xref: /aosp_15_r20/external/XNNPACK/test/qs8-gemm-minmax-fp32-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/qs8-gemm-minmax-fp32.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
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_eq_4)28   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_eq_4) {
29     TEST_REQUIRES_ARM_SIMD32;
30     GemmMicrokernelTester()
31       .mr(1)
32       .nr(1)
33       .kr(4)
34       .sr(1)
35       .m(1)
36       .n(1)
37       .k(4)
38       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
39   }
40 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,strided_cn)41   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, strided_cn) {
42     TEST_REQUIRES_ARM_SIMD32;
43     GemmMicrokernelTester()
44       .mr(1)
45       .nr(1)
46       .kr(4)
47       .sr(1)
48       .m(1)
49       .n(1)
50       .k(4)
51       .cn_stride(3)
52       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
53   }
54 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_eq_4_strided_a)55   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_eq_4_strided_a) {
56     TEST_REQUIRES_ARM_SIMD32;
57     GemmMicrokernelTester()
58       .mr(1)
59       .nr(1)
60       .kr(4)
61       .sr(1)
62       .m(1)
63       .n(1)
64       .k(4)
65       .a_stride(7)
66       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
67   }
68 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_eq_4_subtile)69   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_eq_4_subtile) {
70     TEST_REQUIRES_ARM_SIMD32;
71     for (uint32_t n = 1; n <= 1; n++) {
72       for (uint32_t m = 1; m <= 1; m++) {
73         GemmMicrokernelTester()
74           .mr(1)
75           .nr(1)
76           .kr(4)
77           .sr(1)
78           .m(m)
79           .n(n)
80           .k(4)
81           .iterations(1)
82           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
83       }
84     }
85   }
86 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_eq_4_subtile_m)87   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_eq_4_subtile_m) {
88     TEST_REQUIRES_ARM_SIMD32;
89     for (uint32_t m = 1; m <= 1; m++) {
90       GemmMicrokernelTester()
91         .mr(1)
92         .nr(1)
93         .kr(4)
94         .sr(1)
95         .m(m)
96         .n(1)
97         .k(4)
98         .iterations(1)
99         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
100     }
101   }
102 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_eq_4_subtile_n)103   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_eq_4_subtile_n) {
104     TEST_REQUIRES_ARM_SIMD32;
105     for (uint32_t n = 1; n <= 1; n++) {
106       GemmMicrokernelTester()
107         .mr(1)
108         .nr(1)
109         .kr(4)
110         .sr(1)
111         .m(1)
112         .n(n)
113         .k(4)
114         .iterations(1)
115         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
116     }
117   }
118 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_lt_4)119   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_lt_4) {
120     TEST_REQUIRES_ARM_SIMD32;
121     for (size_t k = 1; k < 4; k++) {
122       GemmMicrokernelTester()
123         .mr(1)
124         .nr(1)
125         .kr(4)
126         .sr(1)
127         .m(1)
128         .n(1)
129         .k(k)
130         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
131     }
132   }
133 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_lt_4_strided_a)134   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_lt_4_strided_a) {
135     TEST_REQUIRES_ARM_SIMD32;
136     for (size_t k = 1; k < 4; k++) {
137       GemmMicrokernelTester()
138         .mr(1)
139         .nr(1)
140         .kr(4)
141         .sr(1)
142         .m(1)
143         .n(1)
144         .k(k)
145         .a_stride(7)
146         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
147     }
148   }
149 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_lt_4_subtile)150   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_lt_4_subtile) {
151     TEST_REQUIRES_ARM_SIMD32;
152     for (size_t k = 1; k < 4; k++) {
153       for (uint32_t n = 1; n <= 1; n++) {
154         for (uint32_t m = 1; m <= 1; m++) {
155           GemmMicrokernelTester()
156             .mr(1)
157             .nr(1)
158             .kr(4)
159             .sr(1)
160             .m(m)
161             .n(n)
162             .k(k)
163             .iterations(1)
164             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
165         }
166       }
167     }
168   }
169 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_gt_4)170   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_gt_4) {
171     TEST_REQUIRES_ARM_SIMD32;
172     for (size_t k = 5; k < 8; k++) {
173       GemmMicrokernelTester()
174         .mr(1)
175         .nr(1)
176         .kr(4)
177         .sr(1)
178         .m(1)
179         .n(1)
180         .k(k)
181         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
182     }
183   }
184 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_gt_4_strided_a)185   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_gt_4_strided_a) {
186     TEST_REQUIRES_ARM_SIMD32;
187     for (size_t k = 5; k < 8; k++) {
188       GemmMicrokernelTester()
189         .mr(1)
190         .nr(1)
191         .kr(4)
192         .sr(1)
193         .m(1)
194         .n(1)
195         .k(k)
196         .a_stride(11)
197         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
198     }
199   }
200 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_gt_4_subtile)201   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_gt_4_subtile) {
202     TEST_REQUIRES_ARM_SIMD32;
203     for (size_t k = 5; k < 8; k++) {
204       for (uint32_t n = 1; n <= 1; n++) {
205         for (uint32_t m = 1; m <= 1; m++) {
206           GemmMicrokernelTester()
207             .mr(1)
208             .nr(1)
209             .kr(4)
210             .sr(1)
211             .m(m)
212             .n(n)
213             .k(k)
214             .iterations(1)
215             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
216         }
217       }
218     }
219   }
220 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_div_4)221   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_div_4) {
222     TEST_REQUIRES_ARM_SIMD32;
223     for (size_t k = 8; k <= 40; k += 4) {
224       GemmMicrokernelTester()
225         .mr(1)
226         .nr(1)
227         .kr(4)
228         .sr(1)
229         .m(1)
230         .n(1)
231         .k(k)
232         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
233     }
234   }
235 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_div_4_strided_a)236   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_div_4_strided_a) {
237     TEST_REQUIRES_ARM_SIMD32;
238     for (size_t k = 8; k <= 40; k += 4) {
239       GemmMicrokernelTester()
240         .mr(1)
241         .nr(1)
242         .kr(4)
243         .sr(1)
244         .m(1)
245         .n(1)
246         .k(k)
247         .a_stride(43)
248         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
249     }
250   }
251 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,k_div_4_subtile)252   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, k_div_4_subtile) {
253     TEST_REQUIRES_ARM_SIMD32;
254     for (size_t k = 8; k <= 40; k += 4) {
255       for (uint32_t n = 1; n <= 1; n++) {
256         for (uint32_t m = 1; m <= 1; m++) {
257           GemmMicrokernelTester()
258             .mr(1)
259             .nr(1)
260             .kr(4)
261             .sr(1)
262             .m(m)
263             .n(n)
264             .k(k)
265             .iterations(1)
266             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
267         }
268       }
269     }
270   }
271 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_gt_1)272   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_gt_1) {
273     TEST_REQUIRES_ARM_SIMD32;
274     for (uint32_t n = 2; n < 2; n++) {
275       for (size_t k = 1; k <= 20; k += 5) {
276         GemmMicrokernelTester()
277           .mr(1)
278           .nr(1)
279           .kr(4)
280           .sr(1)
281           .m(1)
282           .n(n)
283           .k(k)
284           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
285       }
286     }
287   }
288 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_gt_1_strided_cn)289   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_gt_1_strided_cn) {
290     TEST_REQUIRES_ARM_SIMD32;
291     for (uint32_t n = 2; n < 2; n++) {
292       for (size_t k = 1; k <= 20; k += 5) {
293         GemmMicrokernelTester()
294           .mr(1)
295           .nr(1)
296           .kr(4)
297           .sr(1)
298           .m(1)
299           .n(n)
300           .k(k)
301           .cn_stride(3)
302           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
303       }
304     }
305   }
306 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_gt_1_strided_a)307   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_gt_1_strided_a) {
308     TEST_REQUIRES_ARM_SIMD32;
309     for (uint32_t n = 2; n < 2; n++) {
310       for (size_t k = 1; k <= 20; k += 5) {
311         GemmMicrokernelTester()
312           .mr(1)
313           .nr(1)
314           .kr(4)
315           .sr(1)
316           .m(1)
317           .n(n)
318           .k(k)
319           .a_stride(23)
320           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
321       }
322     }
323   }
324 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_gt_1_subtile)325   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_gt_1_subtile) {
326     TEST_REQUIRES_ARM_SIMD32;
327     for (uint32_t n = 2; n < 2; n++) {
328       for (size_t k = 1; k <= 20; k += 5) {
329         for (uint32_t m = 1; m <= 1; m++) {
330           GemmMicrokernelTester()
331             .mr(1)
332             .nr(1)
333             .kr(4)
334             .sr(1)
335             .m(m)
336             .n(n)
337             .k(k)
338             .iterations(1)
339             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
340         }
341       }
342     }
343   }
344 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_div_1)345   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_div_1) {
346     TEST_REQUIRES_ARM_SIMD32;
347     for (uint32_t n = 2; n <= 3; n += 1) {
348       for (size_t k = 1; k <= 20; k += 5) {
349         GemmMicrokernelTester()
350           .mr(1)
351           .nr(1)
352           .kr(4)
353           .sr(1)
354           .m(1)
355           .n(n)
356           .k(k)
357           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
358       }
359     }
360   }
361 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_div_1_strided_cn)362   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_div_1_strided_cn) {
363     TEST_REQUIRES_ARM_SIMD32;
364     for (uint32_t n = 2; n <= 3; n += 1) {
365       for (size_t k = 1; k <= 20; k += 5) {
366         GemmMicrokernelTester()
367           .mr(1)
368           .nr(1)
369           .kr(4)
370           .sr(1)
371           .m(1)
372           .n(n)
373           .k(k)
374           .cn_stride(3)
375           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
376       }
377     }
378   }
379 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_div_1_strided_a)380   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_div_1_strided_a) {
381     TEST_REQUIRES_ARM_SIMD32;
382     for (uint32_t n = 2; n <= 3; n += 1) {
383       for (size_t k = 1; k <= 20; k += 5) {
384         GemmMicrokernelTester()
385           .mr(1)
386           .nr(1)
387           .kr(4)
388           .sr(1)
389           .m(1)
390           .n(n)
391           .k(k)
392           .a_stride(23)
393           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
394       }
395     }
396   }
397 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,n_div_1_subtile)398   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, n_div_1_subtile) {
399     TEST_REQUIRES_ARM_SIMD32;
400     for (uint32_t n = 2; n <= 3; n += 1) {
401       for (size_t k = 1; k <= 20; k += 5) {
402         for (uint32_t m = 1; m <= 1; m++) {
403           GemmMicrokernelTester()
404             .mr(1)
405             .nr(1)
406             .kr(4)
407             .sr(1)
408             .m(m)
409             .n(n)
410             .k(k)
411             .iterations(1)
412             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
413         }
414       }
415     }
416   }
417 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,strided_cm_subtile)418   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, strided_cm_subtile) {
419     TEST_REQUIRES_ARM_SIMD32;
420     for (size_t k = 1; k <= 20; k += 5) {
421       for (uint32_t n = 1; n <= 1; n++) {
422         for (uint32_t m = 1; m <= 1; m++) {
423           GemmMicrokernelTester()
424             .mr(1)
425             .nr(1)
426             .kr(4)
427             .sr(1)
428             .m(m)
429             .n(n)
430             .k(k)
431             .cm_stride(3)
432             .iterations(1)
433             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
434         }
435       }
436     }
437   }
438 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,qmin)439   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, qmin) {
440     TEST_REQUIRES_ARM_SIMD32;
441     GemmMicrokernelTester()
442       .mr(1)
443       .nr(1)
444       .kr(4)
445       .sr(1)
446       .m(1)
447       .n(1)
448       .k(4)
449       .qmin(128)
450       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
451   }
452 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,qmax)453   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, qmax) {
454     TEST_REQUIRES_ARM_SIMD32;
455     GemmMicrokernelTester()
456       .mr(1)
457       .nr(1)
458       .kr(4)
459       .sr(1)
460       .m(1)
461       .n(1)
462       .k(4)
463       .qmax(128)
464       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
465   }
466 
TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32,strided_cm)467   TEST(QS8_GEMM_MINMAX_FP32_1X1C4__ARMSIMD32, strided_cm) {
468     TEST_REQUIRES_ARM_SIMD32;
469     GemmMicrokernelTester()
470       .mr(1)
471       .nr(1)
472       .kr(4)
473       .sr(1)
474       .m(1)
475       .n(1)
476       .k(4)
477       .cm_stride(3)
478       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
479   }
480 #endif  // XNN_ARCH_ARM
481 
482 
483 #if XNN_ARCH_ARM
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_eq_4)484   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_eq_4) {
485     TEST_REQUIRES_ARM_SIMD32;
486     GemmMicrokernelTester()
487       .mr(2)
488       .nr(1)
489       .kr(4)
490       .sr(1)
491       .m(2)
492       .n(1)
493       .k(4)
494       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
495   }
496 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,strided_cn)497   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, strided_cn) {
498     TEST_REQUIRES_ARM_SIMD32;
499     GemmMicrokernelTester()
500       .mr(2)
501       .nr(1)
502       .kr(4)
503       .sr(1)
504       .m(2)
505       .n(1)
506       .k(4)
507       .cn_stride(3)
508       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
509   }
510 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_eq_4_strided_a)511   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_eq_4_strided_a) {
512     TEST_REQUIRES_ARM_SIMD32;
513     GemmMicrokernelTester()
514       .mr(2)
515       .nr(1)
516       .kr(4)
517       .sr(1)
518       .m(2)
519       .n(1)
520       .k(4)
521       .a_stride(7)
522       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
523   }
524 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_eq_4_subtile)525   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_eq_4_subtile) {
526     TEST_REQUIRES_ARM_SIMD32;
527     for (uint32_t n = 1; n <= 1; n++) {
528       for (uint32_t m = 1; m <= 2; m++) {
529         GemmMicrokernelTester()
530           .mr(2)
531           .nr(1)
532           .kr(4)
533           .sr(1)
534           .m(m)
535           .n(n)
536           .k(4)
537           .iterations(1)
538           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
539       }
540     }
541   }
542 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_eq_4_subtile_m)543   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_eq_4_subtile_m) {
544     TEST_REQUIRES_ARM_SIMD32;
545     for (uint32_t m = 1; m <= 2; m++) {
546       GemmMicrokernelTester()
547         .mr(2)
548         .nr(1)
549         .kr(4)
550         .sr(1)
551         .m(m)
552         .n(1)
553         .k(4)
554         .iterations(1)
555         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
556     }
557   }
558 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_eq_4_subtile_n)559   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_eq_4_subtile_n) {
560     TEST_REQUIRES_ARM_SIMD32;
561     for (uint32_t n = 1; n <= 1; n++) {
562       GemmMicrokernelTester()
563         .mr(2)
564         .nr(1)
565         .kr(4)
566         .sr(1)
567         .m(2)
568         .n(n)
569         .k(4)
570         .iterations(1)
571         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
572     }
573   }
574 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_lt_4)575   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_lt_4) {
576     TEST_REQUIRES_ARM_SIMD32;
577     for (size_t k = 1; k < 4; k++) {
578       GemmMicrokernelTester()
579         .mr(2)
580         .nr(1)
581         .kr(4)
582         .sr(1)
583         .m(2)
584         .n(1)
585         .k(k)
586         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
587     }
588   }
589 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_lt_4_strided_a)590   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_lt_4_strided_a) {
591     TEST_REQUIRES_ARM_SIMD32;
592     for (size_t k = 1; k < 4; k++) {
593       GemmMicrokernelTester()
594         .mr(2)
595         .nr(1)
596         .kr(4)
597         .sr(1)
598         .m(2)
599         .n(1)
600         .k(k)
601         .a_stride(7)
602         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
603     }
604   }
605 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_lt_4_subtile)606   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_lt_4_subtile) {
607     TEST_REQUIRES_ARM_SIMD32;
608     for (size_t k = 1; k < 4; k++) {
609       for (uint32_t n = 1; n <= 1; n++) {
610         for (uint32_t m = 1; m <= 2; m++) {
611           GemmMicrokernelTester()
612             .mr(2)
613             .nr(1)
614             .kr(4)
615             .sr(1)
616             .m(m)
617             .n(n)
618             .k(k)
619             .iterations(1)
620             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
621         }
622       }
623     }
624   }
625 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_gt_4)626   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_gt_4) {
627     TEST_REQUIRES_ARM_SIMD32;
628     for (size_t k = 5; k < 8; k++) {
629       GemmMicrokernelTester()
630         .mr(2)
631         .nr(1)
632         .kr(4)
633         .sr(1)
634         .m(2)
635         .n(1)
636         .k(k)
637         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
638     }
639   }
640 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_gt_4_strided_a)641   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_gt_4_strided_a) {
642     TEST_REQUIRES_ARM_SIMD32;
643     for (size_t k = 5; k < 8; k++) {
644       GemmMicrokernelTester()
645         .mr(2)
646         .nr(1)
647         .kr(4)
648         .sr(1)
649         .m(2)
650         .n(1)
651         .k(k)
652         .a_stride(11)
653         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
654     }
655   }
656 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_gt_4_subtile)657   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_gt_4_subtile) {
658     TEST_REQUIRES_ARM_SIMD32;
659     for (size_t k = 5; k < 8; k++) {
660       for (uint32_t n = 1; n <= 1; n++) {
661         for (uint32_t m = 1; m <= 2; m++) {
662           GemmMicrokernelTester()
663             .mr(2)
664             .nr(1)
665             .kr(4)
666             .sr(1)
667             .m(m)
668             .n(n)
669             .k(k)
670             .iterations(1)
671             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
672         }
673       }
674     }
675   }
676 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_div_4)677   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_div_4) {
678     TEST_REQUIRES_ARM_SIMD32;
679     for (size_t k = 8; k <= 40; k += 4) {
680       GemmMicrokernelTester()
681         .mr(2)
682         .nr(1)
683         .kr(4)
684         .sr(1)
685         .m(2)
686         .n(1)
687         .k(k)
688         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
689     }
690   }
691 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_div_4_strided_a)692   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_div_4_strided_a) {
693     TEST_REQUIRES_ARM_SIMD32;
694     for (size_t k = 8; k <= 40; k += 4) {
695       GemmMicrokernelTester()
696         .mr(2)
697         .nr(1)
698         .kr(4)
699         .sr(1)
700         .m(2)
701         .n(1)
702         .k(k)
703         .a_stride(43)
704         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
705     }
706   }
707 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,k_div_4_subtile)708   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, k_div_4_subtile) {
709     TEST_REQUIRES_ARM_SIMD32;
710     for (size_t k = 8; k <= 40; k += 4) {
711       for (uint32_t n = 1; n <= 1; n++) {
712         for (uint32_t m = 1; m <= 2; m++) {
713           GemmMicrokernelTester()
714             .mr(2)
715             .nr(1)
716             .kr(4)
717             .sr(1)
718             .m(m)
719             .n(n)
720             .k(k)
721             .iterations(1)
722             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
723         }
724       }
725     }
726   }
727 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_gt_1)728   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_gt_1) {
729     TEST_REQUIRES_ARM_SIMD32;
730     for (uint32_t n = 2; n < 2; n++) {
731       for (size_t k = 1; k <= 20; k += 5) {
732         GemmMicrokernelTester()
733           .mr(2)
734           .nr(1)
735           .kr(4)
736           .sr(1)
737           .m(2)
738           .n(n)
739           .k(k)
740           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
741       }
742     }
743   }
744 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_gt_1_strided_cn)745   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_gt_1_strided_cn) {
746     TEST_REQUIRES_ARM_SIMD32;
747     for (uint32_t n = 2; n < 2; n++) {
748       for (size_t k = 1; k <= 20; k += 5) {
749         GemmMicrokernelTester()
750           .mr(2)
751           .nr(1)
752           .kr(4)
753           .sr(1)
754           .m(2)
755           .n(n)
756           .k(k)
757           .cn_stride(3)
758           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
759       }
760     }
761   }
762 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_gt_1_strided_a)763   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_gt_1_strided_a) {
764     TEST_REQUIRES_ARM_SIMD32;
765     for (uint32_t n = 2; n < 2; n++) {
766       for (size_t k = 1; k <= 20; k += 5) {
767         GemmMicrokernelTester()
768           .mr(2)
769           .nr(1)
770           .kr(4)
771           .sr(1)
772           .m(2)
773           .n(n)
774           .k(k)
775           .a_stride(23)
776           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
777       }
778     }
779   }
780 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_gt_1_subtile)781   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_gt_1_subtile) {
782     TEST_REQUIRES_ARM_SIMD32;
783     for (uint32_t n = 2; n < 2; n++) {
784       for (size_t k = 1; k <= 20; k += 5) {
785         for (uint32_t m = 1; m <= 2; m++) {
786           GemmMicrokernelTester()
787             .mr(2)
788             .nr(1)
789             .kr(4)
790             .sr(1)
791             .m(m)
792             .n(n)
793             .k(k)
794             .iterations(1)
795             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
796         }
797       }
798     }
799   }
800 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_div_1)801   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_div_1) {
802     TEST_REQUIRES_ARM_SIMD32;
803     for (uint32_t n = 2; n <= 3; n += 1) {
804       for (size_t k = 1; k <= 20; k += 5) {
805         GemmMicrokernelTester()
806           .mr(2)
807           .nr(1)
808           .kr(4)
809           .sr(1)
810           .m(2)
811           .n(n)
812           .k(k)
813           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
814       }
815     }
816   }
817 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_div_1_strided_cn)818   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_div_1_strided_cn) {
819     TEST_REQUIRES_ARM_SIMD32;
820     for (uint32_t n = 2; n <= 3; n += 1) {
821       for (size_t k = 1; k <= 20; k += 5) {
822         GemmMicrokernelTester()
823           .mr(2)
824           .nr(1)
825           .kr(4)
826           .sr(1)
827           .m(2)
828           .n(n)
829           .k(k)
830           .cn_stride(3)
831           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
832       }
833     }
834   }
835 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_div_1_strided_a)836   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_div_1_strided_a) {
837     TEST_REQUIRES_ARM_SIMD32;
838     for (uint32_t n = 2; n <= 3; n += 1) {
839       for (size_t k = 1; k <= 20; k += 5) {
840         GemmMicrokernelTester()
841           .mr(2)
842           .nr(1)
843           .kr(4)
844           .sr(1)
845           .m(2)
846           .n(n)
847           .k(k)
848           .a_stride(23)
849           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
850       }
851     }
852   }
853 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,n_div_1_subtile)854   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, n_div_1_subtile) {
855     TEST_REQUIRES_ARM_SIMD32;
856     for (uint32_t n = 2; n <= 3; n += 1) {
857       for (size_t k = 1; k <= 20; k += 5) {
858         for (uint32_t m = 1; m <= 2; m++) {
859           GemmMicrokernelTester()
860             .mr(2)
861             .nr(1)
862             .kr(4)
863             .sr(1)
864             .m(m)
865             .n(n)
866             .k(k)
867             .iterations(1)
868             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
869         }
870       }
871     }
872   }
873 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,strided_cm_subtile)874   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, strided_cm_subtile) {
875     TEST_REQUIRES_ARM_SIMD32;
876     for (size_t k = 1; k <= 20; k += 5) {
877       for (uint32_t n = 1; n <= 1; n++) {
878         for (uint32_t m = 1; m <= 2; m++) {
879           GemmMicrokernelTester()
880             .mr(2)
881             .nr(1)
882             .kr(4)
883             .sr(1)
884             .m(m)
885             .n(n)
886             .k(k)
887             .cm_stride(3)
888             .iterations(1)
889             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
890         }
891       }
892     }
893   }
894 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,qmin)895   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, qmin) {
896     TEST_REQUIRES_ARM_SIMD32;
897     GemmMicrokernelTester()
898       .mr(2)
899       .nr(1)
900       .kr(4)
901       .sr(1)
902       .m(2)
903       .n(1)
904       .k(4)
905       .qmin(128)
906       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
907   }
908 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,qmax)909   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, qmax) {
910     TEST_REQUIRES_ARM_SIMD32;
911     GemmMicrokernelTester()
912       .mr(2)
913       .nr(1)
914       .kr(4)
915       .sr(1)
916       .m(2)
917       .n(1)
918       .k(4)
919       .qmax(128)
920       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
921   }
922 
TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32,strided_cm)923   TEST(QS8_GEMM_MINMAX_FP32_2X1C4__ARMSIMD32, strided_cm) {
924     TEST_REQUIRES_ARM_SIMD32;
925     GemmMicrokernelTester()
926       .mr(2)
927       .nr(1)
928       .kr(4)
929       .sr(1)
930       .m(2)
931       .n(1)
932       .k(4)
933       .cm_stride(3)
934       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x1c4__armsimd32, xnn_init_qs8_conv_minmax_fp32_armsimd32_params, xnn_qs8_requantize_fp32);
935   }
936 #endif  // XNN_ARCH_ARM
937 
938 
939 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_eq_16)940   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_eq_16) {
941     TEST_REQUIRES_ARM_NEON;
942     GemmMicrokernelTester()
943       .mr(1)
944       .nr(8)
945       .kr(2)
946       .sr(1)
947       .m(1)
948       .n(8)
949       .k(16)
950       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
951   }
952 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,strided_cn)953   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, strided_cn) {
954     TEST_REQUIRES_ARM_NEON;
955     GemmMicrokernelTester()
956       .mr(1)
957       .nr(8)
958       .kr(2)
959       .sr(1)
960       .m(1)
961       .n(8)
962       .k(16)
963       .cn_stride(11)
964       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
965   }
966 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_eq_16_strided_a)967   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_eq_16_strided_a) {
968     TEST_REQUIRES_ARM_NEON;
969     GemmMicrokernelTester()
970       .mr(1)
971       .nr(8)
972       .kr(2)
973       .sr(1)
974       .m(1)
975       .n(8)
976       .k(16)
977       .a_stride(19)
978       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
979   }
980 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_eq_16_subtile)981   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_eq_16_subtile) {
982     TEST_REQUIRES_ARM_NEON;
983     for (uint32_t n = 1; n <= 8; n++) {
984       for (uint32_t m = 1; m <= 1; m++) {
985         GemmMicrokernelTester()
986           .mr(1)
987           .nr(8)
988           .kr(2)
989           .sr(1)
990           .m(m)
991           .n(n)
992           .k(16)
993           .iterations(1)
994           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
995       }
996     }
997   }
998 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_eq_16_subtile_m)999   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_eq_16_subtile_m) {
1000     TEST_REQUIRES_ARM_NEON;
1001     for (uint32_t m = 1; m <= 1; m++) {
1002       GemmMicrokernelTester()
1003         .mr(1)
1004         .nr(8)
1005         .kr(2)
1006         .sr(1)
1007         .m(m)
1008         .n(8)
1009         .k(16)
1010         .iterations(1)
1011         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1012     }
1013   }
1014 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_eq_16_subtile_n)1015   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_eq_16_subtile_n) {
1016     TEST_REQUIRES_ARM_NEON;
1017     for (uint32_t n = 1; n <= 8; n++) {
1018       GemmMicrokernelTester()
1019         .mr(1)
1020         .nr(8)
1021         .kr(2)
1022         .sr(1)
1023         .m(1)
1024         .n(n)
1025         .k(16)
1026         .iterations(1)
1027         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1028     }
1029   }
1030 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_lt_16)1031   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_lt_16) {
1032     TEST_REQUIRES_ARM_NEON;
1033     for (size_t k = 1; k < 16; k++) {
1034       GemmMicrokernelTester()
1035         .mr(1)
1036         .nr(8)
1037         .kr(2)
1038         .sr(1)
1039         .m(1)
1040         .n(8)
1041         .k(k)
1042         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1043     }
1044   }
1045 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_lt_16_strided_a)1046   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_lt_16_strided_a) {
1047     TEST_REQUIRES_ARM_NEON;
1048     for (size_t k = 1; k < 16; k++) {
1049       GemmMicrokernelTester()
1050         .mr(1)
1051         .nr(8)
1052         .kr(2)
1053         .sr(1)
1054         .m(1)
1055         .n(8)
1056         .k(k)
1057         .a_stride(19)
1058         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1059     }
1060   }
1061 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_lt_16_subtile)1062   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_lt_16_subtile) {
1063     TEST_REQUIRES_ARM_NEON;
1064     for (size_t k = 1; k < 16; k++) {
1065       for (uint32_t n = 1; n <= 8; n++) {
1066         for (uint32_t m = 1; m <= 1; m++) {
1067           GemmMicrokernelTester()
1068             .mr(1)
1069             .nr(8)
1070             .kr(2)
1071             .sr(1)
1072             .m(m)
1073             .n(n)
1074             .k(k)
1075             .iterations(1)
1076             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1077         }
1078       }
1079     }
1080   }
1081 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_gt_16)1082   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_gt_16) {
1083     TEST_REQUIRES_ARM_NEON;
1084     for (size_t k = 17; k < 32; k++) {
1085       GemmMicrokernelTester()
1086         .mr(1)
1087         .nr(8)
1088         .kr(2)
1089         .sr(1)
1090         .m(1)
1091         .n(8)
1092         .k(k)
1093         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1094     }
1095   }
1096 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_gt_16_strided_a)1097   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_gt_16_strided_a) {
1098     TEST_REQUIRES_ARM_NEON;
1099     for (size_t k = 17; k < 32; k++) {
1100       GemmMicrokernelTester()
1101         .mr(1)
1102         .nr(8)
1103         .kr(2)
1104         .sr(1)
1105         .m(1)
1106         .n(8)
1107         .k(k)
1108         .a_stride(37)
1109         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1110     }
1111   }
1112 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_gt_16_subtile)1113   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_gt_16_subtile) {
1114     TEST_REQUIRES_ARM_NEON;
1115     for (size_t k = 17; k < 32; k++) {
1116       for (uint32_t n = 1; n <= 8; n++) {
1117         for (uint32_t m = 1; m <= 1; m++) {
1118           GemmMicrokernelTester()
1119             .mr(1)
1120             .nr(8)
1121             .kr(2)
1122             .sr(1)
1123             .m(m)
1124             .n(n)
1125             .k(k)
1126             .iterations(1)
1127             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1128         }
1129       }
1130     }
1131   }
1132 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_div_16)1133   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_div_16) {
1134     TEST_REQUIRES_ARM_NEON;
1135     for (size_t k = 32; k <= 160; k += 16) {
1136       GemmMicrokernelTester()
1137         .mr(1)
1138         .nr(8)
1139         .kr(2)
1140         .sr(1)
1141         .m(1)
1142         .n(8)
1143         .k(k)
1144         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1145     }
1146   }
1147 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_div_16_strided_a)1148   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_div_16_strided_a) {
1149     TEST_REQUIRES_ARM_NEON;
1150     for (size_t k = 32; k <= 160; k += 16) {
1151       GemmMicrokernelTester()
1152         .mr(1)
1153         .nr(8)
1154         .kr(2)
1155         .sr(1)
1156         .m(1)
1157         .n(8)
1158         .k(k)
1159         .a_stride(163)
1160         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1161     }
1162   }
1163 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,k_div_16_subtile)1164   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, k_div_16_subtile) {
1165     TEST_REQUIRES_ARM_NEON;
1166     for (size_t k = 32; k <= 160; k += 16) {
1167       for (uint32_t n = 1; n <= 8; n++) {
1168         for (uint32_t m = 1; m <= 1; m++) {
1169           GemmMicrokernelTester()
1170             .mr(1)
1171             .nr(8)
1172             .kr(2)
1173             .sr(1)
1174             .m(m)
1175             .n(n)
1176             .k(k)
1177             .iterations(1)
1178             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1179         }
1180       }
1181     }
1182   }
1183 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_gt_8)1184   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_gt_8) {
1185     TEST_REQUIRES_ARM_NEON;
1186     for (uint32_t n = 9; n < 16; n++) {
1187       for (size_t k = 1; k <= 80; k += 17) {
1188         GemmMicrokernelTester()
1189           .mr(1)
1190           .nr(8)
1191           .kr(2)
1192           .sr(1)
1193           .m(1)
1194           .n(n)
1195           .k(k)
1196           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1197       }
1198     }
1199   }
1200 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_gt_8_strided_cn)1201   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_gt_8_strided_cn) {
1202     TEST_REQUIRES_ARM_NEON;
1203     for (uint32_t n = 9; n < 16; n++) {
1204       for (size_t k = 1; k <= 80; k += 17) {
1205         GemmMicrokernelTester()
1206           .mr(1)
1207           .nr(8)
1208           .kr(2)
1209           .sr(1)
1210           .m(1)
1211           .n(n)
1212           .k(k)
1213           .cn_stride(11)
1214           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1215       }
1216     }
1217   }
1218 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_gt_8_strided_a)1219   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_gt_8_strided_a) {
1220     TEST_REQUIRES_ARM_NEON;
1221     for (uint32_t n = 9; n < 16; n++) {
1222       for (size_t k = 1; k <= 80; k += 17) {
1223         GemmMicrokernelTester()
1224           .mr(1)
1225           .nr(8)
1226           .kr(2)
1227           .sr(1)
1228           .m(1)
1229           .n(n)
1230           .k(k)
1231           .a_stride(83)
1232           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1233       }
1234     }
1235   }
1236 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_gt_8_subtile)1237   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_gt_8_subtile) {
1238     TEST_REQUIRES_ARM_NEON;
1239     for (uint32_t n = 9; n < 16; n++) {
1240       for (size_t k = 1; k <= 80; k += 17) {
1241         for (uint32_t m = 1; m <= 1; m++) {
1242           GemmMicrokernelTester()
1243             .mr(1)
1244             .nr(8)
1245             .kr(2)
1246             .sr(1)
1247             .m(m)
1248             .n(n)
1249             .k(k)
1250             .iterations(1)
1251             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1252         }
1253       }
1254     }
1255   }
1256 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_div_8)1257   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_div_8) {
1258     TEST_REQUIRES_ARM_NEON;
1259     for (uint32_t n = 16; n <= 24; n += 8) {
1260       for (size_t k = 1; k <= 80; k += 17) {
1261         GemmMicrokernelTester()
1262           .mr(1)
1263           .nr(8)
1264           .kr(2)
1265           .sr(1)
1266           .m(1)
1267           .n(n)
1268           .k(k)
1269           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1270       }
1271     }
1272   }
1273 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_div_8_strided_cn)1274   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_div_8_strided_cn) {
1275     TEST_REQUIRES_ARM_NEON;
1276     for (uint32_t n = 16; n <= 24; n += 8) {
1277       for (size_t k = 1; k <= 80; k += 17) {
1278         GemmMicrokernelTester()
1279           .mr(1)
1280           .nr(8)
1281           .kr(2)
1282           .sr(1)
1283           .m(1)
1284           .n(n)
1285           .k(k)
1286           .cn_stride(11)
1287           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1288       }
1289     }
1290   }
1291 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_div_8_strided_a)1292   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_div_8_strided_a) {
1293     TEST_REQUIRES_ARM_NEON;
1294     for (uint32_t n = 16; n <= 24; n += 8) {
1295       for (size_t k = 1; k <= 80; k += 17) {
1296         GemmMicrokernelTester()
1297           .mr(1)
1298           .nr(8)
1299           .kr(2)
1300           .sr(1)
1301           .m(1)
1302           .n(n)
1303           .k(k)
1304           .a_stride(83)
1305           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1306       }
1307     }
1308   }
1309 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,n_div_8_subtile)1310   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, n_div_8_subtile) {
1311     TEST_REQUIRES_ARM_NEON;
1312     for (uint32_t n = 16; n <= 24; n += 8) {
1313       for (size_t k = 1; k <= 80; k += 17) {
1314         for (uint32_t m = 1; m <= 1; m++) {
1315           GemmMicrokernelTester()
1316             .mr(1)
1317             .nr(8)
1318             .kr(2)
1319             .sr(1)
1320             .m(m)
1321             .n(n)
1322             .k(k)
1323             .iterations(1)
1324             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1325         }
1326       }
1327     }
1328   }
1329 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,strided_cm_subtile)1330   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, strided_cm_subtile) {
1331     TEST_REQUIRES_ARM_NEON;
1332     for (size_t k = 1; k <= 80; k += 17) {
1333       for (uint32_t n = 1; n <= 8; n++) {
1334         for (uint32_t m = 1; m <= 1; m++) {
1335           GemmMicrokernelTester()
1336             .mr(1)
1337             .nr(8)
1338             .kr(2)
1339             .sr(1)
1340             .m(m)
1341             .n(n)
1342             .k(k)
1343             .cm_stride(11)
1344             .iterations(1)
1345             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1346         }
1347       }
1348     }
1349   }
1350 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,qmin)1351   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, qmin) {
1352     TEST_REQUIRES_ARM_NEON;
1353     GemmMicrokernelTester()
1354       .mr(1)
1355       .nr(8)
1356       .kr(2)
1357       .sr(1)
1358       .m(1)
1359       .n(8)
1360       .k(16)
1361       .qmin(128)
1362       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1363   }
1364 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,qmax)1365   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, qmax) {
1366     TEST_REQUIRES_ARM_NEON;
1367     GemmMicrokernelTester()
1368       .mr(1)
1369       .nr(8)
1370       .kr(2)
1371       .sr(1)
1372       .m(1)
1373       .n(8)
1374       .k(16)
1375       .qmax(128)
1376       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1377   }
1378 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP,strided_cm)1379   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_DUP, strided_cm) {
1380     TEST_REQUIRES_ARM_NEON;
1381     GemmMicrokernelTester()
1382       .mr(1)
1383       .nr(8)
1384       .kr(2)
1385       .sr(1)
1386       .m(1)
1387       .n(8)
1388       .k(16)
1389       .cm_stride(11)
1390       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1391   }
1392 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1393 
1394 
1395 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_eq_16)1396   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_eq_16) {
1397     TEST_REQUIRES_ARM_NEON;
1398     GemmMicrokernelTester()
1399       .mr(1)
1400       .nr(8)
1401       .kr(2)
1402       .sr(1)
1403       .m(1)
1404       .n(8)
1405       .k(16)
1406       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1407   }
1408 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,strided_cn)1409   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, strided_cn) {
1410     TEST_REQUIRES_ARM_NEON;
1411     GemmMicrokernelTester()
1412       .mr(1)
1413       .nr(8)
1414       .kr(2)
1415       .sr(1)
1416       .m(1)
1417       .n(8)
1418       .k(16)
1419       .cn_stride(11)
1420       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1421   }
1422 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_eq_16_strided_a)1423   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_eq_16_strided_a) {
1424     TEST_REQUIRES_ARM_NEON;
1425     GemmMicrokernelTester()
1426       .mr(1)
1427       .nr(8)
1428       .kr(2)
1429       .sr(1)
1430       .m(1)
1431       .n(8)
1432       .k(16)
1433       .a_stride(19)
1434       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1435   }
1436 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_eq_16_subtile)1437   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_eq_16_subtile) {
1438     TEST_REQUIRES_ARM_NEON;
1439     for (uint32_t n = 1; n <= 8; n++) {
1440       for (uint32_t m = 1; m <= 1; m++) {
1441         GemmMicrokernelTester()
1442           .mr(1)
1443           .nr(8)
1444           .kr(2)
1445           .sr(1)
1446           .m(m)
1447           .n(n)
1448           .k(16)
1449           .iterations(1)
1450           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1451       }
1452     }
1453   }
1454 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_eq_16_subtile_m)1455   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_eq_16_subtile_m) {
1456     TEST_REQUIRES_ARM_NEON;
1457     for (uint32_t m = 1; m <= 1; m++) {
1458       GemmMicrokernelTester()
1459         .mr(1)
1460         .nr(8)
1461         .kr(2)
1462         .sr(1)
1463         .m(m)
1464         .n(8)
1465         .k(16)
1466         .iterations(1)
1467         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1468     }
1469   }
1470 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_eq_16_subtile_n)1471   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_eq_16_subtile_n) {
1472     TEST_REQUIRES_ARM_NEON;
1473     for (uint32_t n = 1; n <= 8; n++) {
1474       GemmMicrokernelTester()
1475         .mr(1)
1476         .nr(8)
1477         .kr(2)
1478         .sr(1)
1479         .m(1)
1480         .n(n)
1481         .k(16)
1482         .iterations(1)
1483         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1484     }
1485   }
1486 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_lt_16)1487   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_lt_16) {
1488     TEST_REQUIRES_ARM_NEON;
1489     for (size_t k = 1; k < 16; k++) {
1490       GemmMicrokernelTester()
1491         .mr(1)
1492         .nr(8)
1493         .kr(2)
1494         .sr(1)
1495         .m(1)
1496         .n(8)
1497         .k(k)
1498         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1499     }
1500   }
1501 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_lt_16_strided_a)1502   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_lt_16_strided_a) {
1503     TEST_REQUIRES_ARM_NEON;
1504     for (size_t k = 1; k < 16; k++) {
1505       GemmMicrokernelTester()
1506         .mr(1)
1507         .nr(8)
1508         .kr(2)
1509         .sr(1)
1510         .m(1)
1511         .n(8)
1512         .k(k)
1513         .a_stride(19)
1514         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1515     }
1516   }
1517 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_lt_16_subtile)1518   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_lt_16_subtile) {
1519     TEST_REQUIRES_ARM_NEON;
1520     for (size_t k = 1; k < 16; k++) {
1521       for (uint32_t n = 1; n <= 8; n++) {
1522         for (uint32_t m = 1; m <= 1; m++) {
1523           GemmMicrokernelTester()
1524             .mr(1)
1525             .nr(8)
1526             .kr(2)
1527             .sr(1)
1528             .m(m)
1529             .n(n)
1530             .k(k)
1531             .iterations(1)
1532             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1533         }
1534       }
1535     }
1536   }
1537 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_gt_16)1538   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_gt_16) {
1539     TEST_REQUIRES_ARM_NEON;
1540     for (size_t k = 17; k < 32; k++) {
1541       GemmMicrokernelTester()
1542         .mr(1)
1543         .nr(8)
1544         .kr(2)
1545         .sr(1)
1546         .m(1)
1547         .n(8)
1548         .k(k)
1549         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1550     }
1551   }
1552 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_gt_16_strided_a)1553   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_gt_16_strided_a) {
1554     TEST_REQUIRES_ARM_NEON;
1555     for (size_t k = 17; k < 32; k++) {
1556       GemmMicrokernelTester()
1557         .mr(1)
1558         .nr(8)
1559         .kr(2)
1560         .sr(1)
1561         .m(1)
1562         .n(8)
1563         .k(k)
1564         .a_stride(37)
1565         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1566     }
1567   }
1568 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_gt_16_subtile)1569   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_gt_16_subtile) {
1570     TEST_REQUIRES_ARM_NEON;
1571     for (size_t k = 17; k < 32; k++) {
1572       for (uint32_t n = 1; n <= 8; n++) {
1573         for (uint32_t m = 1; m <= 1; m++) {
1574           GemmMicrokernelTester()
1575             .mr(1)
1576             .nr(8)
1577             .kr(2)
1578             .sr(1)
1579             .m(m)
1580             .n(n)
1581             .k(k)
1582             .iterations(1)
1583             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1584         }
1585       }
1586     }
1587   }
1588 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_div_16)1589   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_div_16) {
1590     TEST_REQUIRES_ARM_NEON;
1591     for (size_t k = 32; k <= 160; k += 16) {
1592       GemmMicrokernelTester()
1593         .mr(1)
1594         .nr(8)
1595         .kr(2)
1596         .sr(1)
1597         .m(1)
1598         .n(8)
1599         .k(k)
1600         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1601     }
1602   }
1603 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_div_16_strided_a)1604   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_div_16_strided_a) {
1605     TEST_REQUIRES_ARM_NEON;
1606     for (size_t k = 32; k <= 160; k += 16) {
1607       GemmMicrokernelTester()
1608         .mr(1)
1609         .nr(8)
1610         .kr(2)
1611         .sr(1)
1612         .m(1)
1613         .n(8)
1614         .k(k)
1615         .a_stride(163)
1616         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1617     }
1618   }
1619 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,k_div_16_subtile)1620   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, k_div_16_subtile) {
1621     TEST_REQUIRES_ARM_NEON;
1622     for (size_t k = 32; k <= 160; k += 16) {
1623       for (uint32_t n = 1; n <= 8; n++) {
1624         for (uint32_t m = 1; m <= 1; m++) {
1625           GemmMicrokernelTester()
1626             .mr(1)
1627             .nr(8)
1628             .kr(2)
1629             .sr(1)
1630             .m(m)
1631             .n(n)
1632             .k(k)
1633             .iterations(1)
1634             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1635         }
1636       }
1637     }
1638   }
1639 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_gt_8)1640   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_gt_8) {
1641     TEST_REQUIRES_ARM_NEON;
1642     for (uint32_t n = 9; n < 16; n++) {
1643       for (size_t k = 1; k <= 80; k += 17) {
1644         GemmMicrokernelTester()
1645           .mr(1)
1646           .nr(8)
1647           .kr(2)
1648           .sr(1)
1649           .m(1)
1650           .n(n)
1651           .k(k)
1652           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1653       }
1654     }
1655   }
1656 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_gt_8_strided_cn)1657   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_gt_8_strided_cn) {
1658     TEST_REQUIRES_ARM_NEON;
1659     for (uint32_t n = 9; n < 16; n++) {
1660       for (size_t k = 1; k <= 80; k += 17) {
1661         GemmMicrokernelTester()
1662           .mr(1)
1663           .nr(8)
1664           .kr(2)
1665           .sr(1)
1666           .m(1)
1667           .n(n)
1668           .k(k)
1669           .cn_stride(11)
1670           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1671       }
1672     }
1673   }
1674 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_gt_8_strided_a)1675   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_gt_8_strided_a) {
1676     TEST_REQUIRES_ARM_NEON;
1677     for (uint32_t n = 9; n < 16; n++) {
1678       for (size_t k = 1; k <= 80; k += 17) {
1679         GemmMicrokernelTester()
1680           .mr(1)
1681           .nr(8)
1682           .kr(2)
1683           .sr(1)
1684           .m(1)
1685           .n(n)
1686           .k(k)
1687           .a_stride(83)
1688           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1689       }
1690     }
1691   }
1692 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_gt_8_subtile)1693   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_gt_8_subtile) {
1694     TEST_REQUIRES_ARM_NEON;
1695     for (uint32_t n = 9; n < 16; n++) {
1696       for (size_t k = 1; k <= 80; k += 17) {
1697         for (uint32_t m = 1; m <= 1; m++) {
1698           GemmMicrokernelTester()
1699             .mr(1)
1700             .nr(8)
1701             .kr(2)
1702             .sr(1)
1703             .m(m)
1704             .n(n)
1705             .k(k)
1706             .iterations(1)
1707             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1708         }
1709       }
1710     }
1711   }
1712 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_div_8)1713   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_div_8) {
1714     TEST_REQUIRES_ARM_NEON;
1715     for (uint32_t n = 16; n <= 24; n += 8) {
1716       for (size_t k = 1; k <= 80; k += 17) {
1717         GemmMicrokernelTester()
1718           .mr(1)
1719           .nr(8)
1720           .kr(2)
1721           .sr(1)
1722           .m(1)
1723           .n(n)
1724           .k(k)
1725           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1726       }
1727     }
1728   }
1729 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_div_8_strided_cn)1730   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_div_8_strided_cn) {
1731     TEST_REQUIRES_ARM_NEON;
1732     for (uint32_t n = 16; n <= 24; n += 8) {
1733       for (size_t k = 1; k <= 80; k += 17) {
1734         GemmMicrokernelTester()
1735           .mr(1)
1736           .nr(8)
1737           .kr(2)
1738           .sr(1)
1739           .m(1)
1740           .n(n)
1741           .k(k)
1742           .cn_stride(11)
1743           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1744       }
1745     }
1746   }
1747 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_div_8_strided_a)1748   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_div_8_strided_a) {
1749     TEST_REQUIRES_ARM_NEON;
1750     for (uint32_t n = 16; n <= 24; n += 8) {
1751       for (size_t k = 1; k <= 80; k += 17) {
1752         GemmMicrokernelTester()
1753           .mr(1)
1754           .nr(8)
1755           .kr(2)
1756           .sr(1)
1757           .m(1)
1758           .n(n)
1759           .k(k)
1760           .a_stride(83)
1761           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1762       }
1763     }
1764   }
1765 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,n_div_8_subtile)1766   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, n_div_8_subtile) {
1767     TEST_REQUIRES_ARM_NEON;
1768     for (uint32_t n = 16; n <= 24; n += 8) {
1769       for (size_t k = 1; k <= 80; k += 17) {
1770         for (uint32_t m = 1; m <= 1; m++) {
1771           GemmMicrokernelTester()
1772             .mr(1)
1773             .nr(8)
1774             .kr(2)
1775             .sr(1)
1776             .m(m)
1777             .n(n)
1778             .k(k)
1779             .iterations(1)
1780             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1781         }
1782       }
1783     }
1784   }
1785 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,strided_cm_subtile)1786   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, strided_cm_subtile) {
1787     TEST_REQUIRES_ARM_NEON;
1788     for (size_t k = 1; k <= 80; k += 17) {
1789       for (uint32_t n = 1; n <= 8; n++) {
1790         for (uint32_t m = 1; m <= 1; m++) {
1791           GemmMicrokernelTester()
1792             .mr(1)
1793             .nr(8)
1794             .kr(2)
1795             .sr(1)
1796             .m(m)
1797             .n(n)
1798             .k(k)
1799             .cm_stride(11)
1800             .iterations(1)
1801             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1802         }
1803       }
1804     }
1805   }
1806 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,qmin)1807   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, qmin) {
1808     TEST_REQUIRES_ARM_NEON;
1809     GemmMicrokernelTester()
1810       .mr(1)
1811       .nr(8)
1812       .kr(2)
1813       .sr(1)
1814       .m(1)
1815       .n(8)
1816       .k(16)
1817       .qmin(128)
1818       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1819   }
1820 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,qmax)1821   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, qmax) {
1822     TEST_REQUIRES_ARM_NEON;
1823     GemmMicrokernelTester()
1824       .mr(1)
1825       .nr(8)
1826       .kr(2)
1827       .sr(1)
1828       .m(1)
1829       .n(8)
1830       .k(16)
1831       .qmax(128)
1832       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1833   }
1834 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R,strided_cm)1835   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEON_MLAL_LD1R, strided_cm) {
1836     TEST_REQUIRES_ARM_NEON;
1837     GemmMicrokernelTester()
1838       .mr(1)
1839       .nr(8)
1840       .kr(2)
1841       .sr(1)
1842       .m(1)
1843       .n(8)
1844       .k(16)
1845       .cm_stride(11)
1846       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
1847   }
1848 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1849 
1850 
1851 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_eq_16)1852   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_eq_16) {
1853     TEST_REQUIRES_ARM_NEON_V8;
1854     GemmMicrokernelTester()
1855       .mr(1)
1856       .nr(8)
1857       .kr(2)
1858       .sr(1)
1859       .m(1)
1860       .n(8)
1861       .k(16)
1862       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1863   }
1864 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,strided_cn)1865   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, strided_cn) {
1866     TEST_REQUIRES_ARM_NEON_V8;
1867     GemmMicrokernelTester()
1868       .mr(1)
1869       .nr(8)
1870       .kr(2)
1871       .sr(1)
1872       .m(1)
1873       .n(8)
1874       .k(16)
1875       .cn_stride(11)
1876       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1877   }
1878 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_eq_16_strided_a)1879   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_eq_16_strided_a) {
1880     TEST_REQUIRES_ARM_NEON_V8;
1881     GemmMicrokernelTester()
1882       .mr(1)
1883       .nr(8)
1884       .kr(2)
1885       .sr(1)
1886       .m(1)
1887       .n(8)
1888       .k(16)
1889       .a_stride(19)
1890       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1891   }
1892 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_eq_16_subtile)1893   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_eq_16_subtile) {
1894     TEST_REQUIRES_ARM_NEON_V8;
1895     for (uint32_t n = 1; n <= 8; n++) {
1896       for (uint32_t m = 1; m <= 1; m++) {
1897         GemmMicrokernelTester()
1898           .mr(1)
1899           .nr(8)
1900           .kr(2)
1901           .sr(1)
1902           .m(m)
1903           .n(n)
1904           .k(16)
1905           .iterations(1)
1906           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1907       }
1908     }
1909   }
1910 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_eq_16_subtile_m)1911   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_eq_16_subtile_m) {
1912     TEST_REQUIRES_ARM_NEON_V8;
1913     for (uint32_t m = 1; m <= 1; m++) {
1914       GemmMicrokernelTester()
1915         .mr(1)
1916         .nr(8)
1917         .kr(2)
1918         .sr(1)
1919         .m(m)
1920         .n(8)
1921         .k(16)
1922         .iterations(1)
1923         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1924     }
1925   }
1926 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_eq_16_subtile_n)1927   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_eq_16_subtile_n) {
1928     TEST_REQUIRES_ARM_NEON_V8;
1929     for (uint32_t n = 1; n <= 8; n++) {
1930       GemmMicrokernelTester()
1931         .mr(1)
1932         .nr(8)
1933         .kr(2)
1934         .sr(1)
1935         .m(1)
1936         .n(n)
1937         .k(16)
1938         .iterations(1)
1939         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1940     }
1941   }
1942 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_lt_16)1943   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_lt_16) {
1944     TEST_REQUIRES_ARM_NEON_V8;
1945     for (size_t k = 1; k < 16; k++) {
1946       GemmMicrokernelTester()
1947         .mr(1)
1948         .nr(8)
1949         .kr(2)
1950         .sr(1)
1951         .m(1)
1952         .n(8)
1953         .k(k)
1954         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1955     }
1956   }
1957 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_lt_16_strided_a)1958   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_lt_16_strided_a) {
1959     TEST_REQUIRES_ARM_NEON_V8;
1960     for (size_t k = 1; k < 16; k++) {
1961       GemmMicrokernelTester()
1962         .mr(1)
1963         .nr(8)
1964         .kr(2)
1965         .sr(1)
1966         .m(1)
1967         .n(8)
1968         .k(k)
1969         .a_stride(19)
1970         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1971     }
1972   }
1973 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_lt_16_subtile)1974   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_lt_16_subtile) {
1975     TEST_REQUIRES_ARM_NEON_V8;
1976     for (size_t k = 1; k < 16; k++) {
1977       for (uint32_t n = 1; n <= 8; n++) {
1978         for (uint32_t m = 1; m <= 1; m++) {
1979           GemmMicrokernelTester()
1980             .mr(1)
1981             .nr(8)
1982             .kr(2)
1983             .sr(1)
1984             .m(m)
1985             .n(n)
1986             .k(k)
1987             .iterations(1)
1988             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
1989         }
1990       }
1991     }
1992   }
1993 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_gt_16)1994   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_gt_16) {
1995     TEST_REQUIRES_ARM_NEON_V8;
1996     for (size_t k = 17; k < 32; k++) {
1997       GemmMicrokernelTester()
1998         .mr(1)
1999         .nr(8)
2000         .kr(2)
2001         .sr(1)
2002         .m(1)
2003         .n(8)
2004         .k(k)
2005         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2006     }
2007   }
2008 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_gt_16_strided_a)2009   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_gt_16_strided_a) {
2010     TEST_REQUIRES_ARM_NEON_V8;
2011     for (size_t k = 17; k < 32; k++) {
2012       GemmMicrokernelTester()
2013         .mr(1)
2014         .nr(8)
2015         .kr(2)
2016         .sr(1)
2017         .m(1)
2018         .n(8)
2019         .k(k)
2020         .a_stride(37)
2021         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2022     }
2023   }
2024 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_gt_16_subtile)2025   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_gt_16_subtile) {
2026     TEST_REQUIRES_ARM_NEON_V8;
2027     for (size_t k = 17; k < 32; k++) {
2028       for (uint32_t n = 1; n <= 8; n++) {
2029         for (uint32_t m = 1; m <= 1; m++) {
2030           GemmMicrokernelTester()
2031             .mr(1)
2032             .nr(8)
2033             .kr(2)
2034             .sr(1)
2035             .m(m)
2036             .n(n)
2037             .k(k)
2038             .iterations(1)
2039             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2040         }
2041       }
2042     }
2043   }
2044 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_div_16)2045   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_div_16) {
2046     TEST_REQUIRES_ARM_NEON_V8;
2047     for (size_t k = 32; k <= 160; k += 16) {
2048       GemmMicrokernelTester()
2049         .mr(1)
2050         .nr(8)
2051         .kr(2)
2052         .sr(1)
2053         .m(1)
2054         .n(8)
2055         .k(k)
2056         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2057     }
2058   }
2059 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_div_16_strided_a)2060   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_div_16_strided_a) {
2061     TEST_REQUIRES_ARM_NEON_V8;
2062     for (size_t k = 32; k <= 160; k += 16) {
2063       GemmMicrokernelTester()
2064         .mr(1)
2065         .nr(8)
2066         .kr(2)
2067         .sr(1)
2068         .m(1)
2069         .n(8)
2070         .k(k)
2071         .a_stride(163)
2072         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2073     }
2074   }
2075 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,k_div_16_subtile)2076   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, k_div_16_subtile) {
2077     TEST_REQUIRES_ARM_NEON_V8;
2078     for (size_t k = 32; k <= 160; k += 16) {
2079       for (uint32_t n = 1; n <= 8; n++) {
2080         for (uint32_t m = 1; m <= 1; m++) {
2081           GemmMicrokernelTester()
2082             .mr(1)
2083             .nr(8)
2084             .kr(2)
2085             .sr(1)
2086             .m(m)
2087             .n(n)
2088             .k(k)
2089             .iterations(1)
2090             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2091         }
2092       }
2093     }
2094   }
2095 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_gt_8)2096   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_gt_8) {
2097     TEST_REQUIRES_ARM_NEON_V8;
2098     for (uint32_t n = 9; n < 16; n++) {
2099       for (size_t k = 1; k <= 80; k += 17) {
2100         GemmMicrokernelTester()
2101           .mr(1)
2102           .nr(8)
2103           .kr(2)
2104           .sr(1)
2105           .m(1)
2106           .n(n)
2107           .k(k)
2108           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2109       }
2110     }
2111   }
2112 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_gt_8_strided_cn)2113   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_gt_8_strided_cn) {
2114     TEST_REQUIRES_ARM_NEON_V8;
2115     for (uint32_t n = 9; n < 16; n++) {
2116       for (size_t k = 1; k <= 80; k += 17) {
2117         GemmMicrokernelTester()
2118           .mr(1)
2119           .nr(8)
2120           .kr(2)
2121           .sr(1)
2122           .m(1)
2123           .n(n)
2124           .k(k)
2125           .cn_stride(11)
2126           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2127       }
2128     }
2129   }
2130 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_gt_8_strided_a)2131   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_gt_8_strided_a) {
2132     TEST_REQUIRES_ARM_NEON_V8;
2133     for (uint32_t n = 9; n < 16; n++) {
2134       for (size_t k = 1; k <= 80; k += 17) {
2135         GemmMicrokernelTester()
2136           .mr(1)
2137           .nr(8)
2138           .kr(2)
2139           .sr(1)
2140           .m(1)
2141           .n(n)
2142           .k(k)
2143           .a_stride(83)
2144           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2145       }
2146     }
2147   }
2148 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_gt_8_subtile)2149   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_gt_8_subtile) {
2150     TEST_REQUIRES_ARM_NEON_V8;
2151     for (uint32_t n = 9; n < 16; n++) {
2152       for (size_t k = 1; k <= 80; k += 17) {
2153         for (uint32_t m = 1; m <= 1; m++) {
2154           GemmMicrokernelTester()
2155             .mr(1)
2156             .nr(8)
2157             .kr(2)
2158             .sr(1)
2159             .m(m)
2160             .n(n)
2161             .k(k)
2162             .iterations(1)
2163             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2164         }
2165       }
2166     }
2167   }
2168 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_div_8)2169   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_div_8) {
2170     TEST_REQUIRES_ARM_NEON_V8;
2171     for (uint32_t n = 16; n <= 24; n += 8) {
2172       for (size_t k = 1; k <= 80; k += 17) {
2173         GemmMicrokernelTester()
2174           .mr(1)
2175           .nr(8)
2176           .kr(2)
2177           .sr(1)
2178           .m(1)
2179           .n(n)
2180           .k(k)
2181           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2182       }
2183     }
2184   }
2185 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_div_8_strided_cn)2186   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_div_8_strided_cn) {
2187     TEST_REQUIRES_ARM_NEON_V8;
2188     for (uint32_t n = 16; n <= 24; n += 8) {
2189       for (size_t k = 1; k <= 80; k += 17) {
2190         GemmMicrokernelTester()
2191           .mr(1)
2192           .nr(8)
2193           .kr(2)
2194           .sr(1)
2195           .m(1)
2196           .n(n)
2197           .k(k)
2198           .cn_stride(11)
2199           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2200       }
2201     }
2202   }
2203 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_div_8_strided_a)2204   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_div_8_strided_a) {
2205     TEST_REQUIRES_ARM_NEON_V8;
2206     for (uint32_t n = 16; n <= 24; n += 8) {
2207       for (size_t k = 1; k <= 80; k += 17) {
2208         GemmMicrokernelTester()
2209           .mr(1)
2210           .nr(8)
2211           .kr(2)
2212           .sr(1)
2213           .m(1)
2214           .n(n)
2215           .k(k)
2216           .a_stride(83)
2217           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2218       }
2219     }
2220   }
2221 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,n_div_8_subtile)2222   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, n_div_8_subtile) {
2223     TEST_REQUIRES_ARM_NEON_V8;
2224     for (uint32_t n = 16; n <= 24; n += 8) {
2225       for (size_t k = 1; k <= 80; k += 17) {
2226         for (uint32_t m = 1; m <= 1; m++) {
2227           GemmMicrokernelTester()
2228             .mr(1)
2229             .nr(8)
2230             .kr(2)
2231             .sr(1)
2232             .m(m)
2233             .n(n)
2234             .k(k)
2235             .iterations(1)
2236             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2237         }
2238       }
2239     }
2240   }
2241 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,strided_cm_subtile)2242   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, strided_cm_subtile) {
2243     TEST_REQUIRES_ARM_NEON_V8;
2244     for (size_t k = 1; k <= 80; k += 17) {
2245       for (uint32_t n = 1; n <= 8; n++) {
2246         for (uint32_t m = 1; m <= 1; m++) {
2247           GemmMicrokernelTester()
2248             .mr(1)
2249             .nr(8)
2250             .kr(2)
2251             .sr(1)
2252             .m(m)
2253             .n(n)
2254             .k(k)
2255             .cm_stride(11)
2256             .iterations(1)
2257             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2258         }
2259       }
2260     }
2261   }
2262 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,qmin)2263   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, qmin) {
2264     TEST_REQUIRES_ARM_NEON_V8;
2265     GemmMicrokernelTester()
2266       .mr(1)
2267       .nr(8)
2268       .kr(2)
2269       .sr(1)
2270       .m(1)
2271       .n(8)
2272       .k(16)
2273       .qmin(128)
2274       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2275   }
2276 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,qmax)2277   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, qmax) {
2278     TEST_REQUIRES_ARM_NEON_V8;
2279     GemmMicrokernelTester()
2280       .mr(1)
2281       .nr(8)
2282       .kr(2)
2283       .sr(1)
2284       .m(1)
2285       .n(8)
2286       .k(16)
2287       .qmax(128)
2288       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2289   }
2290 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R,strided_cm)2291   TEST(QS8_GEMM_MINMAX_FP32_1X8C2__NEONV8_MLAL_LD1R, strided_cm) {
2292     TEST_REQUIRES_ARM_NEON_V8;
2293     GemmMicrokernelTester()
2294       .mr(1)
2295       .nr(8)
2296       .kr(2)
2297       .sr(1)
2298       .m(1)
2299       .n(8)
2300       .k(16)
2301       .cm_stride(11)
2302       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2303   }
2304 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
2305 
2306 
2307 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_eq_16)2308   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_eq_16) {
2309     TEST_REQUIRES_ARM_NEON;
2310     GemmMicrokernelTester()
2311       .mr(1)
2312       .nr(8)
2313       .kr(2)
2314       .sr(4)
2315       .m(1)
2316       .n(8)
2317       .k(16)
2318       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2319   }
2320 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,strided_cn)2321   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, strided_cn) {
2322     TEST_REQUIRES_ARM_NEON;
2323     GemmMicrokernelTester()
2324       .mr(1)
2325       .nr(8)
2326       .kr(2)
2327       .sr(4)
2328       .m(1)
2329       .n(8)
2330       .k(16)
2331       .cn_stride(11)
2332       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2333   }
2334 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_eq_16_strided_a)2335   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_eq_16_strided_a) {
2336     TEST_REQUIRES_ARM_NEON;
2337     GemmMicrokernelTester()
2338       .mr(1)
2339       .nr(8)
2340       .kr(2)
2341       .sr(4)
2342       .m(1)
2343       .n(8)
2344       .k(16)
2345       .a_stride(19)
2346       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2347   }
2348 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_eq_16_subtile)2349   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_eq_16_subtile) {
2350     TEST_REQUIRES_ARM_NEON;
2351     for (uint32_t n = 1; n <= 8; n++) {
2352       for (uint32_t m = 1; m <= 1; m++) {
2353         GemmMicrokernelTester()
2354           .mr(1)
2355           .nr(8)
2356           .kr(2)
2357           .sr(4)
2358           .m(m)
2359           .n(n)
2360           .k(16)
2361           .iterations(1)
2362           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2363       }
2364     }
2365   }
2366 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_eq_16_subtile_m)2367   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_eq_16_subtile_m) {
2368     TEST_REQUIRES_ARM_NEON;
2369     for (uint32_t m = 1; m <= 1; m++) {
2370       GemmMicrokernelTester()
2371         .mr(1)
2372         .nr(8)
2373         .kr(2)
2374         .sr(4)
2375         .m(m)
2376         .n(8)
2377         .k(16)
2378         .iterations(1)
2379         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2380     }
2381   }
2382 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_eq_16_subtile_n)2383   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_eq_16_subtile_n) {
2384     TEST_REQUIRES_ARM_NEON;
2385     for (uint32_t n = 1; n <= 8; n++) {
2386       GemmMicrokernelTester()
2387         .mr(1)
2388         .nr(8)
2389         .kr(2)
2390         .sr(4)
2391         .m(1)
2392         .n(n)
2393         .k(16)
2394         .iterations(1)
2395         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2396     }
2397   }
2398 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_lt_16)2399   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_lt_16) {
2400     TEST_REQUIRES_ARM_NEON;
2401     for (size_t k = 1; k < 16; k++) {
2402       GemmMicrokernelTester()
2403         .mr(1)
2404         .nr(8)
2405         .kr(2)
2406         .sr(4)
2407         .m(1)
2408         .n(8)
2409         .k(k)
2410         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2411     }
2412   }
2413 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_lt_16_strided_a)2414   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_lt_16_strided_a) {
2415     TEST_REQUIRES_ARM_NEON;
2416     for (size_t k = 1; k < 16; k++) {
2417       GemmMicrokernelTester()
2418         .mr(1)
2419         .nr(8)
2420         .kr(2)
2421         .sr(4)
2422         .m(1)
2423         .n(8)
2424         .k(k)
2425         .a_stride(19)
2426         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2427     }
2428   }
2429 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_lt_16_subtile)2430   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_lt_16_subtile) {
2431     TEST_REQUIRES_ARM_NEON;
2432     for (size_t k = 1; k < 16; k++) {
2433       for (uint32_t n = 1; n <= 8; n++) {
2434         for (uint32_t m = 1; m <= 1; m++) {
2435           GemmMicrokernelTester()
2436             .mr(1)
2437             .nr(8)
2438             .kr(2)
2439             .sr(4)
2440             .m(m)
2441             .n(n)
2442             .k(k)
2443             .iterations(1)
2444             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2445         }
2446       }
2447     }
2448   }
2449 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_gt_16)2450   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_gt_16) {
2451     TEST_REQUIRES_ARM_NEON;
2452     for (size_t k = 17; k < 32; k++) {
2453       GemmMicrokernelTester()
2454         .mr(1)
2455         .nr(8)
2456         .kr(2)
2457         .sr(4)
2458         .m(1)
2459         .n(8)
2460         .k(k)
2461         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2462     }
2463   }
2464 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_gt_16_strided_a)2465   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_gt_16_strided_a) {
2466     TEST_REQUIRES_ARM_NEON;
2467     for (size_t k = 17; k < 32; k++) {
2468       GemmMicrokernelTester()
2469         .mr(1)
2470         .nr(8)
2471         .kr(2)
2472         .sr(4)
2473         .m(1)
2474         .n(8)
2475         .k(k)
2476         .a_stride(37)
2477         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2478     }
2479   }
2480 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_gt_16_subtile)2481   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_gt_16_subtile) {
2482     TEST_REQUIRES_ARM_NEON;
2483     for (size_t k = 17; k < 32; k++) {
2484       for (uint32_t n = 1; n <= 8; n++) {
2485         for (uint32_t m = 1; m <= 1; m++) {
2486           GemmMicrokernelTester()
2487             .mr(1)
2488             .nr(8)
2489             .kr(2)
2490             .sr(4)
2491             .m(m)
2492             .n(n)
2493             .k(k)
2494             .iterations(1)
2495             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2496         }
2497       }
2498     }
2499   }
2500 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_div_16)2501   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_div_16) {
2502     TEST_REQUIRES_ARM_NEON;
2503     for (size_t k = 32; k <= 160; k += 16) {
2504       GemmMicrokernelTester()
2505         .mr(1)
2506         .nr(8)
2507         .kr(2)
2508         .sr(4)
2509         .m(1)
2510         .n(8)
2511         .k(k)
2512         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2513     }
2514   }
2515 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_div_16_strided_a)2516   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_div_16_strided_a) {
2517     TEST_REQUIRES_ARM_NEON;
2518     for (size_t k = 32; k <= 160; k += 16) {
2519       GemmMicrokernelTester()
2520         .mr(1)
2521         .nr(8)
2522         .kr(2)
2523         .sr(4)
2524         .m(1)
2525         .n(8)
2526         .k(k)
2527         .a_stride(163)
2528         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2529     }
2530   }
2531 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,k_div_16_subtile)2532   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, k_div_16_subtile) {
2533     TEST_REQUIRES_ARM_NEON;
2534     for (size_t k = 32; k <= 160; k += 16) {
2535       for (uint32_t n = 1; n <= 8; n++) {
2536         for (uint32_t m = 1; m <= 1; m++) {
2537           GemmMicrokernelTester()
2538             .mr(1)
2539             .nr(8)
2540             .kr(2)
2541             .sr(4)
2542             .m(m)
2543             .n(n)
2544             .k(k)
2545             .iterations(1)
2546             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2547         }
2548       }
2549     }
2550   }
2551 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_gt_8)2552   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_gt_8) {
2553     TEST_REQUIRES_ARM_NEON;
2554     for (uint32_t n = 9; n < 16; n++) {
2555       for (size_t k = 1; k <= 80; k += 17) {
2556         GemmMicrokernelTester()
2557           .mr(1)
2558           .nr(8)
2559           .kr(2)
2560           .sr(4)
2561           .m(1)
2562           .n(n)
2563           .k(k)
2564           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2565       }
2566     }
2567   }
2568 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_gt_8_strided_cn)2569   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_gt_8_strided_cn) {
2570     TEST_REQUIRES_ARM_NEON;
2571     for (uint32_t n = 9; n < 16; n++) {
2572       for (size_t k = 1; k <= 80; k += 17) {
2573         GemmMicrokernelTester()
2574           .mr(1)
2575           .nr(8)
2576           .kr(2)
2577           .sr(4)
2578           .m(1)
2579           .n(n)
2580           .k(k)
2581           .cn_stride(11)
2582           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2583       }
2584     }
2585   }
2586 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_gt_8_strided_a)2587   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_gt_8_strided_a) {
2588     TEST_REQUIRES_ARM_NEON;
2589     for (uint32_t n = 9; n < 16; n++) {
2590       for (size_t k = 1; k <= 80; k += 17) {
2591         GemmMicrokernelTester()
2592           .mr(1)
2593           .nr(8)
2594           .kr(2)
2595           .sr(4)
2596           .m(1)
2597           .n(n)
2598           .k(k)
2599           .a_stride(83)
2600           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2601       }
2602     }
2603   }
2604 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_gt_8_subtile)2605   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_gt_8_subtile) {
2606     TEST_REQUIRES_ARM_NEON;
2607     for (uint32_t n = 9; n < 16; n++) {
2608       for (size_t k = 1; k <= 80; k += 17) {
2609         for (uint32_t m = 1; m <= 1; m++) {
2610           GemmMicrokernelTester()
2611             .mr(1)
2612             .nr(8)
2613             .kr(2)
2614             .sr(4)
2615             .m(m)
2616             .n(n)
2617             .k(k)
2618             .iterations(1)
2619             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2620         }
2621       }
2622     }
2623   }
2624 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_div_8)2625   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_div_8) {
2626     TEST_REQUIRES_ARM_NEON;
2627     for (uint32_t n = 16; n <= 24; n += 8) {
2628       for (size_t k = 1; k <= 80; k += 17) {
2629         GemmMicrokernelTester()
2630           .mr(1)
2631           .nr(8)
2632           .kr(2)
2633           .sr(4)
2634           .m(1)
2635           .n(n)
2636           .k(k)
2637           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2638       }
2639     }
2640   }
2641 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_div_8_strided_cn)2642   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_div_8_strided_cn) {
2643     TEST_REQUIRES_ARM_NEON;
2644     for (uint32_t n = 16; n <= 24; n += 8) {
2645       for (size_t k = 1; k <= 80; k += 17) {
2646         GemmMicrokernelTester()
2647           .mr(1)
2648           .nr(8)
2649           .kr(2)
2650           .sr(4)
2651           .m(1)
2652           .n(n)
2653           .k(k)
2654           .cn_stride(11)
2655           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2656       }
2657     }
2658   }
2659 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_div_8_strided_a)2660   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_div_8_strided_a) {
2661     TEST_REQUIRES_ARM_NEON;
2662     for (uint32_t n = 16; n <= 24; n += 8) {
2663       for (size_t k = 1; k <= 80; k += 17) {
2664         GemmMicrokernelTester()
2665           .mr(1)
2666           .nr(8)
2667           .kr(2)
2668           .sr(4)
2669           .m(1)
2670           .n(n)
2671           .k(k)
2672           .a_stride(83)
2673           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2674       }
2675     }
2676   }
2677 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,n_div_8_subtile)2678   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, n_div_8_subtile) {
2679     TEST_REQUIRES_ARM_NEON;
2680     for (uint32_t n = 16; n <= 24; n += 8) {
2681       for (size_t k = 1; k <= 80; k += 17) {
2682         for (uint32_t m = 1; m <= 1; m++) {
2683           GemmMicrokernelTester()
2684             .mr(1)
2685             .nr(8)
2686             .kr(2)
2687             .sr(4)
2688             .m(m)
2689             .n(n)
2690             .k(k)
2691             .iterations(1)
2692             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2693         }
2694       }
2695     }
2696   }
2697 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,strided_cm_subtile)2698   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, strided_cm_subtile) {
2699     TEST_REQUIRES_ARM_NEON;
2700     for (size_t k = 1; k <= 80; k += 17) {
2701       for (uint32_t n = 1; n <= 8; n++) {
2702         for (uint32_t m = 1; m <= 1; m++) {
2703           GemmMicrokernelTester()
2704             .mr(1)
2705             .nr(8)
2706             .kr(2)
2707             .sr(4)
2708             .m(m)
2709             .n(n)
2710             .k(k)
2711             .cm_stride(11)
2712             .iterations(1)
2713             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2714         }
2715       }
2716     }
2717   }
2718 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,qmin)2719   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, qmin) {
2720     TEST_REQUIRES_ARM_NEON;
2721     GemmMicrokernelTester()
2722       .mr(1)
2723       .nr(8)
2724       .kr(2)
2725       .sr(4)
2726       .m(1)
2727       .n(8)
2728       .k(16)
2729       .qmin(128)
2730       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2731   }
2732 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,qmax)2733   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, qmax) {
2734     TEST_REQUIRES_ARM_NEON;
2735     GemmMicrokernelTester()
2736       .mr(1)
2737       .nr(8)
2738       .kr(2)
2739       .sr(4)
2740       .m(1)
2741       .n(8)
2742       .k(16)
2743       .qmax(128)
2744       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2745   }
2746 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL,strided_cm)2747   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEON_MLAL, strided_cm) {
2748     TEST_REQUIRES_ARM_NEON;
2749     GemmMicrokernelTester()
2750       .mr(1)
2751       .nr(8)
2752       .kr(2)
2753       .sr(4)
2754       .m(1)
2755       .n(8)
2756       .k(16)
2757       .cm_stride(11)
2758       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
2759   }
2760 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
2761 
2762 
2763 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_eq_16)2764   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_eq_16) {
2765     TEST_REQUIRES_ARM_NEON_V8;
2766     GemmMicrokernelTester()
2767       .mr(1)
2768       .nr(8)
2769       .kr(2)
2770       .sr(4)
2771       .m(1)
2772       .n(8)
2773       .k(16)
2774       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2775   }
2776 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,strided_cn)2777   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, strided_cn) {
2778     TEST_REQUIRES_ARM_NEON_V8;
2779     GemmMicrokernelTester()
2780       .mr(1)
2781       .nr(8)
2782       .kr(2)
2783       .sr(4)
2784       .m(1)
2785       .n(8)
2786       .k(16)
2787       .cn_stride(11)
2788       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2789   }
2790 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_eq_16_strided_a)2791   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_eq_16_strided_a) {
2792     TEST_REQUIRES_ARM_NEON_V8;
2793     GemmMicrokernelTester()
2794       .mr(1)
2795       .nr(8)
2796       .kr(2)
2797       .sr(4)
2798       .m(1)
2799       .n(8)
2800       .k(16)
2801       .a_stride(19)
2802       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2803   }
2804 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_eq_16_subtile)2805   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_eq_16_subtile) {
2806     TEST_REQUIRES_ARM_NEON_V8;
2807     for (uint32_t n = 1; n <= 8; n++) {
2808       for (uint32_t m = 1; m <= 1; m++) {
2809         GemmMicrokernelTester()
2810           .mr(1)
2811           .nr(8)
2812           .kr(2)
2813           .sr(4)
2814           .m(m)
2815           .n(n)
2816           .k(16)
2817           .iterations(1)
2818           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2819       }
2820     }
2821   }
2822 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_eq_16_subtile_m)2823   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_eq_16_subtile_m) {
2824     TEST_REQUIRES_ARM_NEON_V8;
2825     for (uint32_t m = 1; m <= 1; m++) {
2826       GemmMicrokernelTester()
2827         .mr(1)
2828         .nr(8)
2829         .kr(2)
2830         .sr(4)
2831         .m(m)
2832         .n(8)
2833         .k(16)
2834         .iterations(1)
2835         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2836     }
2837   }
2838 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_eq_16_subtile_n)2839   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_eq_16_subtile_n) {
2840     TEST_REQUIRES_ARM_NEON_V8;
2841     for (uint32_t n = 1; n <= 8; n++) {
2842       GemmMicrokernelTester()
2843         .mr(1)
2844         .nr(8)
2845         .kr(2)
2846         .sr(4)
2847         .m(1)
2848         .n(n)
2849         .k(16)
2850         .iterations(1)
2851         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2852     }
2853   }
2854 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_lt_16)2855   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_lt_16) {
2856     TEST_REQUIRES_ARM_NEON_V8;
2857     for (size_t k = 1; k < 16; k++) {
2858       GemmMicrokernelTester()
2859         .mr(1)
2860         .nr(8)
2861         .kr(2)
2862         .sr(4)
2863         .m(1)
2864         .n(8)
2865         .k(k)
2866         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2867     }
2868   }
2869 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_lt_16_strided_a)2870   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_lt_16_strided_a) {
2871     TEST_REQUIRES_ARM_NEON_V8;
2872     for (size_t k = 1; k < 16; k++) {
2873       GemmMicrokernelTester()
2874         .mr(1)
2875         .nr(8)
2876         .kr(2)
2877         .sr(4)
2878         .m(1)
2879         .n(8)
2880         .k(k)
2881         .a_stride(19)
2882         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2883     }
2884   }
2885 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_lt_16_subtile)2886   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_lt_16_subtile) {
2887     TEST_REQUIRES_ARM_NEON_V8;
2888     for (size_t k = 1; k < 16; k++) {
2889       for (uint32_t n = 1; n <= 8; n++) {
2890         for (uint32_t m = 1; m <= 1; m++) {
2891           GemmMicrokernelTester()
2892             .mr(1)
2893             .nr(8)
2894             .kr(2)
2895             .sr(4)
2896             .m(m)
2897             .n(n)
2898             .k(k)
2899             .iterations(1)
2900             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2901         }
2902       }
2903     }
2904   }
2905 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_gt_16)2906   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_gt_16) {
2907     TEST_REQUIRES_ARM_NEON_V8;
2908     for (size_t k = 17; k < 32; k++) {
2909       GemmMicrokernelTester()
2910         .mr(1)
2911         .nr(8)
2912         .kr(2)
2913         .sr(4)
2914         .m(1)
2915         .n(8)
2916         .k(k)
2917         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2918     }
2919   }
2920 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_gt_16_strided_a)2921   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_gt_16_strided_a) {
2922     TEST_REQUIRES_ARM_NEON_V8;
2923     for (size_t k = 17; k < 32; k++) {
2924       GemmMicrokernelTester()
2925         .mr(1)
2926         .nr(8)
2927         .kr(2)
2928         .sr(4)
2929         .m(1)
2930         .n(8)
2931         .k(k)
2932         .a_stride(37)
2933         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2934     }
2935   }
2936 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_gt_16_subtile)2937   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_gt_16_subtile) {
2938     TEST_REQUIRES_ARM_NEON_V8;
2939     for (size_t k = 17; k < 32; k++) {
2940       for (uint32_t n = 1; n <= 8; n++) {
2941         for (uint32_t m = 1; m <= 1; m++) {
2942           GemmMicrokernelTester()
2943             .mr(1)
2944             .nr(8)
2945             .kr(2)
2946             .sr(4)
2947             .m(m)
2948             .n(n)
2949             .k(k)
2950             .iterations(1)
2951             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2952         }
2953       }
2954     }
2955   }
2956 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_div_16)2957   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_div_16) {
2958     TEST_REQUIRES_ARM_NEON_V8;
2959     for (size_t k = 32; k <= 160; k += 16) {
2960       GemmMicrokernelTester()
2961         .mr(1)
2962         .nr(8)
2963         .kr(2)
2964         .sr(4)
2965         .m(1)
2966         .n(8)
2967         .k(k)
2968         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2969     }
2970   }
2971 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_div_16_strided_a)2972   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_div_16_strided_a) {
2973     TEST_REQUIRES_ARM_NEON_V8;
2974     for (size_t k = 32; k <= 160; k += 16) {
2975       GemmMicrokernelTester()
2976         .mr(1)
2977         .nr(8)
2978         .kr(2)
2979         .sr(4)
2980         .m(1)
2981         .n(8)
2982         .k(k)
2983         .a_stride(163)
2984         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
2985     }
2986   }
2987 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,k_div_16_subtile)2988   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, k_div_16_subtile) {
2989     TEST_REQUIRES_ARM_NEON_V8;
2990     for (size_t k = 32; k <= 160; k += 16) {
2991       for (uint32_t n = 1; n <= 8; n++) {
2992         for (uint32_t m = 1; m <= 1; m++) {
2993           GemmMicrokernelTester()
2994             .mr(1)
2995             .nr(8)
2996             .kr(2)
2997             .sr(4)
2998             .m(m)
2999             .n(n)
3000             .k(k)
3001             .iterations(1)
3002             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3003         }
3004       }
3005     }
3006   }
3007 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_gt_8)3008   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_gt_8) {
3009     TEST_REQUIRES_ARM_NEON_V8;
3010     for (uint32_t n = 9; n < 16; n++) {
3011       for (size_t k = 1; k <= 80; k += 17) {
3012         GemmMicrokernelTester()
3013           .mr(1)
3014           .nr(8)
3015           .kr(2)
3016           .sr(4)
3017           .m(1)
3018           .n(n)
3019           .k(k)
3020           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3021       }
3022     }
3023   }
3024 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_gt_8_strided_cn)3025   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_gt_8_strided_cn) {
3026     TEST_REQUIRES_ARM_NEON_V8;
3027     for (uint32_t n = 9; n < 16; n++) {
3028       for (size_t k = 1; k <= 80; k += 17) {
3029         GemmMicrokernelTester()
3030           .mr(1)
3031           .nr(8)
3032           .kr(2)
3033           .sr(4)
3034           .m(1)
3035           .n(n)
3036           .k(k)
3037           .cn_stride(11)
3038           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3039       }
3040     }
3041   }
3042 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_gt_8_strided_a)3043   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_gt_8_strided_a) {
3044     TEST_REQUIRES_ARM_NEON_V8;
3045     for (uint32_t n = 9; n < 16; n++) {
3046       for (size_t k = 1; k <= 80; k += 17) {
3047         GemmMicrokernelTester()
3048           .mr(1)
3049           .nr(8)
3050           .kr(2)
3051           .sr(4)
3052           .m(1)
3053           .n(n)
3054           .k(k)
3055           .a_stride(83)
3056           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3057       }
3058     }
3059   }
3060 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_gt_8_subtile)3061   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_gt_8_subtile) {
3062     TEST_REQUIRES_ARM_NEON_V8;
3063     for (uint32_t n = 9; n < 16; n++) {
3064       for (size_t k = 1; k <= 80; k += 17) {
3065         for (uint32_t m = 1; m <= 1; m++) {
3066           GemmMicrokernelTester()
3067             .mr(1)
3068             .nr(8)
3069             .kr(2)
3070             .sr(4)
3071             .m(m)
3072             .n(n)
3073             .k(k)
3074             .iterations(1)
3075             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3076         }
3077       }
3078     }
3079   }
3080 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_div_8)3081   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_div_8) {
3082     TEST_REQUIRES_ARM_NEON_V8;
3083     for (uint32_t n = 16; n <= 24; n += 8) {
3084       for (size_t k = 1; k <= 80; k += 17) {
3085         GemmMicrokernelTester()
3086           .mr(1)
3087           .nr(8)
3088           .kr(2)
3089           .sr(4)
3090           .m(1)
3091           .n(n)
3092           .k(k)
3093           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3094       }
3095     }
3096   }
3097 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_div_8_strided_cn)3098   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_div_8_strided_cn) {
3099     TEST_REQUIRES_ARM_NEON_V8;
3100     for (uint32_t n = 16; n <= 24; n += 8) {
3101       for (size_t k = 1; k <= 80; k += 17) {
3102         GemmMicrokernelTester()
3103           .mr(1)
3104           .nr(8)
3105           .kr(2)
3106           .sr(4)
3107           .m(1)
3108           .n(n)
3109           .k(k)
3110           .cn_stride(11)
3111           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3112       }
3113     }
3114   }
3115 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_div_8_strided_a)3116   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_div_8_strided_a) {
3117     TEST_REQUIRES_ARM_NEON_V8;
3118     for (uint32_t n = 16; n <= 24; n += 8) {
3119       for (size_t k = 1; k <= 80; k += 17) {
3120         GemmMicrokernelTester()
3121           .mr(1)
3122           .nr(8)
3123           .kr(2)
3124           .sr(4)
3125           .m(1)
3126           .n(n)
3127           .k(k)
3128           .a_stride(83)
3129           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3130       }
3131     }
3132   }
3133 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,n_div_8_subtile)3134   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, n_div_8_subtile) {
3135     TEST_REQUIRES_ARM_NEON_V8;
3136     for (uint32_t n = 16; n <= 24; n += 8) {
3137       for (size_t k = 1; k <= 80; k += 17) {
3138         for (uint32_t m = 1; m <= 1; m++) {
3139           GemmMicrokernelTester()
3140             .mr(1)
3141             .nr(8)
3142             .kr(2)
3143             .sr(4)
3144             .m(m)
3145             .n(n)
3146             .k(k)
3147             .iterations(1)
3148             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3149         }
3150       }
3151     }
3152   }
3153 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,strided_cm_subtile)3154   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, strided_cm_subtile) {
3155     TEST_REQUIRES_ARM_NEON_V8;
3156     for (size_t k = 1; k <= 80; k += 17) {
3157       for (uint32_t n = 1; n <= 8; n++) {
3158         for (uint32_t m = 1; m <= 1; m++) {
3159           GemmMicrokernelTester()
3160             .mr(1)
3161             .nr(8)
3162             .kr(2)
3163             .sr(4)
3164             .m(m)
3165             .n(n)
3166             .k(k)
3167             .cm_stride(11)
3168             .iterations(1)
3169             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3170         }
3171       }
3172     }
3173   }
3174 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,qmin)3175   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, qmin) {
3176     TEST_REQUIRES_ARM_NEON_V8;
3177     GemmMicrokernelTester()
3178       .mr(1)
3179       .nr(8)
3180       .kr(2)
3181       .sr(4)
3182       .m(1)
3183       .n(8)
3184       .k(16)
3185       .qmin(128)
3186       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3187   }
3188 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,qmax)3189   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, qmax) {
3190     TEST_REQUIRES_ARM_NEON_V8;
3191     GemmMicrokernelTester()
3192       .mr(1)
3193       .nr(8)
3194       .kr(2)
3195       .sr(4)
3196       .m(1)
3197       .n(8)
3198       .k(16)
3199       .qmax(128)
3200       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3201   }
3202 
TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL,strided_cm)3203   TEST(QS8_GEMM_MINMAX_FP32_1X8C2S4__NEONV8_MLAL, strided_cm) {
3204     TEST_REQUIRES_ARM_NEON_V8;
3205     GemmMicrokernelTester()
3206       .mr(1)
3207       .nr(8)
3208       .kr(2)
3209       .sr(4)
3210       .m(1)
3211       .n(8)
3212       .k(16)
3213       .cm_stride(11)
3214       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
3215   }
3216 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
3217 
3218 
3219 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_eq_16)3220   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_eq_16) {
3221     TEST_REQUIRES_ARM_NEON;
3222     GemmMicrokernelTester()
3223       .mr(1)
3224       .nr(8)
3225       .kr(4)
3226       .sr(1)
3227       .m(1)
3228       .n(8)
3229       .k(16)
3230       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3231   }
3232 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,strided_cn)3233   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, strided_cn) {
3234     TEST_REQUIRES_ARM_NEON;
3235     GemmMicrokernelTester()
3236       .mr(1)
3237       .nr(8)
3238       .kr(4)
3239       .sr(1)
3240       .m(1)
3241       .n(8)
3242       .k(16)
3243       .cn_stride(11)
3244       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3245   }
3246 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_eq_16_strided_a)3247   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_eq_16_strided_a) {
3248     TEST_REQUIRES_ARM_NEON;
3249     GemmMicrokernelTester()
3250       .mr(1)
3251       .nr(8)
3252       .kr(4)
3253       .sr(1)
3254       .m(1)
3255       .n(8)
3256       .k(16)
3257       .a_stride(19)
3258       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3259   }
3260 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_eq_16_subtile)3261   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_eq_16_subtile) {
3262     TEST_REQUIRES_ARM_NEON;
3263     for (uint32_t n = 1; n <= 8; n++) {
3264       for (uint32_t m = 1; m <= 1; m++) {
3265         GemmMicrokernelTester()
3266           .mr(1)
3267           .nr(8)
3268           .kr(4)
3269           .sr(1)
3270           .m(m)
3271           .n(n)
3272           .k(16)
3273           .iterations(1)
3274           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3275       }
3276     }
3277   }
3278 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_eq_16_subtile_m)3279   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_eq_16_subtile_m) {
3280     TEST_REQUIRES_ARM_NEON;
3281     for (uint32_t m = 1; m <= 1; m++) {
3282       GemmMicrokernelTester()
3283         .mr(1)
3284         .nr(8)
3285         .kr(4)
3286         .sr(1)
3287         .m(m)
3288         .n(8)
3289         .k(16)
3290         .iterations(1)
3291         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3292     }
3293   }
3294 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_eq_16_subtile_n)3295   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_eq_16_subtile_n) {
3296     TEST_REQUIRES_ARM_NEON;
3297     for (uint32_t n = 1; n <= 8; n++) {
3298       GemmMicrokernelTester()
3299         .mr(1)
3300         .nr(8)
3301         .kr(4)
3302         .sr(1)
3303         .m(1)
3304         .n(n)
3305         .k(16)
3306         .iterations(1)
3307         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3308     }
3309   }
3310 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_lt_16)3311   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_lt_16) {
3312     TEST_REQUIRES_ARM_NEON;
3313     for (size_t k = 1; k < 16; k++) {
3314       GemmMicrokernelTester()
3315         .mr(1)
3316         .nr(8)
3317         .kr(4)
3318         .sr(1)
3319         .m(1)
3320         .n(8)
3321         .k(k)
3322         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3323     }
3324   }
3325 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_lt_16_strided_a)3326   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_lt_16_strided_a) {
3327     TEST_REQUIRES_ARM_NEON;
3328     for (size_t k = 1; k < 16; k++) {
3329       GemmMicrokernelTester()
3330         .mr(1)
3331         .nr(8)
3332         .kr(4)
3333         .sr(1)
3334         .m(1)
3335         .n(8)
3336         .k(k)
3337         .a_stride(19)
3338         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3339     }
3340   }
3341 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_lt_16_subtile)3342   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_lt_16_subtile) {
3343     TEST_REQUIRES_ARM_NEON;
3344     for (size_t k = 1; k < 16; k++) {
3345       for (uint32_t n = 1; n <= 8; n++) {
3346         for (uint32_t m = 1; m <= 1; m++) {
3347           GemmMicrokernelTester()
3348             .mr(1)
3349             .nr(8)
3350             .kr(4)
3351             .sr(1)
3352             .m(m)
3353             .n(n)
3354             .k(k)
3355             .iterations(1)
3356             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3357         }
3358       }
3359     }
3360   }
3361 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_gt_16)3362   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_gt_16) {
3363     TEST_REQUIRES_ARM_NEON;
3364     for (size_t k = 17; k < 32; k++) {
3365       GemmMicrokernelTester()
3366         .mr(1)
3367         .nr(8)
3368         .kr(4)
3369         .sr(1)
3370         .m(1)
3371         .n(8)
3372         .k(k)
3373         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3374     }
3375   }
3376 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_gt_16_strided_a)3377   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_gt_16_strided_a) {
3378     TEST_REQUIRES_ARM_NEON;
3379     for (size_t k = 17; k < 32; k++) {
3380       GemmMicrokernelTester()
3381         .mr(1)
3382         .nr(8)
3383         .kr(4)
3384         .sr(1)
3385         .m(1)
3386         .n(8)
3387         .k(k)
3388         .a_stride(37)
3389         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3390     }
3391   }
3392 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_gt_16_subtile)3393   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_gt_16_subtile) {
3394     TEST_REQUIRES_ARM_NEON;
3395     for (size_t k = 17; k < 32; k++) {
3396       for (uint32_t n = 1; n <= 8; n++) {
3397         for (uint32_t m = 1; m <= 1; m++) {
3398           GemmMicrokernelTester()
3399             .mr(1)
3400             .nr(8)
3401             .kr(4)
3402             .sr(1)
3403             .m(m)
3404             .n(n)
3405             .k(k)
3406             .iterations(1)
3407             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3408         }
3409       }
3410     }
3411   }
3412 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_div_16)3413   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_div_16) {
3414     TEST_REQUIRES_ARM_NEON;
3415     for (size_t k = 32; k <= 160; k += 16) {
3416       GemmMicrokernelTester()
3417         .mr(1)
3418         .nr(8)
3419         .kr(4)
3420         .sr(1)
3421         .m(1)
3422         .n(8)
3423         .k(k)
3424         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3425     }
3426   }
3427 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_div_16_strided_a)3428   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_div_16_strided_a) {
3429     TEST_REQUIRES_ARM_NEON;
3430     for (size_t k = 32; k <= 160; k += 16) {
3431       GemmMicrokernelTester()
3432         .mr(1)
3433         .nr(8)
3434         .kr(4)
3435         .sr(1)
3436         .m(1)
3437         .n(8)
3438         .k(k)
3439         .a_stride(163)
3440         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3441     }
3442   }
3443 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,k_div_16_subtile)3444   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, k_div_16_subtile) {
3445     TEST_REQUIRES_ARM_NEON;
3446     for (size_t k = 32; k <= 160; k += 16) {
3447       for (uint32_t n = 1; n <= 8; n++) {
3448         for (uint32_t m = 1; m <= 1; m++) {
3449           GemmMicrokernelTester()
3450             .mr(1)
3451             .nr(8)
3452             .kr(4)
3453             .sr(1)
3454             .m(m)
3455             .n(n)
3456             .k(k)
3457             .iterations(1)
3458             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3459         }
3460       }
3461     }
3462   }
3463 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_gt_8)3464   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_gt_8) {
3465     TEST_REQUIRES_ARM_NEON;
3466     for (uint32_t n = 9; n < 16; n++) {
3467       for (size_t k = 1; k <= 80; k += 17) {
3468         GemmMicrokernelTester()
3469           .mr(1)
3470           .nr(8)
3471           .kr(4)
3472           .sr(1)
3473           .m(1)
3474           .n(n)
3475           .k(k)
3476           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3477       }
3478     }
3479   }
3480 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_gt_8_strided_cn)3481   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_gt_8_strided_cn) {
3482     TEST_REQUIRES_ARM_NEON;
3483     for (uint32_t n = 9; n < 16; n++) {
3484       for (size_t k = 1; k <= 80; k += 17) {
3485         GemmMicrokernelTester()
3486           .mr(1)
3487           .nr(8)
3488           .kr(4)
3489           .sr(1)
3490           .m(1)
3491           .n(n)
3492           .k(k)
3493           .cn_stride(11)
3494           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3495       }
3496     }
3497   }
3498 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_gt_8_strided_a)3499   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_gt_8_strided_a) {
3500     TEST_REQUIRES_ARM_NEON;
3501     for (uint32_t n = 9; n < 16; n++) {
3502       for (size_t k = 1; k <= 80; k += 17) {
3503         GemmMicrokernelTester()
3504           .mr(1)
3505           .nr(8)
3506           .kr(4)
3507           .sr(1)
3508           .m(1)
3509           .n(n)
3510           .k(k)
3511           .a_stride(83)
3512           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3513       }
3514     }
3515   }
3516 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_gt_8_subtile)3517   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_gt_8_subtile) {
3518     TEST_REQUIRES_ARM_NEON;
3519     for (uint32_t n = 9; n < 16; n++) {
3520       for (size_t k = 1; k <= 80; k += 17) {
3521         for (uint32_t m = 1; m <= 1; m++) {
3522           GemmMicrokernelTester()
3523             .mr(1)
3524             .nr(8)
3525             .kr(4)
3526             .sr(1)
3527             .m(m)
3528             .n(n)
3529             .k(k)
3530             .iterations(1)
3531             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3532         }
3533       }
3534     }
3535   }
3536 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_div_8)3537   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_div_8) {
3538     TEST_REQUIRES_ARM_NEON;
3539     for (uint32_t n = 16; n <= 24; n += 8) {
3540       for (size_t k = 1; k <= 80; k += 17) {
3541         GemmMicrokernelTester()
3542           .mr(1)
3543           .nr(8)
3544           .kr(4)
3545           .sr(1)
3546           .m(1)
3547           .n(n)
3548           .k(k)
3549           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3550       }
3551     }
3552   }
3553 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_div_8_strided_cn)3554   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_div_8_strided_cn) {
3555     TEST_REQUIRES_ARM_NEON;
3556     for (uint32_t n = 16; n <= 24; n += 8) {
3557       for (size_t k = 1; k <= 80; k += 17) {
3558         GemmMicrokernelTester()
3559           .mr(1)
3560           .nr(8)
3561           .kr(4)
3562           .sr(1)
3563           .m(1)
3564           .n(n)
3565           .k(k)
3566           .cn_stride(11)
3567           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3568       }
3569     }
3570   }
3571 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_div_8_strided_a)3572   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_div_8_strided_a) {
3573     TEST_REQUIRES_ARM_NEON;
3574     for (uint32_t n = 16; n <= 24; n += 8) {
3575       for (size_t k = 1; k <= 80; k += 17) {
3576         GemmMicrokernelTester()
3577           .mr(1)
3578           .nr(8)
3579           .kr(4)
3580           .sr(1)
3581           .m(1)
3582           .n(n)
3583           .k(k)
3584           .a_stride(83)
3585           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3586       }
3587     }
3588   }
3589 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,n_div_8_subtile)3590   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, n_div_8_subtile) {
3591     TEST_REQUIRES_ARM_NEON;
3592     for (uint32_t n = 16; n <= 24; n += 8) {
3593       for (size_t k = 1; k <= 80; k += 17) {
3594         for (uint32_t m = 1; m <= 1; m++) {
3595           GemmMicrokernelTester()
3596             .mr(1)
3597             .nr(8)
3598             .kr(4)
3599             .sr(1)
3600             .m(m)
3601             .n(n)
3602             .k(k)
3603             .iterations(1)
3604             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3605         }
3606       }
3607     }
3608   }
3609 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,strided_cm_subtile)3610   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, strided_cm_subtile) {
3611     TEST_REQUIRES_ARM_NEON;
3612     for (size_t k = 1; k <= 80; k += 17) {
3613       for (uint32_t n = 1; n <= 8; n++) {
3614         for (uint32_t m = 1; m <= 1; m++) {
3615           GemmMicrokernelTester()
3616             .mr(1)
3617             .nr(8)
3618             .kr(4)
3619             .sr(1)
3620             .m(m)
3621             .n(n)
3622             .k(k)
3623             .cm_stride(11)
3624             .iterations(1)
3625             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3626         }
3627       }
3628     }
3629   }
3630 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,qmin)3631   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, qmin) {
3632     TEST_REQUIRES_ARM_NEON;
3633     GemmMicrokernelTester()
3634       .mr(1)
3635       .nr(8)
3636       .kr(4)
3637       .sr(1)
3638       .m(1)
3639       .n(8)
3640       .k(16)
3641       .qmin(128)
3642       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3643   }
3644 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,qmax)3645   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, qmax) {
3646     TEST_REQUIRES_ARM_NEON;
3647     GemmMicrokernelTester()
3648       .mr(1)
3649       .nr(8)
3650       .kr(4)
3651       .sr(1)
3652       .m(1)
3653       .n(8)
3654       .k(16)
3655       .qmax(128)
3656       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3657   }
3658 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP,strided_cm)3659   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_DUP, strided_cm) {
3660     TEST_REQUIRES_ARM_NEON;
3661     GemmMicrokernelTester()
3662       .mr(1)
3663       .nr(8)
3664       .kr(4)
3665       .sr(1)
3666       .m(1)
3667       .n(8)
3668       .k(16)
3669       .cm_stride(11)
3670       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3671   }
3672 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
3673 
3674 
3675 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_eq_16)3676   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_eq_16) {
3677     TEST_REQUIRES_ARM_NEON;
3678     GemmMicrokernelTester()
3679       .mr(1)
3680       .nr(8)
3681       .kr(4)
3682       .sr(1)
3683       .m(1)
3684       .n(8)
3685       .k(16)
3686       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3687   }
3688 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,strided_cn)3689   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, strided_cn) {
3690     TEST_REQUIRES_ARM_NEON;
3691     GemmMicrokernelTester()
3692       .mr(1)
3693       .nr(8)
3694       .kr(4)
3695       .sr(1)
3696       .m(1)
3697       .n(8)
3698       .k(16)
3699       .cn_stride(11)
3700       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3701   }
3702 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_eq_16_strided_a)3703   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_eq_16_strided_a) {
3704     TEST_REQUIRES_ARM_NEON;
3705     GemmMicrokernelTester()
3706       .mr(1)
3707       .nr(8)
3708       .kr(4)
3709       .sr(1)
3710       .m(1)
3711       .n(8)
3712       .k(16)
3713       .a_stride(19)
3714       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3715   }
3716 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_eq_16_subtile)3717   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_eq_16_subtile) {
3718     TEST_REQUIRES_ARM_NEON;
3719     for (uint32_t n = 1; n <= 8; n++) {
3720       for (uint32_t m = 1; m <= 1; m++) {
3721         GemmMicrokernelTester()
3722           .mr(1)
3723           .nr(8)
3724           .kr(4)
3725           .sr(1)
3726           .m(m)
3727           .n(n)
3728           .k(16)
3729           .iterations(1)
3730           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3731       }
3732     }
3733   }
3734 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_eq_16_subtile_m)3735   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_eq_16_subtile_m) {
3736     TEST_REQUIRES_ARM_NEON;
3737     for (uint32_t m = 1; m <= 1; m++) {
3738       GemmMicrokernelTester()
3739         .mr(1)
3740         .nr(8)
3741         .kr(4)
3742         .sr(1)
3743         .m(m)
3744         .n(8)
3745         .k(16)
3746         .iterations(1)
3747         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3748     }
3749   }
3750 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_eq_16_subtile_n)3751   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_eq_16_subtile_n) {
3752     TEST_REQUIRES_ARM_NEON;
3753     for (uint32_t n = 1; n <= 8; n++) {
3754       GemmMicrokernelTester()
3755         .mr(1)
3756         .nr(8)
3757         .kr(4)
3758         .sr(1)
3759         .m(1)
3760         .n(n)
3761         .k(16)
3762         .iterations(1)
3763         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3764     }
3765   }
3766 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_lt_16)3767   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_lt_16) {
3768     TEST_REQUIRES_ARM_NEON;
3769     for (size_t k = 1; k < 16; k++) {
3770       GemmMicrokernelTester()
3771         .mr(1)
3772         .nr(8)
3773         .kr(4)
3774         .sr(1)
3775         .m(1)
3776         .n(8)
3777         .k(k)
3778         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3779     }
3780   }
3781 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_lt_16_strided_a)3782   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_lt_16_strided_a) {
3783     TEST_REQUIRES_ARM_NEON;
3784     for (size_t k = 1; k < 16; k++) {
3785       GemmMicrokernelTester()
3786         .mr(1)
3787         .nr(8)
3788         .kr(4)
3789         .sr(1)
3790         .m(1)
3791         .n(8)
3792         .k(k)
3793         .a_stride(19)
3794         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3795     }
3796   }
3797 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_lt_16_subtile)3798   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_lt_16_subtile) {
3799     TEST_REQUIRES_ARM_NEON;
3800     for (size_t k = 1; k < 16; k++) {
3801       for (uint32_t n = 1; n <= 8; n++) {
3802         for (uint32_t m = 1; m <= 1; m++) {
3803           GemmMicrokernelTester()
3804             .mr(1)
3805             .nr(8)
3806             .kr(4)
3807             .sr(1)
3808             .m(m)
3809             .n(n)
3810             .k(k)
3811             .iterations(1)
3812             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3813         }
3814       }
3815     }
3816   }
3817 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_gt_16)3818   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_gt_16) {
3819     TEST_REQUIRES_ARM_NEON;
3820     for (size_t k = 17; k < 32; k++) {
3821       GemmMicrokernelTester()
3822         .mr(1)
3823         .nr(8)
3824         .kr(4)
3825         .sr(1)
3826         .m(1)
3827         .n(8)
3828         .k(k)
3829         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3830     }
3831   }
3832 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_gt_16_strided_a)3833   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_gt_16_strided_a) {
3834     TEST_REQUIRES_ARM_NEON;
3835     for (size_t k = 17; k < 32; k++) {
3836       GemmMicrokernelTester()
3837         .mr(1)
3838         .nr(8)
3839         .kr(4)
3840         .sr(1)
3841         .m(1)
3842         .n(8)
3843         .k(k)
3844         .a_stride(37)
3845         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3846     }
3847   }
3848 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_gt_16_subtile)3849   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_gt_16_subtile) {
3850     TEST_REQUIRES_ARM_NEON;
3851     for (size_t k = 17; k < 32; k++) {
3852       for (uint32_t n = 1; n <= 8; n++) {
3853         for (uint32_t m = 1; m <= 1; m++) {
3854           GemmMicrokernelTester()
3855             .mr(1)
3856             .nr(8)
3857             .kr(4)
3858             .sr(1)
3859             .m(m)
3860             .n(n)
3861             .k(k)
3862             .iterations(1)
3863             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3864         }
3865       }
3866     }
3867   }
3868 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_div_16)3869   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_div_16) {
3870     TEST_REQUIRES_ARM_NEON;
3871     for (size_t k = 32; k <= 160; k += 16) {
3872       GemmMicrokernelTester()
3873         .mr(1)
3874         .nr(8)
3875         .kr(4)
3876         .sr(1)
3877         .m(1)
3878         .n(8)
3879         .k(k)
3880         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3881     }
3882   }
3883 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_div_16_strided_a)3884   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_div_16_strided_a) {
3885     TEST_REQUIRES_ARM_NEON;
3886     for (size_t k = 32; k <= 160; k += 16) {
3887       GemmMicrokernelTester()
3888         .mr(1)
3889         .nr(8)
3890         .kr(4)
3891         .sr(1)
3892         .m(1)
3893         .n(8)
3894         .k(k)
3895         .a_stride(163)
3896         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3897     }
3898   }
3899 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,k_div_16_subtile)3900   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, k_div_16_subtile) {
3901     TEST_REQUIRES_ARM_NEON;
3902     for (size_t k = 32; k <= 160; k += 16) {
3903       for (uint32_t n = 1; n <= 8; n++) {
3904         for (uint32_t m = 1; m <= 1; m++) {
3905           GemmMicrokernelTester()
3906             .mr(1)
3907             .nr(8)
3908             .kr(4)
3909             .sr(1)
3910             .m(m)
3911             .n(n)
3912             .k(k)
3913             .iterations(1)
3914             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3915         }
3916       }
3917     }
3918   }
3919 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_gt_8)3920   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_gt_8) {
3921     TEST_REQUIRES_ARM_NEON;
3922     for (uint32_t n = 9; n < 16; n++) {
3923       for (size_t k = 1; k <= 80; k += 17) {
3924         GemmMicrokernelTester()
3925           .mr(1)
3926           .nr(8)
3927           .kr(4)
3928           .sr(1)
3929           .m(1)
3930           .n(n)
3931           .k(k)
3932           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3933       }
3934     }
3935   }
3936 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_gt_8_strided_cn)3937   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_gt_8_strided_cn) {
3938     TEST_REQUIRES_ARM_NEON;
3939     for (uint32_t n = 9; n < 16; n++) {
3940       for (size_t k = 1; k <= 80; k += 17) {
3941         GemmMicrokernelTester()
3942           .mr(1)
3943           .nr(8)
3944           .kr(4)
3945           .sr(1)
3946           .m(1)
3947           .n(n)
3948           .k(k)
3949           .cn_stride(11)
3950           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3951       }
3952     }
3953   }
3954 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_gt_8_strided_a)3955   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_gt_8_strided_a) {
3956     TEST_REQUIRES_ARM_NEON;
3957     for (uint32_t n = 9; n < 16; n++) {
3958       for (size_t k = 1; k <= 80; k += 17) {
3959         GemmMicrokernelTester()
3960           .mr(1)
3961           .nr(8)
3962           .kr(4)
3963           .sr(1)
3964           .m(1)
3965           .n(n)
3966           .k(k)
3967           .a_stride(83)
3968           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3969       }
3970     }
3971   }
3972 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_gt_8_subtile)3973   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_gt_8_subtile) {
3974     TEST_REQUIRES_ARM_NEON;
3975     for (uint32_t n = 9; n < 16; n++) {
3976       for (size_t k = 1; k <= 80; k += 17) {
3977         for (uint32_t m = 1; m <= 1; m++) {
3978           GemmMicrokernelTester()
3979             .mr(1)
3980             .nr(8)
3981             .kr(4)
3982             .sr(1)
3983             .m(m)
3984             .n(n)
3985             .k(k)
3986             .iterations(1)
3987             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
3988         }
3989       }
3990     }
3991   }
3992 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_div_8)3993   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_div_8) {
3994     TEST_REQUIRES_ARM_NEON;
3995     for (uint32_t n = 16; n <= 24; n += 8) {
3996       for (size_t k = 1; k <= 80; k += 17) {
3997         GemmMicrokernelTester()
3998           .mr(1)
3999           .nr(8)
4000           .kr(4)
4001           .sr(1)
4002           .m(1)
4003           .n(n)
4004           .k(k)
4005           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4006       }
4007     }
4008   }
4009 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_div_8_strided_cn)4010   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_div_8_strided_cn) {
4011     TEST_REQUIRES_ARM_NEON;
4012     for (uint32_t n = 16; n <= 24; n += 8) {
4013       for (size_t k = 1; k <= 80; k += 17) {
4014         GemmMicrokernelTester()
4015           .mr(1)
4016           .nr(8)
4017           .kr(4)
4018           .sr(1)
4019           .m(1)
4020           .n(n)
4021           .k(k)
4022           .cn_stride(11)
4023           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4024       }
4025     }
4026   }
4027 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_div_8_strided_a)4028   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_div_8_strided_a) {
4029     TEST_REQUIRES_ARM_NEON;
4030     for (uint32_t n = 16; n <= 24; n += 8) {
4031       for (size_t k = 1; k <= 80; k += 17) {
4032         GemmMicrokernelTester()
4033           .mr(1)
4034           .nr(8)
4035           .kr(4)
4036           .sr(1)
4037           .m(1)
4038           .n(n)
4039           .k(k)
4040           .a_stride(83)
4041           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4042       }
4043     }
4044   }
4045 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,n_div_8_subtile)4046   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, n_div_8_subtile) {
4047     TEST_REQUIRES_ARM_NEON;
4048     for (uint32_t n = 16; n <= 24; n += 8) {
4049       for (size_t k = 1; k <= 80; k += 17) {
4050         for (uint32_t m = 1; m <= 1; m++) {
4051           GemmMicrokernelTester()
4052             .mr(1)
4053             .nr(8)
4054             .kr(4)
4055             .sr(1)
4056             .m(m)
4057             .n(n)
4058             .k(k)
4059             .iterations(1)
4060             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4061         }
4062       }
4063     }
4064   }
4065 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,strided_cm_subtile)4066   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, strided_cm_subtile) {
4067     TEST_REQUIRES_ARM_NEON;
4068     for (size_t k = 1; k <= 80; k += 17) {
4069       for (uint32_t n = 1; n <= 8; n++) {
4070         for (uint32_t m = 1; m <= 1; m++) {
4071           GemmMicrokernelTester()
4072             .mr(1)
4073             .nr(8)
4074             .kr(4)
4075             .sr(1)
4076             .m(m)
4077             .n(n)
4078             .k(k)
4079             .cm_stride(11)
4080             .iterations(1)
4081             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4082         }
4083       }
4084     }
4085   }
4086 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,qmin)4087   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, qmin) {
4088     TEST_REQUIRES_ARM_NEON;
4089     GemmMicrokernelTester()
4090       .mr(1)
4091       .nr(8)
4092       .kr(4)
4093       .sr(1)
4094       .m(1)
4095       .n(8)
4096       .k(16)
4097       .qmin(128)
4098       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4099   }
4100 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,qmax)4101   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, qmax) {
4102     TEST_REQUIRES_ARM_NEON;
4103     GemmMicrokernelTester()
4104       .mr(1)
4105       .nr(8)
4106       .kr(4)
4107       .sr(1)
4108       .m(1)
4109       .n(8)
4110       .k(16)
4111       .qmax(128)
4112       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4113   }
4114 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R,strided_cm)4115   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEON_MLAL_LD1R, strided_cm) {
4116     TEST_REQUIRES_ARM_NEON;
4117     GemmMicrokernelTester()
4118       .mr(1)
4119       .nr(8)
4120       .kr(4)
4121       .sr(1)
4122       .m(1)
4123       .n(8)
4124       .k(16)
4125       .cm_stride(11)
4126       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neon_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
4127   }
4128 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
4129 
4130 
4131 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_eq_16)4132   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_eq_16) {
4133     TEST_REQUIRES_ARM_NEON_V8;
4134     GemmMicrokernelTester()
4135       .mr(1)
4136       .nr(8)
4137       .kr(4)
4138       .sr(1)
4139       .m(1)
4140       .n(8)
4141       .k(16)
4142       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4143   }
4144 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,strided_cn)4145   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, strided_cn) {
4146     TEST_REQUIRES_ARM_NEON_V8;
4147     GemmMicrokernelTester()
4148       .mr(1)
4149       .nr(8)
4150       .kr(4)
4151       .sr(1)
4152       .m(1)
4153       .n(8)
4154       .k(16)
4155       .cn_stride(11)
4156       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4157   }
4158 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_eq_16_strided_a)4159   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_eq_16_strided_a) {
4160     TEST_REQUIRES_ARM_NEON_V8;
4161     GemmMicrokernelTester()
4162       .mr(1)
4163       .nr(8)
4164       .kr(4)
4165       .sr(1)
4166       .m(1)
4167       .n(8)
4168       .k(16)
4169       .a_stride(19)
4170       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4171   }
4172 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile)4173   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile) {
4174     TEST_REQUIRES_ARM_NEON_V8;
4175     for (uint32_t n = 1; n <= 8; n++) {
4176       for (uint32_t m = 1; m <= 1; m++) {
4177         GemmMicrokernelTester()
4178           .mr(1)
4179           .nr(8)
4180           .kr(4)
4181           .sr(1)
4182           .m(m)
4183           .n(n)
4184           .k(16)
4185           .iterations(1)
4186           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4187       }
4188     }
4189   }
4190 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile_m)4191   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile_m) {
4192     TEST_REQUIRES_ARM_NEON_V8;
4193     for (uint32_t m = 1; m <= 1; m++) {
4194       GemmMicrokernelTester()
4195         .mr(1)
4196         .nr(8)
4197         .kr(4)
4198         .sr(1)
4199         .m(m)
4200         .n(8)
4201         .k(16)
4202         .iterations(1)
4203         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4204     }
4205   }
4206 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile_n)4207   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile_n) {
4208     TEST_REQUIRES_ARM_NEON_V8;
4209     for (uint32_t n = 1; n <= 8; n++) {
4210       GemmMicrokernelTester()
4211         .mr(1)
4212         .nr(8)
4213         .kr(4)
4214         .sr(1)
4215         .m(1)
4216         .n(n)
4217         .k(16)
4218         .iterations(1)
4219         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4220     }
4221   }
4222 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_lt_16)4223   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_lt_16) {
4224     TEST_REQUIRES_ARM_NEON_V8;
4225     for (size_t k = 1; k < 16; k++) {
4226       GemmMicrokernelTester()
4227         .mr(1)
4228         .nr(8)
4229         .kr(4)
4230         .sr(1)
4231         .m(1)
4232         .n(8)
4233         .k(k)
4234         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4235     }
4236   }
4237 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_lt_16_strided_a)4238   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_lt_16_strided_a) {
4239     TEST_REQUIRES_ARM_NEON_V8;
4240     for (size_t k = 1; k < 16; k++) {
4241       GemmMicrokernelTester()
4242         .mr(1)
4243         .nr(8)
4244         .kr(4)
4245         .sr(1)
4246         .m(1)
4247         .n(8)
4248         .k(k)
4249         .a_stride(19)
4250         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4251     }
4252   }
4253 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_lt_16_subtile)4254   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_lt_16_subtile) {
4255     TEST_REQUIRES_ARM_NEON_V8;
4256     for (size_t k = 1; k < 16; k++) {
4257       for (uint32_t n = 1; n <= 8; n++) {
4258         for (uint32_t m = 1; m <= 1; m++) {
4259           GemmMicrokernelTester()
4260             .mr(1)
4261             .nr(8)
4262             .kr(4)
4263             .sr(1)
4264             .m(m)
4265             .n(n)
4266             .k(k)
4267             .iterations(1)
4268             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4269         }
4270       }
4271     }
4272   }
4273 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_gt_16)4274   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_gt_16) {
4275     TEST_REQUIRES_ARM_NEON_V8;
4276     for (size_t k = 17; k < 32; k++) {
4277       GemmMicrokernelTester()
4278         .mr(1)
4279         .nr(8)
4280         .kr(4)
4281         .sr(1)
4282         .m(1)
4283         .n(8)
4284         .k(k)
4285         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4286     }
4287   }
4288 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_gt_16_strided_a)4289   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_gt_16_strided_a) {
4290     TEST_REQUIRES_ARM_NEON_V8;
4291     for (size_t k = 17; k < 32; k++) {
4292       GemmMicrokernelTester()
4293         .mr(1)
4294         .nr(8)
4295         .kr(4)
4296         .sr(1)
4297         .m(1)
4298         .n(8)
4299         .k(k)
4300         .a_stride(37)
4301         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4302     }
4303   }
4304 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_gt_16_subtile)4305   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_gt_16_subtile) {
4306     TEST_REQUIRES_ARM_NEON_V8;
4307     for (size_t k = 17; k < 32; k++) {
4308       for (uint32_t n = 1; n <= 8; n++) {
4309         for (uint32_t m = 1; m <= 1; m++) {
4310           GemmMicrokernelTester()
4311             .mr(1)
4312             .nr(8)
4313             .kr(4)
4314             .sr(1)
4315             .m(m)
4316             .n(n)
4317             .k(k)
4318             .iterations(1)
4319             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4320         }
4321       }
4322     }
4323   }
4324 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_div_16)4325   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_div_16) {
4326     TEST_REQUIRES_ARM_NEON_V8;
4327     for (size_t k = 32; k <= 160; k += 16) {
4328       GemmMicrokernelTester()
4329         .mr(1)
4330         .nr(8)
4331         .kr(4)
4332         .sr(1)
4333         .m(1)
4334         .n(8)
4335         .k(k)
4336         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4337     }
4338   }
4339 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_div_16_strided_a)4340   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_div_16_strided_a) {
4341     TEST_REQUIRES_ARM_NEON_V8;
4342     for (size_t k = 32; k <= 160; k += 16) {
4343       GemmMicrokernelTester()
4344         .mr(1)
4345         .nr(8)
4346         .kr(4)
4347         .sr(1)
4348         .m(1)
4349         .n(8)
4350         .k(k)
4351         .a_stride(163)
4352         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4353     }
4354   }
4355 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,k_div_16_subtile)4356   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, k_div_16_subtile) {
4357     TEST_REQUIRES_ARM_NEON_V8;
4358     for (size_t k = 32; k <= 160; k += 16) {
4359       for (uint32_t n = 1; n <= 8; n++) {
4360         for (uint32_t m = 1; m <= 1; m++) {
4361           GemmMicrokernelTester()
4362             .mr(1)
4363             .nr(8)
4364             .kr(4)
4365             .sr(1)
4366             .m(m)
4367             .n(n)
4368             .k(k)
4369             .iterations(1)
4370             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4371         }
4372       }
4373     }
4374   }
4375 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_gt_8)4376   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_gt_8) {
4377     TEST_REQUIRES_ARM_NEON_V8;
4378     for (uint32_t n = 9; n < 16; n++) {
4379       for (size_t k = 1; k <= 80; k += 17) {
4380         GemmMicrokernelTester()
4381           .mr(1)
4382           .nr(8)
4383           .kr(4)
4384           .sr(1)
4385           .m(1)
4386           .n(n)
4387           .k(k)
4388           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4389       }
4390     }
4391   }
4392 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_gt_8_strided_cn)4393   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_gt_8_strided_cn) {
4394     TEST_REQUIRES_ARM_NEON_V8;
4395     for (uint32_t n = 9; n < 16; n++) {
4396       for (size_t k = 1; k <= 80; k += 17) {
4397         GemmMicrokernelTester()
4398           .mr(1)
4399           .nr(8)
4400           .kr(4)
4401           .sr(1)
4402           .m(1)
4403           .n(n)
4404           .k(k)
4405           .cn_stride(11)
4406           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4407       }
4408     }
4409   }
4410 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_gt_8_strided_a)4411   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_gt_8_strided_a) {
4412     TEST_REQUIRES_ARM_NEON_V8;
4413     for (uint32_t n = 9; n < 16; n++) {
4414       for (size_t k = 1; k <= 80; k += 17) {
4415         GemmMicrokernelTester()
4416           .mr(1)
4417           .nr(8)
4418           .kr(4)
4419           .sr(1)
4420           .m(1)
4421           .n(n)
4422           .k(k)
4423           .a_stride(83)
4424           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4425       }
4426     }
4427   }
4428 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_gt_8_subtile)4429   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_gt_8_subtile) {
4430     TEST_REQUIRES_ARM_NEON_V8;
4431     for (uint32_t n = 9; n < 16; n++) {
4432       for (size_t k = 1; k <= 80; k += 17) {
4433         for (uint32_t m = 1; m <= 1; m++) {
4434           GemmMicrokernelTester()
4435             .mr(1)
4436             .nr(8)
4437             .kr(4)
4438             .sr(1)
4439             .m(m)
4440             .n(n)
4441             .k(k)
4442             .iterations(1)
4443             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4444         }
4445       }
4446     }
4447   }
4448 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_div_8)4449   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_div_8) {
4450     TEST_REQUIRES_ARM_NEON_V8;
4451     for (uint32_t n = 16; n <= 24; n += 8) {
4452       for (size_t k = 1; k <= 80; k += 17) {
4453         GemmMicrokernelTester()
4454           .mr(1)
4455           .nr(8)
4456           .kr(4)
4457           .sr(1)
4458           .m(1)
4459           .n(n)
4460           .k(k)
4461           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4462       }
4463     }
4464   }
4465 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_div_8_strided_cn)4466   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_div_8_strided_cn) {
4467     TEST_REQUIRES_ARM_NEON_V8;
4468     for (uint32_t n = 16; n <= 24; n += 8) {
4469       for (size_t k = 1; k <= 80; k += 17) {
4470         GemmMicrokernelTester()
4471           .mr(1)
4472           .nr(8)
4473           .kr(4)
4474           .sr(1)
4475           .m(1)
4476           .n(n)
4477           .k(k)
4478           .cn_stride(11)
4479           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4480       }
4481     }
4482   }
4483 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_div_8_strided_a)4484   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_div_8_strided_a) {
4485     TEST_REQUIRES_ARM_NEON_V8;
4486     for (uint32_t n = 16; n <= 24; n += 8) {
4487       for (size_t k = 1; k <= 80; k += 17) {
4488         GemmMicrokernelTester()
4489           .mr(1)
4490           .nr(8)
4491           .kr(4)
4492           .sr(1)
4493           .m(1)
4494           .n(n)
4495           .k(k)
4496           .a_stride(83)
4497           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4498       }
4499     }
4500   }
4501 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,n_div_8_subtile)4502   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, n_div_8_subtile) {
4503     TEST_REQUIRES_ARM_NEON_V8;
4504     for (uint32_t n = 16; n <= 24; n += 8) {
4505       for (size_t k = 1; k <= 80; k += 17) {
4506         for (uint32_t m = 1; m <= 1; m++) {
4507           GemmMicrokernelTester()
4508             .mr(1)
4509             .nr(8)
4510             .kr(4)
4511             .sr(1)
4512             .m(m)
4513             .n(n)
4514             .k(k)
4515             .iterations(1)
4516             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4517         }
4518       }
4519     }
4520   }
4521 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,strided_cm_subtile)4522   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, strided_cm_subtile) {
4523     TEST_REQUIRES_ARM_NEON_V8;
4524     for (size_t k = 1; k <= 80; k += 17) {
4525       for (uint32_t n = 1; n <= 8; n++) {
4526         for (uint32_t m = 1; m <= 1; m++) {
4527           GemmMicrokernelTester()
4528             .mr(1)
4529             .nr(8)
4530             .kr(4)
4531             .sr(1)
4532             .m(m)
4533             .n(n)
4534             .k(k)
4535             .cm_stride(11)
4536             .iterations(1)
4537             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4538         }
4539       }
4540     }
4541   }
4542 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,qmin)4543   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, qmin) {
4544     TEST_REQUIRES_ARM_NEON_V8;
4545     GemmMicrokernelTester()
4546       .mr(1)
4547       .nr(8)
4548       .kr(4)
4549       .sr(1)
4550       .m(1)
4551       .n(8)
4552       .k(16)
4553       .qmin(128)
4554       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4555   }
4556 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,qmax)4557   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, qmax) {
4558     TEST_REQUIRES_ARM_NEON_V8;
4559     GemmMicrokernelTester()
4560       .mr(1)
4561       .nr(8)
4562       .kr(4)
4563       .sr(1)
4564       .m(1)
4565       .n(8)
4566       .k(16)
4567       .qmax(128)
4568       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4569   }
4570 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP,strided_cm)4571   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_DUP, strided_cm) {
4572     TEST_REQUIRES_ARM_NEON_V8;
4573     GemmMicrokernelTester()
4574       .mr(1)
4575       .nr(8)
4576       .kr(4)
4577       .sr(1)
4578       .m(1)
4579       .n(8)
4580       .k(16)
4581       .cm_stride(11)
4582       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4583   }
4584 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
4585 
4586 
4587 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_eq_16)4588   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_eq_16) {
4589     TEST_REQUIRES_ARM_NEON_V8;
4590     GemmMicrokernelTester()
4591       .mr(1)
4592       .nr(8)
4593       .kr(4)
4594       .sr(1)
4595       .m(1)
4596       .n(8)
4597       .k(16)
4598       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4599   }
4600 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,strided_cn)4601   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, strided_cn) {
4602     TEST_REQUIRES_ARM_NEON_V8;
4603     GemmMicrokernelTester()
4604       .mr(1)
4605       .nr(8)
4606       .kr(4)
4607       .sr(1)
4608       .m(1)
4609       .n(8)
4610       .k(16)
4611       .cn_stride(11)
4612       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4613   }
4614 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_eq_16_strided_a)4615   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_eq_16_strided_a) {
4616     TEST_REQUIRES_ARM_NEON_V8;
4617     GemmMicrokernelTester()
4618       .mr(1)
4619       .nr(8)
4620       .kr(4)
4621       .sr(1)
4622       .m(1)
4623       .n(8)
4624       .k(16)
4625       .a_stride(19)
4626       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4627   }
4628 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_eq_16_subtile)4629   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_eq_16_subtile) {
4630     TEST_REQUIRES_ARM_NEON_V8;
4631     for (uint32_t n = 1; n <= 8; n++) {
4632       for (uint32_t m = 1; m <= 1; m++) {
4633         GemmMicrokernelTester()
4634           .mr(1)
4635           .nr(8)
4636           .kr(4)
4637           .sr(1)
4638           .m(m)
4639           .n(n)
4640           .k(16)
4641           .iterations(1)
4642           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4643       }
4644     }
4645   }
4646 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_eq_16_subtile_m)4647   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_eq_16_subtile_m) {
4648     TEST_REQUIRES_ARM_NEON_V8;
4649     for (uint32_t m = 1; m <= 1; m++) {
4650       GemmMicrokernelTester()
4651         .mr(1)
4652         .nr(8)
4653         .kr(4)
4654         .sr(1)
4655         .m(m)
4656         .n(8)
4657         .k(16)
4658         .iterations(1)
4659         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4660     }
4661   }
4662 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_eq_16_subtile_n)4663   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_eq_16_subtile_n) {
4664     TEST_REQUIRES_ARM_NEON_V8;
4665     for (uint32_t n = 1; n <= 8; n++) {
4666       GemmMicrokernelTester()
4667         .mr(1)
4668         .nr(8)
4669         .kr(4)
4670         .sr(1)
4671         .m(1)
4672         .n(n)
4673         .k(16)
4674         .iterations(1)
4675         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4676     }
4677   }
4678 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_lt_16)4679   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_lt_16) {
4680     TEST_REQUIRES_ARM_NEON_V8;
4681     for (size_t k = 1; k < 16; k++) {
4682       GemmMicrokernelTester()
4683         .mr(1)
4684         .nr(8)
4685         .kr(4)
4686         .sr(1)
4687         .m(1)
4688         .n(8)
4689         .k(k)
4690         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4691     }
4692   }
4693 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_lt_16_strided_a)4694   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_lt_16_strided_a) {
4695     TEST_REQUIRES_ARM_NEON_V8;
4696     for (size_t k = 1; k < 16; k++) {
4697       GemmMicrokernelTester()
4698         .mr(1)
4699         .nr(8)
4700         .kr(4)
4701         .sr(1)
4702         .m(1)
4703         .n(8)
4704         .k(k)
4705         .a_stride(19)
4706         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4707     }
4708   }
4709 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_lt_16_subtile)4710   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_lt_16_subtile) {
4711     TEST_REQUIRES_ARM_NEON_V8;
4712     for (size_t k = 1; k < 16; k++) {
4713       for (uint32_t n = 1; n <= 8; n++) {
4714         for (uint32_t m = 1; m <= 1; m++) {
4715           GemmMicrokernelTester()
4716             .mr(1)
4717             .nr(8)
4718             .kr(4)
4719             .sr(1)
4720             .m(m)
4721             .n(n)
4722             .k(k)
4723             .iterations(1)
4724             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4725         }
4726       }
4727     }
4728   }
4729 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_gt_16)4730   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_gt_16) {
4731     TEST_REQUIRES_ARM_NEON_V8;
4732     for (size_t k = 17; k < 32; k++) {
4733       GemmMicrokernelTester()
4734         .mr(1)
4735         .nr(8)
4736         .kr(4)
4737         .sr(1)
4738         .m(1)
4739         .n(8)
4740         .k(k)
4741         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4742     }
4743   }
4744 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_gt_16_strided_a)4745   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_gt_16_strided_a) {
4746     TEST_REQUIRES_ARM_NEON_V8;
4747     for (size_t k = 17; k < 32; k++) {
4748       GemmMicrokernelTester()
4749         .mr(1)
4750         .nr(8)
4751         .kr(4)
4752         .sr(1)
4753         .m(1)
4754         .n(8)
4755         .k(k)
4756         .a_stride(37)
4757         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4758     }
4759   }
4760 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_gt_16_subtile)4761   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_gt_16_subtile) {
4762     TEST_REQUIRES_ARM_NEON_V8;
4763     for (size_t k = 17; k < 32; k++) {
4764       for (uint32_t n = 1; n <= 8; n++) {
4765         for (uint32_t m = 1; m <= 1; m++) {
4766           GemmMicrokernelTester()
4767             .mr(1)
4768             .nr(8)
4769             .kr(4)
4770             .sr(1)
4771             .m(m)
4772             .n(n)
4773             .k(k)
4774             .iterations(1)
4775             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4776         }
4777       }
4778     }
4779   }
4780 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_div_16)4781   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_div_16) {
4782     TEST_REQUIRES_ARM_NEON_V8;
4783     for (size_t k = 32; k <= 160; k += 16) {
4784       GemmMicrokernelTester()
4785         .mr(1)
4786         .nr(8)
4787         .kr(4)
4788         .sr(1)
4789         .m(1)
4790         .n(8)
4791         .k(k)
4792         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4793     }
4794   }
4795 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_div_16_strided_a)4796   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_div_16_strided_a) {
4797     TEST_REQUIRES_ARM_NEON_V8;
4798     for (size_t k = 32; k <= 160; k += 16) {
4799       GemmMicrokernelTester()
4800         .mr(1)
4801         .nr(8)
4802         .kr(4)
4803         .sr(1)
4804         .m(1)
4805         .n(8)
4806         .k(k)
4807         .a_stride(163)
4808         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4809     }
4810   }
4811 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,k_div_16_subtile)4812   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, k_div_16_subtile) {
4813     TEST_REQUIRES_ARM_NEON_V8;
4814     for (size_t k = 32; k <= 160; k += 16) {
4815       for (uint32_t n = 1; n <= 8; n++) {
4816         for (uint32_t m = 1; m <= 1; m++) {
4817           GemmMicrokernelTester()
4818             .mr(1)
4819             .nr(8)
4820             .kr(4)
4821             .sr(1)
4822             .m(m)
4823             .n(n)
4824             .k(k)
4825             .iterations(1)
4826             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4827         }
4828       }
4829     }
4830   }
4831 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_gt_8)4832   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_gt_8) {
4833     TEST_REQUIRES_ARM_NEON_V8;
4834     for (uint32_t n = 9; n < 16; n++) {
4835       for (size_t k = 1; k <= 80; k += 17) {
4836         GemmMicrokernelTester()
4837           .mr(1)
4838           .nr(8)
4839           .kr(4)
4840           .sr(1)
4841           .m(1)
4842           .n(n)
4843           .k(k)
4844           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4845       }
4846     }
4847   }
4848 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_gt_8_strided_cn)4849   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_gt_8_strided_cn) {
4850     TEST_REQUIRES_ARM_NEON_V8;
4851     for (uint32_t n = 9; n < 16; n++) {
4852       for (size_t k = 1; k <= 80; k += 17) {
4853         GemmMicrokernelTester()
4854           .mr(1)
4855           .nr(8)
4856           .kr(4)
4857           .sr(1)
4858           .m(1)
4859           .n(n)
4860           .k(k)
4861           .cn_stride(11)
4862           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4863       }
4864     }
4865   }
4866 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_gt_8_strided_a)4867   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_gt_8_strided_a) {
4868     TEST_REQUIRES_ARM_NEON_V8;
4869     for (uint32_t n = 9; n < 16; n++) {
4870       for (size_t k = 1; k <= 80; k += 17) {
4871         GemmMicrokernelTester()
4872           .mr(1)
4873           .nr(8)
4874           .kr(4)
4875           .sr(1)
4876           .m(1)
4877           .n(n)
4878           .k(k)
4879           .a_stride(83)
4880           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4881       }
4882     }
4883   }
4884 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_gt_8_subtile)4885   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_gt_8_subtile) {
4886     TEST_REQUIRES_ARM_NEON_V8;
4887     for (uint32_t n = 9; n < 16; n++) {
4888       for (size_t k = 1; k <= 80; k += 17) {
4889         for (uint32_t m = 1; m <= 1; m++) {
4890           GemmMicrokernelTester()
4891             .mr(1)
4892             .nr(8)
4893             .kr(4)
4894             .sr(1)
4895             .m(m)
4896             .n(n)
4897             .k(k)
4898             .iterations(1)
4899             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4900         }
4901       }
4902     }
4903   }
4904 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_div_8)4905   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_div_8) {
4906     TEST_REQUIRES_ARM_NEON_V8;
4907     for (uint32_t n = 16; n <= 24; n += 8) {
4908       for (size_t k = 1; k <= 80; k += 17) {
4909         GemmMicrokernelTester()
4910           .mr(1)
4911           .nr(8)
4912           .kr(4)
4913           .sr(1)
4914           .m(1)
4915           .n(n)
4916           .k(k)
4917           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4918       }
4919     }
4920   }
4921 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_div_8_strided_cn)4922   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_div_8_strided_cn) {
4923     TEST_REQUIRES_ARM_NEON_V8;
4924     for (uint32_t n = 16; n <= 24; n += 8) {
4925       for (size_t k = 1; k <= 80; k += 17) {
4926         GemmMicrokernelTester()
4927           .mr(1)
4928           .nr(8)
4929           .kr(4)
4930           .sr(1)
4931           .m(1)
4932           .n(n)
4933           .k(k)
4934           .cn_stride(11)
4935           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4936       }
4937     }
4938   }
4939 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_div_8_strided_a)4940   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_div_8_strided_a) {
4941     TEST_REQUIRES_ARM_NEON_V8;
4942     for (uint32_t n = 16; n <= 24; n += 8) {
4943       for (size_t k = 1; k <= 80; k += 17) {
4944         GemmMicrokernelTester()
4945           .mr(1)
4946           .nr(8)
4947           .kr(4)
4948           .sr(1)
4949           .m(1)
4950           .n(n)
4951           .k(k)
4952           .a_stride(83)
4953           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4954       }
4955     }
4956   }
4957 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,n_div_8_subtile)4958   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, n_div_8_subtile) {
4959     TEST_REQUIRES_ARM_NEON_V8;
4960     for (uint32_t n = 16; n <= 24; n += 8) {
4961       for (size_t k = 1; k <= 80; k += 17) {
4962         for (uint32_t m = 1; m <= 1; m++) {
4963           GemmMicrokernelTester()
4964             .mr(1)
4965             .nr(8)
4966             .kr(4)
4967             .sr(1)
4968             .m(m)
4969             .n(n)
4970             .k(k)
4971             .iterations(1)
4972             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4973         }
4974       }
4975     }
4976   }
4977 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,strided_cm_subtile)4978   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, strided_cm_subtile) {
4979     TEST_REQUIRES_ARM_NEON_V8;
4980     for (size_t k = 1; k <= 80; k += 17) {
4981       for (uint32_t n = 1; n <= 8; n++) {
4982         for (uint32_t m = 1; m <= 1; m++) {
4983           GemmMicrokernelTester()
4984             .mr(1)
4985             .nr(8)
4986             .kr(4)
4987             .sr(1)
4988             .m(m)
4989             .n(n)
4990             .k(k)
4991             .cm_stride(11)
4992             .iterations(1)
4993             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
4994         }
4995       }
4996     }
4997   }
4998 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,qmin)4999   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, qmin) {
5000     TEST_REQUIRES_ARM_NEON_V8;
5001     GemmMicrokernelTester()
5002       .mr(1)
5003       .nr(8)
5004       .kr(4)
5005       .sr(1)
5006       .m(1)
5007       .n(8)
5008       .k(16)
5009       .qmin(128)
5010       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5011   }
5012 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,qmax)5013   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, qmax) {
5014     TEST_REQUIRES_ARM_NEON_V8;
5015     GemmMicrokernelTester()
5016       .mr(1)
5017       .nr(8)
5018       .kr(4)
5019       .sr(1)
5020       .m(1)
5021       .n(8)
5022       .k(16)
5023       .qmax(128)
5024       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5025   }
5026 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R,strided_cm)5027   TEST(QS8_GEMM_MINMAX_FP32_1X8C4__NEONV8_MLAL_LD2R, strided_cm) {
5028     TEST_REQUIRES_ARM_NEON_V8;
5029     GemmMicrokernelTester()
5030       .mr(1)
5031       .nr(8)
5032       .kr(4)
5033       .sr(1)
5034       .m(1)
5035       .n(8)
5036       .k(16)
5037       .cm_stride(11)
5038       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5039   }
5040 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
5041 
5042 
5043 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_eq_16)5044   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_eq_16) {
5045     TEST_REQUIRES_ARM_NEON;
5046     GemmMicrokernelTester()
5047       .mr(1)
5048       .nr(8)
5049       .kr(4)
5050       .sr(2)
5051       .m(1)
5052       .n(8)
5053       .k(16)
5054       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5055   }
5056 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,strided_cn)5057   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, strided_cn) {
5058     TEST_REQUIRES_ARM_NEON;
5059     GemmMicrokernelTester()
5060       .mr(1)
5061       .nr(8)
5062       .kr(4)
5063       .sr(2)
5064       .m(1)
5065       .n(8)
5066       .k(16)
5067       .cn_stride(11)
5068       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5069   }
5070 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_eq_16_strided_a)5071   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_eq_16_strided_a) {
5072     TEST_REQUIRES_ARM_NEON;
5073     GemmMicrokernelTester()
5074       .mr(1)
5075       .nr(8)
5076       .kr(4)
5077       .sr(2)
5078       .m(1)
5079       .n(8)
5080       .k(16)
5081       .a_stride(19)
5082       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5083   }
5084 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_eq_16_subtile)5085   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_eq_16_subtile) {
5086     TEST_REQUIRES_ARM_NEON;
5087     for (uint32_t n = 1; n <= 8; n++) {
5088       for (uint32_t m = 1; m <= 1; m++) {
5089         GemmMicrokernelTester()
5090           .mr(1)
5091           .nr(8)
5092           .kr(4)
5093           .sr(2)
5094           .m(m)
5095           .n(n)
5096           .k(16)
5097           .iterations(1)
5098           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5099       }
5100     }
5101   }
5102 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_eq_16_subtile_m)5103   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_eq_16_subtile_m) {
5104     TEST_REQUIRES_ARM_NEON;
5105     for (uint32_t m = 1; m <= 1; m++) {
5106       GemmMicrokernelTester()
5107         .mr(1)
5108         .nr(8)
5109         .kr(4)
5110         .sr(2)
5111         .m(m)
5112         .n(8)
5113         .k(16)
5114         .iterations(1)
5115         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5116     }
5117   }
5118 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_eq_16_subtile_n)5119   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_eq_16_subtile_n) {
5120     TEST_REQUIRES_ARM_NEON;
5121     for (uint32_t n = 1; n <= 8; n++) {
5122       GemmMicrokernelTester()
5123         .mr(1)
5124         .nr(8)
5125         .kr(4)
5126         .sr(2)
5127         .m(1)
5128         .n(n)
5129         .k(16)
5130         .iterations(1)
5131         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5132     }
5133   }
5134 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_lt_16)5135   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_lt_16) {
5136     TEST_REQUIRES_ARM_NEON;
5137     for (size_t k = 1; k < 16; k++) {
5138       GemmMicrokernelTester()
5139         .mr(1)
5140         .nr(8)
5141         .kr(4)
5142         .sr(2)
5143         .m(1)
5144         .n(8)
5145         .k(k)
5146         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5147     }
5148   }
5149 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_lt_16_strided_a)5150   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_lt_16_strided_a) {
5151     TEST_REQUIRES_ARM_NEON;
5152     for (size_t k = 1; k < 16; k++) {
5153       GemmMicrokernelTester()
5154         .mr(1)
5155         .nr(8)
5156         .kr(4)
5157         .sr(2)
5158         .m(1)
5159         .n(8)
5160         .k(k)
5161         .a_stride(19)
5162         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5163     }
5164   }
5165 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_lt_16_subtile)5166   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_lt_16_subtile) {
5167     TEST_REQUIRES_ARM_NEON;
5168     for (size_t k = 1; k < 16; k++) {
5169       for (uint32_t n = 1; n <= 8; n++) {
5170         for (uint32_t m = 1; m <= 1; m++) {
5171           GemmMicrokernelTester()
5172             .mr(1)
5173             .nr(8)
5174             .kr(4)
5175             .sr(2)
5176             .m(m)
5177             .n(n)
5178             .k(k)
5179             .iterations(1)
5180             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5181         }
5182       }
5183     }
5184   }
5185 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_gt_16)5186   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_gt_16) {
5187     TEST_REQUIRES_ARM_NEON;
5188     for (size_t k = 17; k < 32; k++) {
5189       GemmMicrokernelTester()
5190         .mr(1)
5191         .nr(8)
5192         .kr(4)
5193         .sr(2)
5194         .m(1)
5195         .n(8)
5196         .k(k)
5197         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5198     }
5199   }
5200 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_gt_16_strided_a)5201   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_gt_16_strided_a) {
5202     TEST_REQUIRES_ARM_NEON;
5203     for (size_t k = 17; k < 32; k++) {
5204       GemmMicrokernelTester()
5205         .mr(1)
5206         .nr(8)
5207         .kr(4)
5208         .sr(2)
5209         .m(1)
5210         .n(8)
5211         .k(k)
5212         .a_stride(37)
5213         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5214     }
5215   }
5216 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_gt_16_subtile)5217   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_gt_16_subtile) {
5218     TEST_REQUIRES_ARM_NEON;
5219     for (size_t k = 17; k < 32; k++) {
5220       for (uint32_t n = 1; n <= 8; n++) {
5221         for (uint32_t m = 1; m <= 1; m++) {
5222           GemmMicrokernelTester()
5223             .mr(1)
5224             .nr(8)
5225             .kr(4)
5226             .sr(2)
5227             .m(m)
5228             .n(n)
5229             .k(k)
5230             .iterations(1)
5231             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5232         }
5233       }
5234     }
5235   }
5236 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_div_16)5237   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_div_16) {
5238     TEST_REQUIRES_ARM_NEON;
5239     for (size_t k = 32; k <= 160; k += 16) {
5240       GemmMicrokernelTester()
5241         .mr(1)
5242         .nr(8)
5243         .kr(4)
5244         .sr(2)
5245         .m(1)
5246         .n(8)
5247         .k(k)
5248         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5249     }
5250   }
5251 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_div_16_strided_a)5252   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_div_16_strided_a) {
5253     TEST_REQUIRES_ARM_NEON;
5254     for (size_t k = 32; k <= 160; k += 16) {
5255       GemmMicrokernelTester()
5256         .mr(1)
5257         .nr(8)
5258         .kr(4)
5259         .sr(2)
5260         .m(1)
5261         .n(8)
5262         .k(k)
5263         .a_stride(163)
5264         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5265     }
5266   }
5267 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,k_div_16_subtile)5268   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, k_div_16_subtile) {
5269     TEST_REQUIRES_ARM_NEON;
5270     for (size_t k = 32; k <= 160; k += 16) {
5271       for (uint32_t n = 1; n <= 8; n++) {
5272         for (uint32_t m = 1; m <= 1; m++) {
5273           GemmMicrokernelTester()
5274             .mr(1)
5275             .nr(8)
5276             .kr(4)
5277             .sr(2)
5278             .m(m)
5279             .n(n)
5280             .k(k)
5281             .iterations(1)
5282             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5283         }
5284       }
5285     }
5286   }
5287 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_gt_8)5288   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_gt_8) {
5289     TEST_REQUIRES_ARM_NEON;
5290     for (uint32_t n = 9; n < 16; n++) {
5291       for (size_t k = 1; k <= 80; k += 17) {
5292         GemmMicrokernelTester()
5293           .mr(1)
5294           .nr(8)
5295           .kr(4)
5296           .sr(2)
5297           .m(1)
5298           .n(n)
5299           .k(k)
5300           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5301       }
5302     }
5303   }
5304 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_gt_8_strided_cn)5305   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_gt_8_strided_cn) {
5306     TEST_REQUIRES_ARM_NEON;
5307     for (uint32_t n = 9; n < 16; n++) {
5308       for (size_t k = 1; k <= 80; k += 17) {
5309         GemmMicrokernelTester()
5310           .mr(1)
5311           .nr(8)
5312           .kr(4)
5313           .sr(2)
5314           .m(1)
5315           .n(n)
5316           .k(k)
5317           .cn_stride(11)
5318           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5319       }
5320     }
5321   }
5322 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_gt_8_strided_a)5323   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_gt_8_strided_a) {
5324     TEST_REQUIRES_ARM_NEON;
5325     for (uint32_t n = 9; n < 16; n++) {
5326       for (size_t k = 1; k <= 80; k += 17) {
5327         GemmMicrokernelTester()
5328           .mr(1)
5329           .nr(8)
5330           .kr(4)
5331           .sr(2)
5332           .m(1)
5333           .n(n)
5334           .k(k)
5335           .a_stride(83)
5336           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5337       }
5338     }
5339   }
5340 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_gt_8_subtile)5341   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_gt_8_subtile) {
5342     TEST_REQUIRES_ARM_NEON;
5343     for (uint32_t n = 9; n < 16; n++) {
5344       for (size_t k = 1; k <= 80; k += 17) {
5345         for (uint32_t m = 1; m <= 1; m++) {
5346           GemmMicrokernelTester()
5347             .mr(1)
5348             .nr(8)
5349             .kr(4)
5350             .sr(2)
5351             .m(m)
5352             .n(n)
5353             .k(k)
5354             .iterations(1)
5355             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5356         }
5357       }
5358     }
5359   }
5360 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_div_8)5361   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_div_8) {
5362     TEST_REQUIRES_ARM_NEON;
5363     for (uint32_t n = 16; n <= 24; n += 8) {
5364       for (size_t k = 1; k <= 80; k += 17) {
5365         GemmMicrokernelTester()
5366           .mr(1)
5367           .nr(8)
5368           .kr(4)
5369           .sr(2)
5370           .m(1)
5371           .n(n)
5372           .k(k)
5373           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5374       }
5375     }
5376   }
5377 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_div_8_strided_cn)5378   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_div_8_strided_cn) {
5379     TEST_REQUIRES_ARM_NEON;
5380     for (uint32_t n = 16; n <= 24; n += 8) {
5381       for (size_t k = 1; k <= 80; k += 17) {
5382         GemmMicrokernelTester()
5383           .mr(1)
5384           .nr(8)
5385           .kr(4)
5386           .sr(2)
5387           .m(1)
5388           .n(n)
5389           .k(k)
5390           .cn_stride(11)
5391           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5392       }
5393     }
5394   }
5395 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_div_8_strided_a)5396   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_div_8_strided_a) {
5397     TEST_REQUIRES_ARM_NEON;
5398     for (uint32_t n = 16; n <= 24; n += 8) {
5399       for (size_t k = 1; k <= 80; k += 17) {
5400         GemmMicrokernelTester()
5401           .mr(1)
5402           .nr(8)
5403           .kr(4)
5404           .sr(2)
5405           .m(1)
5406           .n(n)
5407           .k(k)
5408           .a_stride(83)
5409           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5410       }
5411     }
5412   }
5413 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,n_div_8_subtile)5414   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, n_div_8_subtile) {
5415     TEST_REQUIRES_ARM_NEON;
5416     for (uint32_t n = 16; n <= 24; n += 8) {
5417       for (size_t k = 1; k <= 80; k += 17) {
5418         for (uint32_t m = 1; m <= 1; m++) {
5419           GemmMicrokernelTester()
5420             .mr(1)
5421             .nr(8)
5422             .kr(4)
5423             .sr(2)
5424             .m(m)
5425             .n(n)
5426             .k(k)
5427             .iterations(1)
5428             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5429         }
5430       }
5431     }
5432   }
5433 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,strided_cm_subtile)5434   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, strided_cm_subtile) {
5435     TEST_REQUIRES_ARM_NEON;
5436     for (size_t k = 1; k <= 80; k += 17) {
5437       for (uint32_t n = 1; n <= 8; n++) {
5438         for (uint32_t m = 1; m <= 1; m++) {
5439           GemmMicrokernelTester()
5440             .mr(1)
5441             .nr(8)
5442             .kr(4)
5443             .sr(2)
5444             .m(m)
5445             .n(n)
5446             .k(k)
5447             .cm_stride(11)
5448             .iterations(1)
5449             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5450         }
5451       }
5452     }
5453   }
5454 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,qmin)5455   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, qmin) {
5456     TEST_REQUIRES_ARM_NEON;
5457     GemmMicrokernelTester()
5458       .mr(1)
5459       .nr(8)
5460       .kr(4)
5461       .sr(2)
5462       .m(1)
5463       .n(8)
5464       .k(16)
5465       .qmin(128)
5466       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5467   }
5468 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,qmax)5469   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, qmax) {
5470     TEST_REQUIRES_ARM_NEON;
5471     GemmMicrokernelTester()
5472       .mr(1)
5473       .nr(8)
5474       .kr(4)
5475       .sr(2)
5476       .m(1)
5477       .n(8)
5478       .k(16)
5479       .qmax(128)
5480       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5481   }
5482 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL,strided_cm)5483   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEON_MLAL, strided_cm) {
5484     TEST_REQUIRES_ARM_NEON;
5485     GemmMicrokernelTester()
5486       .mr(1)
5487       .nr(8)
5488       .kr(4)
5489       .sr(2)
5490       .m(1)
5491       .n(8)
5492       .k(16)
5493       .cm_stride(11)
5494       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5495   }
5496 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
5497 
5498 
5499 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_eq_16)5500   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_eq_16) {
5501     TEST_REQUIRES_ARM_NEON_V8;
5502     GemmMicrokernelTester()
5503       .mr(1)
5504       .nr(8)
5505       .kr(4)
5506       .sr(2)
5507       .m(1)
5508       .n(8)
5509       .k(16)
5510       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5511   }
5512 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,strided_cn)5513   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, strided_cn) {
5514     TEST_REQUIRES_ARM_NEON_V8;
5515     GemmMicrokernelTester()
5516       .mr(1)
5517       .nr(8)
5518       .kr(4)
5519       .sr(2)
5520       .m(1)
5521       .n(8)
5522       .k(16)
5523       .cn_stride(11)
5524       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5525   }
5526 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_eq_16_strided_a)5527   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_eq_16_strided_a) {
5528     TEST_REQUIRES_ARM_NEON_V8;
5529     GemmMicrokernelTester()
5530       .mr(1)
5531       .nr(8)
5532       .kr(4)
5533       .sr(2)
5534       .m(1)
5535       .n(8)
5536       .k(16)
5537       .a_stride(19)
5538       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5539   }
5540 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_eq_16_subtile)5541   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_eq_16_subtile) {
5542     TEST_REQUIRES_ARM_NEON_V8;
5543     for (uint32_t n = 1; n <= 8; n++) {
5544       for (uint32_t m = 1; m <= 1; m++) {
5545         GemmMicrokernelTester()
5546           .mr(1)
5547           .nr(8)
5548           .kr(4)
5549           .sr(2)
5550           .m(m)
5551           .n(n)
5552           .k(16)
5553           .iterations(1)
5554           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5555       }
5556     }
5557   }
5558 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_eq_16_subtile_m)5559   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_eq_16_subtile_m) {
5560     TEST_REQUIRES_ARM_NEON_V8;
5561     for (uint32_t m = 1; m <= 1; m++) {
5562       GemmMicrokernelTester()
5563         .mr(1)
5564         .nr(8)
5565         .kr(4)
5566         .sr(2)
5567         .m(m)
5568         .n(8)
5569         .k(16)
5570         .iterations(1)
5571         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5572     }
5573   }
5574 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_eq_16_subtile_n)5575   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_eq_16_subtile_n) {
5576     TEST_REQUIRES_ARM_NEON_V8;
5577     for (uint32_t n = 1; n <= 8; n++) {
5578       GemmMicrokernelTester()
5579         .mr(1)
5580         .nr(8)
5581         .kr(4)
5582         .sr(2)
5583         .m(1)
5584         .n(n)
5585         .k(16)
5586         .iterations(1)
5587         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5588     }
5589   }
5590 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_lt_16)5591   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_lt_16) {
5592     TEST_REQUIRES_ARM_NEON_V8;
5593     for (size_t k = 1; k < 16; k++) {
5594       GemmMicrokernelTester()
5595         .mr(1)
5596         .nr(8)
5597         .kr(4)
5598         .sr(2)
5599         .m(1)
5600         .n(8)
5601         .k(k)
5602         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5603     }
5604   }
5605 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_lt_16_strided_a)5606   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_lt_16_strided_a) {
5607     TEST_REQUIRES_ARM_NEON_V8;
5608     for (size_t k = 1; k < 16; k++) {
5609       GemmMicrokernelTester()
5610         .mr(1)
5611         .nr(8)
5612         .kr(4)
5613         .sr(2)
5614         .m(1)
5615         .n(8)
5616         .k(k)
5617         .a_stride(19)
5618         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5619     }
5620   }
5621 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_lt_16_subtile)5622   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_lt_16_subtile) {
5623     TEST_REQUIRES_ARM_NEON_V8;
5624     for (size_t k = 1; k < 16; k++) {
5625       for (uint32_t n = 1; n <= 8; n++) {
5626         for (uint32_t m = 1; m <= 1; m++) {
5627           GemmMicrokernelTester()
5628             .mr(1)
5629             .nr(8)
5630             .kr(4)
5631             .sr(2)
5632             .m(m)
5633             .n(n)
5634             .k(k)
5635             .iterations(1)
5636             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5637         }
5638       }
5639     }
5640   }
5641 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_gt_16)5642   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_gt_16) {
5643     TEST_REQUIRES_ARM_NEON_V8;
5644     for (size_t k = 17; k < 32; k++) {
5645       GemmMicrokernelTester()
5646         .mr(1)
5647         .nr(8)
5648         .kr(4)
5649         .sr(2)
5650         .m(1)
5651         .n(8)
5652         .k(k)
5653         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5654     }
5655   }
5656 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_gt_16_strided_a)5657   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_gt_16_strided_a) {
5658     TEST_REQUIRES_ARM_NEON_V8;
5659     for (size_t k = 17; k < 32; k++) {
5660       GemmMicrokernelTester()
5661         .mr(1)
5662         .nr(8)
5663         .kr(4)
5664         .sr(2)
5665         .m(1)
5666         .n(8)
5667         .k(k)
5668         .a_stride(37)
5669         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5670     }
5671   }
5672 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_gt_16_subtile)5673   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_gt_16_subtile) {
5674     TEST_REQUIRES_ARM_NEON_V8;
5675     for (size_t k = 17; k < 32; k++) {
5676       for (uint32_t n = 1; n <= 8; n++) {
5677         for (uint32_t m = 1; m <= 1; m++) {
5678           GemmMicrokernelTester()
5679             .mr(1)
5680             .nr(8)
5681             .kr(4)
5682             .sr(2)
5683             .m(m)
5684             .n(n)
5685             .k(k)
5686             .iterations(1)
5687             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5688         }
5689       }
5690     }
5691   }
5692 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_div_16)5693   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_div_16) {
5694     TEST_REQUIRES_ARM_NEON_V8;
5695     for (size_t k = 32; k <= 160; k += 16) {
5696       GemmMicrokernelTester()
5697         .mr(1)
5698         .nr(8)
5699         .kr(4)
5700         .sr(2)
5701         .m(1)
5702         .n(8)
5703         .k(k)
5704         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5705     }
5706   }
5707 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_div_16_strided_a)5708   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_div_16_strided_a) {
5709     TEST_REQUIRES_ARM_NEON_V8;
5710     for (size_t k = 32; k <= 160; k += 16) {
5711       GemmMicrokernelTester()
5712         .mr(1)
5713         .nr(8)
5714         .kr(4)
5715         .sr(2)
5716         .m(1)
5717         .n(8)
5718         .k(k)
5719         .a_stride(163)
5720         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5721     }
5722   }
5723 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,k_div_16_subtile)5724   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, k_div_16_subtile) {
5725     TEST_REQUIRES_ARM_NEON_V8;
5726     for (size_t k = 32; k <= 160; k += 16) {
5727       for (uint32_t n = 1; n <= 8; n++) {
5728         for (uint32_t m = 1; m <= 1; m++) {
5729           GemmMicrokernelTester()
5730             .mr(1)
5731             .nr(8)
5732             .kr(4)
5733             .sr(2)
5734             .m(m)
5735             .n(n)
5736             .k(k)
5737             .iterations(1)
5738             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5739         }
5740       }
5741     }
5742   }
5743 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_gt_8)5744   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_gt_8) {
5745     TEST_REQUIRES_ARM_NEON_V8;
5746     for (uint32_t n = 9; n < 16; n++) {
5747       for (size_t k = 1; k <= 80; k += 17) {
5748         GemmMicrokernelTester()
5749           .mr(1)
5750           .nr(8)
5751           .kr(4)
5752           .sr(2)
5753           .m(1)
5754           .n(n)
5755           .k(k)
5756           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5757       }
5758     }
5759   }
5760 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_gt_8_strided_cn)5761   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_gt_8_strided_cn) {
5762     TEST_REQUIRES_ARM_NEON_V8;
5763     for (uint32_t n = 9; n < 16; n++) {
5764       for (size_t k = 1; k <= 80; k += 17) {
5765         GemmMicrokernelTester()
5766           .mr(1)
5767           .nr(8)
5768           .kr(4)
5769           .sr(2)
5770           .m(1)
5771           .n(n)
5772           .k(k)
5773           .cn_stride(11)
5774           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5775       }
5776     }
5777   }
5778 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_gt_8_strided_a)5779   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_gt_8_strided_a) {
5780     TEST_REQUIRES_ARM_NEON_V8;
5781     for (uint32_t n = 9; n < 16; n++) {
5782       for (size_t k = 1; k <= 80; k += 17) {
5783         GemmMicrokernelTester()
5784           .mr(1)
5785           .nr(8)
5786           .kr(4)
5787           .sr(2)
5788           .m(1)
5789           .n(n)
5790           .k(k)
5791           .a_stride(83)
5792           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5793       }
5794     }
5795   }
5796 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_gt_8_subtile)5797   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_gt_8_subtile) {
5798     TEST_REQUIRES_ARM_NEON_V8;
5799     for (uint32_t n = 9; n < 16; n++) {
5800       for (size_t k = 1; k <= 80; k += 17) {
5801         for (uint32_t m = 1; m <= 1; m++) {
5802           GemmMicrokernelTester()
5803             .mr(1)
5804             .nr(8)
5805             .kr(4)
5806             .sr(2)
5807             .m(m)
5808             .n(n)
5809             .k(k)
5810             .iterations(1)
5811             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5812         }
5813       }
5814     }
5815   }
5816 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_div_8)5817   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_div_8) {
5818     TEST_REQUIRES_ARM_NEON_V8;
5819     for (uint32_t n = 16; n <= 24; n += 8) {
5820       for (size_t k = 1; k <= 80; k += 17) {
5821         GemmMicrokernelTester()
5822           .mr(1)
5823           .nr(8)
5824           .kr(4)
5825           .sr(2)
5826           .m(1)
5827           .n(n)
5828           .k(k)
5829           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5830       }
5831     }
5832   }
5833 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_div_8_strided_cn)5834   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_div_8_strided_cn) {
5835     TEST_REQUIRES_ARM_NEON_V8;
5836     for (uint32_t n = 16; n <= 24; n += 8) {
5837       for (size_t k = 1; k <= 80; k += 17) {
5838         GemmMicrokernelTester()
5839           .mr(1)
5840           .nr(8)
5841           .kr(4)
5842           .sr(2)
5843           .m(1)
5844           .n(n)
5845           .k(k)
5846           .cn_stride(11)
5847           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5848       }
5849     }
5850   }
5851 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_div_8_strided_a)5852   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_div_8_strided_a) {
5853     TEST_REQUIRES_ARM_NEON_V8;
5854     for (uint32_t n = 16; n <= 24; n += 8) {
5855       for (size_t k = 1; k <= 80; k += 17) {
5856         GemmMicrokernelTester()
5857           .mr(1)
5858           .nr(8)
5859           .kr(4)
5860           .sr(2)
5861           .m(1)
5862           .n(n)
5863           .k(k)
5864           .a_stride(83)
5865           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5866       }
5867     }
5868   }
5869 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,n_div_8_subtile)5870   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, n_div_8_subtile) {
5871     TEST_REQUIRES_ARM_NEON_V8;
5872     for (uint32_t n = 16; n <= 24; n += 8) {
5873       for (size_t k = 1; k <= 80; k += 17) {
5874         for (uint32_t m = 1; m <= 1; m++) {
5875           GemmMicrokernelTester()
5876             .mr(1)
5877             .nr(8)
5878             .kr(4)
5879             .sr(2)
5880             .m(m)
5881             .n(n)
5882             .k(k)
5883             .iterations(1)
5884             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5885         }
5886       }
5887     }
5888   }
5889 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,strided_cm_subtile)5890   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, strided_cm_subtile) {
5891     TEST_REQUIRES_ARM_NEON_V8;
5892     for (size_t k = 1; k <= 80; k += 17) {
5893       for (uint32_t n = 1; n <= 8; n++) {
5894         for (uint32_t m = 1; m <= 1; m++) {
5895           GemmMicrokernelTester()
5896             .mr(1)
5897             .nr(8)
5898             .kr(4)
5899             .sr(2)
5900             .m(m)
5901             .n(n)
5902             .k(k)
5903             .cm_stride(11)
5904             .iterations(1)
5905             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5906         }
5907       }
5908     }
5909   }
5910 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,qmin)5911   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, qmin) {
5912     TEST_REQUIRES_ARM_NEON_V8;
5913     GemmMicrokernelTester()
5914       .mr(1)
5915       .nr(8)
5916       .kr(4)
5917       .sr(2)
5918       .m(1)
5919       .n(8)
5920       .k(16)
5921       .qmin(128)
5922       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5923   }
5924 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,qmax)5925   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, qmax) {
5926     TEST_REQUIRES_ARM_NEON_V8;
5927     GemmMicrokernelTester()
5928       .mr(1)
5929       .nr(8)
5930       .kr(4)
5931       .sr(2)
5932       .m(1)
5933       .n(8)
5934       .k(16)
5935       .qmax(128)
5936       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5937   }
5938 
TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL,strided_cm)5939   TEST(QS8_GEMM_MINMAX_FP32_1X8C4S2__NEONV8_MLAL, strided_cm) {
5940     TEST_REQUIRES_ARM_NEON_V8;
5941     GemmMicrokernelTester()
5942       .mr(1)
5943       .nr(8)
5944       .kr(4)
5945       .sr(2)
5946       .m(1)
5947       .n(8)
5948       .k(16)
5949       .cm_stride(11)
5950       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
5951   }
5952 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
5953 
5954 
5955 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_eq_16)5956   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_eq_16) {
5957     TEST_REQUIRES_ARM_NEON;
5958     GemmMicrokernelTester()
5959       .mr(2)
5960       .nr(8)
5961       .kr(2)
5962       .sr(1)
5963       .m(2)
5964       .n(8)
5965       .k(16)
5966       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5967   }
5968 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,strided_cn)5969   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, strided_cn) {
5970     TEST_REQUIRES_ARM_NEON;
5971     GemmMicrokernelTester()
5972       .mr(2)
5973       .nr(8)
5974       .kr(2)
5975       .sr(1)
5976       .m(2)
5977       .n(8)
5978       .k(16)
5979       .cn_stride(11)
5980       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5981   }
5982 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_eq_16_strided_a)5983   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_eq_16_strided_a) {
5984     TEST_REQUIRES_ARM_NEON;
5985     GemmMicrokernelTester()
5986       .mr(2)
5987       .nr(8)
5988       .kr(2)
5989       .sr(1)
5990       .m(2)
5991       .n(8)
5992       .k(16)
5993       .a_stride(19)
5994       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
5995   }
5996 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_eq_16_subtile)5997   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_eq_16_subtile) {
5998     TEST_REQUIRES_ARM_NEON;
5999     for (uint32_t n = 1; n <= 8; n++) {
6000       for (uint32_t m = 1; m <= 2; m++) {
6001         GemmMicrokernelTester()
6002           .mr(2)
6003           .nr(8)
6004           .kr(2)
6005           .sr(1)
6006           .m(m)
6007           .n(n)
6008           .k(16)
6009           .iterations(1)
6010           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6011       }
6012     }
6013   }
6014 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_eq_16_subtile_m)6015   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_eq_16_subtile_m) {
6016     TEST_REQUIRES_ARM_NEON;
6017     for (uint32_t m = 1; m <= 2; m++) {
6018       GemmMicrokernelTester()
6019         .mr(2)
6020         .nr(8)
6021         .kr(2)
6022         .sr(1)
6023         .m(m)
6024         .n(8)
6025         .k(16)
6026         .iterations(1)
6027         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6028     }
6029   }
6030 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_eq_16_subtile_n)6031   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_eq_16_subtile_n) {
6032     TEST_REQUIRES_ARM_NEON;
6033     for (uint32_t n = 1; n <= 8; n++) {
6034       GemmMicrokernelTester()
6035         .mr(2)
6036         .nr(8)
6037         .kr(2)
6038         .sr(1)
6039         .m(2)
6040         .n(n)
6041         .k(16)
6042         .iterations(1)
6043         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6044     }
6045   }
6046 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_lt_16)6047   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_lt_16) {
6048     TEST_REQUIRES_ARM_NEON;
6049     for (size_t k = 1; k < 16; k++) {
6050       GemmMicrokernelTester()
6051         .mr(2)
6052         .nr(8)
6053         .kr(2)
6054         .sr(1)
6055         .m(2)
6056         .n(8)
6057         .k(k)
6058         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6059     }
6060   }
6061 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_lt_16_strided_a)6062   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_lt_16_strided_a) {
6063     TEST_REQUIRES_ARM_NEON;
6064     for (size_t k = 1; k < 16; k++) {
6065       GemmMicrokernelTester()
6066         .mr(2)
6067         .nr(8)
6068         .kr(2)
6069         .sr(1)
6070         .m(2)
6071         .n(8)
6072         .k(k)
6073         .a_stride(19)
6074         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6075     }
6076   }
6077 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_lt_16_subtile)6078   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_lt_16_subtile) {
6079     TEST_REQUIRES_ARM_NEON;
6080     for (size_t k = 1; k < 16; k++) {
6081       for (uint32_t n = 1; n <= 8; n++) {
6082         for (uint32_t m = 1; m <= 2; m++) {
6083           GemmMicrokernelTester()
6084             .mr(2)
6085             .nr(8)
6086             .kr(2)
6087             .sr(1)
6088             .m(m)
6089             .n(n)
6090             .k(k)
6091             .iterations(1)
6092             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6093         }
6094       }
6095     }
6096   }
6097 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_gt_16)6098   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_gt_16) {
6099     TEST_REQUIRES_ARM_NEON;
6100     for (size_t k = 17; k < 32; k++) {
6101       GemmMicrokernelTester()
6102         .mr(2)
6103         .nr(8)
6104         .kr(2)
6105         .sr(1)
6106         .m(2)
6107         .n(8)
6108         .k(k)
6109         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6110     }
6111   }
6112 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_gt_16_strided_a)6113   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_gt_16_strided_a) {
6114     TEST_REQUIRES_ARM_NEON;
6115     for (size_t k = 17; k < 32; k++) {
6116       GemmMicrokernelTester()
6117         .mr(2)
6118         .nr(8)
6119         .kr(2)
6120         .sr(1)
6121         .m(2)
6122         .n(8)
6123         .k(k)
6124         .a_stride(37)
6125         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6126     }
6127   }
6128 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_gt_16_subtile)6129   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_gt_16_subtile) {
6130     TEST_REQUIRES_ARM_NEON;
6131     for (size_t k = 17; k < 32; k++) {
6132       for (uint32_t n = 1; n <= 8; n++) {
6133         for (uint32_t m = 1; m <= 2; m++) {
6134           GemmMicrokernelTester()
6135             .mr(2)
6136             .nr(8)
6137             .kr(2)
6138             .sr(1)
6139             .m(m)
6140             .n(n)
6141             .k(k)
6142             .iterations(1)
6143             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6144         }
6145       }
6146     }
6147   }
6148 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_div_16)6149   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_div_16) {
6150     TEST_REQUIRES_ARM_NEON;
6151     for (size_t k = 32; k <= 160; k += 16) {
6152       GemmMicrokernelTester()
6153         .mr(2)
6154         .nr(8)
6155         .kr(2)
6156         .sr(1)
6157         .m(2)
6158         .n(8)
6159         .k(k)
6160         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6161     }
6162   }
6163 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_div_16_strided_a)6164   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_div_16_strided_a) {
6165     TEST_REQUIRES_ARM_NEON;
6166     for (size_t k = 32; k <= 160; k += 16) {
6167       GemmMicrokernelTester()
6168         .mr(2)
6169         .nr(8)
6170         .kr(2)
6171         .sr(1)
6172         .m(2)
6173         .n(8)
6174         .k(k)
6175         .a_stride(163)
6176         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6177     }
6178   }
6179 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,k_div_16_subtile)6180   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, k_div_16_subtile) {
6181     TEST_REQUIRES_ARM_NEON;
6182     for (size_t k = 32; k <= 160; k += 16) {
6183       for (uint32_t n = 1; n <= 8; n++) {
6184         for (uint32_t m = 1; m <= 2; m++) {
6185           GemmMicrokernelTester()
6186             .mr(2)
6187             .nr(8)
6188             .kr(2)
6189             .sr(1)
6190             .m(m)
6191             .n(n)
6192             .k(k)
6193             .iterations(1)
6194             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6195         }
6196       }
6197     }
6198   }
6199 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_gt_8)6200   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_gt_8) {
6201     TEST_REQUIRES_ARM_NEON;
6202     for (uint32_t n = 9; n < 16; n++) {
6203       for (size_t k = 1; k <= 80; k += 17) {
6204         GemmMicrokernelTester()
6205           .mr(2)
6206           .nr(8)
6207           .kr(2)
6208           .sr(1)
6209           .m(2)
6210           .n(n)
6211           .k(k)
6212           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6213       }
6214     }
6215   }
6216 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_gt_8_strided_cn)6217   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_gt_8_strided_cn) {
6218     TEST_REQUIRES_ARM_NEON;
6219     for (uint32_t n = 9; n < 16; n++) {
6220       for (size_t k = 1; k <= 80; k += 17) {
6221         GemmMicrokernelTester()
6222           .mr(2)
6223           .nr(8)
6224           .kr(2)
6225           .sr(1)
6226           .m(2)
6227           .n(n)
6228           .k(k)
6229           .cn_stride(11)
6230           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6231       }
6232     }
6233   }
6234 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_gt_8_strided_a)6235   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_gt_8_strided_a) {
6236     TEST_REQUIRES_ARM_NEON;
6237     for (uint32_t n = 9; n < 16; n++) {
6238       for (size_t k = 1; k <= 80; k += 17) {
6239         GemmMicrokernelTester()
6240           .mr(2)
6241           .nr(8)
6242           .kr(2)
6243           .sr(1)
6244           .m(2)
6245           .n(n)
6246           .k(k)
6247           .a_stride(83)
6248           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6249       }
6250     }
6251   }
6252 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_gt_8_subtile)6253   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_gt_8_subtile) {
6254     TEST_REQUIRES_ARM_NEON;
6255     for (uint32_t n = 9; n < 16; n++) {
6256       for (size_t k = 1; k <= 80; k += 17) {
6257         for (uint32_t m = 1; m <= 2; m++) {
6258           GemmMicrokernelTester()
6259             .mr(2)
6260             .nr(8)
6261             .kr(2)
6262             .sr(1)
6263             .m(m)
6264             .n(n)
6265             .k(k)
6266             .iterations(1)
6267             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6268         }
6269       }
6270     }
6271   }
6272 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_div_8)6273   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_div_8) {
6274     TEST_REQUIRES_ARM_NEON;
6275     for (uint32_t n = 16; n <= 24; n += 8) {
6276       for (size_t k = 1; k <= 80; k += 17) {
6277         GemmMicrokernelTester()
6278           .mr(2)
6279           .nr(8)
6280           .kr(2)
6281           .sr(1)
6282           .m(2)
6283           .n(n)
6284           .k(k)
6285           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6286       }
6287     }
6288   }
6289 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_div_8_strided_cn)6290   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_div_8_strided_cn) {
6291     TEST_REQUIRES_ARM_NEON;
6292     for (uint32_t n = 16; n <= 24; n += 8) {
6293       for (size_t k = 1; k <= 80; k += 17) {
6294         GemmMicrokernelTester()
6295           .mr(2)
6296           .nr(8)
6297           .kr(2)
6298           .sr(1)
6299           .m(2)
6300           .n(n)
6301           .k(k)
6302           .cn_stride(11)
6303           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6304       }
6305     }
6306   }
6307 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_div_8_strided_a)6308   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_div_8_strided_a) {
6309     TEST_REQUIRES_ARM_NEON;
6310     for (uint32_t n = 16; n <= 24; n += 8) {
6311       for (size_t k = 1; k <= 80; k += 17) {
6312         GemmMicrokernelTester()
6313           .mr(2)
6314           .nr(8)
6315           .kr(2)
6316           .sr(1)
6317           .m(2)
6318           .n(n)
6319           .k(k)
6320           .a_stride(83)
6321           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6322       }
6323     }
6324   }
6325 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,n_div_8_subtile)6326   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, n_div_8_subtile) {
6327     TEST_REQUIRES_ARM_NEON;
6328     for (uint32_t n = 16; n <= 24; n += 8) {
6329       for (size_t k = 1; k <= 80; k += 17) {
6330         for (uint32_t m = 1; m <= 2; m++) {
6331           GemmMicrokernelTester()
6332             .mr(2)
6333             .nr(8)
6334             .kr(2)
6335             .sr(1)
6336             .m(m)
6337             .n(n)
6338             .k(k)
6339             .iterations(1)
6340             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6341         }
6342       }
6343     }
6344   }
6345 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,strided_cm_subtile)6346   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, strided_cm_subtile) {
6347     TEST_REQUIRES_ARM_NEON;
6348     for (size_t k = 1; k <= 80; k += 17) {
6349       for (uint32_t n = 1; n <= 8; n++) {
6350         for (uint32_t m = 1; m <= 2; m++) {
6351           GemmMicrokernelTester()
6352             .mr(2)
6353             .nr(8)
6354             .kr(2)
6355             .sr(1)
6356             .m(m)
6357             .n(n)
6358             .k(k)
6359             .cm_stride(11)
6360             .iterations(1)
6361             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6362         }
6363       }
6364     }
6365   }
6366 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,qmin)6367   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, qmin) {
6368     TEST_REQUIRES_ARM_NEON;
6369     GemmMicrokernelTester()
6370       .mr(2)
6371       .nr(8)
6372       .kr(2)
6373       .sr(1)
6374       .m(2)
6375       .n(8)
6376       .k(16)
6377       .qmin(128)
6378       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6379   }
6380 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,qmax)6381   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, qmax) {
6382     TEST_REQUIRES_ARM_NEON;
6383     GemmMicrokernelTester()
6384       .mr(2)
6385       .nr(8)
6386       .kr(2)
6387       .sr(1)
6388       .m(2)
6389       .n(8)
6390       .k(16)
6391       .qmax(128)
6392       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6393   }
6394 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP,strided_cm)6395   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_DUP, strided_cm) {
6396     TEST_REQUIRES_ARM_NEON;
6397     GemmMicrokernelTester()
6398       .mr(2)
6399       .nr(8)
6400       .kr(2)
6401       .sr(1)
6402       .m(2)
6403       .n(8)
6404       .k(16)
6405       .cm_stride(11)
6406       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6407   }
6408 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
6409 
6410 
6411 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_eq_16)6412   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_eq_16) {
6413     TEST_REQUIRES_ARM_NEON;
6414     GemmMicrokernelTester()
6415       .mr(2)
6416       .nr(8)
6417       .kr(2)
6418       .sr(1)
6419       .m(2)
6420       .n(8)
6421       .k(16)
6422       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6423   }
6424 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,strided_cn)6425   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, strided_cn) {
6426     TEST_REQUIRES_ARM_NEON;
6427     GemmMicrokernelTester()
6428       .mr(2)
6429       .nr(8)
6430       .kr(2)
6431       .sr(1)
6432       .m(2)
6433       .n(8)
6434       .k(16)
6435       .cn_stride(11)
6436       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6437   }
6438 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_eq_16_strided_a)6439   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_eq_16_strided_a) {
6440     TEST_REQUIRES_ARM_NEON;
6441     GemmMicrokernelTester()
6442       .mr(2)
6443       .nr(8)
6444       .kr(2)
6445       .sr(1)
6446       .m(2)
6447       .n(8)
6448       .k(16)
6449       .a_stride(19)
6450       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6451   }
6452 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_eq_16_subtile)6453   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_eq_16_subtile) {
6454     TEST_REQUIRES_ARM_NEON;
6455     for (uint32_t n = 1; n <= 8; n++) {
6456       for (uint32_t m = 1; m <= 2; m++) {
6457         GemmMicrokernelTester()
6458           .mr(2)
6459           .nr(8)
6460           .kr(2)
6461           .sr(1)
6462           .m(m)
6463           .n(n)
6464           .k(16)
6465           .iterations(1)
6466           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6467       }
6468     }
6469   }
6470 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_eq_16_subtile_m)6471   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_eq_16_subtile_m) {
6472     TEST_REQUIRES_ARM_NEON;
6473     for (uint32_t m = 1; m <= 2; m++) {
6474       GemmMicrokernelTester()
6475         .mr(2)
6476         .nr(8)
6477         .kr(2)
6478         .sr(1)
6479         .m(m)
6480         .n(8)
6481         .k(16)
6482         .iterations(1)
6483         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6484     }
6485   }
6486 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_eq_16_subtile_n)6487   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_eq_16_subtile_n) {
6488     TEST_REQUIRES_ARM_NEON;
6489     for (uint32_t n = 1; n <= 8; n++) {
6490       GemmMicrokernelTester()
6491         .mr(2)
6492         .nr(8)
6493         .kr(2)
6494         .sr(1)
6495         .m(2)
6496         .n(n)
6497         .k(16)
6498         .iterations(1)
6499         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6500     }
6501   }
6502 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_lt_16)6503   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_lt_16) {
6504     TEST_REQUIRES_ARM_NEON;
6505     for (size_t k = 1; k < 16; k++) {
6506       GemmMicrokernelTester()
6507         .mr(2)
6508         .nr(8)
6509         .kr(2)
6510         .sr(1)
6511         .m(2)
6512         .n(8)
6513         .k(k)
6514         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6515     }
6516   }
6517 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_lt_16_strided_a)6518   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_lt_16_strided_a) {
6519     TEST_REQUIRES_ARM_NEON;
6520     for (size_t k = 1; k < 16; k++) {
6521       GemmMicrokernelTester()
6522         .mr(2)
6523         .nr(8)
6524         .kr(2)
6525         .sr(1)
6526         .m(2)
6527         .n(8)
6528         .k(k)
6529         .a_stride(19)
6530         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6531     }
6532   }
6533 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_lt_16_subtile)6534   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_lt_16_subtile) {
6535     TEST_REQUIRES_ARM_NEON;
6536     for (size_t k = 1; k < 16; k++) {
6537       for (uint32_t n = 1; n <= 8; n++) {
6538         for (uint32_t m = 1; m <= 2; m++) {
6539           GemmMicrokernelTester()
6540             .mr(2)
6541             .nr(8)
6542             .kr(2)
6543             .sr(1)
6544             .m(m)
6545             .n(n)
6546             .k(k)
6547             .iterations(1)
6548             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6549         }
6550       }
6551     }
6552   }
6553 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_gt_16)6554   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_gt_16) {
6555     TEST_REQUIRES_ARM_NEON;
6556     for (size_t k = 17; k < 32; k++) {
6557       GemmMicrokernelTester()
6558         .mr(2)
6559         .nr(8)
6560         .kr(2)
6561         .sr(1)
6562         .m(2)
6563         .n(8)
6564         .k(k)
6565         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6566     }
6567   }
6568 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_gt_16_strided_a)6569   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_gt_16_strided_a) {
6570     TEST_REQUIRES_ARM_NEON;
6571     for (size_t k = 17; k < 32; k++) {
6572       GemmMicrokernelTester()
6573         .mr(2)
6574         .nr(8)
6575         .kr(2)
6576         .sr(1)
6577         .m(2)
6578         .n(8)
6579         .k(k)
6580         .a_stride(37)
6581         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6582     }
6583   }
6584 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_gt_16_subtile)6585   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_gt_16_subtile) {
6586     TEST_REQUIRES_ARM_NEON;
6587     for (size_t k = 17; k < 32; k++) {
6588       for (uint32_t n = 1; n <= 8; n++) {
6589         for (uint32_t m = 1; m <= 2; m++) {
6590           GemmMicrokernelTester()
6591             .mr(2)
6592             .nr(8)
6593             .kr(2)
6594             .sr(1)
6595             .m(m)
6596             .n(n)
6597             .k(k)
6598             .iterations(1)
6599             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6600         }
6601       }
6602     }
6603   }
6604 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_div_16)6605   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_div_16) {
6606     TEST_REQUIRES_ARM_NEON;
6607     for (size_t k = 32; k <= 160; k += 16) {
6608       GemmMicrokernelTester()
6609         .mr(2)
6610         .nr(8)
6611         .kr(2)
6612         .sr(1)
6613         .m(2)
6614         .n(8)
6615         .k(k)
6616         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6617     }
6618   }
6619 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_div_16_strided_a)6620   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_div_16_strided_a) {
6621     TEST_REQUIRES_ARM_NEON;
6622     for (size_t k = 32; k <= 160; k += 16) {
6623       GemmMicrokernelTester()
6624         .mr(2)
6625         .nr(8)
6626         .kr(2)
6627         .sr(1)
6628         .m(2)
6629         .n(8)
6630         .k(k)
6631         .a_stride(163)
6632         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6633     }
6634   }
6635 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,k_div_16_subtile)6636   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, k_div_16_subtile) {
6637     TEST_REQUIRES_ARM_NEON;
6638     for (size_t k = 32; k <= 160; k += 16) {
6639       for (uint32_t n = 1; n <= 8; n++) {
6640         for (uint32_t m = 1; m <= 2; m++) {
6641           GemmMicrokernelTester()
6642             .mr(2)
6643             .nr(8)
6644             .kr(2)
6645             .sr(1)
6646             .m(m)
6647             .n(n)
6648             .k(k)
6649             .iterations(1)
6650             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6651         }
6652       }
6653     }
6654   }
6655 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_gt_8)6656   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_gt_8) {
6657     TEST_REQUIRES_ARM_NEON;
6658     for (uint32_t n = 9; n < 16; n++) {
6659       for (size_t k = 1; k <= 80; k += 17) {
6660         GemmMicrokernelTester()
6661           .mr(2)
6662           .nr(8)
6663           .kr(2)
6664           .sr(1)
6665           .m(2)
6666           .n(n)
6667           .k(k)
6668           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6669       }
6670     }
6671   }
6672 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_gt_8_strided_cn)6673   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_gt_8_strided_cn) {
6674     TEST_REQUIRES_ARM_NEON;
6675     for (uint32_t n = 9; n < 16; n++) {
6676       for (size_t k = 1; k <= 80; k += 17) {
6677         GemmMicrokernelTester()
6678           .mr(2)
6679           .nr(8)
6680           .kr(2)
6681           .sr(1)
6682           .m(2)
6683           .n(n)
6684           .k(k)
6685           .cn_stride(11)
6686           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6687       }
6688     }
6689   }
6690 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_gt_8_strided_a)6691   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_gt_8_strided_a) {
6692     TEST_REQUIRES_ARM_NEON;
6693     for (uint32_t n = 9; n < 16; n++) {
6694       for (size_t k = 1; k <= 80; k += 17) {
6695         GemmMicrokernelTester()
6696           .mr(2)
6697           .nr(8)
6698           .kr(2)
6699           .sr(1)
6700           .m(2)
6701           .n(n)
6702           .k(k)
6703           .a_stride(83)
6704           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6705       }
6706     }
6707   }
6708 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_gt_8_subtile)6709   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_gt_8_subtile) {
6710     TEST_REQUIRES_ARM_NEON;
6711     for (uint32_t n = 9; n < 16; n++) {
6712       for (size_t k = 1; k <= 80; k += 17) {
6713         for (uint32_t m = 1; m <= 2; m++) {
6714           GemmMicrokernelTester()
6715             .mr(2)
6716             .nr(8)
6717             .kr(2)
6718             .sr(1)
6719             .m(m)
6720             .n(n)
6721             .k(k)
6722             .iterations(1)
6723             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6724         }
6725       }
6726     }
6727   }
6728 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_div_8)6729   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_div_8) {
6730     TEST_REQUIRES_ARM_NEON;
6731     for (uint32_t n = 16; n <= 24; n += 8) {
6732       for (size_t k = 1; k <= 80; k += 17) {
6733         GemmMicrokernelTester()
6734           .mr(2)
6735           .nr(8)
6736           .kr(2)
6737           .sr(1)
6738           .m(2)
6739           .n(n)
6740           .k(k)
6741           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6742       }
6743     }
6744   }
6745 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_div_8_strided_cn)6746   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_div_8_strided_cn) {
6747     TEST_REQUIRES_ARM_NEON;
6748     for (uint32_t n = 16; n <= 24; n += 8) {
6749       for (size_t k = 1; k <= 80; k += 17) {
6750         GemmMicrokernelTester()
6751           .mr(2)
6752           .nr(8)
6753           .kr(2)
6754           .sr(1)
6755           .m(2)
6756           .n(n)
6757           .k(k)
6758           .cn_stride(11)
6759           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6760       }
6761     }
6762   }
6763 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_div_8_strided_a)6764   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_div_8_strided_a) {
6765     TEST_REQUIRES_ARM_NEON;
6766     for (uint32_t n = 16; n <= 24; n += 8) {
6767       for (size_t k = 1; k <= 80; k += 17) {
6768         GemmMicrokernelTester()
6769           .mr(2)
6770           .nr(8)
6771           .kr(2)
6772           .sr(1)
6773           .m(2)
6774           .n(n)
6775           .k(k)
6776           .a_stride(83)
6777           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6778       }
6779     }
6780   }
6781 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,n_div_8_subtile)6782   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, n_div_8_subtile) {
6783     TEST_REQUIRES_ARM_NEON;
6784     for (uint32_t n = 16; n <= 24; n += 8) {
6785       for (size_t k = 1; k <= 80; k += 17) {
6786         for (uint32_t m = 1; m <= 2; m++) {
6787           GemmMicrokernelTester()
6788             .mr(2)
6789             .nr(8)
6790             .kr(2)
6791             .sr(1)
6792             .m(m)
6793             .n(n)
6794             .k(k)
6795             .iterations(1)
6796             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6797         }
6798       }
6799     }
6800   }
6801 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,strided_cm_subtile)6802   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, strided_cm_subtile) {
6803     TEST_REQUIRES_ARM_NEON;
6804     for (size_t k = 1; k <= 80; k += 17) {
6805       for (uint32_t n = 1; n <= 8; n++) {
6806         for (uint32_t m = 1; m <= 2; m++) {
6807           GemmMicrokernelTester()
6808             .mr(2)
6809             .nr(8)
6810             .kr(2)
6811             .sr(1)
6812             .m(m)
6813             .n(n)
6814             .k(k)
6815             .cm_stride(11)
6816             .iterations(1)
6817             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6818         }
6819       }
6820     }
6821   }
6822 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,qmin)6823   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, qmin) {
6824     TEST_REQUIRES_ARM_NEON;
6825     GemmMicrokernelTester()
6826       .mr(2)
6827       .nr(8)
6828       .kr(2)
6829       .sr(1)
6830       .m(2)
6831       .n(8)
6832       .k(16)
6833       .qmin(128)
6834       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6835   }
6836 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,qmax)6837   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, qmax) {
6838     TEST_REQUIRES_ARM_NEON;
6839     GemmMicrokernelTester()
6840       .mr(2)
6841       .nr(8)
6842       .kr(2)
6843       .sr(1)
6844       .m(2)
6845       .n(8)
6846       .k(16)
6847       .qmax(128)
6848       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6849   }
6850 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R,strided_cm)6851   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD2R, strided_cm) {
6852     TEST_REQUIRES_ARM_NEON;
6853     GemmMicrokernelTester()
6854       .mr(2)
6855       .nr(8)
6856       .kr(2)
6857       .sr(1)
6858       .m(2)
6859       .n(8)
6860       .k(16)
6861       .cm_stride(11)
6862       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6863   }
6864 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
6865 
6866 
6867 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_eq_16)6868   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_eq_16) {
6869     TEST_REQUIRES_ARM_NEON;
6870     GemmMicrokernelTester()
6871       .mr(2)
6872       .nr(8)
6873       .kr(2)
6874       .sr(1)
6875       .m(2)
6876       .n(8)
6877       .k(16)
6878       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6879   }
6880 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,strided_cn)6881   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, strided_cn) {
6882     TEST_REQUIRES_ARM_NEON;
6883     GemmMicrokernelTester()
6884       .mr(2)
6885       .nr(8)
6886       .kr(2)
6887       .sr(1)
6888       .m(2)
6889       .n(8)
6890       .k(16)
6891       .cn_stride(11)
6892       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6893   }
6894 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_eq_16_strided_a)6895   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_eq_16_strided_a) {
6896     TEST_REQUIRES_ARM_NEON;
6897     GemmMicrokernelTester()
6898       .mr(2)
6899       .nr(8)
6900       .kr(2)
6901       .sr(1)
6902       .m(2)
6903       .n(8)
6904       .k(16)
6905       .a_stride(19)
6906       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6907   }
6908 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_eq_16_subtile)6909   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_eq_16_subtile) {
6910     TEST_REQUIRES_ARM_NEON;
6911     for (uint32_t n = 1; n <= 8; n++) {
6912       for (uint32_t m = 1; m <= 2; m++) {
6913         GemmMicrokernelTester()
6914           .mr(2)
6915           .nr(8)
6916           .kr(2)
6917           .sr(1)
6918           .m(m)
6919           .n(n)
6920           .k(16)
6921           .iterations(1)
6922           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6923       }
6924     }
6925   }
6926 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_eq_16_subtile_m)6927   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_eq_16_subtile_m) {
6928     TEST_REQUIRES_ARM_NEON;
6929     for (uint32_t m = 1; m <= 2; m++) {
6930       GemmMicrokernelTester()
6931         .mr(2)
6932         .nr(8)
6933         .kr(2)
6934         .sr(1)
6935         .m(m)
6936         .n(8)
6937         .k(16)
6938         .iterations(1)
6939         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6940     }
6941   }
6942 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_eq_16_subtile_n)6943   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_eq_16_subtile_n) {
6944     TEST_REQUIRES_ARM_NEON;
6945     for (uint32_t n = 1; n <= 8; n++) {
6946       GemmMicrokernelTester()
6947         .mr(2)
6948         .nr(8)
6949         .kr(2)
6950         .sr(1)
6951         .m(2)
6952         .n(n)
6953         .k(16)
6954         .iterations(1)
6955         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6956     }
6957   }
6958 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_lt_16)6959   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_lt_16) {
6960     TEST_REQUIRES_ARM_NEON;
6961     for (size_t k = 1; k < 16; k++) {
6962       GemmMicrokernelTester()
6963         .mr(2)
6964         .nr(8)
6965         .kr(2)
6966         .sr(1)
6967         .m(2)
6968         .n(8)
6969         .k(k)
6970         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6971     }
6972   }
6973 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_lt_16_strided_a)6974   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_lt_16_strided_a) {
6975     TEST_REQUIRES_ARM_NEON;
6976     for (size_t k = 1; k < 16; k++) {
6977       GemmMicrokernelTester()
6978         .mr(2)
6979         .nr(8)
6980         .kr(2)
6981         .sr(1)
6982         .m(2)
6983         .n(8)
6984         .k(k)
6985         .a_stride(19)
6986         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
6987     }
6988   }
6989 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_lt_16_subtile)6990   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_lt_16_subtile) {
6991     TEST_REQUIRES_ARM_NEON;
6992     for (size_t k = 1; k < 16; k++) {
6993       for (uint32_t n = 1; n <= 8; n++) {
6994         for (uint32_t m = 1; m <= 2; m++) {
6995           GemmMicrokernelTester()
6996             .mr(2)
6997             .nr(8)
6998             .kr(2)
6999             .sr(1)
7000             .m(m)
7001             .n(n)
7002             .k(k)
7003             .iterations(1)
7004             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7005         }
7006       }
7007     }
7008   }
7009 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_gt_16)7010   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_gt_16) {
7011     TEST_REQUIRES_ARM_NEON;
7012     for (size_t k = 17; k < 32; k++) {
7013       GemmMicrokernelTester()
7014         .mr(2)
7015         .nr(8)
7016         .kr(2)
7017         .sr(1)
7018         .m(2)
7019         .n(8)
7020         .k(k)
7021         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7022     }
7023   }
7024 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_gt_16_strided_a)7025   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_gt_16_strided_a) {
7026     TEST_REQUIRES_ARM_NEON;
7027     for (size_t k = 17; k < 32; k++) {
7028       GemmMicrokernelTester()
7029         .mr(2)
7030         .nr(8)
7031         .kr(2)
7032         .sr(1)
7033         .m(2)
7034         .n(8)
7035         .k(k)
7036         .a_stride(37)
7037         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7038     }
7039   }
7040 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_gt_16_subtile)7041   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_gt_16_subtile) {
7042     TEST_REQUIRES_ARM_NEON;
7043     for (size_t k = 17; k < 32; k++) {
7044       for (uint32_t n = 1; n <= 8; n++) {
7045         for (uint32_t m = 1; m <= 2; m++) {
7046           GemmMicrokernelTester()
7047             .mr(2)
7048             .nr(8)
7049             .kr(2)
7050             .sr(1)
7051             .m(m)
7052             .n(n)
7053             .k(k)
7054             .iterations(1)
7055             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7056         }
7057       }
7058     }
7059   }
7060 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_div_16)7061   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_div_16) {
7062     TEST_REQUIRES_ARM_NEON;
7063     for (size_t k = 32; k <= 160; k += 16) {
7064       GemmMicrokernelTester()
7065         .mr(2)
7066         .nr(8)
7067         .kr(2)
7068         .sr(1)
7069         .m(2)
7070         .n(8)
7071         .k(k)
7072         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7073     }
7074   }
7075 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_div_16_strided_a)7076   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_div_16_strided_a) {
7077     TEST_REQUIRES_ARM_NEON;
7078     for (size_t k = 32; k <= 160; k += 16) {
7079       GemmMicrokernelTester()
7080         .mr(2)
7081         .nr(8)
7082         .kr(2)
7083         .sr(1)
7084         .m(2)
7085         .n(8)
7086         .k(k)
7087         .a_stride(163)
7088         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7089     }
7090   }
7091 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,k_div_16_subtile)7092   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, k_div_16_subtile) {
7093     TEST_REQUIRES_ARM_NEON;
7094     for (size_t k = 32; k <= 160; k += 16) {
7095       for (uint32_t n = 1; n <= 8; n++) {
7096         for (uint32_t m = 1; m <= 2; m++) {
7097           GemmMicrokernelTester()
7098             .mr(2)
7099             .nr(8)
7100             .kr(2)
7101             .sr(1)
7102             .m(m)
7103             .n(n)
7104             .k(k)
7105             .iterations(1)
7106             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7107         }
7108       }
7109     }
7110   }
7111 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_gt_8)7112   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_gt_8) {
7113     TEST_REQUIRES_ARM_NEON;
7114     for (uint32_t n = 9; n < 16; n++) {
7115       for (size_t k = 1; k <= 80; k += 17) {
7116         GemmMicrokernelTester()
7117           .mr(2)
7118           .nr(8)
7119           .kr(2)
7120           .sr(1)
7121           .m(2)
7122           .n(n)
7123           .k(k)
7124           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7125       }
7126     }
7127   }
7128 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_gt_8_strided_cn)7129   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_gt_8_strided_cn) {
7130     TEST_REQUIRES_ARM_NEON;
7131     for (uint32_t n = 9; n < 16; n++) {
7132       for (size_t k = 1; k <= 80; k += 17) {
7133         GemmMicrokernelTester()
7134           .mr(2)
7135           .nr(8)
7136           .kr(2)
7137           .sr(1)
7138           .m(2)
7139           .n(n)
7140           .k(k)
7141           .cn_stride(11)
7142           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7143       }
7144     }
7145   }
7146 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_gt_8_strided_a)7147   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_gt_8_strided_a) {
7148     TEST_REQUIRES_ARM_NEON;
7149     for (uint32_t n = 9; n < 16; n++) {
7150       for (size_t k = 1; k <= 80; k += 17) {
7151         GemmMicrokernelTester()
7152           .mr(2)
7153           .nr(8)
7154           .kr(2)
7155           .sr(1)
7156           .m(2)
7157           .n(n)
7158           .k(k)
7159           .a_stride(83)
7160           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7161       }
7162     }
7163   }
7164 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_gt_8_subtile)7165   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_gt_8_subtile) {
7166     TEST_REQUIRES_ARM_NEON;
7167     for (uint32_t n = 9; n < 16; n++) {
7168       for (size_t k = 1; k <= 80; k += 17) {
7169         for (uint32_t m = 1; m <= 2; m++) {
7170           GemmMicrokernelTester()
7171             .mr(2)
7172             .nr(8)
7173             .kr(2)
7174             .sr(1)
7175             .m(m)
7176             .n(n)
7177             .k(k)
7178             .iterations(1)
7179             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7180         }
7181       }
7182     }
7183   }
7184 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_div_8)7185   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_div_8) {
7186     TEST_REQUIRES_ARM_NEON;
7187     for (uint32_t n = 16; n <= 24; n += 8) {
7188       for (size_t k = 1; k <= 80; k += 17) {
7189         GemmMicrokernelTester()
7190           .mr(2)
7191           .nr(8)
7192           .kr(2)
7193           .sr(1)
7194           .m(2)
7195           .n(n)
7196           .k(k)
7197           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7198       }
7199     }
7200   }
7201 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_div_8_strided_cn)7202   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_div_8_strided_cn) {
7203     TEST_REQUIRES_ARM_NEON;
7204     for (uint32_t n = 16; n <= 24; n += 8) {
7205       for (size_t k = 1; k <= 80; k += 17) {
7206         GemmMicrokernelTester()
7207           .mr(2)
7208           .nr(8)
7209           .kr(2)
7210           .sr(1)
7211           .m(2)
7212           .n(n)
7213           .k(k)
7214           .cn_stride(11)
7215           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7216       }
7217     }
7218   }
7219 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_div_8_strided_a)7220   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_div_8_strided_a) {
7221     TEST_REQUIRES_ARM_NEON;
7222     for (uint32_t n = 16; n <= 24; n += 8) {
7223       for (size_t k = 1; k <= 80; k += 17) {
7224         GemmMicrokernelTester()
7225           .mr(2)
7226           .nr(8)
7227           .kr(2)
7228           .sr(1)
7229           .m(2)
7230           .n(n)
7231           .k(k)
7232           .a_stride(83)
7233           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7234       }
7235     }
7236   }
7237 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,n_div_8_subtile)7238   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, n_div_8_subtile) {
7239     TEST_REQUIRES_ARM_NEON;
7240     for (uint32_t n = 16; n <= 24; n += 8) {
7241       for (size_t k = 1; k <= 80; k += 17) {
7242         for (uint32_t m = 1; m <= 2; m++) {
7243           GemmMicrokernelTester()
7244             .mr(2)
7245             .nr(8)
7246             .kr(2)
7247             .sr(1)
7248             .m(m)
7249             .n(n)
7250             .k(k)
7251             .iterations(1)
7252             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7253         }
7254       }
7255     }
7256   }
7257 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,strided_cm_subtile)7258   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, strided_cm_subtile) {
7259     TEST_REQUIRES_ARM_NEON;
7260     for (size_t k = 1; k <= 80; k += 17) {
7261       for (uint32_t n = 1; n <= 8; n++) {
7262         for (uint32_t m = 1; m <= 2; m++) {
7263           GemmMicrokernelTester()
7264             .mr(2)
7265             .nr(8)
7266             .kr(2)
7267             .sr(1)
7268             .m(m)
7269             .n(n)
7270             .k(k)
7271             .cm_stride(11)
7272             .iterations(1)
7273             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7274         }
7275       }
7276     }
7277   }
7278 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,qmin)7279   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, qmin) {
7280     TEST_REQUIRES_ARM_NEON;
7281     GemmMicrokernelTester()
7282       .mr(2)
7283       .nr(8)
7284       .kr(2)
7285       .sr(1)
7286       .m(2)
7287       .n(8)
7288       .k(16)
7289       .qmin(128)
7290       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7291   }
7292 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,qmax)7293   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, qmax) {
7294     TEST_REQUIRES_ARM_NEON;
7295     GemmMicrokernelTester()
7296       .mr(2)
7297       .nr(8)
7298       .kr(2)
7299       .sr(1)
7300       .m(2)
7301       .n(8)
7302       .k(16)
7303       .qmax(128)
7304       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7305   }
7306 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R,strided_cm)7307   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEON_MLAL_LD4R, strided_cm) {
7308     TEST_REQUIRES_ARM_NEON;
7309     GemmMicrokernelTester()
7310       .mr(2)
7311       .nr(8)
7312       .kr(2)
7313       .sr(1)
7314       .m(2)
7315       .n(8)
7316       .k(16)
7317       .cm_stride(11)
7318       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neon_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
7319   }
7320 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
7321 
7322 
7323 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_eq_16)7324   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_eq_16) {
7325     TEST_REQUIRES_ARM_NEON_V8;
7326     GemmMicrokernelTester()
7327       .mr(2)
7328       .nr(8)
7329       .kr(2)
7330       .sr(1)
7331       .m(2)
7332       .n(8)
7333       .k(16)
7334       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7335   }
7336 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,strided_cn)7337   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, strided_cn) {
7338     TEST_REQUIRES_ARM_NEON_V8;
7339     GemmMicrokernelTester()
7340       .mr(2)
7341       .nr(8)
7342       .kr(2)
7343       .sr(1)
7344       .m(2)
7345       .n(8)
7346       .k(16)
7347       .cn_stride(11)
7348       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7349   }
7350 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_eq_16_strided_a)7351   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_eq_16_strided_a) {
7352     TEST_REQUIRES_ARM_NEON_V8;
7353     GemmMicrokernelTester()
7354       .mr(2)
7355       .nr(8)
7356       .kr(2)
7357       .sr(1)
7358       .m(2)
7359       .n(8)
7360       .k(16)
7361       .a_stride(19)
7362       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7363   }
7364 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_eq_16_subtile)7365   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_eq_16_subtile) {
7366     TEST_REQUIRES_ARM_NEON_V8;
7367     for (uint32_t n = 1; n <= 8; n++) {
7368       for (uint32_t m = 1; m <= 2; m++) {
7369         GemmMicrokernelTester()
7370           .mr(2)
7371           .nr(8)
7372           .kr(2)
7373           .sr(1)
7374           .m(m)
7375           .n(n)
7376           .k(16)
7377           .iterations(1)
7378           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7379       }
7380     }
7381   }
7382 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_eq_16_subtile_m)7383   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_eq_16_subtile_m) {
7384     TEST_REQUIRES_ARM_NEON_V8;
7385     for (uint32_t m = 1; m <= 2; m++) {
7386       GemmMicrokernelTester()
7387         .mr(2)
7388         .nr(8)
7389         .kr(2)
7390         .sr(1)
7391         .m(m)
7392         .n(8)
7393         .k(16)
7394         .iterations(1)
7395         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7396     }
7397   }
7398 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_eq_16_subtile_n)7399   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_eq_16_subtile_n) {
7400     TEST_REQUIRES_ARM_NEON_V8;
7401     for (uint32_t n = 1; n <= 8; n++) {
7402       GemmMicrokernelTester()
7403         .mr(2)
7404         .nr(8)
7405         .kr(2)
7406         .sr(1)
7407         .m(2)
7408         .n(n)
7409         .k(16)
7410         .iterations(1)
7411         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7412     }
7413   }
7414 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_lt_16)7415   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_lt_16) {
7416     TEST_REQUIRES_ARM_NEON_V8;
7417     for (size_t k = 1; k < 16; k++) {
7418       GemmMicrokernelTester()
7419         .mr(2)
7420         .nr(8)
7421         .kr(2)
7422         .sr(1)
7423         .m(2)
7424         .n(8)
7425         .k(k)
7426         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7427     }
7428   }
7429 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_lt_16_strided_a)7430   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_lt_16_strided_a) {
7431     TEST_REQUIRES_ARM_NEON_V8;
7432     for (size_t k = 1; k < 16; k++) {
7433       GemmMicrokernelTester()
7434         .mr(2)
7435         .nr(8)
7436         .kr(2)
7437         .sr(1)
7438         .m(2)
7439         .n(8)
7440         .k(k)
7441         .a_stride(19)
7442         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7443     }
7444   }
7445 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_lt_16_subtile)7446   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_lt_16_subtile) {
7447     TEST_REQUIRES_ARM_NEON_V8;
7448     for (size_t k = 1; k < 16; k++) {
7449       for (uint32_t n = 1; n <= 8; n++) {
7450         for (uint32_t m = 1; m <= 2; m++) {
7451           GemmMicrokernelTester()
7452             .mr(2)
7453             .nr(8)
7454             .kr(2)
7455             .sr(1)
7456             .m(m)
7457             .n(n)
7458             .k(k)
7459             .iterations(1)
7460             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7461         }
7462       }
7463     }
7464   }
7465 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_gt_16)7466   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_gt_16) {
7467     TEST_REQUIRES_ARM_NEON_V8;
7468     for (size_t k = 17; k < 32; k++) {
7469       GemmMicrokernelTester()
7470         .mr(2)
7471         .nr(8)
7472         .kr(2)
7473         .sr(1)
7474         .m(2)
7475         .n(8)
7476         .k(k)
7477         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7478     }
7479   }
7480 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_gt_16_strided_a)7481   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_gt_16_strided_a) {
7482     TEST_REQUIRES_ARM_NEON_V8;
7483     for (size_t k = 17; k < 32; k++) {
7484       GemmMicrokernelTester()
7485         .mr(2)
7486         .nr(8)
7487         .kr(2)
7488         .sr(1)
7489         .m(2)
7490         .n(8)
7491         .k(k)
7492         .a_stride(37)
7493         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7494     }
7495   }
7496 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_gt_16_subtile)7497   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_gt_16_subtile) {
7498     TEST_REQUIRES_ARM_NEON_V8;
7499     for (size_t k = 17; k < 32; k++) {
7500       for (uint32_t n = 1; n <= 8; n++) {
7501         for (uint32_t m = 1; m <= 2; m++) {
7502           GemmMicrokernelTester()
7503             .mr(2)
7504             .nr(8)
7505             .kr(2)
7506             .sr(1)
7507             .m(m)
7508             .n(n)
7509             .k(k)
7510             .iterations(1)
7511             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7512         }
7513       }
7514     }
7515   }
7516 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_div_16)7517   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_div_16) {
7518     TEST_REQUIRES_ARM_NEON_V8;
7519     for (size_t k = 32; k <= 160; k += 16) {
7520       GemmMicrokernelTester()
7521         .mr(2)
7522         .nr(8)
7523         .kr(2)
7524         .sr(1)
7525         .m(2)
7526         .n(8)
7527         .k(k)
7528         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7529     }
7530   }
7531 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_div_16_strided_a)7532   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_div_16_strided_a) {
7533     TEST_REQUIRES_ARM_NEON_V8;
7534     for (size_t k = 32; k <= 160; k += 16) {
7535       GemmMicrokernelTester()
7536         .mr(2)
7537         .nr(8)
7538         .kr(2)
7539         .sr(1)
7540         .m(2)
7541         .n(8)
7542         .k(k)
7543         .a_stride(163)
7544         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7545     }
7546   }
7547 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,k_div_16_subtile)7548   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, k_div_16_subtile) {
7549     TEST_REQUIRES_ARM_NEON_V8;
7550     for (size_t k = 32; k <= 160; k += 16) {
7551       for (uint32_t n = 1; n <= 8; n++) {
7552         for (uint32_t m = 1; m <= 2; m++) {
7553           GemmMicrokernelTester()
7554             .mr(2)
7555             .nr(8)
7556             .kr(2)
7557             .sr(1)
7558             .m(m)
7559             .n(n)
7560             .k(k)
7561             .iterations(1)
7562             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7563         }
7564       }
7565     }
7566   }
7567 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_gt_8)7568   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_gt_8) {
7569     TEST_REQUIRES_ARM_NEON_V8;
7570     for (uint32_t n = 9; n < 16; n++) {
7571       for (size_t k = 1; k <= 80; k += 17) {
7572         GemmMicrokernelTester()
7573           .mr(2)
7574           .nr(8)
7575           .kr(2)
7576           .sr(1)
7577           .m(2)
7578           .n(n)
7579           .k(k)
7580           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7581       }
7582     }
7583   }
7584 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_gt_8_strided_cn)7585   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_gt_8_strided_cn) {
7586     TEST_REQUIRES_ARM_NEON_V8;
7587     for (uint32_t n = 9; n < 16; n++) {
7588       for (size_t k = 1; k <= 80; k += 17) {
7589         GemmMicrokernelTester()
7590           .mr(2)
7591           .nr(8)
7592           .kr(2)
7593           .sr(1)
7594           .m(2)
7595           .n(n)
7596           .k(k)
7597           .cn_stride(11)
7598           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7599       }
7600     }
7601   }
7602 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_gt_8_strided_a)7603   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_gt_8_strided_a) {
7604     TEST_REQUIRES_ARM_NEON_V8;
7605     for (uint32_t n = 9; n < 16; n++) {
7606       for (size_t k = 1; k <= 80; k += 17) {
7607         GemmMicrokernelTester()
7608           .mr(2)
7609           .nr(8)
7610           .kr(2)
7611           .sr(1)
7612           .m(2)
7613           .n(n)
7614           .k(k)
7615           .a_stride(83)
7616           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7617       }
7618     }
7619   }
7620 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_gt_8_subtile)7621   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_gt_8_subtile) {
7622     TEST_REQUIRES_ARM_NEON_V8;
7623     for (uint32_t n = 9; n < 16; n++) {
7624       for (size_t k = 1; k <= 80; k += 17) {
7625         for (uint32_t m = 1; m <= 2; m++) {
7626           GemmMicrokernelTester()
7627             .mr(2)
7628             .nr(8)
7629             .kr(2)
7630             .sr(1)
7631             .m(m)
7632             .n(n)
7633             .k(k)
7634             .iterations(1)
7635             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7636         }
7637       }
7638     }
7639   }
7640 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_div_8)7641   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_div_8) {
7642     TEST_REQUIRES_ARM_NEON_V8;
7643     for (uint32_t n = 16; n <= 24; n += 8) {
7644       for (size_t k = 1; k <= 80; k += 17) {
7645         GemmMicrokernelTester()
7646           .mr(2)
7647           .nr(8)
7648           .kr(2)
7649           .sr(1)
7650           .m(2)
7651           .n(n)
7652           .k(k)
7653           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7654       }
7655     }
7656   }
7657 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_div_8_strided_cn)7658   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_div_8_strided_cn) {
7659     TEST_REQUIRES_ARM_NEON_V8;
7660     for (uint32_t n = 16; n <= 24; n += 8) {
7661       for (size_t k = 1; k <= 80; k += 17) {
7662         GemmMicrokernelTester()
7663           .mr(2)
7664           .nr(8)
7665           .kr(2)
7666           .sr(1)
7667           .m(2)
7668           .n(n)
7669           .k(k)
7670           .cn_stride(11)
7671           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7672       }
7673     }
7674   }
7675 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_div_8_strided_a)7676   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_div_8_strided_a) {
7677     TEST_REQUIRES_ARM_NEON_V8;
7678     for (uint32_t n = 16; n <= 24; n += 8) {
7679       for (size_t k = 1; k <= 80; k += 17) {
7680         GemmMicrokernelTester()
7681           .mr(2)
7682           .nr(8)
7683           .kr(2)
7684           .sr(1)
7685           .m(2)
7686           .n(n)
7687           .k(k)
7688           .a_stride(83)
7689           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7690       }
7691     }
7692   }
7693 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,n_div_8_subtile)7694   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, n_div_8_subtile) {
7695     TEST_REQUIRES_ARM_NEON_V8;
7696     for (uint32_t n = 16; n <= 24; n += 8) {
7697       for (size_t k = 1; k <= 80; k += 17) {
7698         for (uint32_t m = 1; m <= 2; m++) {
7699           GemmMicrokernelTester()
7700             .mr(2)
7701             .nr(8)
7702             .kr(2)
7703             .sr(1)
7704             .m(m)
7705             .n(n)
7706             .k(k)
7707             .iterations(1)
7708             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7709         }
7710       }
7711     }
7712   }
7713 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,strided_cm_subtile)7714   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, strided_cm_subtile) {
7715     TEST_REQUIRES_ARM_NEON_V8;
7716     for (size_t k = 1; k <= 80; k += 17) {
7717       for (uint32_t n = 1; n <= 8; n++) {
7718         for (uint32_t m = 1; m <= 2; m++) {
7719           GemmMicrokernelTester()
7720             .mr(2)
7721             .nr(8)
7722             .kr(2)
7723             .sr(1)
7724             .m(m)
7725             .n(n)
7726             .k(k)
7727             .cm_stride(11)
7728             .iterations(1)
7729             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7730         }
7731       }
7732     }
7733   }
7734 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,qmin)7735   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, qmin) {
7736     TEST_REQUIRES_ARM_NEON_V8;
7737     GemmMicrokernelTester()
7738       .mr(2)
7739       .nr(8)
7740       .kr(2)
7741       .sr(1)
7742       .m(2)
7743       .n(8)
7744       .k(16)
7745       .qmin(128)
7746       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7747   }
7748 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,qmax)7749   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, qmax) {
7750     TEST_REQUIRES_ARM_NEON_V8;
7751     GemmMicrokernelTester()
7752       .mr(2)
7753       .nr(8)
7754       .kr(2)
7755       .sr(1)
7756       .m(2)
7757       .n(8)
7758       .k(16)
7759       .qmax(128)
7760       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7761   }
7762 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R,strided_cm)7763   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD2R, strided_cm) {
7764     TEST_REQUIRES_ARM_NEON_V8;
7765     GemmMicrokernelTester()
7766       .mr(2)
7767       .nr(8)
7768       .kr(2)
7769       .sr(1)
7770       .m(2)
7771       .n(8)
7772       .k(16)
7773       .cm_stride(11)
7774       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7775   }
7776 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
7777 
7778 
7779 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_eq_16)7780   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_eq_16) {
7781     TEST_REQUIRES_ARM_NEON_V8;
7782     GemmMicrokernelTester()
7783       .mr(2)
7784       .nr(8)
7785       .kr(2)
7786       .sr(1)
7787       .m(2)
7788       .n(8)
7789       .k(16)
7790       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7791   }
7792 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,strided_cn)7793   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, strided_cn) {
7794     TEST_REQUIRES_ARM_NEON_V8;
7795     GemmMicrokernelTester()
7796       .mr(2)
7797       .nr(8)
7798       .kr(2)
7799       .sr(1)
7800       .m(2)
7801       .n(8)
7802       .k(16)
7803       .cn_stride(11)
7804       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7805   }
7806 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_eq_16_strided_a)7807   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_eq_16_strided_a) {
7808     TEST_REQUIRES_ARM_NEON_V8;
7809     GemmMicrokernelTester()
7810       .mr(2)
7811       .nr(8)
7812       .kr(2)
7813       .sr(1)
7814       .m(2)
7815       .n(8)
7816       .k(16)
7817       .a_stride(19)
7818       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7819   }
7820 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_eq_16_subtile)7821   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_eq_16_subtile) {
7822     TEST_REQUIRES_ARM_NEON_V8;
7823     for (uint32_t n = 1; n <= 8; n++) {
7824       for (uint32_t m = 1; m <= 2; m++) {
7825         GemmMicrokernelTester()
7826           .mr(2)
7827           .nr(8)
7828           .kr(2)
7829           .sr(1)
7830           .m(m)
7831           .n(n)
7832           .k(16)
7833           .iterations(1)
7834           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7835       }
7836     }
7837   }
7838 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_eq_16_subtile_m)7839   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_eq_16_subtile_m) {
7840     TEST_REQUIRES_ARM_NEON_V8;
7841     for (uint32_t m = 1; m <= 2; m++) {
7842       GemmMicrokernelTester()
7843         .mr(2)
7844         .nr(8)
7845         .kr(2)
7846         .sr(1)
7847         .m(m)
7848         .n(8)
7849         .k(16)
7850         .iterations(1)
7851         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7852     }
7853   }
7854 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_eq_16_subtile_n)7855   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_eq_16_subtile_n) {
7856     TEST_REQUIRES_ARM_NEON_V8;
7857     for (uint32_t n = 1; n <= 8; n++) {
7858       GemmMicrokernelTester()
7859         .mr(2)
7860         .nr(8)
7861         .kr(2)
7862         .sr(1)
7863         .m(2)
7864         .n(n)
7865         .k(16)
7866         .iterations(1)
7867         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7868     }
7869   }
7870 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_lt_16)7871   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_lt_16) {
7872     TEST_REQUIRES_ARM_NEON_V8;
7873     for (size_t k = 1; k < 16; k++) {
7874       GemmMicrokernelTester()
7875         .mr(2)
7876         .nr(8)
7877         .kr(2)
7878         .sr(1)
7879         .m(2)
7880         .n(8)
7881         .k(k)
7882         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7883     }
7884   }
7885 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_lt_16_strided_a)7886   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_lt_16_strided_a) {
7887     TEST_REQUIRES_ARM_NEON_V8;
7888     for (size_t k = 1; k < 16; k++) {
7889       GemmMicrokernelTester()
7890         .mr(2)
7891         .nr(8)
7892         .kr(2)
7893         .sr(1)
7894         .m(2)
7895         .n(8)
7896         .k(k)
7897         .a_stride(19)
7898         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7899     }
7900   }
7901 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_lt_16_subtile)7902   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_lt_16_subtile) {
7903     TEST_REQUIRES_ARM_NEON_V8;
7904     for (size_t k = 1; k < 16; k++) {
7905       for (uint32_t n = 1; n <= 8; n++) {
7906         for (uint32_t m = 1; m <= 2; m++) {
7907           GemmMicrokernelTester()
7908             .mr(2)
7909             .nr(8)
7910             .kr(2)
7911             .sr(1)
7912             .m(m)
7913             .n(n)
7914             .k(k)
7915             .iterations(1)
7916             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7917         }
7918       }
7919     }
7920   }
7921 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_gt_16)7922   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_gt_16) {
7923     TEST_REQUIRES_ARM_NEON_V8;
7924     for (size_t k = 17; k < 32; k++) {
7925       GemmMicrokernelTester()
7926         .mr(2)
7927         .nr(8)
7928         .kr(2)
7929         .sr(1)
7930         .m(2)
7931         .n(8)
7932         .k(k)
7933         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7934     }
7935   }
7936 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_gt_16_strided_a)7937   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_gt_16_strided_a) {
7938     TEST_REQUIRES_ARM_NEON_V8;
7939     for (size_t k = 17; k < 32; k++) {
7940       GemmMicrokernelTester()
7941         .mr(2)
7942         .nr(8)
7943         .kr(2)
7944         .sr(1)
7945         .m(2)
7946         .n(8)
7947         .k(k)
7948         .a_stride(37)
7949         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7950     }
7951   }
7952 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_gt_16_subtile)7953   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_gt_16_subtile) {
7954     TEST_REQUIRES_ARM_NEON_V8;
7955     for (size_t k = 17; k < 32; k++) {
7956       for (uint32_t n = 1; n <= 8; n++) {
7957         for (uint32_t m = 1; m <= 2; m++) {
7958           GemmMicrokernelTester()
7959             .mr(2)
7960             .nr(8)
7961             .kr(2)
7962             .sr(1)
7963             .m(m)
7964             .n(n)
7965             .k(k)
7966             .iterations(1)
7967             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7968         }
7969       }
7970     }
7971   }
7972 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_div_16)7973   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_div_16) {
7974     TEST_REQUIRES_ARM_NEON_V8;
7975     for (size_t k = 32; k <= 160; k += 16) {
7976       GemmMicrokernelTester()
7977         .mr(2)
7978         .nr(8)
7979         .kr(2)
7980         .sr(1)
7981         .m(2)
7982         .n(8)
7983         .k(k)
7984         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
7985     }
7986   }
7987 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_div_16_strided_a)7988   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_div_16_strided_a) {
7989     TEST_REQUIRES_ARM_NEON_V8;
7990     for (size_t k = 32; k <= 160; k += 16) {
7991       GemmMicrokernelTester()
7992         .mr(2)
7993         .nr(8)
7994         .kr(2)
7995         .sr(1)
7996         .m(2)
7997         .n(8)
7998         .k(k)
7999         .a_stride(163)
8000         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8001     }
8002   }
8003 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,k_div_16_subtile)8004   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, k_div_16_subtile) {
8005     TEST_REQUIRES_ARM_NEON_V8;
8006     for (size_t k = 32; k <= 160; k += 16) {
8007       for (uint32_t n = 1; n <= 8; n++) {
8008         for (uint32_t m = 1; m <= 2; m++) {
8009           GemmMicrokernelTester()
8010             .mr(2)
8011             .nr(8)
8012             .kr(2)
8013             .sr(1)
8014             .m(m)
8015             .n(n)
8016             .k(k)
8017             .iterations(1)
8018             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8019         }
8020       }
8021     }
8022   }
8023 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_gt_8)8024   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_gt_8) {
8025     TEST_REQUIRES_ARM_NEON_V8;
8026     for (uint32_t n = 9; n < 16; n++) {
8027       for (size_t k = 1; k <= 80; k += 17) {
8028         GemmMicrokernelTester()
8029           .mr(2)
8030           .nr(8)
8031           .kr(2)
8032           .sr(1)
8033           .m(2)
8034           .n(n)
8035           .k(k)
8036           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8037       }
8038     }
8039   }
8040 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_gt_8_strided_cn)8041   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_gt_8_strided_cn) {
8042     TEST_REQUIRES_ARM_NEON_V8;
8043     for (uint32_t n = 9; n < 16; n++) {
8044       for (size_t k = 1; k <= 80; k += 17) {
8045         GemmMicrokernelTester()
8046           .mr(2)
8047           .nr(8)
8048           .kr(2)
8049           .sr(1)
8050           .m(2)
8051           .n(n)
8052           .k(k)
8053           .cn_stride(11)
8054           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8055       }
8056     }
8057   }
8058 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_gt_8_strided_a)8059   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_gt_8_strided_a) {
8060     TEST_REQUIRES_ARM_NEON_V8;
8061     for (uint32_t n = 9; n < 16; n++) {
8062       for (size_t k = 1; k <= 80; k += 17) {
8063         GemmMicrokernelTester()
8064           .mr(2)
8065           .nr(8)
8066           .kr(2)
8067           .sr(1)
8068           .m(2)
8069           .n(n)
8070           .k(k)
8071           .a_stride(83)
8072           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8073       }
8074     }
8075   }
8076 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_gt_8_subtile)8077   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_gt_8_subtile) {
8078     TEST_REQUIRES_ARM_NEON_V8;
8079     for (uint32_t n = 9; n < 16; n++) {
8080       for (size_t k = 1; k <= 80; k += 17) {
8081         for (uint32_t m = 1; m <= 2; m++) {
8082           GemmMicrokernelTester()
8083             .mr(2)
8084             .nr(8)
8085             .kr(2)
8086             .sr(1)
8087             .m(m)
8088             .n(n)
8089             .k(k)
8090             .iterations(1)
8091             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8092         }
8093       }
8094     }
8095   }
8096 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_div_8)8097   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_div_8) {
8098     TEST_REQUIRES_ARM_NEON_V8;
8099     for (uint32_t n = 16; n <= 24; n += 8) {
8100       for (size_t k = 1; k <= 80; k += 17) {
8101         GemmMicrokernelTester()
8102           .mr(2)
8103           .nr(8)
8104           .kr(2)
8105           .sr(1)
8106           .m(2)
8107           .n(n)
8108           .k(k)
8109           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8110       }
8111     }
8112   }
8113 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_div_8_strided_cn)8114   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_div_8_strided_cn) {
8115     TEST_REQUIRES_ARM_NEON_V8;
8116     for (uint32_t n = 16; n <= 24; n += 8) {
8117       for (size_t k = 1; k <= 80; k += 17) {
8118         GemmMicrokernelTester()
8119           .mr(2)
8120           .nr(8)
8121           .kr(2)
8122           .sr(1)
8123           .m(2)
8124           .n(n)
8125           .k(k)
8126           .cn_stride(11)
8127           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8128       }
8129     }
8130   }
8131 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_div_8_strided_a)8132   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_div_8_strided_a) {
8133     TEST_REQUIRES_ARM_NEON_V8;
8134     for (uint32_t n = 16; n <= 24; n += 8) {
8135       for (size_t k = 1; k <= 80; k += 17) {
8136         GemmMicrokernelTester()
8137           .mr(2)
8138           .nr(8)
8139           .kr(2)
8140           .sr(1)
8141           .m(2)
8142           .n(n)
8143           .k(k)
8144           .a_stride(83)
8145           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8146       }
8147     }
8148   }
8149 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,n_div_8_subtile)8150   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, n_div_8_subtile) {
8151     TEST_REQUIRES_ARM_NEON_V8;
8152     for (uint32_t n = 16; n <= 24; n += 8) {
8153       for (size_t k = 1; k <= 80; k += 17) {
8154         for (uint32_t m = 1; m <= 2; m++) {
8155           GemmMicrokernelTester()
8156             .mr(2)
8157             .nr(8)
8158             .kr(2)
8159             .sr(1)
8160             .m(m)
8161             .n(n)
8162             .k(k)
8163             .iterations(1)
8164             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8165         }
8166       }
8167     }
8168   }
8169 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,strided_cm_subtile)8170   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, strided_cm_subtile) {
8171     TEST_REQUIRES_ARM_NEON_V8;
8172     for (size_t k = 1; k <= 80; k += 17) {
8173       for (uint32_t n = 1; n <= 8; n++) {
8174         for (uint32_t m = 1; m <= 2; m++) {
8175           GemmMicrokernelTester()
8176             .mr(2)
8177             .nr(8)
8178             .kr(2)
8179             .sr(1)
8180             .m(m)
8181             .n(n)
8182             .k(k)
8183             .cm_stride(11)
8184             .iterations(1)
8185             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8186         }
8187       }
8188     }
8189   }
8190 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,qmin)8191   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, qmin) {
8192     TEST_REQUIRES_ARM_NEON_V8;
8193     GemmMicrokernelTester()
8194       .mr(2)
8195       .nr(8)
8196       .kr(2)
8197       .sr(1)
8198       .m(2)
8199       .n(8)
8200       .k(16)
8201       .qmin(128)
8202       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8203   }
8204 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,qmax)8205   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, qmax) {
8206     TEST_REQUIRES_ARM_NEON_V8;
8207     GemmMicrokernelTester()
8208       .mr(2)
8209       .nr(8)
8210       .kr(2)
8211       .sr(1)
8212       .m(2)
8213       .n(8)
8214       .k(16)
8215       .qmax(128)
8216       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8217   }
8218 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R,strided_cm)8219   TEST(QS8_GEMM_MINMAX_FP32_2X8C2__NEONV8_MLAL_LD4R, strided_cm) {
8220     TEST_REQUIRES_ARM_NEON_V8;
8221     GemmMicrokernelTester()
8222       .mr(2)
8223       .nr(8)
8224       .kr(2)
8225       .sr(1)
8226       .m(2)
8227       .n(8)
8228       .k(16)
8229       .cm_stride(11)
8230       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2__neonv8_mlal_ld4r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8231   }
8232 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
8233 
8234 
8235 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_eq_16)8236   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_eq_16) {
8237     TEST_REQUIRES_ARM_NEON;
8238     GemmMicrokernelTester()
8239       .mr(2)
8240       .nr(8)
8241       .kr(2)
8242       .sr(4)
8243       .m(2)
8244       .n(8)
8245       .k(16)
8246       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8247   }
8248 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,strided_cn)8249   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, strided_cn) {
8250     TEST_REQUIRES_ARM_NEON;
8251     GemmMicrokernelTester()
8252       .mr(2)
8253       .nr(8)
8254       .kr(2)
8255       .sr(4)
8256       .m(2)
8257       .n(8)
8258       .k(16)
8259       .cn_stride(11)
8260       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8261   }
8262 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_eq_16_strided_a)8263   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_eq_16_strided_a) {
8264     TEST_REQUIRES_ARM_NEON;
8265     GemmMicrokernelTester()
8266       .mr(2)
8267       .nr(8)
8268       .kr(2)
8269       .sr(4)
8270       .m(2)
8271       .n(8)
8272       .k(16)
8273       .a_stride(19)
8274       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8275   }
8276 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_eq_16_subtile)8277   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_eq_16_subtile) {
8278     TEST_REQUIRES_ARM_NEON;
8279     for (uint32_t n = 1; n <= 8; n++) {
8280       for (uint32_t m = 1; m <= 2; m++) {
8281         GemmMicrokernelTester()
8282           .mr(2)
8283           .nr(8)
8284           .kr(2)
8285           .sr(4)
8286           .m(m)
8287           .n(n)
8288           .k(16)
8289           .iterations(1)
8290           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8291       }
8292     }
8293   }
8294 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_eq_16_subtile_m)8295   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_eq_16_subtile_m) {
8296     TEST_REQUIRES_ARM_NEON;
8297     for (uint32_t m = 1; m <= 2; m++) {
8298       GemmMicrokernelTester()
8299         .mr(2)
8300         .nr(8)
8301         .kr(2)
8302         .sr(4)
8303         .m(m)
8304         .n(8)
8305         .k(16)
8306         .iterations(1)
8307         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8308     }
8309   }
8310 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_eq_16_subtile_n)8311   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_eq_16_subtile_n) {
8312     TEST_REQUIRES_ARM_NEON;
8313     for (uint32_t n = 1; n <= 8; n++) {
8314       GemmMicrokernelTester()
8315         .mr(2)
8316         .nr(8)
8317         .kr(2)
8318         .sr(4)
8319         .m(2)
8320         .n(n)
8321         .k(16)
8322         .iterations(1)
8323         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8324     }
8325   }
8326 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_lt_16)8327   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_lt_16) {
8328     TEST_REQUIRES_ARM_NEON;
8329     for (size_t k = 1; k < 16; k++) {
8330       GemmMicrokernelTester()
8331         .mr(2)
8332         .nr(8)
8333         .kr(2)
8334         .sr(4)
8335         .m(2)
8336         .n(8)
8337         .k(k)
8338         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8339     }
8340   }
8341 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_lt_16_strided_a)8342   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_lt_16_strided_a) {
8343     TEST_REQUIRES_ARM_NEON;
8344     for (size_t k = 1; k < 16; k++) {
8345       GemmMicrokernelTester()
8346         .mr(2)
8347         .nr(8)
8348         .kr(2)
8349         .sr(4)
8350         .m(2)
8351         .n(8)
8352         .k(k)
8353         .a_stride(19)
8354         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8355     }
8356   }
8357 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_lt_16_subtile)8358   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_lt_16_subtile) {
8359     TEST_REQUIRES_ARM_NEON;
8360     for (size_t k = 1; k < 16; k++) {
8361       for (uint32_t n = 1; n <= 8; n++) {
8362         for (uint32_t m = 1; m <= 2; m++) {
8363           GemmMicrokernelTester()
8364             .mr(2)
8365             .nr(8)
8366             .kr(2)
8367             .sr(4)
8368             .m(m)
8369             .n(n)
8370             .k(k)
8371             .iterations(1)
8372             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8373         }
8374       }
8375     }
8376   }
8377 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_gt_16)8378   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_gt_16) {
8379     TEST_REQUIRES_ARM_NEON;
8380     for (size_t k = 17; k < 32; k++) {
8381       GemmMicrokernelTester()
8382         .mr(2)
8383         .nr(8)
8384         .kr(2)
8385         .sr(4)
8386         .m(2)
8387         .n(8)
8388         .k(k)
8389         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8390     }
8391   }
8392 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_gt_16_strided_a)8393   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_gt_16_strided_a) {
8394     TEST_REQUIRES_ARM_NEON;
8395     for (size_t k = 17; k < 32; k++) {
8396       GemmMicrokernelTester()
8397         .mr(2)
8398         .nr(8)
8399         .kr(2)
8400         .sr(4)
8401         .m(2)
8402         .n(8)
8403         .k(k)
8404         .a_stride(37)
8405         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8406     }
8407   }
8408 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_gt_16_subtile)8409   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_gt_16_subtile) {
8410     TEST_REQUIRES_ARM_NEON;
8411     for (size_t k = 17; k < 32; k++) {
8412       for (uint32_t n = 1; n <= 8; n++) {
8413         for (uint32_t m = 1; m <= 2; m++) {
8414           GemmMicrokernelTester()
8415             .mr(2)
8416             .nr(8)
8417             .kr(2)
8418             .sr(4)
8419             .m(m)
8420             .n(n)
8421             .k(k)
8422             .iterations(1)
8423             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8424         }
8425       }
8426     }
8427   }
8428 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_div_16)8429   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_div_16) {
8430     TEST_REQUIRES_ARM_NEON;
8431     for (size_t k = 32; k <= 160; k += 16) {
8432       GemmMicrokernelTester()
8433         .mr(2)
8434         .nr(8)
8435         .kr(2)
8436         .sr(4)
8437         .m(2)
8438         .n(8)
8439         .k(k)
8440         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8441     }
8442   }
8443 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_div_16_strided_a)8444   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_div_16_strided_a) {
8445     TEST_REQUIRES_ARM_NEON;
8446     for (size_t k = 32; k <= 160; k += 16) {
8447       GemmMicrokernelTester()
8448         .mr(2)
8449         .nr(8)
8450         .kr(2)
8451         .sr(4)
8452         .m(2)
8453         .n(8)
8454         .k(k)
8455         .a_stride(163)
8456         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8457     }
8458   }
8459 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,k_div_16_subtile)8460   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, k_div_16_subtile) {
8461     TEST_REQUIRES_ARM_NEON;
8462     for (size_t k = 32; k <= 160; k += 16) {
8463       for (uint32_t n = 1; n <= 8; n++) {
8464         for (uint32_t m = 1; m <= 2; m++) {
8465           GemmMicrokernelTester()
8466             .mr(2)
8467             .nr(8)
8468             .kr(2)
8469             .sr(4)
8470             .m(m)
8471             .n(n)
8472             .k(k)
8473             .iterations(1)
8474             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8475         }
8476       }
8477     }
8478   }
8479 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_gt_8)8480   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_gt_8) {
8481     TEST_REQUIRES_ARM_NEON;
8482     for (uint32_t n = 9; n < 16; n++) {
8483       for (size_t k = 1; k <= 80; k += 17) {
8484         GemmMicrokernelTester()
8485           .mr(2)
8486           .nr(8)
8487           .kr(2)
8488           .sr(4)
8489           .m(2)
8490           .n(n)
8491           .k(k)
8492           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8493       }
8494     }
8495   }
8496 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_gt_8_strided_cn)8497   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_gt_8_strided_cn) {
8498     TEST_REQUIRES_ARM_NEON;
8499     for (uint32_t n = 9; n < 16; n++) {
8500       for (size_t k = 1; k <= 80; k += 17) {
8501         GemmMicrokernelTester()
8502           .mr(2)
8503           .nr(8)
8504           .kr(2)
8505           .sr(4)
8506           .m(2)
8507           .n(n)
8508           .k(k)
8509           .cn_stride(11)
8510           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8511       }
8512     }
8513   }
8514 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_gt_8_strided_a)8515   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_gt_8_strided_a) {
8516     TEST_REQUIRES_ARM_NEON;
8517     for (uint32_t n = 9; n < 16; n++) {
8518       for (size_t k = 1; k <= 80; k += 17) {
8519         GemmMicrokernelTester()
8520           .mr(2)
8521           .nr(8)
8522           .kr(2)
8523           .sr(4)
8524           .m(2)
8525           .n(n)
8526           .k(k)
8527           .a_stride(83)
8528           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8529       }
8530     }
8531   }
8532 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_gt_8_subtile)8533   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_gt_8_subtile) {
8534     TEST_REQUIRES_ARM_NEON;
8535     for (uint32_t n = 9; n < 16; n++) {
8536       for (size_t k = 1; k <= 80; k += 17) {
8537         for (uint32_t m = 1; m <= 2; m++) {
8538           GemmMicrokernelTester()
8539             .mr(2)
8540             .nr(8)
8541             .kr(2)
8542             .sr(4)
8543             .m(m)
8544             .n(n)
8545             .k(k)
8546             .iterations(1)
8547             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8548         }
8549       }
8550     }
8551   }
8552 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_div_8)8553   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_div_8) {
8554     TEST_REQUIRES_ARM_NEON;
8555     for (uint32_t n = 16; n <= 24; n += 8) {
8556       for (size_t k = 1; k <= 80; k += 17) {
8557         GemmMicrokernelTester()
8558           .mr(2)
8559           .nr(8)
8560           .kr(2)
8561           .sr(4)
8562           .m(2)
8563           .n(n)
8564           .k(k)
8565           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8566       }
8567     }
8568   }
8569 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_div_8_strided_cn)8570   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_div_8_strided_cn) {
8571     TEST_REQUIRES_ARM_NEON;
8572     for (uint32_t n = 16; n <= 24; n += 8) {
8573       for (size_t k = 1; k <= 80; k += 17) {
8574         GemmMicrokernelTester()
8575           .mr(2)
8576           .nr(8)
8577           .kr(2)
8578           .sr(4)
8579           .m(2)
8580           .n(n)
8581           .k(k)
8582           .cn_stride(11)
8583           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8584       }
8585     }
8586   }
8587 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_div_8_strided_a)8588   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_div_8_strided_a) {
8589     TEST_REQUIRES_ARM_NEON;
8590     for (uint32_t n = 16; n <= 24; n += 8) {
8591       for (size_t k = 1; k <= 80; k += 17) {
8592         GemmMicrokernelTester()
8593           .mr(2)
8594           .nr(8)
8595           .kr(2)
8596           .sr(4)
8597           .m(2)
8598           .n(n)
8599           .k(k)
8600           .a_stride(83)
8601           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8602       }
8603     }
8604   }
8605 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,n_div_8_subtile)8606   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, n_div_8_subtile) {
8607     TEST_REQUIRES_ARM_NEON;
8608     for (uint32_t n = 16; n <= 24; n += 8) {
8609       for (size_t k = 1; k <= 80; k += 17) {
8610         for (uint32_t m = 1; m <= 2; m++) {
8611           GemmMicrokernelTester()
8612             .mr(2)
8613             .nr(8)
8614             .kr(2)
8615             .sr(4)
8616             .m(m)
8617             .n(n)
8618             .k(k)
8619             .iterations(1)
8620             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8621         }
8622       }
8623     }
8624   }
8625 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,strided_cm_subtile)8626   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, strided_cm_subtile) {
8627     TEST_REQUIRES_ARM_NEON;
8628     for (size_t k = 1; k <= 80; k += 17) {
8629       for (uint32_t n = 1; n <= 8; n++) {
8630         for (uint32_t m = 1; m <= 2; m++) {
8631           GemmMicrokernelTester()
8632             .mr(2)
8633             .nr(8)
8634             .kr(2)
8635             .sr(4)
8636             .m(m)
8637             .n(n)
8638             .k(k)
8639             .cm_stride(11)
8640             .iterations(1)
8641             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8642         }
8643       }
8644     }
8645   }
8646 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,qmin)8647   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, qmin) {
8648     TEST_REQUIRES_ARM_NEON;
8649     GemmMicrokernelTester()
8650       .mr(2)
8651       .nr(8)
8652       .kr(2)
8653       .sr(4)
8654       .m(2)
8655       .n(8)
8656       .k(16)
8657       .qmin(128)
8658       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8659   }
8660 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,qmax)8661   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, qmax) {
8662     TEST_REQUIRES_ARM_NEON;
8663     GemmMicrokernelTester()
8664       .mr(2)
8665       .nr(8)
8666       .kr(2)
8667       .sr(4)
8668       .m(2)
8669       .n(8)
8670       .k(16)
8671       .qmax(128)
8672       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8673   }
8674 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL,strided_cm)8675   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEON_MLAL, strided_cm) {
8676     TEST_REQUIRES_ARM_NEON;
8677     GemmMicrokernelTester()
8678       .mr(2)
8679       .nr(8)
8680       .kr(2)
8681       .sr(4)
8682       .m(2)
8683       .n(8)
8684       .k(16)
8685       .cm_stride(11)
8686       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
8687   }
8688 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
8689 
8690 
8691 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_eq_16)8692   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_eq_16) {
8693     TEST_REQUIRES_ARM_NEON_V8;
8694     GemmMicrokernelTester()
8695       .mr(2)
8696       .nr(8)
8697       .kr(2)
8698       .sr(4)
8699       .m(2)
8700       .n(8)
8701       .k(16)
8702       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8703   }
8704 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,strided_cn)8705   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, strided_cn) {
8706     TEST_REQUIRES_ARM_NEON_V8;
8707     GemmMicrokernelTester()
8708       .mr(2)
8709       .nr(8)
8710       .kr(2)
8711       .sr(4)
8712       .m(2)
8713       .n(8)
8714       .k(16)
8715       .cn_stride(11)
8716       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8717   }
8718 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_eq_16_strided_a)8719   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_eq_16_strided_a) {
8720     TEST_REQUIRES_ARM_NEON_V8;
8721     GemmMicrokernelTester()
8722       .mr(2)
8723       .nr(8)
8724       .kr(2)
8725       .sr(4)
8726       .m(2)
8727       .n(8)
8728       .k(16)
8729       .a_stride(19)
8730       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8731   }
8732 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_eq_16_subtile)8733   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_eq_16_subtile) {
8734     TEST_REQUIRES_ARM_NEON_V8;
8735     for (uint32_t n = 1; n <= 8; n++) {
8736       for (uint32_t m = 1; m <= 2; m++) {
8737         GemmMicrokernelTester()
8738           .mr(2)
8739           .nr(8)
8740           .kr(2)
8741           .sr(4)
8742           .m(m)
8743           .n(n)
8744           .k(16)
8745           .iterations(1)
8746           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8747       }
8748     }
8749   }
8750 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_eq_16_subtile_m)8751   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_eq_16_subtile_m) {
8752     TEST_REQUIRES_ARM_NEON_V8;
8753     for (uint32_t m = 1; m <= 2; m++) {
8754       GemmMicrokernelTester()
8755         .mr(2)
8756         .nr(8)
8757         .kr(2)
8758         .sr(4)
8759         .m(m)
8760         .n(8)
8761         .k(16)
8762         .iterations(1)
8763         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8764     }
8765   }
8766 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_eq_16_subtile_n)8767   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_eq_16_subtile_n) {
8768     TEST_REQUIRES_ARM_NEON_V8;
8769     for (uint32_t n = 1; n <= 8; n++) {
8770       GemmMicrokernelTester()
8771         .mr(2)
8772         .nr(8)
8773         .kr(2)
8774         .sr(4)
8775         .m(2)
8776         .n(n)
8777         .k(16)
8778         .iterations(1)
8779         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8780     }
8781   }
8782 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_lt_16)8783   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_lt_16) {
8784     TEST_REQUIRES_ARM_NEON_V8;
8785     for (size_t k = 1; k < 16; k++) {
8786       GemmMicrokernelTester()
8787         .mr(2)
8788         .nr(8)
8789         .kr(2)
8790         .sr(4)
8791         .m(2)
8792         .n(8)
8793         .k(k)
8794         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8795     }
8796   }
8797 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_lt_16_strided_a)8798   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_lt_16_strided_a) {
8799     TEST_REQUIRES_ARM_NEON_V8;
8800     for (size_t k = 1; k < 16; k++) {
8801       GemmMicrokernelTester()
8802         .mr(2)
8803         .nr(8)
8804         .kr(2)
8805         .sr(4)
8806         .m(2)
8807         .n(8)
8808         .k(k)
8809         .a_stride(19)
8810         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8811     }
8812   }
8813 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_lt_16_subtile)8814   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_lt_16_subtile) {
8815     TEST_REQUIRES_ARM_NEON_V8;
8816     for (size_t k = 1; k < 16; k++) {
8817       for (uint32_t n = 1; n <= 8; n++) {
8818         for (uint32_t m = 1; m <= 2; m++) {
8819           GemmMicrokernelTester()
8820             .mr(2)
8821             .nr(8)
8822             .kr(2)
8823             .sr(4)
8824             .m(m)
8825             .n(n)
8826             .k(k)
8827             .iterations(1)
8828             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8829         }
8830       }
8831     }
8832   }
8833 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_gt_16)8834   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_gt_16) {
8835     TEST_REQUIRES_ARM_NEON_V8;
8836     for (size_t k = 17; k < 32; k++) {
8837       GemmMicrokernelTester()
8838         .mr(2)
8839         .nr(8)
8840         .kr(2)
8841         .sr(4)
8842         .m(2)
8843         .n(8)
8844         .k(k)
8845         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8846     }
8847   }
8848 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_gt_16_strided_a)8849   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_gt_16_strided_a) {
8850     TEST_REQUIRES_ARM_NEON_V8;
8851     for (size_t k = 17; k < 32; k++) {
8852       GemmMicrokernelTester()
8853         .mr(2)
8854         .nr(8)
8855         .kr(2)
8856         .sr(4)
8857         .m(2)
8858         .n(8)
8859         .k(k)
8860         .a_stride(37)
8861         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8862     }
8863   }
8864 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_gt_16_subtile)8865   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_gt_16_subtile) {
8866     TEST_REQUIRES_ARM_NEON_V8;
8867     for (size_t k = 17; k < 32; k++) {
8868       for (uint32_t n = 1; n <= 8; n++) {
8869         for (uint32_t m = 1; m <= 2; m++) {
8870           GemmMicrokernelTester()
8871             .mr(2)
8872             .nr(8)
8873             .kr(2)
8874             .sr(4)
8875             .m(m)
8876             .n(n)
8877             .k(k)
8878             .iterations(1)
8879             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8880         }
8881       }
8882     }
8883   }
8884 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_div_16)8885   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_div_16) {
8886     TEST_REQUIRES_ARM_NEON_V8;
8887     for (size_t k = 32; k <= 160; k += 16) {
8888       GemmMicrokernelTester()
8889         .mr(2)
8890         .nr(8)
8891         .kr(2)
8892         .sr(4)
8893         .m(2)
8894         .n(8)
8895         .k(k)
8896         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8897     }
8898   }
8899 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_div_16_strided_a)8900   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_div_16_strided_a) {
8901     TEST_REQUIRES_ARM_NEON_V8;
8902     for (size_t k = 32; k <= 160; k += 16) {
8903       GemmMicrokernelTester()
8904         .mr(2)
8905         .nr(8)
8906         .kr(2)
8907         .sr(4)
8908         .m(2)
8909         .n(8)
8910         .k(k)
8911         .a_stride(163)
8912         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8913     }
8914   }
8915 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,k_div_16_subtile)8916   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, k_div_16_subtile) {
8917     TEST_REQUIRES_ARM_NEON_V8;
8918     for (size_t k = 32; k <= 160; k += 16) {
8919       for (uint32_t n = 1; n <= 8; n++) {
8920         for (uint32_t m = 1; m <= 2; m++) {
8921           GemmMicrokernelTester()
8922             .mr(2)
8923             .nr(8)
8924             .kr(2)
8925             .sr(4)
8926             .m(m)
8927             .n(n)
8928             .k(k)
8929             .iterations(1)
8930             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8931         }
8932       }
8933     }
8934   }
8935 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_gt_8)8936   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_gt_8) {
8937     TEST_REQUIRES_ARM_NEON_V8;
8938     for (uint32_t n = 9; n < 16; n++) {
8939       for (size_t k = 1; k <= 80; k += 17) {
8940         GemmMicrokernelTester()
8941           .mr(2)
8942           .nr(8)
8943           .kr(2)
8944           .sr(4)
8945           .m(2)
8946           .n(n)
8947           .k(k)
8948           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8949       }
8950     }
8951   }
8952 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_gt_8_strided_cn)8953   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_gt_8_strided_cn) {
8954     TEST_REQUIRES_ARM_NEON_V8;
8955     for (uint32_t n = 9; n < 16; n++) {
8956       for (size_t k = 1; k <= 80; k += 17) {
8957         GemmMicrokernelTester()
8958           .mr(2)
8959           .nr(8)
8960           .kr(2)
8961           .sr(4)
8962           .m(2)
8963           .n(n)
8964           .k(k)
8965           .cn_stride(11)
8966           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8967       }
8968     }
8969   }
8970 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_gt_8_strided_a)8971   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_gt_8_strided_a) {
8972     TEST_REQUIRES_ARM_NEON_V8;
8973     for (uint32_t n = 9; n < 16; n++) {
8974       for (size_t k = 1; k <= 80; k += 17) {
8975         GemmMicrokernelTester()
8976           .mr(2)
8977           .nr(8)
8978           .kr(2)
8979           .sr(4)
8980           .m(2)
8981           .n(n)
8982           .k(k)
8983           .a_stride(83)
8984           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
8985       }
8986     }
8987   }
8988 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_gt_8_subtile)8989   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_gt_8_subtile) {
8990     TEST_REQUIRES_ARM_NEON_V8;
8991     for (uint32_t n = 9; n < 16; n++) {
8992       for (size_t k = 1; k <= 80; k += 17) {
8993         for (uint32_t m = 1; m <= 2; m++) {
8994           GemmMicrokernelTester()
8995             .mr(2)
8996             .nr(8)
8997             .kr(2)
8998             .sr(4)
8999             .m(m)
9000             .n(n)
9001             .k(k)
9002             .iterations(1)
9003             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9004         }
9005       }
9006     }
9007   }
9008 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_div_8)9009   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_div_8) {
9010     TEST_REQUIRES_ARM_NEON_V8;
9011     for (uint32_t n = 16; n <= 24; n += 8) {
9012       for (size_t k = 1; k <= 80; k += 17) {
9013         GemmMicrokernelTester()
9014           .mr(2)
9015           .nr(8)
9016           .kr(2)
9017           .sr(4)
9018           .m(2)
9019           .n(n)
9020           .k(k)
9021           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9022       }
9023     }
9024   }
9025 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_div_8_strided_cn)9026   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_div_8_strided_cn) {
9027     TEST_REQUIRES_ARM_NEON_V8;
9028     for (uint32_t n = 16; n <= 24; n += 8) {
9029       for (size_t k = 1; k <= 80; k += 17) {
9030         GemmMicrokernelTester()
9031           .mr(2)
9032           .nr(8)
9033           .kr(2)
9034           .sr(4)
9035           .m(2)
9036           .n(n)
9037           .k(k)
9038           .cn_stride(11)
9039           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9040       }
9041     }
9042   }
9043 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_div_8_strided_a)9044   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_div_8_strided_a) {
9045     TEST_REQUIRES_ARM_NEON_V8;
9046     for (uint32_t n = 16; n <= 24; n += 8) {
9047       for (size_t k = 1; k <= 80; k += 17) {
9048         GemmMicrokernelTester()
9049           .mr(2)
9050           .nr(8)
9051           .kr(2)
9052           .sr(4)
9053           .m(2)
9054           .n(n)
9055           .k(k)
9056           .a_stride(83)
9057           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9058       }
9059     }
9060   }
9061 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,n_div_8_subtile)9062   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, n_div_8_subtile) {
9063     TEST_REQUIRES_ARM_NEON_V8;
9064     for (uint32_t n = 16; n <= 24; n += 8) {
9065       for (size_t k = 1; k <= 80; k += 17) {
9066         for (uint32_t m = 1; m <= 2; m++) {
9067           GemmMicrokernelTester()
9068             .mr(2)
9069             .nr(8)
9070             .kr(2)
9071             .sr(4)
9072             .m(m)
9073             .n(n)
9074             .k(k)
9075             .iterations(1)
9076             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9077         }
9078       }
9079     }
9080   }
9081 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,strided_cm_subtile)9082   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, strided_cm_subtile) {
9083     TEST_REQUIRES_ARM_NEON_V8;
9084     for (size_t k = 1; k <= 80; k += 17) {
9085       for (uint32_t n = 1; n <= 8; n++) {
9086         for (uint32_t m = 1; m <= 2; m++) {
9087           GemmMicrokernelTester()
9088             .mr(2)
9089             .nr(8)
9090             .kr(2)
9091             .sr(4)
9092             .m(m)
9093             .n(n)
9094             .k(k)
9095             .cm_stride(11)
9096             .iterations(1)
9097             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9098         }
9099       }
9100     }
9101   }
9102 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,qmin)9103   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, qmin) {
9104     TEST_REQUIRES_ARM_NEON_V8;
9105     GemmMicrokernelTester()
9106       .mr(2)
9107       .nr(8)
9108       .kr(2)
9109       .sr(4)
9110       .m(2)
9111       .n(8)
9112       .k(16)
9113       .qmin(128)
9114       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9115   }
9116 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,qmax)9117   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, qmax) {
9118     TEST_REQUIRES_ARM_NEON_V8;
9119     GemmMicrokernelTester()
9120       .mr(2)
9121       .nr(8)
9122       .kr(2)
9123       .sr(4)
9124       .m(2)
9125       .n(8)
9126       .k(16)
9127       .qmax(128)
9128       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9129   }
9130 
TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL,strided_cm)9131   TEST(QS8_GEMM_MINMAX_FP32_2X8C2S4__NEONV8_MLAL, strided_cm) {
9132     TEST_REQUIRES_ARM_NEON_V8;
9133     GemmMicrokernelTester()
9134       .mr(2)
9135       .nr(8)
9136       .kr(2)
9137       .sr(4)
9138       .m(2)
9139       .n(8)
9140       .k(16)
9141       .cm_stride(11)
9142       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c2s4__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
9143   }
9144 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
9145 
9146 
9147 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_eq_16)9148   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_eq_16) {
9149     TEST_REQUIRES_ARM_NEON;
9150     GemmMicrokernelTester()
9151       .mr(2)
9152       .nr(8)
9153       .kr(4)
9154       .sr(1)
9155       .m(2)
9156       .n(8)
9157       .k(16)
9158       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9159   }
9160 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,strided_cn)9161   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, strided_cn) {
9162     TEST_REQUIRES_ARM_NEON;
9163     GemmMicrokernelTester()
9164       .mr(2)
9165       .nr(8)
9166       .kr(4)
9167       .sr(1)
9168       .m(2)
9169       .n(8)
9170       .k(16)
9171       .cn_stride(11)
9172       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9173   }
9174 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_eq_16_strided_a)9175   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_eq_16_strided_a) {
9176     TEST_REQUIRES_ARM_NEON;
9177     GemmMicrokernelTester()
9178       .mr(2)
9179       .nr(8)
9180       .kr(4)
9181       .sr(1)
9182       .m(2)
9183       .n(8)
9184       .k(16)
9185       .a_stride(19)
9186       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9187   }
9188 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_eq_16_subtile)9189   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_eq_16_subtile) {
9190     TEST_REQUIRES_ARM_NEON;
9191     for (uint32_t n = 1; n <= 8; n++) {
9192       for (uint32_t m = 1; m <= 2; m++) {
9193         GemmMicrokernelTester()
9194           .mr(2)
9195           .nr(8)
9196           .kr(4)
9197           .sr(1)
9198           .m(m)
9199           .n(n)
9200           .k(16)
9201           .iterations(1)
9202           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9203       }
9204     }
9205   }
9206 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_eq_16_subtile_m)9207   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_eq_16_subtile_m) {
9208     TEST_REQUIRES_ARM_NEON;
9209     for (uint32_t m = 1; m <= 2; m++) {
9210       GemmMicrokernelTester()
9211         .mr(2)
9212         .nr(8)
9213         .kr(4)
9214         .sr(1)
9215         .m(m)
9216         .n(8)
9217         .k(16)
9218         .iterations(1)
9219         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9220     }
9221   }
9222 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_eq_16_subtile_n)9223   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_eq_16_subtile_n) {
9224     TEST_REQUIRES_ARM_NEON;
9225     for (uint32_t n = 1; n <= 8; n++) {
9226       GemmMicrokernelTester()
9227         .mr(2)
9228         .nr(8)
9229         .kr(4)
9230         .sr(1)
9231         .m(2)
9232         .n(n)
9233         .k(16)
9234         .iterations(1)
9235         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9236     }
9237   }
9238 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_lt_16)9239   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_lt_16) {
9240     TEST_REQUIRES_ARM_NEON;
9241     for (size_t k = 1; k < 16; k++) {
9242       GemmMicrokernelTester()
9243         .mr(2)
9244         .nr(8)
9245         .kr(4)
9246         .sr(1)
9247         .m(2)
9248         .n(8)
9249         .k(k)
9250         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9251     }
9252   }
9253 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_lt_16_strided_a)9254   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_lt_16_strided_a) {
9255     TEST_REQUIRES_ARM_NEON;
9256     for (size_t k = 1; k < 16; k++) {
9257       GemmMicrokernelTester()
9258         .mr(2)
9259         .nr(8)
9260         .kr(4)
9261         .sr(1)
9262         .m(2)
9263         .n(8)
9264         .k(k)
9265         .a_stride(19)
9266         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9267     }
9268   }
9269 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_lt_16_subtile)9270   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_lt_16_subtile) {
9271     TEST_REQUIRES_ARM_NEON;
9272     for (size_t k = 1; k < 16; k++) {
9273       for (uint32_t n = 1; n <= 8; n++) {
9274         for (uint32_t m = 1; m <= 2; m++) {
9275           GemmMicrokernelTester()
9276             .mr(2)
9277             .nr(8)
9278             .kr(4)
9279             .sr(1)
9280             .m(m)
9281             .n(n)
9282             .k(k)
9283             .iterations(1)
9284             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9285         }
9286       }
9287     }
9288   }
9289 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_gt_16)9290   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_gt_16) {
9291     TEST_REQUIRES_ARM_NEON;
9292     for (size_t k = 17; k < 32; k++) {
9293       GemmMicrokernelTester()
9294         .mr(2)
9295         .nr(8)
9296         .kr(4)
9297         .sr(1)
9298         .m(2)
9299         .n(8)
9300         .k(k)
9301         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9302     }
9303   }
9304 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_gt_16_strided_a)9305   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_gt_16_strided_a) {
9306     TEST_REQUIRES_ARM_NEON;
9307     for (size_t k = 17; k < 32; k++) {
9308       GemmMicrokernelTester()
9309         .mr(2)
9310         .nr(8)
9311         .kr(4)
9312         .sr(1)
9313         .m(2)
9314         .n(8)
9315         .k(k)
9316         .a_stride(37)
9317         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9318     }
9319   }
9320 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_gt_16_subtile)9321   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_gt_16_subtile) {
9322     TEST_REQUIRES_ARM_NEON;
9323     for (size_t k = 17; k < 32; k++) {
9324       for (uint32_t n = 1; n <= 8; n++) {
9325         for (uint32_t m = 1; m <= 2; m++) {
9326           GemmMicrokernelTester()
9327             .mr(2)
9328             .nr(8)
9329             .kr(4)
9330             .sr(1)
9331             .m(m)
9332             .n(n)
9333             .k(k)
9334             .iterations(1)
9335             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9336         }
9337       }
9338     }
9339   }
9340 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_div_16)9341   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_div_16) {
9342     TEST_REQUIRES_ARM_NEON;
9343     for (size_t k = 32; k <= 160; k += 16) {
9344       GemmMicrokernelTester()
9345         .mr(2)
9346         .nr(8)
9347         .kr(4)
9348         .sr(1)
9349         .m(2)
9350         .n(8)
9351         .k(k)
9352         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9353     }
9354   }
9355 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_div_16_strided_a)9356   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_div_16_strided_a) {
9357     TEST_REQUIRES_ARM_NEON;
9358     for (size_t k = 32; k <= 160; k += 16) {
9359       GemmMicrokernelTester()
9360         .mr(2)
9361         .nr(8)
9362         .kr(4)
9363         .sr(1)
9364         .m(2)
9365         .n(8)
9366         .k(k)
9367         .a_stride(163)
9368         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9369     }
9370   }
9371 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,k_div_16_subtile)9372   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, k_div_16_subtile) {
9373     TEST_REQUIRES_ARM_NEON;
9374     for (size_t k = 32; k <= 160; k += 16) {
9375       for (uint32_t n = 1; n <= 8; n++) {
9376         for (uint32_t m = 1; m <= 2; m++) {
9377           GemmMicrokernelTester()
9378             .mr(2)
9379             .nr(8)
9380             .kr(4)
9381             .sr(1)
9382             .m(m)
9383             .n(n)
9384             .k(k)
9385             .iterations(1)
9386             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9387         }
9388       }
9389     }
9390   }
9391 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_gt_8)9392   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_gt_8) {
9393     TEST_REQUIRES_ARM_NEON;
9394     for (uint32_t n = 9; n < 16; n++) {
9395       for (size_t k = 1; k <= 80; k += 17) {
9396         GemmMicrokernelTester()
9397           .mr(2)
9398           .nr(8)
9399           .kr(4)
9400           .sr(1)
9401           .m(2)
9402           .n(n)
9403           .k(k)
9404           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9405       }
9406     }
9407   }
9408 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_gt_8_strided_cn)9409   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_gt_8_strided_cn) {
9410     TEST_REQUIRES_ARM_NEON;
9411     for (uint32_t n = 9; n < 16; n++) {
9412       for (size_t k = 1; k <= 80; k += 17) {
9413         GemmMicrokernelTester()
9414           .mr(2)
9415           .nr(8)
9416           .kr(4)
9417           .sr(1)
9418           .m(2)
9419           .n(n)
9420           .k(k)
9421           .cn_stride(11)
9422           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9423       }
9424     }
9425   }
9426 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_gt_8_strided_a)9427   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_gt_8_strided_a) {
9428     TEST_REQUIRES_ARM_NEON;
9429     for (uint32_t n = 9; n < 16; n++) {
9430       for (size_t k = 1; k <= 80; k += 17) {
9431         GemmMicrokernelTester()
9432           .mr(2)
9433           .nr(8)
9434           .kr(4)
9435           .sr(1)
9436           .m(2)
9437           .n(n)
9438           .k(k)
9439           .a_stride(83)
9440           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9441       }
9442     }
9443   }
9444 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_gt_8_subtile)9445   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_gt_8_subtile) {
9446     TEST_REQUIRES_ARM_NEON;
9447     for (uint32_t n = 9; n < 16; n++) {
9448       for (size_t k = 1; k <= 80; k += 17) {
9449         for (uint32_t m = 1; m <= 2; m++) {
9450           GemmMicrokernelTester()
9451             .mr(2)
9452             .nr(8)
9453             .kr(4)
9454             .sr(1)
9455             .m(m)
9456             .n(n)
9457             .k(k)
9458             .iterations(1)
9459             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9460         }
9461       }
9462     }
9463   }
9464 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_div_8)9465   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_div_8) {
9466     TEST_REQUIRES_ARM_NEON;
9467     for (uint32_t n = 16; n <= 24; n += 8) {
9468       for (size_t k = 1; k <= 80; k += 17) {
9469         GemmMicrokernelTester()
9470           .mr(2)
9471           .nr(8)
9472           .kr(4)
9473           .sr(1)
9474           .m(2)
9475           .n(n)
9476           .k(k)
9477           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9478       }
9479     }
9480   }
9481 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_div_8_strided_cn)9482   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_div_8_strided_cn) {
9483     TEST_REQUIRES_ARM_NEON;
9484     for (uint32_t n = 16; n <= 24; n += 8) {
9485       for (size_t k = 1; k <= 80; k += 17) {
9486         GemmMicrokernelTester()
9487           .mr(2)
9488           .nr(8)
9489           .kr(4)
9490           .sr(1)
9491           .m(2)
9492           .n(n)
9493           .k(k)
9494           .cn_stride(11)
9495           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9496       }
9497     }
9498   }
9499 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_div_8_strided_a)9500   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_div_8_strided_a) {
9501     TEST_REQUIRES_ARM_NEON;
9502     for (uint32_t n = 16; n <= 24; n += 8) {
9503       for (size_t k = 1; k <= 80; k += 17) {
9504         GemmMicrokernelTester()
9505           .mr(2)
9506           .nr(8)
9507           .kr(4)
9508           .sr(1)
9509           .m(2)
9510           .n(n)
9511           .k(k)
9512           .a_stride(83)
9513           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9514       }
9515     }
9516   }
9517 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,n_div_8_subtile)9518   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, n_div_8_subtile) {
9519     TEST_REQUIRES_ARM_NEON;
9520     for (uint32_t n = 16; n <= 24; n += 8) {
9521       for (size_t k = 1; k <= 80; k += 17) {
9522         for (uint32_t m = 1; m <= 2; m++) {
9523           GemmMicrokernelTester()
9524             .mr(2)
9525             .nr(8)
9526             .kr(4)
9527             .sr(1)
9528             .m(m)
9529             .n(n)
9530             .k(k)
9531             .iterations(1)
9532             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9533         }
9534       }
9535     }
9536   }
9537 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,strided_cm_subtile)9538   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, strided_cm_subtile) {
9539     TEST_REQUIRES_ARM_NEON;
9540     for (size_t k = 1; k <= 80; k += 17) {
9541       for (uint32_t n = 1; n <= 8; n++) {
9542         for (uint32_t m = 1; m <= 2; m++) {
9543           GemmMicrokernelTester()
9544             .mr(2)
9545             .nr(8)
9546             .kr(4)
9547             .sr(1)
9548             .m(m)
9549             .n(n)
9550             .k(k)
9551             .cm_stride(11)
9552             .iterations(1)
9553             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9554         }
9555       }
9556     }
9557   }
9558 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,qmin)9559   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, qmin) {
9560     TEST_REQUIRES_ARM_NEON;
9561     GemmMicrokernelTester()
9562       .mr(2)
9563       .nr(8)
9564       .kr(4)
9565       .sr(1)
9566       .m(2)
9567       .n(8)
9568       .k(16)
9569       .qmin(128)
9570       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9571   }
9572 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,qmax)9573   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, qmax) {
9574     TEST_REQUIRES_ARM_NEON;
9575     GemmMicrokernelTester()
9576       .mr(2)
9577       .nr(8)
9578       .kr(4)
9579       .sr(1)
9580       .m(2)
9581       .n(8)
9582       .k(16)
9583       .qmax(128)
9584       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9585   }
9586 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP,strided_cm)9587   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_DUP, strided_cm) {
9588     TEST_REQUIRES_ARM_NEON;
9589     GemmMicrokernelTester()
9590       .mr(2)
9591       .nr(8)
9592       .kr(4)
9593       .sr(1)
9594       .m(2)
9595       .n(8)
9596       .k(16)
9597       .cm_stride(11)
9598       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9599   }
9600 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
9601 
9602 
9603 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_eq_16)9604   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_eq_16) {
9605     TEST_REQUIRES_ARM_NEON;
9606     GemmMicrokernelTester()
9607       .mr(2)
9608       .nr(8)
9609       .kr(4)
9610       .sr(1)
9611       .m(2)
9612       .n(8)
9613       .k(16)
9614       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9615   }
9616 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,strided_cn)9617   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, strided_cn) {
9618     TEST_REQUIRES_ARM_NEON;
9619     GemmMicrokernelTester()
9620       .mr(2)
9621       .nr(8)
9622       .kr(4)
9623       .sr(1)
9624       .m(2)
9625       .n(8)
9626       .k(16)
9627       .cn_stride(11)
9628       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9629   }
9630 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_eq_16_strided_a)9631   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_eq_16_strided_a) {
9632     TEST_REQUIRES_ARM_NEON;
9633     GemmMicrokernelTester()
9634       .mr(2)
9635       .nr(8)
9636       .kr(4)
9637       .sr(1)
9638       .m(2)
9639       .n(8)
9640       .k(16)
9641       .a_stride(19)
9642       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9643   }
9644 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_eq_16_subtile)9645   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_eq_16_subtile) {
9646     TEST_REQUIRES_ARM_NEON;
9647     for (uint32_t n = 1; n <= 8; n++) {
9648       for (uint32_t m = 1; m <= 2; m++) {
9649         GemmMicrokernelTester()
9650           .mr(2)
9651           .nr(8)
9652           .kr(4)
9653           .sr(1)
9654           .m(m)
9655           .n(n)
9656           .k(16)
9657           .iterations(1)
9658           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9659       }
9660     }
9661   }
9662 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_eq_16_subtile_m)9663   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_eq_16_subtile_m) {
9664     TEST_REQUIRES_ARM_NEON;
9665     for (uint32_t m = 1; m <= 2; m++) {
9666       GemmMicrokernelTester()
9667         .mr(2)
9668         .nr(8)
9669         .kr(4)
9670         .sr(1)
9671         .m(m)
9672         .n(8)
9673         .k(16)
9674         .iterations(1)
9675         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9676     }
9677   }
9678 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_eq_16_subtile_n)9679   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_eq_16_subtile_n) {
9680     TEST_REQUIRES_ARM_NEON;
9681     for (uint32_t n = 1; n <= 8; n++) {
9682       GemmMicrokernelTester()
9683         .mr(2)
9684         .nr(8)
9685         .kr(4)
9686         .sr(1)
9687         .m(2)
9688         .n(n)
9689         .k(16)
9690         .iterations(1)
9691         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9692     }
9693   }
9694 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_lt_16)9695   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_lt_16) {
9696     TEST_REQUIRES_ARM_NEON;
9697     for (size_t k = 1; k < 16; k++) {
9698       GemmMicrokernelTester()
9699         .mr(2)
9700         .nr(8)
9701         .kr(4)
9702         .sr(1)
9703         .m(2)
9704         .n(8)
9705         .k(k)
9706         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9707     }
9708   }
9709 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_lt_16_strided_a)9710   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_lt_16_strided_a) {
9711     TEST_REQUIRES_ARM_NEON;
9712     for (size_t k = 1; k < 16; k++) {
9713       GemmMicrokernelTester()
9714         .mr(2)
9715         .nr(8)
9716         .kr(4)
9717         .sr(1)
9718         .m(2)
9719         .n(8)
9720         .k(k)
9721         .a_stride(19)
9722         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9723     }
9724   }
9725 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_lt_16_subtile)9726   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_lt_16_subtile) {
9727     TEST_REQUIRES_ARM_NEON;
9728     for (size_t k = 1; k < 16; k++) {
9729       for (uint32_t n = 1; n <= 8; n++) {
9730         for (uint32_t m = 1; m <= 2; m++) {
9731           GemmMicrokernelTester()
9732             .mr(2)
9733             .nr(8)
9734             .kr(4)
9735             .sr(1)
9736             .m(m)
9737             .n(n)
9738             .k(k)
9739             .iterations(1)
9740             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9741         }
9742       }
9743     }
9744   }
9745 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_gt_16)9746   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_gt_16) {
9747     TEST_REQUIRES_ARM_NEON;
9748     for (size_t k = 17; k < 32; k++) {
9749       GemmMicrokernelTester()
9750         .mr(2)
9751         .nr(8)
9752         .kr(4)
9753         .sr(1)
9754         .m(2)
9755         .n(8)
9756         .k(k)
9757         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9758     }
9759   }
9760 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_gt_16_strided_a)9761   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_gt_16_strided_a) {
9762     TEST_REQUIRES_ARM_NEON;
9763     for (size_t k = 17; k < 32; k++) {
9764       GemmMicrokernelTester()
9765         .mr(2)
9766         .nr(8)
9767         .kr(4)
9768         .sr(1)
9769         .m(2)
9770         .n(8)
9771         .k(k)
9772         .a_stride(37)
9773         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9774     }
9775   }
9776 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_gt_16_subtile)9777   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_gt_16_subtile) {
9778     TEST_REQUIRES_ARM_NEON;
9779     for (size_t k = 17; k < 32; k++) {
9780       for (uint32_t n = 1; n <= 8; n++) {
9781         for (uint32_t m = 1; m <= 2; m++) {
9782           GemmMicrokernelTester()
9783             .mr(2)
9784             .nr(8)
9785             .kr(4)
9786             .sr(1)
9787             .m(m)
9788             .n(n)
9789             .k(k)
9790             .iterations(1)
9791             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9792         }
9793       }
9794     }
9795   }
9796 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_div_16)9797   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_div_16) {
9798     TEST_REQUIRES_ARM_NEON;
9799     for (size_t k = 32; k <= 160; k += 16) {
9800       GemmMicrokernelTester()
9801         .mr(2)
9802         .nr(8)
9803         .kr(4)
9804         .sr(1)
9805         .m(2)
9806         .n(8)
9807         .k(k)
9808         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9809     }
9810   }
9811 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_div_16_strided_a)9812   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_div_16_strided_a) {
9813     TEST_REQUIRES_ARM_NEON;
9814     for (size_t k = 32; k <= 160; k += 16) {
9815       GemmMicrokernelTester()
9816         .mr(2)
9817         .nr(8)
9818         .kr(4)
9819         .sr(1)
9820         .m(2)
9821         .n(8)
9822         .k(k)
9823         .a_stride(163)
9824         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9825     }
9826   }
9827 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,k_div_16_subtile)9828   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, k_div_16_subtile) {
9829     TEST_REQUIRES_ARM_NEON;
9830     for (size_t k = 32; k <= 160; k += 16) {
9831       for (uint32_t n = 1; n <= 8; n++) {
9832         for (uint32_t m = 1; m <= 2; m++) {
9833           GemmMicrokernelTester()
9834             .mr(2)
9835             .nr(8)
9836             .kr(4)
9837             .sr(1)
9838             .m(m)
9839             .n(n)
9840             .k(k)
9841             .iterations(1)
9842             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9843         }
9844       }
9845     }
9846   }
9847 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_gt_8)9848   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_gt_8) {
9849     TEST_REQUIRES_ARM_NEON;
9850     for (uint32_t n = 9; n < 16; n++) {
9851       for (size_t k = 1; k <= 80; k += 17) {
9852         GemmMicrokernelTester()
9853           .mr(2)
9854           .nr(8)
9855           .kr(4)
9856           .sr(1)
9857           .m(2)
9858           .n(n)
9859           .k(k)
9860           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9861       }
9862     }
9863   }
9864 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_gt_8_strided_cn)9865   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_gt_8_strided_cn) {
9866     TEST_REQUIRES_ARM_NEON;
9867     for (uint32_t n = 9; n < 16; n++) {
9868       for (size_t k = 1; k <= 80; k += 17) {
9869         GemmMicrokernelTester()
9870           .mr(2)
9871           .nr(8)
9872           .kr(4)
9873           .sr(1)
9874           .m(2)
9875           .n(n)
9876           .k(k)
9877           .cn_stride(11)
9878           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9879       }
9880     }
9881   }
9882 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_gt_8_strided_a)9883   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_gt_8_strided_a) {
9884     TEST_REQUIRES_ARM_NEON;
9885     for (uint32_t n = 9; n < 16; n++) {
9886       for (size_t k = 1; k <= 80; k += 17) {
9887         GemmMicrokernelTester()
9888           .mr(2)
9889           .nr(8)
9890           .kr(4)
9891           .sr(1)
9892           .m(2)
9893           .n(n)
9894           .k(k)
9895           .a_stride(83)
9896           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9897       }
9898     }
9899   }
9900 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_gt_8_subtile)9901   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_gt_8_subtile) {
9902     TEST_REQUIRES_ARM_NEON;
9903     for (uint32_t n = 9; n < 16; n++) {
9904       for (size_t k = 1; k <= 80; k += 17) {
9905         for (uint32_t m = 1; m <= 2; m++) {
9906           GemmMicrokernelTester()
9907             .mr(2)
9908             .nr(8)
9909             .kr(4)
9910             .sr(1)
9911             .m(m)
9912             .n(n)
9913             .k(k)
9914             .iterations(1)
9915             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9916         }
9917       }
9918     }
9919   }
9920 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_div_8)9921   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_div_8) {
9922     TEST_REQUIRES_ARM_NEON;
9923     for (uint32_t n = 16; n <= 24; n += 8) {
9924       for (size_t k = 1; k <= 80; k += 17) {
9925         GemmMicrokernelTester()
9926           .mr(2)
9927           .nr(8)
9928           .kr(4)
9929           .sr(1)
9930           .m(2)
9931           .n(n)
9932           .k(k)
9933           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9934       }
9935     }
9936   }
9937 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_div_8_strided_cn)9938   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_div_8_strided_cn) {
9939     TEST_REQUIRES_ARM_NEON;
9940     for (uint32_t n = 16; n <= 24; n += 8) {
9941       for (size_t k = 1; k <= 80; k += 17) {
9942         GemmMicrokernelTester()
9943           .mr(2)
9944           .nr(8)
9945           .kr(4)
9946           .sr(1)
9947           .m(2)
9948           .n(n)
9949           .k(k)
9950           .cn_stride(11)
9951           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9952       }
9953     }
9954   }
9955 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_div_8_strided_a)9956   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_div_8_strided_a) {
9957     TEST_REQUIRES_ARM_NEON;
9958     for (uint32_t n = 16; n <= 24; n += 8) {
9959       for (size_t k = 1; k <= 80; k += 17) {
9960         GemmMicrokernelTester()
9961           .mr(2)
9962           .nr(8)
9963           .kr(4)
9964           .sr(1)
9965           .m(2)
9966           .n(n)
9967           .k(k)
9968           .a_stride(83)
9969           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9970       }
9971     }
9972   }
9973 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,n_div_8_subtile)9974   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, n_div_8_subtile) {
9975     TEST_REQUIRES_ARM_NEON;
9976     for (uint32_t n = 16; n <= 24; n += 8) {
9977       for (size_t k = 1; k <= 80; k += 17) {
9978         for (uint32_t m = 1; m <= 2; m++) {
9979           GemmMicrokernelTester()
9980             .mr(2)
9981             .nr(8)
9982             .kr(4)
9983             .sr(1)
9984             .m(m)
9985             .n(n)
9986             .k(k)
9987             .iterations(1)
9988             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
9989         }
9990       }
9991     }
9992   }
9993 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,strided_cm_subtile)9994   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, strided_cm_subtile) {
9995     TEST_REQUIRES_ARM_NEON;
9996     for (size_t k = 1; k <= 80; k += 17) {
9997       for (uint32_t n = 1; n <= 8; n++) {
9998         for (uint32_t m = 1; m <= 2; m++) {
9999           GemmMicrokernelTester()
10000             .mr(2)
10001             .nr(8)
10002             .kr(4)
10003             .sr(1)
10004             .m(m)
10005             .n(n)
10006             .k(k)
10007             .cm_stride(11)
10008             .iterations(1)
10009             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10010         }
10011       }
10012     }
10013   }
10014 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,qmin)10015   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, qmin) {
10016     TEST_REQUIRES_ARM_NEON;
10017     GemmMicrokernelTester()
10018       .mr(2)
10019       .nr(8)
10020       .kr(4)
10021       .sr(1)
10022       .m(2)
10023       .n(8)
10024       .k(16)
10025       .qmin(128)
10026       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10027   }
10028 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,qmax)10029   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, qmax) {
10030     TEST_REQUIRES_ARM_NEON;
10031     GemmMicrokernelTester()
10032       .mr(2)
10033       .nr(8)
10034       .kr(4)
10035       .sr(1)
10036       .m(2)
10037       .n(8)
10038       .k(16)
10039       .qmax(128)
10040       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10041   }
10042 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R,strided_cm)10043   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEON_MLAL_LD2R, strided_cm) {
10044     TEST_REQUIRES_ARM_NEON;
10045     GemmMicrokernelTester()
10046       .mr(2)
10047       .nr(8)
10048       .kr(4)
10049       .sr(1)
10050       .m(2)
10051       .n(8)
10052       .k(16)
10053       .cm_stride(11)
10054       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neon_mlal_ld2r, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10055   }
10056 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
10057 
10058 
10059 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_eq_16)10060   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_eq_16) {
10061     TEST_REQUIRES_ARM_NEON_V8;
10062     GemmMicrokernelTester()
10063       .mr(2)
10064       .nr(8)
10065       .kr(4)
10066       .sr(1)
10067       .m(2)
10068       .n(8)
10069       .k(16)
10070       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10071   }
10072 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,strided_cn)10073   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, strided_cn) {
10074     TEST_REQUIRES_ARM_NEON_V8;
10075     GemmMicrokernelTester()
10076       .mr(2)
10077       .nr(8)
10078       .kr(4)
10079       .sr(1)
10080       .m(2)
10081       .n(8)
10082       .k(16)
10083       .cn_stride(11)
10084       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10085   }
10086 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_eq_16_strided_a)10087   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_eq_16_strided_a) {
10088     TEST_REQUIRES_ARM_NEON_V8;
10089     GemmMicrokernelTester()
10090       .mr(2)
10091       .nr(8)
10092       .kr(4)
10093       .sr(1)
10094       .m(2)
10095       .n(8)
10096       .k(16)
10097       .a_stride(19)
10098       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10099   }
10100 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile)10101   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile) {
10102     TEST_REQUIRES_ARM_NEON_V8;
10103     for (uint32_t n = 1; n <= 8; n++) {
10104       for (uint32_t m = 1; m <= 2; m++) {
10105         GemmMicrokernelTester()
10106           .mr(2)
10107           .nr(8)
10108           .kr(4)
10109           .sr(1)
10110           .m(m)
10111           .n(n)
10112           .k(16)
10113           .iterations(1)
10114           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10115       }
10116     }
10117   }
10118 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile_m)10119   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile_m) {
10120     TEST_REQUIRES_ARM_NEON_V8;
10121     for (uint32_t m = 1; m <= 2; m++) {
10122       GemmMicrokernelTester()
10123         .mr(2)
10124         .nr(8)
10125         .kr(4)
10126         .sr(1)
10127         .m(m)
10128         .n(8)
10129         .k(16)
10130         .iterations(1)
10131         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10132     }
10133   }
10134 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_eq_16_subtile_n)10135   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_eq_16_subtile_n) {
10136     TEST_REQUIRES_ARM_NEON_V8;
10137     for (uint32_t n = 1; n <= 8; n++) {
10138       GemmMicrokernelTester()
10139         .mr(2)
10140         .nr(8)
10141         .kr(4)
10142         .sr(1)
10143         .m(2)
10144         .n(n)
10145         .k(16)
10146         .iterations(1)
10147         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10148     }
10149   }
10150 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_lt_16)10151   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_lt_16) {
10152     TEST_REQUIRES_ARM_NEON_V8;
10153     for (size_t k = 1; k < 16; k++) {
10154       GemmMicrokernelTester()
10155         .mr(2)
10156         .nr(8)
10157         .kr(4)
10158         .sr(1)
10159         .m(2)
10160         .n(8)
10161         .k(k)
10162         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10163     }
10164   }
10165 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_lt_16_strided_a)10166   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_lt_16_strided_a) {
10167     TEST_REQUIRES_ARM_NEON_V8;
10168     for (size_t k = 1; k < 16; k++) {
10169       GemmMicrokernelTester()
10170         .mr(2)
10171         .nr(8)
10172         .kr(4)
10173         .sr(1)
10174         .m(2)
10175         .n(8)
10176         .k(k)
10177         .a_stride(19)
10178         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10179     }
10180   }
10181 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_lt_16_subtile)10182   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_lt_16_subtile) {
10183     TEST_REQUIRES_ARM_NEON_V8;
10184     for (size_t k = 1; k < 16; k++) {
10185       for (uint32_t n = 1; n <= 8; n++) {
10186         for (uint32_t m = 1; m <= 2; m++) {
10187           GemmMicrokernelTester()
10188             .mr(2)
10189             .nr(8)
10190             .kr(4)
10191             .sr(1)
10192             .m(m)
10193             .n(n)
10194             .k(k)
10195             .iterations(1)
10196             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10197         }
10198       }
10199     }
10200   }
10201 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_gt_16)10202   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_gt_16) {
10203     TEST_REQUIRES_ARM_NEON_V8;
10204     for (size_t k = 17; k < 32; k++) {
10205       GemmMicrokernelTester()
10206         .mr(2)
10207         .nr(8)
10208         .kr(4)
10209         .sr(1)
10210         .m(2)
10211         .n(8)
10212         .k(k)
10213         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10214     }
10215   }
10216 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_gt_16_strided_a)10217   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_gt_16_strided_a) {
10218     TEST_REQUIRES_ARM_NEON_V8;
10219     for (size_t k = 17; k < 32; k++) {
10220       GemmMicrokernelTester()
10221         .mr(2)
10222         .nr(8)
10223         .kr(4)
10224         .sr(1)
10225         .m(2)
10226         .n(8)
10227         .k(k)
10228         .a_stride(37)
10229         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10230     }
10231   }
10232 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_gt_16_subtile)10233   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_gt_16_subtile) {
10234     TEST_REQUIRES_ARM_NEON_V8;
10235     for (size_t k = 17; k < 32; k++) {
10236       for (uint32_t n = 1; n <= 8; n++) {
10237         for (uint32_t m = 1; m <= 2; m++) {
10238           GemmMicrokernelTester()
10239             .mr(2)
10240             .nr(8)
10241             .kr(4)
10242             .sr(1)
10243             .m(m)
10244             .n(n)
10245             .k(k)
10246             .iterations(1)
10247             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10248         }
10249       }
10250     }
10251   }
10252 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_div_16)10253   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_div_16) {
10254     TEST_REQUIRES_ARM_NEON_V8;
10255     for (size_t k = 32; k <= 160; k += 16) {
10256       GemmMicrokernelTester()
10257         .mr(2)
10258         .nr(8)
10259         .kr(4)
10260         .sr(1)
10261         .m(2)
10262         .n(8)
10263         .k(k)
10264         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10265     }
10266   }
10267 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_div_16_strided_a)10268   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_div_16_strided_a) {
10269     TEST_REQUIRES_ARM_NEON_V8;
10270     for (size_t k = 32; k <= 160; k += 16) {
10271       GemmMicrokernelTester()
10272         .mr(2)
10273         .nr(8)
10274         .kr(4)
10275         .sr(1)
10276         .m(2)
10277         .n(8)
10278         .k(k)
10279         .a_stride(163)
10280         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10281     }
10282   }
10283 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,k_div_16_subtile)10284   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, k_div_16_subtile) {
10285     TEST_REQUIRES_ARM_NEON_V8;
10286     for (size_t k = 32; k <= 160; k += 16) {
10287       for (uint32_t n = 1; n <= 8; n++) {
10288         for (uint32_t m = 1; m <= 2; m++) {
10289           GemmMicrokernelTester()
10290             .mr(2)
10291             .nr(8)
10292             .kr(4)
10293             .sr(1)
10294             .m(m)
10295             .n(n)
10296             .k(k)
10297             .iterations(1)
10298             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10299         }
10300       }
10301     }
10302   }
10303 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_gt_8)10304   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_gt_8) {
10305     TEST_REQUIRES_ARM_NEON_V8;
10306     for (uint32_t n = 9; n < 16; n++) {
10307       for (size_t k = 1; k <= 80; k += 17) {
10308         GemmMicrokernelTester()
10309           .mr(2)
10310           .nr(8)
10311           .kr(4)
10312           .sr(1)
10313           .m(2)
10314           .n(n)
10315           .k(k)
10316           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10317       }
10318     }
10319   }
10320 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_gt_8_strided_cn)10321   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_gt_8_strided_cn) {
10322     TEST_REQUIRES_ARM_NEON_V8;
10323     for (uint32_t n = 9; n < 16; n++) {
10324       for (size_t k = 1; k <= 80; k += 17) {
10325         GemmMicrokernelTester()
10326           .mr(2)
10327           .nr(8)
10328           .kr(4)
10329           .sr(1)
10330           .m(2)
10331           .n(n)
10332           .k(k)
10333           .cn_stride(11)
10334           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10335       }
10336     }
10337   }
10338 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_gt_8_strided_a)10339   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_gt_8_strided_a) {
10340     TEST_REQUIRES_ARM_NEON_V8;
10341     for (uint32_t n = 9; n < 16; n++) {
10342       for (size_t k = 1; k <= 80; k += 17) {
10343         GemmMicrokernelTester()
10344           .mr(2)
10345           .nr(8)
10346           .kr(4)
10347           .sr(1)
10348           .m(2)
10349           .n(n)
10350           .k(k)
10351           .a_stride(83)
10352           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10353       }
10354     }
10355   }
10356 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_gt_8_subtile)10357   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_gt_8_subtile) {
10358     TEST_REQUIRES_ARM_NEON_V8;
10359     for (uint32_t n = 9; n < 16; n++) {
10360       for (size_t k = 1; k <= 80; k += 17) {
10361         for (uint32_t m = 1; m <= 2; m++) {
10362           GemmMicrokernelTester()
10363             .mr(2)
10364             .nr(8)
10365             .kr(4)
10366             .sr(1)
10367             .m(m)
10368             .n(n)
10369             .k(k)
10370             .iterations(1)
10371             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10372         }
10373       }
10374     }
10375   }
10376 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_div_8)10377   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_div_8) {
10378     TEST_REQUIRES_ARM_NEON_V8;
10379     for (uint32_t n = 16; n <= 24; n += 8) {
10380       for (size_t k = 1; k <= 80; k += 17) {
10381         GemmMicrokernelTester()
10382           .mr(2)
10383           .nr(8)
10384           .kr(4)
10385           .sr(1)
10386           .m(2)
10387           .n(n)
10388           .k(k)
10389           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10390       }
10391     }
10392   }
10393 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_div_8_strided_cn)10394   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_div_8_strided_cn) {
10395     TEST_REQUIRES_ARM_NEON_V8;
10396     for (uint32_t n = 16; n <= 24; n += 8) {
10397       for (size_t k = 1; k <= 80; k += 17) {
10398         GemmMicrokernelTester()
10399           .mr(2)
10400           .nr(8)
10401           .kr(4)
10402           .sr(1)
10403           .m(2)
10404           .n(n)
10405           .k(k)
10406           .cn_stride(11)
10407           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10408       }
10409     }
10410   }
10411 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_div_8_strided_a)10412   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_div_8_strided_a) {
10413     TEST_REQUIRES_ARM_NEON_V8;
10414     for (uint32_t n = 16; n <= 24; n += 8) {
10415       for (size_t k = 1; k <= 80; k += 17) {
10416         GemmMicrokernelTester()
10417           .mr(2)
10418           .nr(8)
10419           .kr(4)
10420           .sr(1)
10421           .m(2)
10422           .n(n)
10423           .k(k)
10424           .a_stride(83)
10425           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10426       }
10427     }
10428   }
10429 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,n_div_8_subtile)10430   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, n_div_8_subtile) {
10431     TEST_REQUIRES_ARM_NEON_V8;
10432     for (uint32_t n = 16; n <= 24; n += 8) {
10433       for (size_t k = 1; k <= 80; k += 17) {
10434         for (uint32_t m = 1; m <= 2; m++) {
10435           GemmMicrokernelTester()
10436             .mr(2)
10437             .nr(8)
10438             .kr(4)
10439             .sr(1)
10440             .m(m)
10441             .n(n)
10442             .k(k)
10443             .iterations(1)
10444             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10445         }
10446       }
10447     }
10448   }
10449 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,strided_cm_subtile)10450   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, strided_cm_subtile) {
10451     TEST_REQUIRES_ARM_NEON_V8;
10452     for (size_t k = 1; k <= 80; k += 17) {
10453       for (uint32_t n = 1; n <= 8; n++) {
10454         for (uint32_t m = 1; m <= 2; m++) {
10455           GemmMicrokernelTester()
10456             .mr(2)
10457             .nr(8)
10458             .kr(4)
10459             .sr(1)
10460             .m(m)
10461             .n(n)
10462             .k(k)
10463             .cm_stride(11)
10464             .iterations(1)
10465             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10466         }
10467       }
10468     }
10469   }
10470 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,qmin)10471   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, qmin) {
10472     TEST_REQUIRES_ARM_NEON_V8;
10473     GemmMicrokernelTester()
10474       .mr(2)
10475       .nr(8)
10476       .kr(4)
10477       .sr(1)
10478       .m(2)
10479       .n(8)
10480       .k(16)
10481       .qmin(128)
10482       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10483   }
10484 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,qmax)10485   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, qmax) {
10486     TEST_REQUIRES_ARM_NEON_V8;
10487     GemmMicrokernelTester()
10488       .mr(2)
10489       .nr(8)
10490       .kr(4)
10491       .sr(1)
10492       .m(2)
10493       .n(8)
10494       .k(16)
10495       .qmax(128)
10496       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10497   }
10498 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP,strided_cm)10499   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_DUP, strided_cm) {
10500     TEST_REQUIRES_ARM_NEON_V8;
10501     GemmMicrokernelTester()
10502       .mr(2)
10503       .nr(8)
10504       .kr(4)
10505       .sr(1)
10506       .m(2)
10507       .n(8)
10508       .k(16)
10509       .cm_stride(11)
10510       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_dup, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10511   }
10512 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
10513 
10514 
10515 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_eq_16)10516   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_eq_16) {
10517     TEST_REQUIRES_ARM_NEON_V8;
10518     GemmMicrokernelTester()
10519       .mr(2)
10520       .nr(8)
10521       .kr(4)
10522       .sr(1)
10523       .m(2)
10524       .n(8)
10525       .k(16)
10526       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10527   }
10528 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,strided_cn)10529   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, strided_cn) {
10530     TEST_REQUIRES_ARM_NEON_V8;
10531     GemmMicrokernelTester()
10532       .mr(2)
10533       .nr(8)
10534       .kr(4)
10535       .sr(1)
10536       .m(2)
10537       .n(8)
10538       .k(16)
10539       .cn_stride(11)
10540       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10541   }
10542 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_eq_16_strided_a)10543   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_eq_16_strided_a) {
10544     TEST_REQUIRES_ARM_NEON_V8;
10545     GemmMicrokernelTester()
10546       .mr(2)
10547       .nr(8)
10548       .kr(4)
10549       .sr(1)
10550       .m(2)
10551       .n(8)
10552       .k(16)
10553       .a_stride(19)
10554       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10555   }
10556 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_eq_16_subtile)10557   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_eq_16_subtile) {
10558     TEST_REQUIRES_ARM_NEON_V8;
10559     for (uint32_t n = 1; n <= 8; n++) {
10560       for (uint32_t m = 1; m <= 2; m++) {
10561         GemmMicrokernelTester()
10562           .mr(2)
10563           .nr(8)
10564           .kr(4)
10565           .sr(1)
10566           .m(m)
10567           .n(n)
10568           .k(16)
10569           .iterations(1)
10570           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10571       }
10572     }
10573   }
10574 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_eq_16_subtile_m)10575   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_eq_16_subtile_m) {
10576     TEST_REQUIRES_ARM_NEON_V8;
10577     for (uint32_t m = 1; m <= 2; m++) {
10578       GemmMicrokernelTester()
10579         .mr(2)
10580         .nr(8)
10581         .kr(4)
10582         .sr(1)
10583         .m(m)
10584         .n(8)
10585         .k(16)
10586         .iterations(1)
10587         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10588     }
10589   }
10590 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_eq_16_subtile_n)10591   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_eq_16_subtile_n) {
10592     TEST_REQUIRES_ARM_NEON_V8;
10593     for (uint32_t n = 1; n <= 8; n++) {
10594       GemmMicrokernelTester()
10595         .mr(2)
10596         .nr(8)
10597         .kr(4)
10598         .sr(1)
10599         .m(2)
10600         .n(n)
10601         .k(16)
10602         .iterations(1)
10603         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10604     }
10605   }
10606 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_lt_16)10607   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_lt_16) {
10608     TEST_REQUIRES_ARM_NEON_V8;
10609     for (size_t k = 1; k < 16; k++) {
10610       GemmMicrokernelTester()
10611         .mr(2)
10612         .nr(8)
10613         .kr(4)
10614         .sr(1)
10615         .m(2)
10616         .n(8)
10617         .k(k)
10618         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10619     }
10620   }
10621 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_lt_16_strided_a)10622   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_lt_16_strided_a) {
10623     TEST_REQUIRES_ARM_NEON_V8;
10624     for (size_t k = 1; k < 16; k++) {
10625       GemmMicrokernelTester()
10626         .mr(2)
10627         .nr(8)
10628         .kr(4)
10629         .sr(1)
10630         .m(2)
10631         .n(8)
10632         .k(k)
10633         .a_stride(19)
10634         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10635     }
10636   }
10637 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_lt_16_subtile)10638   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_lt_16_subtile) {
10639     TEST_REQUIRES_ARM_NEON_V8;
10640     for (size_t k = 1; k < 16; k++) {
10641       for (uint32_t n = 1; n <= 8; n++) {
10642         for (uint32_t m = 1; m <= 2; m++) {
10643           GemmMicrokernelTester()
10644             .mr(2)
10645             .nr(8)
10646             .kr(4)
10647             .sr(1)
10648             .m(m)
10649             .n(n)
10650             .k(k)
10651             .iterations(1)
10652             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10653         }
10654       }
10655     }
10656   }
10657 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_gt_16)10658   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_gt_16) {
10659     TEST_REQUIRES_ARM_NEON_V8;
10660     for (size_t k = 17; k < 32; k++) {
10661       GemmMicrokernelTester()
10662         .mr(2)
10663         .nr(8)
10664         .kr(4)
10665         .sr(1)
10666         .m(2)
10667         .n(8)
10668         .k(k)
10669         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10670     }
10671   }
10672 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_gt_16_strided_a)10673   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_gt_16_strided_a) {
10674     TEST_REQUIRES_ARM_NEON_V8;
10675     for (size_t k = 17; k < 32; k++) {
10676       GemmMicrokernelTester()
10677         .mr(2)
10678         .nr(8)
10679         .kr(4)
10680         .sr(1)
10681         .m(2)
10682         .n(8)
10683         .k(k)
10684         .a_stride(37)
10685         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10686     }
10687   }
10688 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_gt_16_subtile)10689   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_gt_16_subtile) {
10690     TEST_REQUIRES_ARM_NEON_V8;
10691     for (size_t k = 17; k < 32; k++) {
10692       for (uint32_t n = 1; n <= 8; n++) {
10693         for (uint32_t m = 1; m <= 2; m++) {
10694           GemmMicrokernelTester()
10695             .mr(2)
10696             .nr(8)
10697             .kr(4)
10698             .sr(1)
10699             .m(m)
10700             .n(n)
10701             .k(k)
10702             .iterations(1)
10703             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10704         }
10705       }
10706     }
10707   }
10708 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_div_16)10709   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_div_16) {
10710     TEST_REQUIRES_ARM_NEON_V8;
10711     for (size_t k = 32; k <= 160; k += 16) {
10712       GemmMicrokernelTester()
10713         .mr(2)
10714         .nr(8)
10715         .kr(4)
10716         .sr(1)
10717         .m(2)
10718         .n(8)
10719         .k(k)
10720         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10721     }
10722   }
10723 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_div_16_strided_a)10724   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_div_16_strided_a) {
10725     TEST_REQUIRES_ARM_NEON_V8;
10726     for (size_t k = 32; k <= 160; k += 16) {
10727       GemmMicrokernelTester()
10728         .mr(2)
10729         .nr(8)
10730         .kr(4)
10731         .sr(1)
10732         .m(2)
10733         .n(8)
10734         .k(k)
10735         .a_stride(163)
10736         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10737     }
10738   }
10739 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,k_div_16_subtile)10740   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, k_div_16_subtile) {
10741     TEST_REQUIRES_ARM_NEON_V8;
10742     for (size_t k = 32; k <= 160; k += 16) {
10743       for (uint32_t n = 1; n <= 8; n++) {
10744         for (uint32_t m = 1; m <= 2; m++) {
10745           GemmMicrokernelTester()
10746             .mr(2)
10747             .nr(8)
10748             .kr(4)
10749             .sr(1)
10750             .m(m)
10751             .n(n)
10752             .k(k)
10753             .iterations(1)
10754             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10755         }
10756       }
10757     }
10758   }
10759 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_gt_8)10760   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_gt_8) {
10761     TEST_REQUIRES_ARM_NEON_V8;
10762     for (uint32_t n = 9; n < 16; n++) {
10763       for (size_t k = 1; k <= 80; k += 17) {
10764         GemmMicrokernelTester()
10765           .mr(2)
10766           .nr(8)
10767           .kr(4)
10768           .sr(1)
10769           .m(2)
10770           .n(n)
10771           .k(k)
10772           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10773       }
10774     }
10775   }
10776 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_gt_8_strided_cn)10777   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_gt_8_strided_cn) {
10778     TEST_REQUIRES_ARM_NEON_V8;
10779     for (uint32_t n = 9; n < 16; n++) {
10780       for (size_t k = 1; k <= 80; k += 17) {
10781         GemmMicrokernelTester()
10782           .mr(2)
10783           .nr(8)
10784           .kr(4)
10785           .sr(1)
10786           .m(2)
10787           .n(n)
10788           .k(k)
10789           .cn_stride(11)
10790           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10791       }
10792     }
10793   }
10794 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_gt_8_strided_a)10795   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_gt_8_strided_a) {
10796     TEST_REQUIRES_ARM_NEON_V8;
10797     for (uint32_t n = 9; n < 16; n++) {
10798       for (size_t k = 1; k <= 80; k += 17) {
10799         GemmMicrokernelTester()
10800           .mr(2)
10801           .nr(8)
10802           .kr(4)
10803           .sr(1)
10804           .m(2)
10805           .n(n)
10806           .k(k)
10807           .a_stride(83)
10808           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10809       }
10810     }
10811   }
10812 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_gt_8_subtile)10813   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_gt_8_subtile) {
10814     TEST_REQUIRES_ARM_NEON_V8;
10815     for (uint32_t n = 9; n < 16; n++) {
10816       for (size_t k = 1; k <= 80; k += 17) {
10817         for (uint32_t m = 1; m <= 2; m++) {
10818           GemmMicrokernelTester()
10819             .mr(2)
10820             .nr(8)
10821             .kr(4)
10822             .sr(1)
10823             .m(m)
10824             .n(n)
10825             .k(k)
10826             .iterations(1)
10827             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10828         }
10829       }
10830     }
10831   }
10832 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_div_8)10833   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_div_8) {
10834     TEST_REQUIRES_ARM_NEON_V8;
10835     for (uint32_t n = 16; n <= 24; n += 8) {
10836       for (size_t k = 1; k <= 80; k += 17) {
10837         GemmMicrokernelTester()
10838           .mr(2)
10839           .nr(8)
10840           .kr(4)
10841           .sr(1)
10842           .m(2)
10843           .n(n)
10844           .k(k)
10845           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10846       }
10847     }
10848   }
10849 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_div_8_strided_cn)10850   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_div_8_strided_cn) {
10851     TEST_REQUIRES_ARM_NEON_V8;
10852     for (uint32_t n = 16; n <= 24; n += 8) {
10853       for (size_t k = 1; k <= 80; k += 17) {
10854         GemmMicrokernelTester()
10855           .mr(2)
10856           .nr(8)
10857           .kr(4)
10858           .sr(1)
10859           .m(2)
10860           .n(n)
10861           .k(k)
10862           .cn_stride(11)
10863           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10864       }
10865     }
10866   }
10867 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_div_8_strided_a)10868   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_div_8_strided_a) {
10869     TEST_REQUIRES_ARM_NEON_V8;
10870     for (uint32_t n = 16; n <= 24; n += 8) {
10871       for (size_t k = 1; k <= 80; k += 17) {
10872         GemmMicrokernelTester()
10873           .mr(2)
10874           .nr(8)
10875           .kr(4)
10876           .sr(1)
10877           .m(2)
10878           .n(n)
10879           .k(k)
10880           .a_stride(83)
10881           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10882       }
10883     }
10884   }
10885 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,n_div_8_subtile)10886   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, n_div_8_subtile) {
10887     TEST_REQUIRES_ARM_NEON_V8;
10888     for (uint32_t n = 16; n <= 24; n += 8) {
10889       for (size_t k = 1; k <= 80; k += 17) {
10890         for (uint32_t m = 1; m <= 2; m++) {
10891           GemmMicrokernelTester()
10892             .mr(2)
10893             .nr(8)
10894             .kr(4)
10895             .sr(1)
10896             .m(m)
10897             .n(n)
10898             .k(k)
10899             .iterations(1)
10900             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10901         }
10902       }
10903     }
10904   }
10905 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,strided_cm_subtile)10906   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, strided_cm_subtile) {
10907     TEST_REQUIRES_ARM_NEON_V8;
10908     for (size_t k = 1; k <= 80; k += 17) {
10909       for (uint32_t n = 1; n <= 8; n++) {
10910         for (uint32_t m = 1; m <= 2; m++) {
10911           GemmMicrokernelTester()
10912             .mr(2)
10913             .nr(8)
10914             .kr(4)
10915             .sr(1)
10916             .m(m)
10917             .n(n)
10918             .k(k)
10919             .cm_stride(11)
10920             .iterations(1)
10921             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10922         }
10923       }
10924     }
10925   }
10926 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,qmin)10927   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, qmin) {
10928     TEST_REQUIRES_ARM_NEON_V8;
10929     GemmMicrokernelTester()
10930       .mr(2)
10931       .nr(8)
10932       .kr(4)
10933       .sr(1)
10934       .m(2)
10935       .n(8)
10936       .k(16)
10937       .qmin(128)
10938       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10939   }
10940 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,qmax)10941   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, qmax) {
10942     TEST_REQUIRES_ARM_NEON_V8;
10943     GemmMicrokernelTester()
10944       .mr(2)
10945       .nr(8)
10946       .kr(4)
10947       .sr(1)
10948       .m(2)
10949       .n(8)
10950       .k(16)
10951       .qmax(128)
10952       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10953   }
10954 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R,strided_cm)10955   TEST(QS8_GEMM_MINMAX_FP32_2X8C4__NEONV8_MLAL_LD1R, strided_cm) {
10956     TEST_REQUIRES_ARM_NEON_V8;
10957     GemmMicrokernelTester()
10958       .mr(2)
10959       .nr(8)
10960       .kr(4)
10961       .sr(1)
10962       .m(2)
10963       .n(8)
10964       .k(16)
10965       .cm_stride(11)
10966       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4__neonv8_mlal_ld1r, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
10967   }
10968 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
10969 
10970 
10971 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_eq_16)10972   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_eq_16) {
10973     TEST_REQUIRES_ARM_NEON;
10974     GemmMicrokernelTester()
10975       .mr(2)
10976       .nr(8)
10977       .kr(4)
10978       .sr(2)
10979       .m(2)
10980       .n(8)
10981       .k(16)
10982       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10983   }
10984 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,strided_cn)10985   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, strided_cn) {
10986     TEST_REQUIRES_ARM_NEON;
10987     GemmMicrokernelTester()
10988       .mr(2)
10989       .nr(8)
10990       .kr(4)
10991       .sr(2)
10992       .m(2)
10993       .n(8)
10994       .k(16)
10995       .cn_stride(11)
10996       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
10997   }
10998 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_eq_16_strided_a)10999   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_eq_16_strided_a) {
11000     TEST_REQUIRES_ARM_NEON;
11001     GemmMicrokernelTester()
11002       .mr(2)
11003       .nr(8)
11004       .kr(4)
11005       .sr(2)
11006       .m(2)
11007       .n(8)
11008       .k(16)
11009       .a_stride(19)
11010       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11011   }
11012 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_eq_16_subtile)11013   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_eq_16_subtile) {
11014     TEST_REQUIRES_ARM_NEON;
11015     for (uint32_t n = 1; n <= 8; n++) {
11016       for (uint32_t m = 1; m <= 2; m++) {
11017         GemmMicrokernelTester()
11018           .mr(2)
11019           .nr(8)
11020           .kr(4)
11021           .sr(2)
11022           .m(m)
11023           .n(n)
11024           .k(16)
11025           .iterations(1)
11026           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11027       }
11028     }
11029   }
11030 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_eq_16_subtile_m)11031   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_eq_16_subtile_m) {
11032     TEST_REQUIRES_ARM_NEON;
11033     for (uint32_t m = 1; m <= 2; m++) {
11034       GemmMicrokernelTester()
11035         .mr(2)
11036         .nr(8)
11037         .kr(4)
11038         .sr(2)
11039         .m(m)
11040         .n(8)
11041         .k(16)
11042         .iterations(1)
11043         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11044     }
11045   }
11046 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_eq_16_subtile_n)11047   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_eq_16_subtile_n) {
11048     TEST_REQUIRES_ARM_NEON;
11049     for (uint32_t n = 1; n <= 8; n++) {
11050       GemmMicrokernelTester()
11051         .mr(2)
11052         .nr(8)
11053         .kr(4)
11054         .sr(2)
11055         .m(2)
11056         .n(n)
11057         .k(16)
11058         .iterations(1)
11059         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11060     }
11061   }
11062 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_lt_16)11063   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_lt_16) {
11064     TEST_REQUIRES_ARM_NEON;
11065     for (size_t k = 1; k < 16; k++) {
11066       GemmMicrokernelTester()
11067         .mr(2)
11068         .nr(8)
11069         .kr(4)
11070         .sr(2)
11071         .m(2)
11072         .n(8)
11073         .k(k)
11074         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11075     }
11076   }
11077 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_lt_16_strided_a)11078   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_lt_16_strided_a) {
11079     TEST_REQUIRES_ARM_NEON;
11080     for (size_t k = 1; k < 16; k++) {
11081       GemmMicrokernelTester()
11082         .mr(2)
11083         .nr(8)
11084         .kr(4)
11085         .sr(2)
11086         .m(2)
11087         .n(8)
11088         .k(k)
11089         .a_stride(19)
11090         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11091     }
11092   }
11093 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_lt_16_subtile)11094   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_lt_16_subtile) {
11095     TEST_REQUIRES_ARM_NEON;
11096     for (size_t k = 1; k < 16; k++) {
11097       for (uint32_t n = 1; n <= 8; n++) {
11098         for (uint32_t m = 1; m <= 2; m++) {
11099           GemmMicrokernelTester()
11100             .mr(2)
11101             .nr(8)
11102             .kr(4)
11103             .sr(2)
11104             .m(m)
11105             .n(n)
11106             .k(k)
11107             .iterations(1)
11108             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11109         }
11110       }
11111     }
11112   }
11113 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_gt_16)11114   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_gt_16) {
11115     TEST_REQUIRES_ARM_NEON;
11116     for (size_t k = 17; k < 32; k++) {
11117       GemmMicrokernelTester()
11118         .mr(2)
11119         .nr(8)
11120         .kr(4)
11121         .sr(2)
11122         .m(2)
11123         .n(8)
11124         .k(k)
11125         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11126     }
11127   }
11128 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_gt_16_strided_a)11129   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_gt_16_strided_a) {
11130     TEST_REQUIRES_ARM_NEON;
11131     for (size_t k = 17; k < 32; k++) {
11132       GemmMicrokernelTester()
11133         .mr(2)
11134         .nr(8)
11135         .kr(4)
11136         .sr(2)
11137         .m(2)
11138         .n(8)
11139         .k(k)
11140         .a_stride(37)
11141         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11142     }
11143   }
11144 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_gt_16_subtile)11145   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_gt_16_subtile) {
11146     TEST_REQUIRES_ARM_NEON;
11147     for (size_t k = 17; k < 32; k++) {
11148       for (uint32_t n = 1; n <= 8; n++) {
11149         for (uint32_t m = 1; m <= 2; m++) {
11150           GemmMicrokernelTester()
11151             .mr(2)
11152             .nr(8)
11153             .kr(4)
11154             .sr(2)
11155             .m(m)
11156             .n(n)
11157             .k(k)
11158             .iterations(1)
11159             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11160         }
11161       }
11162     }
11163   }
11164 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_div_16)11165   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_div_16) {
11166     TEST_REQUIRES_ARM_NEON;
11167     for (size_t k = 32; k <= 160; k += 16) {
11168       GemmMicrokernelTester()
11169         .mr(2)
11170         .nr(8)
11171         .kr(4)
11172         .sr(2)
11173         .m(2)
11174         .n(8)
11175         .k(k)
11176         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11177     }
11178   }
11179 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_div_16_strided_a)11180   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_div_16_strided_a) {
11181     TEST_REQUIRES_ARM_NEON;
11182     for (size_t k = 32; k <= 160; k += 16) {
11183       GemmMicrokernelTester()
11184         .mr(2)
11185         .nr(8)
11186         .kr(4)
11187         .sr(2)
11188         .m(2)
11189         .n(8)
11190         .k(k)
11191         .a_stride(163)
11192         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11193     }
11194   }
11195 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,k_div_16_subtile)11196   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, k_div_16_subtile) {
11197     TEST_REQUIRES_ARM_NEON;
11198     for (size_t k = 32; k <= 160; k += 16) {
11199       for (uint32_t n = 1; n <= 8; n++) {
11200         for (uint32_t m = 1; m <= 2; m++) {
11201           GemmMicrokernelTester()
11202             .mr(2)
11203             .nr(8)
11204             .kr(4)
11205             .sr(2)
11206             .m(m)
11207             .n(n)
11208             .k(k)
11209             .iterations(1)
11210             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11211         }
11212       }
11213     }
11214   }
11215 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_gt_8)11216   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_gt_8) {
11217     TEST_REQUIRES_ARM_NEON;
11218     for (uint32_t n = 9; n < 16; n++) {
11219       for (size_t k = 1; k <= 80; k += 17) {
11220         GemmMicrokernelTester()
11221           .mr(2)
11222           .nr(8)
11223           .kr(4)
11224           .sr(2)
11225           .m(2)
11226           .n(n)
11227           .k(k)
11228           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11229       }
11230     }
11231   }
11232 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_gt_8_strided_cn)11233   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_gt_8_strided_cn) {
11234     TEST_REQUIRES_ARM_NEON;
11235     for (uint32_t n = 9; n < 16; n++) {
11236       for (size_t k = 1; k <= 80; k += 17) {
11237         GemmMicrokernelTester()
11238           .mr(2)
11239           .nr(8)
11240           .kr(4)
11241           .sr(2)
11242           .m(2)
11243           .n(n)
11244           .k(k)
11245           .cn_stride(11)
11246           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11247       }
11248     }
11249   }
11250 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_gt_8_strided_a)11251   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_gt_8_strided_a) {
11252     TEST_REQUIRES_ARM_NEON;
11253     for (uint32_t n = 9; n < 16; n++) {
11254       for (size_t k = 1; k <= 80; k += 17) {
11255         GemmMicrokernelTester()
11256           .mr(2)
11257           .nr(8)
11258           .kr(4)
11259           .sr(2)
11260           .m(2)
11261           .n(n)
11262           .k(k)
11263           .a_stride(83)
11264           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11265       }
11266     }
11267   }
11268 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_gt_8_subtile)11269   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_gt_8_subtile) {
11270     TEST_REQUIRES_ARM_NEON;
11271     for (uint32_t n = 9; n < 16; n++) {
11272       for (size_t k = 1; k <= 80; k += 17) {
11273         for (uint32_t m = 1; m <= 2; m++) {
11274           GemmMicrokernelTester()
11275             .mr(2)
11276             .nr(8)
11277             .kr(4)
11278             .sr(2)
11279             .m(m)
11280             .n(n)
11281             .k(k)
11282             .iterations(1)
11283             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11284         }
11285       }
11286     }
11287   }
11288 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_div_8)11289   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_div_8) {
11290     TEST_REQUIRES_ARM_NEON;
11291     for (uint32_t n = 16; n <= 24; n += 8) {
11292       for (size_t k = 1; k <= 80; k += 17) {
11293         GemmMicrokernelTester()
11294           .mr(2)
11295           .nr(8)
11296           .kr(4)
11297           .sr(2)
11298           .m(2)
11299           .n(n)
11300           .k(k)
11301           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11302       }
11303     }
11304   }
11305 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_div_8_strided_cn)11306   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_div_8_strided_cn) {
11307     TEST_REQUIRES_ARM_NEON;
11308     for (uint32_t n = 16; n <= 24; n += 8) {
11309       for (size_t k = 1; k <= 80; k += 17) {
11310         GemmMicrokernelTester()
11311           .mr(2)
11312           .nr(8)
11313           .kr(4)
11314           .sr(2)
11315           .m(2)
11316           .n(n)
11317           .k(k)
11318           .cn_stride(11)
11319           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11320       }
11321     }
11322   }
11323 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_div_8_strided_a)11324   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_div_8_strided_a) {
11325     TEST_REQUIRES_ARM_NEON;
11326     for (uint32_t n = 16; n <= 24; n += 8) {
11327       for (size_t k = 1; k <= 80; k += 17) {
11328         GemmMicrokernelTester()
11329           .mr(2)
11330           .nr(8)
11331           .kr(4)
11332           .sr(2)
11333           .m(2)
11334           .n(n)
11335           .k(k)
11336           .a_stride(83)
11337           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11338       }
11339     }
11340   }
11341 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,n_div_8_subtile)11342   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, n_div_8_subtile) {
11343     TEST_REQUIRES_ARM_NEON;
11344     for (uint32_t n = 16; n <= 24; n += 8) {
11345       for (size_t k = 1; k <= 80; k += 17) {
11346         for (uint32_t m = 1; m <= 2; m++) {
11347           GemmMicrokernelTester()
11348             .mr(2)
11349             .nr(8)
11350             .kr(4)
11351             .sr(2)
11352             .m(m)
11353             .n(n)
11354             .k(k)
11355             .iterations(1)
11356             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11357         }
11358       }
11359     }
11360   }
11361 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,strided_cm_subtile)11362   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, strided_cm_subtile) {
11363     TEST_REQUIRES_ARM_NEON;
11364     for (size_t k = 1; k <= 80; k += 17) {
11365       for (uint32_t n = 1; n <= 8; n++) {
11366         for (uint32_t m = 1; m <= 2; m++) {
11367           GemmMicrokernelTester()
11368             .mr(2)
11369             .nr(8)
11370             .kr(4)
11371             .sr(2)
11372             .m(m)
11373             .n(n)
11374             .k(k)
11375             .cm_stride(11)
11376             .iterations(1)
11377             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11378         }
11379       }
11380     }
11381   }
11382 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,qmin)11383   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, qmin) {
11384     TEST_REQUIRES_ARM_NEON;
11385     GemmMicrokernelTester()
11386       .mr(2)
11387       .nr(8)
11388       .kr(4)
11389       .sr(2)
11390       .m(2)
11391       .n(8)
11392       .k(16)
11393       .qmin(128)
11394       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11395   }
11396 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,qmax)11397   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, qmax) {
11398     TEST_REQUIRES_ARM_NEON;
11399     GemmMicrokernelTester()
11400       .mr(2)
11401       .nr(8)
11402       .kr(4)
11403       .sr(2)
11404       .m(2)
11405       .n(8)
11406       .k(16)
11407       .qmax(128)
11408       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11409   }
11410 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL,strided_cm)11411   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEON_MLAL, strided_cm) {
11412     TEST_REQUIRES_ARM_NEON;
11413     GemmMicrokernelTester()
11414       .mr(2)
11415       .nr(8)
11416       .kr(4)
11417       .sr(2)
11418       .m(2)
11419       .n(8)
11420       .k(16)
11421       .cm_stride(11)
11422       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neon_mlal, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
11423   }
11424 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
11425 
11426 
11427 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_eq_16)11428   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_eq_16) {
11429     TEST_REQUIRES_ARM_NEON_V8;
11430     GemmMicrokernelTester()
11431       .mr(2)
11432       .nr(8)
11433       .kr(4)
11434       .sr(2)
11435       .m(2)
11436       .n(8)
11437       .k(16)
11438       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11439   }
11440 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,strided_cn)11441   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, strided_cn) {
11442     TEST_REQUIRES_ARM_NEON_V8;
11443     GemmMicrokernelTester()
11444       .mr(2)
11445       .nr(8)
11446       .kr(4)
11447       .sr(2)
11448       .m(2)
11449       .n(8)
11450       .k(16)
11451       .cn_stride(11)
11452       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11453   }
11454 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_eq_16_strided_a)11455   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_eq_16_strided_a) {
11456     TEST_REQUIRES_ARM_NEON_V8;
11457     GemmMicrokernelTester()
11458       .mr(2)
11459       .nr(8)
11460       .kr(4)
11461       .sr(2)
11462       .m(2)
11463       .n(8)
11464       .k(16)
11465       .a_stride(19)
11466       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11467   }
11468 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_eq_16_subtile)11469   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_eq_16_subtile) {
11470     TEST_REQUIRES_ARM_NEON_V8;
11471     for (uint32_t n = 1; n <= 8; n++) {
11472       for (uint32_t m = 1; m <= 2; m++) {
11473         GemmMicrokernelTester()
11474           .mr(2)
11475           .nr(8)
11476           .kr(4)
11477           .sr(2)
11478           .m(m)
11479           .n(n)
11480           .k(16)
11481           .iterations(1)
11482           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11483       }
11484     }
11485   }
11486 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_eq_16_subtile_m)11487   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_eq_16_subtile_m) {
11488     TEST_REQUIRES_ARM_NEON_V8;
11489     for (uint32_t m = 1; m <= 2; m++) {
11490       GemmMicrokernelTester()
11491         .mr(2)
11492         .nr(8)
11493         .kr(4)
11494         .sr(2)
11495         .m(m)
11496         .n(8)
11497         .k(16)
11498         .iterations(1)
11499         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11500     }
11501   }
11502 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_eq_16_subtile_n)11503   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_eq_16_subtile_n) {
11504     TEST_REQUIRES_ARM_NEON_V8;
11505     for (uint32_t n = 1; n <= 8; n++) {
11506       GemmMicrokernelTester()
11507         .mr(2)
11508         .nr(8)
11509         .kr(4)
11510         .sr(2)
11511         .m(2)
11512         .n(n)
11513         .k(16)
11514         .iterations(1)
11515         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11516     }
11517   }
11518 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_lt_16)11519   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_lt_16) {
11520     TEST_REQUIRES_ARM_NEON_V8;
11521     for (size_t k = 1; k < 16; k++) {
11522       GemmMicrokernelTester()
11523         .mr(2)
11524         .nr(8)
11525         .kr(4)
11526         .sr(2)
11527         .m(2)
11528         .n(8)
11529         .k(k)
11530         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11531     }
11532   }
11533 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_lt_16_strided_a)11534   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_lt_16_strided_a) {
11535     TEST_REQUIRES_ARM_NEON_V8;
11536     for (size_t k = 1; k < 16; k++) {
11537       GemmMicrokernelTester()
11538         .mr(2)
11539         .nr(8)
11540         .kr(4)
11541         .sr(2)
11542         .m(2)
11543         .n(8)
11544         .k(k)
11545         .a_stride(19)
11546         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11547     }
11548   }
11549 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_lt_16_subtile)11550   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_lt_16_subtile) {
11551     TEST_REQUIRES_ARM_NEON_V8;
11552     for (size_t k = 1; k < 16; k++) {
11553       for (uint32_t n = 1; n <= 8; n++) {
11554         for (uint32_t m = 1; m <= 2; m++) {
11555           GemmMicrokernelTester()
11556             .mr(2)
11557             .nr(8)
11558             .kr(4)
11559             .sr(2)
11560             .m(m)
11561             .n(n)
11562             .k(k)
11563             .iterations(1)
11564             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11565         }
11566       }
11567     }
11568   }
11569 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_gt_16)11570   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_gt_16) {
11571     TEST_REQUIRES_ARM_NEON_V8;
11572     for (size_t k = 17; k < 32; k++) {
11573       GemmMicrokernelTester()
11574         .mr(2)
11575         .nr(8)
11576         .kr(4)
11577         .sr(2)
11578         .m(2)
11579         .n(8)
11580         .k(k)
11581         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11582     }
11583   }
11584 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_gt_16_strided_a)11585   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_gt_16_strided_a) {
11586     TEST_REQUIRES_ARM_NEON_V8;
11587     for (size_t k = 17; k < 32; k++) {
11588       GemmMicrokernelTester()
11589         .mr(2)
11590         .nr(8)
11591         .kr(4)
11592         .sr(2)
11593         .m(2)
11594         .n(8)
11595         .k(k)
11596         .a_stride(37)
11597         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11598     }
11599   }
11600 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_gt_16_subtile)11601   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_gt_16_subtile) {
11602     TEST_REQUIRES_ARM_NEON_V8;
11603     for (size_t k = 17; k < 32; k++) {
11604       for (uint32_t n = 1; n <= 8; n++) {
11605         for (uint32_t m = 1; m <= 2; m++) {
11606           GemmMicrokernelTester()
11607             .mr(2)
11608             .nr(8)
11609             .kr(4)
11610             .sr(2)
11611             .m(m)
11612             .n(n)
11613             .k(k)
11614             .iterations(1)
11615             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11616         }
11617       }
11618     }
11619   }
11620 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_div_16)11621   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_div_16) {
11622     TEST_REQUIRES_ARM_NEON_V8;
11623     for (size_t k = 32; k <= 160; k += 16) {
11624       GemmMicrokernelTester()
11625         .mr(2)
11626         .nr(8)
11627         .kr(4)
11628         .sr(2)
11629         .m(2)
11630         .n(8)
11631         .k(k)
11632         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11633     }
11634   }
11635 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_div_16_strided_a)11636   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_div_16_strided_a) {
11637     TEST_REQUIRES_ARM_NEON_V8;
11638     for (size_t k = 32; k <= 160; k += 16) {
11639       GemmMicrokernelTester()
11640         .mr(2)
11641         .nr(8)
11642         .kr(4)
11643         .sr(2)
11644         .m(2)
11645         .n(8)
11646         .k(k)
11647         .a_stride(163)
11648         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11649     }
11650   }
11651 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,k_div_16_subtile)11652   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, k_div_16_subtile) {
11653     TEST_REQUIRES_ARM_NEON_V8;
11654     for (size_t k = 32; k <= 160; k += 16) {
11655       for (uint32_t n = 1; n <= 8; n++) {
11656         for (uint32_t m = 1; m <= 2; m++) {
11657           GemmMicrokernelTester()
11658             .mr(2)
11659             .nr(8)
11660             .kr(4)
11661             .sr(2)
11662             .m(m)
11663             .n(n)
11664             .k(k)
11665             .iterations(1)
11666             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11667         }
11668       }
11669     }
11670   }
11671 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_gt_8)11672   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_gt_8) {
11673     TEST_REQUIRES_ARM_NEON_V8;
11674     for (uint32_t n = 9; n < 16; n++) {
11675       for (size_t k = 1; k <= 80; k += 17) {
11676         GemmMicrokernelTester()
11677           .mr(2)
11678           .nr(8)
11679           .kr(4)
11680           .sr(2)
11681           .m(2)
11682           .n(n)
11683           .k(k)
11684           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11685       }
11686     }
11687   }
11688 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_gt_8_strided_cn)11689   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_gt_8_strided_cn) {
11690     TEST_REQUIRES_ARM_NEON_V8;
11691     for (uint32_t n = 9; n < 16; n++) {
11692       for (size_t k = 1; k <= 80; k += 17) {
11693         GemmMicrokernelTester()
11694           .mr(2)
11695           .nr(8)
11696           .kr(4)
11697           .sr(2)
11698           .m(2)
11699           .n(n)
11700           .k(k)
11701           .cn_stride(11)
11702           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11703       }
11704     }
11705   }
11706 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_gt_8_strided_a)11707   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_gt_8_strided_a) {
11708     TEST_REQUIRES_ARM_NEON_V8;
11709     for (uint32_t n = 9; n < 16; n++) {
11710       for (size_t k = 1; k <= 80; k += 17) {
11711         GemmMicrokernelTester()
11712           .mr(2)
11713           .nr(8)
11714           .kr(4)
11715           .sr(2)
11716           .m(2)
11717           .n(n)
11718           .k(k)
11719           .a_stride(83)
11720           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11721       }
11722     }
11723   }
11724 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_gt_8_subtile)11725   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_gt_8_subtile) {
11726     TEST_REQUIRES_ARM_NEON_V8;
11727     for (uint32_t n = 9; n < 16; n++) {
11728       for (size_t k = 1; k <= 80; k += 17) {
11729         for (uint32_t m = 1; m <= 2; m++) {
11730           GemmMicrokernelTester()
11731             .mr(2)
11732             .nr(8)
11733             .kr(4)
11734             .sr(2)
11735             .m(m)
11736             .n(n)
11737             .k(k)
11738             .iterations(1)
11739             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11740         }
11741       }
11742     }
11743   }
11744 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_div_8)11745   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_div_8) {
11746     TEST_REQUIRES_ARM_NEON_V8;
11747     for (uint32_t n = 16; n <= 24; n += 8) {
11748       for (size_t k = 1; k <= 80; k += 17) {
11749         GemmMicrokernelTester()
11750           .mr(2)
11751           .nr(8)
11752           .kr(4)
11753           .sr(2)
11754           .m(2)
11755           .n(n)
11756           .k(k)
11757           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11758       }
11759     }
11760   }
11761 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_div_8_strided_cn)11762   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_div_8_strided_cn) {
11763     TEST_REQUIRES_ARM_NEON_V8;
11764     for (uint32_t n = 16; n <= 24; n += 8) {
11765       for (size_t k = 1; k <= 80; k += 17) {
11766         GemmMicrokernelTester()
11767           .mr(2)
11768           .nr(8)
11769           .kr(4)
11770           .sr(2)
11771           .m(2)
11772           .n(n)
11773           .k(k)
11774           .cn_stride(11)
11775           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11776       }
11777     }
11778   }
11779 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_div_8_strided_a)11780   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_div_8_strided_a) {
11781     TEST_REQUIRES_ARM_NEON_V8;
11782     for (uint32_t n = 16; n <= 24; n += 8) {
11783       for (size_t k = 1; k <= 80; k += 17) {
11784         GemmMicrokernelTester()
11785           .mr(2)
11786           .nr(8)
11787           .kr(4)
11788           .sr(2)
11789           .m(2)
11790           .n(n)
11791           .k(k)
11792           .a_stride(83)
11793           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11794       }
11795     }
11796   }
11797 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,n_div_8_subtile)11798   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, n_div_8_subtile) {
11799     TEST_REQUIRES_ARM_NEON_V8;
11800     for (uint32_t n = 16; n <= 24; n += 8) {
11801       for (size_t k = 1; k <= 80; k += 17) {
11802         for (uint32_t m = 1; m <= 2; m++) {
11803           GemmMicrokernelTester()
11804             .mr(2)
11805             .nr(8)
11806             .kr(4)
11807             .sr(2)
11808             .m(m)
11809             .n(n)
11810             .k(k)
11811             .iterations(1)
11812             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11813         }
11814       }
11815     }
11816   }
11817 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,strided_cm_subtile)11818   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, strided_cm_subtile) {
11819     TEST_REQUIRES_ARM_NEON_V8;
11820     for (size_t k = 1; k <= 80; k += 17) {
11821       for (uint32_t n = 1; n <= 8; n++) {
11822         for (uint32_t m = 1; m <= 2; m++) {
11823           GemmMicrokernelTester()
11824             .mr(2)
11825             .nr(8)
11826             .kr(4)
11827             .sr(2)
11828             .m(m)
11829             .n(n)
11830             .k(k)
11831             .cm_stride(11)
11832             .iterations(1)
11833             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11834         }
11835       }
11836     }
11837   }
11838 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,qmin)11839   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, qmin) {
11840     TEST_REQUIRES_ARM_NEON_V8;
11841     GemmMicrokernelTester()
11842       .mr(2)
11843       .nr(8)
11844       .kr(4)
11845       .sr(2)
11846       .m(2)
11847       .n(8)
11848       .k(16)
11849       .qmin(128)
11850       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11851   }
11852 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,qmax)11853   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, qmax) {
11854     TEST_REQUIRES_ARM_NEON_V8;
11855     GemmMicrokernelTester()
11856       .mr(2)
11857       .nr(8)
11858       .kr(4)
11859       .sr(2)
11860       .m(2)
11861       .n(8)
11862       .k(16)
11863       .qmax(128)
11864       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11865   }
11866 
TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL,strided_cm)11867   TEST(QS8_GEMM_MINMAX_FP32_2X8C4S2__NEONV8_MLAL, strided_cm) {
11868     TEST_REQUIRES_ARM_NEON_V8;
11869     GemmMicrokernelTester()
11870       .mr(2)
11871       .nr(8)
11872       .kr(4)
11873       .sr(2)
11874       .m(2)
11875       .n(8)
11876       .k(16)
11877       .cm_stride(11)
11878       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c4s2__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11879   }
11880 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
11881 
11882 
11883 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_eq_16)11884   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_eq_16) {
11885     TEST_REQUIRES_ARM_NEON;
11886     GemmMicrokernelTester()
11887       .mr(1)
11888       .nr(8)
11889       .kr(8)
11890       .sr(1)
11891       .m(1)
11892       .n(8)
11893       .k(16)
11894       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11895   }
11896 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,strided_cn)11897   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, strided_cn) {
11898     TEST_REQUIRES_ARM_NEON;
11899     GemmMicrokernelTester()
11900       .mr(1)
11901       .nr(8)
11902       .kr(8)
11903       .sr(1)
11904       .m(1)
11905       .n(8)
11906       .k(16)
11907       .cn_stride(11)
11908       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11909   }
11910 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_eq_16_strided_a)11911   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_eq_16_strided_a) {
11912     TEST_REQUIRES_ARM_NEON;
11913     GemmMicrokernelTester()
11914       .mr(1)
11915       .nr(8)
11916       .kr(8)
11917       .sr(1)
11918       .m(1)
11919       .n(8)
11920       .k(16)
11921       .a_stride(19)
11922       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11923   }
11924 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile)11925   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile) {
11926     TEST_REQUIRES_ARM_NEON;
11927     for (uint32_t n = 1; n <= 8; n++) {
11928       for (uint32_t m = 1; m <= 1; m++) {
11929         GemmMicrokernelTester()
11930           .mr(1)
11931           .nr(8)
11932           .kr(8)
11933           .sr(1)
11934           .m(m)
11935           .n(n)
11936           .k(16)
11937           .iterations(1)
11938           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11939       }
11940     }
11941   }
11942 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile_m)11943   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile_m) {
11944     TEST_REQUIRES_ARM_NEON;
11945     for (uint32_t m = 1; m <= 1; m++) {
11946       GemmMicrokernelTester()
11947         .mr(1)
11948         .nr(8)
11949         .kr(8)
11950         .sr(1)
11951         .m(m)
11952         .n(8)
11953         .k(16)
11954         .iterations(1)
11955         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11956     }
11957   }
11958 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile_n)11959   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile_n) {
11960     TEST_REQUIRES_ARM_NEON;
11961     for (uint32_t n = 1; n <= 8; n++) {
11962       GemmMicrokernelTester()
11963         .mr(1)
11964         .nr(8)
11965         .kr(8)
11966         .sr(1)
11967         .m(1)
11968         .n(n)
11969         .k(16)
11970         .iterations(1)
11971         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11972     }
11973   }
11974 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_lt_16)11975   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_lt_16) {
11976     TEST_REQUIRES_ARM_NEON;
11977     for (size_t k = 1; k < 16; k++) {
11978       GemmMicrokernelTester()
11979         .mr(1)
11980         .nr(8)
11981         .kr(8)
11982         .sr(1)
11983         .m(1)
11984         .n(8)
11985         .k(k)
11986         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
11987     }
11988   }
11989 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_lt_16_strided_a)11990   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_lt_16_strided_a) {
11991     TEST_REQUIRES_ARM_NEON;
11992     for (size_t k = 1; k < 16; k++) {
11993       GemmMicrokernelTester()
11994         .mr(1)
11995         .nr(8)
11996         .kr(8)
11997         .sr(1)
11998         .m(1)
11999         .n(8)
12000         .k(k)
12001         .a_stride(19)
12002         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12003     }
12004   }
12005 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_lt_16_subtile)12006   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_lt_16_subtile) {
12007     TEST_REQUIRES_ARM_NEON;
12008     for (size_t k = 1; k < 16; k++) {
12009       for (uint32_t n = 1; n <= 8; n++) {
12010         for (uint32_t m = 1; m <= 1; m++) {
12011           GemmMicrokernelTester()
12012             .mr(1)
12013             .nr(8)
12014             .kr(8)
12015             .sr(1)
12016             .m(m)
12017             .n(n)
12018             .k(k)
12019             .iterations(1)
12020             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12021         }
12022       }
12023     }
12024   }
12025 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_gt_16)12026   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_gt_16) {
12027     TEST_REQUIRES_ARM_NEON;
12028     for (size_t k = 17; k < 32; k++) {
12029       GemmMicrokernelTester()
12030         .mr(1)
12031         .nr(8)
12032         .kr(8)
12033         .sr(1)
12034         .m(1)
12035         .n(8)
12036         .k(k)
12037         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12038     }
12039   }
12040 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_gt_16_strided_a)12041   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_gt_16_strided_a) {
12042     TEST_REQUIRES_ARM_NEON;
12043     for (size_t k = 17; k < 32; k++) {
12044       GemmMicrokernelTester()
12045         .mr(1)
12046         .nr(8)
12047         .kr(8)
12048         .sr(1)
12049         .m(1)
12050         .n(8)
12051         .k(k)
12052         .a_stride(37)
12053         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12054     }
12055   }
12056 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_gt_16_subtile)12057   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_gt_16_subtile) {
12058     TEST_REQUIRES_ARM_NEON;
12059     for (size_t k = 17; k < 32; k++) {
12060       for (uint32_t n = 1; n <= 8; n++) {
12061         for (uint32_t m = 1; m <= 1; m++) {
12062           GemmMicrokernelTester()
12063             .mr(1)
12064             .nr(8)
12065             .kr(8)
12066             .sr(1)
12067             .m(m)
12068             .n(n)
12069             .k(k)
12070             .iterations(1)
12071             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12072         }
12073       }
12074     }
12075   }
12076 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_div_16)12077   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_div_16) {
12078     TEST_REQUIRES_ARM_NEON;
12079     for (size_t k = 32; k <= 160; k += 16) {
12080       GemmMicrokernelTester()
12081         .mr(1)
12082         .nr(8)
12083         .kr(8)
12084         .sr(1)
12085         .m(1)
12086         .n(8)
12087         .k(k)
12088         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12089     }
12090   }
12091 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_div_16_strided_a)12092   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_div_16_strided_a) {
12093     TEST_REQUIRES_ARM_NEON;
12094     for (size_t k = 32; k <= 160; k += 16) {
12095       GemmMicrokernelTester()
12096         .mr(1)
12097         .nr(8)
12098         .kr(8)
12099         .sr(1)
12100         .m(1)
12101         .n(8)
12102         .k(k)
12103         .a_stride(163)
12104         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12105     }
12106   }
12107 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,k_div_16_subtile)12108   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, k_div_16_subtile) {
12109     TEST_REQUIRES_ARM_NEON;
12110     for (size_t k = 32; k <= 160; k += 16) {
12111       for (uint32_t n = 1; n <= 8; n++) {
12112         for (uint32_t m = 1; m <= 1; m++) {
12113           GemmMicrokernelTester()
12114             .mr(1)
12115             .nr(8)
12116             .kr(8)
12117             .sr(1)
12118             .m(m)
12119             .n(n)
12120             .k(k)
12121             .iterations(1)
12122             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12123         }
12124       }
12125     }
12126   }
12127 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_gt_8)12128   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_gt_8) {
12129     TEST_REQUIRES_ARM_NEON;
12130     for (uint32_t n = 9; n < 16; n++) {
12131       for (size_t k = 1; k <= 80; k += 17) {
12132         GemmMicrokernelTester()
12133           .mr(1)
12134           .nr(8)
12135           .kr(8)
12136           .sr(1)
12137           .m(1)
12138           .n(n)
12139           .k(k)
12140           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12141       }
12142     }
12143   }
12144 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_gt_8_strided_cn)12145   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_gt_8_strided_cn) {
12146     TEST_REQUIRES_ARM_NEON;
12147     for (uint32_t n = 9; n < 16; n++) {
12148       for (size_t k = 1; k <= 80; k += 17) {
12149         GemmMicrokernelTester()
12150           .mr(1)
12151           .nr(8)
12152           .kr(8)
12153           .sr(1)
12154           .m(1)
12155           .n(n)
12156           .k(k)
12157           .cn_stride(11)
12158           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12159       }
12160     }
12161   }
12162 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_gt_8_strided_a)12163   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_gt_8_strided_a) {
12164     TEST_REQUIRES_ARM_NEON;
12165     for (uint32_t n = 9; n < 16; n++) {
12166       for (size_t k = 1; k <= 80; k += 17) {
12167         GemmMicrokernelTester()
12168           .mr(1)
12169           .nr(8)
12170           .kr(8)
12171           .sr(1)
12172           .m(1)
12173           .n(n)
12174           .k(k)
12175           .a_stride(83)
12176           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12177       }
12178     }
12179   }
12180 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_gt_8_subtile)12181   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_gt_8_subtile) {
12182     TEST_REQUIRES_ARM_NEON;
12183     for (uint32_t n = 9; n < 16; n++) {
12184       for (size_t k = 1; k <= 80; k += 17) {
12185         for (uint32_t m = 1; m <= 1; m++) {
12186           GemmMicrokernelTester()
12187             .mr(1)
12188             .nr(8)
12189             .kr(8)
12190             .sr(1)
12191             .m(m)
12192             .n(n)
12193             .k(k)
12194             .iterations(1)
12195             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12196         }
12197       }
12198     }
12199   }
12200 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_div_8)12201   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_div_8) {
12202     TEST_REQUIRES_ARM_NEON;
12203     for (uint32_t n = 16; n <= 24; n += 8) {
12204       for (size_t k = 1; k <= 80; k += 17) {
12205         GemmMicrokernelTester()
12206           .mr(1)
12207           .nr(8)
12208           .kr(8)
12209           .sr(1)
12210           .m(1)
12211           .n(n)
12212           .k(k)
12213           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12214       }
12215     }
12216   }
12217 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_div_8_strided_cn)12218   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_div_8_strided_cn) {
12219     TEST_REQUIRES_ARM_NEON;
12220     for (uint32_t n = 16; n <= 24; n += 8) {
12221       for (size_t k = 1; k <= 80; k += 17) {
12222         GemmMicrokernelTester()
12223           .mr(1)
12224           .nr(8)
12225           .kr(8)
12226           .sr(1)
12227           .m(1)
12228           .n(n)
12229           .k(k)
12230           .cn_stride(11)
12231           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12232       }
12233     }
12234   }
12235 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_div_8_strided_a)12236   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_div_8_strided_a) {
12237     TEST_REQUIRES_ARM_NEON;
12238     for (uint32_t n = 16; n <= 24; n += 8) {
12239       for (size_t k = 1; k <= 80; k += 17) {
12240         GemmMicrokernelTester()
12241           .mr(1)
12242           .nr(8)
12243           .kr(8)
12244           .sr(1)
12245           .m(1)
12246           .n(n)
12247           .k(k)
12248           .a_stride(83)
12249           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12250       }
12251     }
12252   }
12253 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,n_div_8_subtile)12254   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, n_div_8_subtile) {
12255     TEST_REQUIRES_ARM_NEON;
12256     for (uint32_t n = 16; n <= 24; n += 8) {
12257       for (size_t k = 1; k <= 80; k += 17) {
12258         for (uint32_t m = 1; m <= 1; m++) {
12259           GemmMicrokernelTester()
12260             .mr(1)
12261             .nr(8)
12262             .kr(8)
12263             .sr(1)
12264             .m(m)
12265             .n(n)
12266             .k(k)
12267             .iterations(1)
12268             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12269         }
12270       }
12271     }
12272   }
12273 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,strided_cm_subtile)12274   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, strided_cm_subtile) {
12275     TEST_REQUIRES_ARM_NEON;
12276     for (size_t k = 1; k <= 80; k += 17) {
12277       for (uint32_t n = 1; n <= 8; n++) {
12278         for (uint32_t m = 1; m <= 1; m++) {
12279           GemmMicrokernelTester()
12280             .mr(1)
12281             .nr(8)
12282             .kr(8)
12283             .sr(1)
12284             .m(m)
12285             .n(n)
12286             .k(k)
12287             .cm_stride(11)
12288             .iterations(1)
12289             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12290         }
12291       }
12292     }
12293   }
12294 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,qmin)12295   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, qmin) {
12296     TEST_REQUIRES_ARM_NEON;
12297     GemmMicrokernelTester()
12298       .mr(1)
12299       .nr(8)
12300       .kr(8)
12301       .sr(1)
12302       .m(1)
12303       .n(8)
12304       .k(16)
12305       .qmin(128)
12306       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12307   }
12308 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,qmax)12309   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, qmax) {
12310     TEST_REQUIRES_ARM_NEON;
12311     GemmMicrokernelTester()
12312       .mr(1)
12313       .nr(8)
12314       .kr(8)
12315       .sr(1)
12316       .m(1)
12317       .n(8)
12318       .k(16)
12319       .qmax(128)
12320       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12321   }
12322 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL,strided_cm)12323   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL, strided_cm) {
12324     TEST_REQUIRES_ARM_NEON;
12325     GemmMicrokernelTester()
12326       .mr(1)
12327       .nr(8)
12328       .kr(8)
12329       .sr(1)
12330       .m(1)
12331       .n(8)
12332       .k(16)
12333       .cm_stride(11)
12334       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12335   }
12336 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
12337 
12338 
12339 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_eq_16)12340   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_eq_16) {
12341     TEST_REQUIRES_ARM_NEON;
12342     GemmMicrokernelTester()
12343       .mr(1)
12344       .nr(8)
12345       .kr(8)
12346       .sr(1)
12347       .m(1)
12348       .n(8)
12349       .k(16)
12350       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12351   }
12352 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,strided_cn)12353   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, strided_cn) {
12354     TEST_REQUIRES_ARM_NEON;
12355     GemmMicrokernelTester()
12356       .mr(1)
12357       .nr(8)
12358       .kr(8)
12359       .sr(1)
12360       .m(1)
12361       .n(8)
12362       .k(16)
12363       .cn_stride(11)
12364       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12365   }
12366 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_eq_16_strided_a)12367   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_eq_16_strided_a) {
12368     TEST_REQUIRES_ARM_NEON;
12369     GemmMicrokernelTester()
12370       .mr(1)
12371       .nr(8)
12372       .kr(8)
12373       .sr(1)
12374       .m(1)
12375       .n(8)
12376       .k(16)
12377       .a_stride(19)
12378       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12379   }
12380 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_eq_16_subtile)12381   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_eq_16_subtile) {
12382     TEST_REQUIRES_ARM_NEON;
12383     for (uint32_t n = 1; n <= 8; n++) {
12384       for (uint32_t m = 1; m <= 1; m++) {
12385         GemmMicrokernelTester()
12386           .mr(1)
12387           .nr(8)
12388           .kr(8)
12389           .sr(1)
12390           .m(m)
12391           .n(n)
12392           .k(16)
12393           .iterations(1)
12394           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12395       }
12396     }
12397   }
12398 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_eq_16_subtile_m)12399   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_eq_16_subtile_m) {
12400     TEST_REQUIRES_ARM_NEON;
12401     for (uint32_t m = 1; m <= 1; m++) {
12402       GemmMicrokernelTester()
12403         .mr(1)
12404         .nr(8)
12405         .kr(8)
12406         .sr(1)
12407         .m(m)
12408         .n(8)
12409         .k(16)
12410         .iterations(1)
12411         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12412     }
12413   }
12414 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_eq_16_subtile_n)12415   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_eq_16_subtile_n) {
12416     TEST_REQUIRES_ARM_NEON;
12417     for (uint32_t n = 1; n <= 8; n++) {
12418       GemmMicrokernelTester()
12419         .mr(1)
12420         .nr(8)
12421         .kr(8)
12422         .sr(1)
12423         .m(1)
12424         .n(n)
12425         .k(16)
12426         .iterations(1)
12427         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12428     }
12429   }
12430 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_lt_16)12431   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_lt_16) {
12432     TEST_REQUIRES_ARM_NEON;
12433     for (size_t k = 1; k < 16; k++) {
12434       GemmMicrokernelTester()
12435         .mr(1)
12436         .nr(8)
12437         .kr(8)
12438         .sr(1)
12439         .m(1)
12440         .n(8)
12441         .k(k)
12442         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12443     }
12444   }
12445 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_lt_16_strided_a)12446   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_lt_16_strided_a) {
12447     TEST_REQUIRES_ARM_NEON;
12448     for (size_t k = 1; k < 16; k++) {
12449       GemmMicrokernelTester()
12450         .mr(1)
12451         .nr(8)
12452         .kr(8)
12453         .sr(1)
12454         .m(1)
12455         .n(8)
12456         .k(k)
12457         .a_stride(19)
12458         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12459     }
12460   }
12461 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_lt_16_subtile)12462   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_lt_16_subtile) {
12463     TEST_REQUIRES_ARM_NEON;
12464     for (size_t k = 1; k < 16; k++) {
12465       for (uint32_t n = 1; n <= 8; n++) {
12466         for (uint32_t m = 1; m <= 1; m++) {
12467           GemmMicrokernelTester()
12468             .mr(1)
12469             .nr(8)
12470             .kr(8)
12471             .sr(1)
12472             .m(m)
12473             .n(n)
12474             .k(k)
12475             .iterations(1)
12476             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12477         }
12478       }
12479     }
12480   }
12481 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_gt_16)12482   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_gt_16) {
12483     TEST_REQUIRES_ARM_NEON;
12484     for (size_t k = 17; k < 32; k++) {
12485       GemmMicrokernelTester()
12486         .mr(1)
12487         .nr(8)
12488         .kr(8)
12489         .sr(1)
12490         .m(1)
12491         .n(8)
12492         .k(k)
12493         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12494     }
12495   }
12496 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_gt_16_strided_a)12497   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_gt_16_strided_a) {
12498     TEST_REQUIRES_ARM_NEON;
12499     for (size_t k = 17; k < 32; k++) {
12500       GemmMicrokernelTester()
12501         .mr(1)
12502         .nr(8)
12503         .kr(8)
12504         .sr(1)
12505         .m(1)
12506         .n(8)
12507         .k(k)
12508         .a_stride(37)
12509         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12510     }
12511   }
12512 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_gt_16_subtile)12513   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_gt_16_subtile) {
12514     TEST_REQUIRES_ARM_NEON;
12515     for (size_t k = 17; k < 32; k++) {
12516       for (uint32_t n = 1; n <= 8; n++) {
12517         for (uint32_t m = 1; m <= 1; m++) {
12518           GemmMicrokernelTester()
12519             .mr(1)
12520             .nr(8)
12521             .kr(8)
12522             .sr(1)
12523             .m(m)
12524             .n(n)
12525             .k(k)
12526             .iterations(1)
12527             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12528         }
12529       }
12530     }
12531   }
12532 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_div_16)12533   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_div_16) {
12534     TEST_REQUIRES_ARM_NEON;
12535     for (size_t k = 32; k <= 160; k += 16) {
12536       GemmMicrokernelTester()
12537         .mr(1)
12538         .nr(8)
12539         .kr(8)
12540         .sr(1)
12541         .m(1)
12542         .n(8)
12543         .k(k)
12544         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12545     }
12546   }
12547 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_div_16_strided_a)12548   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_div_16_strided_a) {
12549     TEST_REQUIRES_ARM_NEON;
12550     for (size_t k = 32; k <= 160; k += 16) {
12551       GemmMicrokernelTester()
12552         .mr(1)
12553         .nr(8)
12554         .kr(8)
12555         .sr(1)
12556         .m(1)
12557         .n(8)
12558         .k(k)
12559         .a_stride(163)
12560         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12561     }
12562   }
12563 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,k_div_16_subtile)12564   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, k_div_16_subtile) {
12565     TEST_REQUIRES_ARM_NEON;
12566     for (size_t k = 32; k <= 160; k += 16) {
12567       for (uint32_t n = 1; n <= 8; n++) {
12568         for (uint32_t m = 1; m <= 1; m++) {
12569           GemmMicrokernelTester()
12570             .mr(1)
12571             .nr(8)
12572             .kr(8)
12573             .sr(1)
12574             .m(m)
12575             .n(n)
12576             .k(k)
12577             .iterations(1)
12578             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12579         }
12580       }
12581     }
12582   }
12583 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_gt_8)12584   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_gt_8) {
12585     TEST_REQUIRES_ARM_NEON;
12586     for (uint32_t n = 9; n < 16; n++) {
12587       for (size_t k = 1; k <= 80; k += 17) {
12588         GemmMicrokernelTester()
12589           .mr(1)
12590           .nr(8)
12591           .kr(8)
12592           .sr(1)
12593           .m(1)
12594           .n(n)
12595           .k(k)
12596           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12597       }
12598     }
12599   }
12600 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_gt_8_strided_cn)12601   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_gt_8_strided_cn) {
12602     TEST_REQUIRES_ARM_NEON;
12603     for (uint32_t n = 9; n < 16; n++) {
12604       for (size_t k = 1; k <= 80; k += 17) {
12605         GemmMicrokernelTester()
12606           .mr(1)
12607           .nr(8)
12608           .kr(8)
12609           .sr(1)
12610           .m(1)
12611           .n(n)
12612           .k(k)
12613           .cn_stride(11)
12614           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12615       }
12616     }
12617   }
12618 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_gt_8_strided_a)12619   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_gt_8_strided_a) {
12620     TEST_REQUIRES_ARM_NEON;
12621     for (uint32_t n = 9; n < 16; n++) {
12622       for (size_t k = 1; k <= 80; k += 17) {
12623         GemmMicrokernelTester()
12624           .mr(1)
12625           .nr(8)
12626           .kr(8)
12627           .sr(1)
12628           .m(1)
12629           .n(n)
12630           .k(k)
12631           .a_stride(83)
12632           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12633       }
12634     }
12635   }
12636 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_gt_8_subtile)12637   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_gt_8_subtile) {
12638     TEST_REQUIRES_ARM_NEON;
12639     for (uint32_t n = 9; n < 16; n++) {
12640       for (size_t k = 1; k <= 80; k += 17) {
12641         for (uint32_t m = 1; m <= 1; m++) {
12642           GemmMicrokernelTester()
12643             .mr(1)
12644             .nr(8)
12645             .kr(8)
12646             .sr(1)
12647             .m(m)
12648             .n(n)
12649             .k(k)
12650             .iterations(1)
12651             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12652         }
12653       }
12654     }
12655   }
12656 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_div_8)12657   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_div_8) {
12658     TEST_REQUIRES_ARM_NEON;
12659     for (uint32_t n = 16; n <= 24; n += 8) {
12660       for (size_t k = 1; k <= 80; k += 17) {
12661         GemmMicrokernelTester()
12662           .mr(1)
12663           .nr(8)
12664           .kr(8)
12665           .sr(1)
12666           .m(1)
12667           .n(n)
12668           .k(k)
12669           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12670       }
12671     }
12672   }
12673 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_div_8_strided_cn)12674   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_div_8_strided_cn) {
12675     TEST_REQUIRES_ARM_NEON;
12676     for (uint32_t n = 16; n <= 24; n += 8) {
12677       for (size_t k = 1; k <= 80; k += 17) {
12678         GemmMicrokernelTester()
12679           .mr(1)
12680           .nr(8)
12681           .kr(8)
12682           .sr(1)
12683           .m(1)
12684           .n(n)
12685           .k(k)
12686           .cn_stride(11)
12687           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12688       }
12689     }
12690   }
12691 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_div_8_strided_a)12692   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_div_8_strided_a) {
12693     TEST_REQUIRES_ARM_NEON;
12694     for (uint32_t n = 16; n <= 24; n += 8) {
12695       for (size_t k = 1; k <= 80; k += 17) {
12696         GemmMicrokernelTester()
12697           .mr(1)
12698           .nr(8)
12699           .kr(8)
12700           .sr(1)
12701           .m(1)
12702           .n(n)
12703           .k(k)
12704           .a_stride(83)
12705           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12706       }
12707     }
12708   }
12709 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,n_div_8_subtile)12710   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, n_div_8_subtile) {
12711     TEST_REQUIRES_ARM_NEON;
12712     for (uint32_t n = 16; n <= 24; n += 8) {
12713       for (size_t k = 1; k <= 80; k += 17) {
12714         for (uint32_t m = 1; m <= 1; m++) {
12715           GemmMicrokernelTester()
12716             .mr(1)
12717             .nr(8)
12718             .kr(8)
12719             .sr(1)
12720             .m(m)
12721             .n(n)
12722             .k(k)
12723             .iterations(1)
12724             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12725         }
12726       }
12727     }
12728   }
12729 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,strided_cm_subtile)12730   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, strided_cm_subtile) {
12731     TEST_REQUIRES_ARM_NEON;
12732     for (size_t k = 1; k <= 80; k += 17) {
12733       for (uint32_t n = 1; n <= 8; n++) {
12734         for (uint32_t m = 1; m <= 1; m++) {
12735           GemmMicrokernelTester()
12736             .mr(1)
12737             .nr(8)
12738             .kr(8)
12739             .sr(1)
12740             .m(m)
12741             .n(n)
12742             .k(k)
12743             .cm_stride(11)
12744             .iterations(1)
12745             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12746         }
12747       }
12748     }
12749   }
12750 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,qmin)12751   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, qmin) {
12752     TEST_REQUIRES_ARM_NEON;
12753     GemmMicrokernelTester()
12754       .mr(1)
12755       .nr(8)
12756       .kr(8)
12757       .sr(1)
12758       .m(1)
12759       .n(8)
12760       .k(16)
12761       .qmin(128)
12762       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12763   }
12764 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,qmax)12765   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, qmax) {
12766     TEST_REQUIRES_ARM_NEON;
12767     GemmMicrokernelTester()
12768       .mr(1)
12769       .nr(8)
12770       .kr(8)
12771       .sr(1)
12772       .m(1)
12773       .n(8)
12774       .k(16)
12775       .qmax(128)
12776       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12777   }
12778 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53,strided_cm)12779   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_CORTEX_A53, strided_cm) {
12780     TEST_REQUIRES_ARM_NEON;
12781     GemmMicrokernelTester()
12782       .mr(1)
12783       .nr(8)
12784       .kr(8)
12785       .sr(1)
12786       .m(1)
12787       .n(8)
12788       .k(16)
12789       .cm_stride(11)
12790       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12791   }
12792 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
12793 
12794 
12795 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16)12796   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16) {
12797     TEST_REQUIRES_ARM_NEON;
12798     GemmMicrokernelTester()
12799       .mr(1)
12800       .nr(8)
12801       .kr(8)
12802       .sr(1)
12803       .m(1)
12804       .n(8)
12805       .k(16)
12806       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12807   }
12808 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,strided_cn)12809   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, strided_cn) {
12810     TEST_REQUIRES_ARM_NEON;
12811     GemmMicrokernelTester()
12812       .mr(1)
12813       .nr(8)
12814       .kr(8)
12815       .sr(1)
12816       .m(1)
12817       .n(8)
12818       .k(16)
12819       .cn_stride(11)
12820       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12821   }
12822 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_strided_a)12823   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_strided_a) {
12824     TEST_REQUIRES_ARM_NEON;
12825     GemmMicrokernelTester()
12826       .mr(1)
12827       .nr(8)
12828       .kr(8)
12829       .sr(1)
12830       .m(1)
12831       .n(8)
12832       .k(16)
12833       .a_stride(19)
12834       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12835   }
12836 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile)12837   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile) {
12838     TEST_REQUIRES_ARM_NEON;
12839     for (uint32_t n = 1; n <= 8; n++) {
12840       for (uint32_t m = 1; m <= 1; m++) {
12841         GemmMicrokernelTester()
12842           .mr(1)
12843           .nr(8)
12844           .kr(8)
12845           .sr(1)
12846           .m(m)
12847           .n(n)
12848           .k(16)
12849           .iterations(1)
12850           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12851       }
12852     }
12853   }
12854 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile_m)12855   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile_m) {
12856     TEST_REQUIRES_ARM_NEON;
12857     for (uint32_t m = 1; m <= 1; m++) {
12858       GemmMicrokernelTester()
12859         .mr(1)
12860         .nr(8)
12861         .kr(8)
12862         .sr(1)
12863         .m(m)
12864         .n(8)
12865         .k(16)
12866         .iterations(1)
12867         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12868     }
12869   }
12870 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile_n)12871   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile_n) {
12872     TEST_REQUIRES_ARM_NEON;
12873     for (uint32_t n = 1; n <= 8; n++) {
12874       GemmMicrokernelTester()
12875         .mr(1)
12876         .nr(8)
12877         .kr(8)
12878         .sr(1)
12879         .m(1)
12880         .n(n)
12881         .k(16)
12882         .iterations(1)
12883         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12884     }
12885   }
12886 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16)12887   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16) {
12888     TEST_REQUIRES_ARM_NEON;
12889     for (size_t k = 1; k < 16; k++) {
12890       GemmMicrokernelTester()
12891         .mr(1)
12892         .nr(8)
12893         .kr(8)
12894         .sr(1)
12895         .m(1)
12896         .n(8)
12897         .k(k)
12898         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12899     }
12900   }
12901 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16_strided_a)12902   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16_strided_a) {
12903     TEST_REQUIRES_ARM_NEON;
12904     for (size_t k = 1; k < 16; k++) {
12905       GemmMicrokernelTester()
12906         .mr(1)
12907         .nr(8)
12908         .kr(8)
12909         .sr(1)
12910         .m(1)
12911         .n(8)
12912         .k(k)
12913         .a_stride(19)
12914         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12915     }
12916   }
12917 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16_subtile)12918   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16_subtile) {
12919     TEST_REQUIRES_ARM_NEON;
12920     for (size_t k = 1; k < 16; k++) {
12921       for (uint32_t n = 1; n <= 8; n++) {
12922         for (uint32_t m = 1; m <= 1; m++) {
12923           GemmMicrokernelTester()
12924             .mr(1)
12925             .nr(8)
12926             .kr(8)
12927             .sr(1)
12928             .m(m)
12929             .n(n)
12930             .k(k)
12931             .iterations(1)
12932             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12933         }
12934       }
12935     }
12936   }
12937 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16)12938   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16) {
12939     TEST_REQUIRES_ARM_NEON;
12940     for (size_t k = 17; k < 32; k++) {
12941       GemmMicrokernelTester()
12942         .mr(1)
12943         .nr(8)
12944         .kr(8)
12945         .sr(1)
12946         .m(1)
12947         .n(8)
12948         .k(k)
12949         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12950     }
12951   }
12952 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16_strided_a)12953   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16_strided_a) {
12954     TEST_REQUIRES_ARM_NEON;
12955     for (size_t k = 17; k < 32; k++) {
12956       GemmMicrokernelTester()
12957         .mr(1)
12958         .nr(8)
12959         .kr(8)
12960         .sr(1)
12961         .m(1)
12962         .n(8)
12963         .k(k)
12964         .a_stride(37)
12965         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12966     }
12967   }
12968 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16_subtile)12969   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16_subtile) {
12970     TEST_REQUIRES_ARM_NEON;
12971     for (size_t k = 17; k < 32; k++) {
12972       for (uint32_t n = 1; n <= 8; n++) {
12973         for (uint32_t m = 1; m <= 1; m++) {
12974           GemmMicrokernelTester()
12975             .mr(1)
12976             .nr(8)
12977             .kr(8)
12978             .sr(1)
12979             .m(m)
12980             .n(n)
12981             .k(k)
12982             .iterations(1)
12983             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
12984         }
12985       }
12986     }
12987   }
12988 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16)12989   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16) {
12990     TEST_REQUIRES_ARM_NEON;
12991     for (size_t k = 32; k <= 160; k += 16) {
12992       GemmMicrokernelTester()
12993         .mr(1)
12994         .nr(8)
12995         .kr(8)
12996         .sr(1)
12997         .m(1)
12998         .n(8)
12999         .k(k)
13000         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13001     }
13002   }
13003 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16_strided_a)13004   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16_strided_a) {
13005     TEST_REQUIRES_ARM_NEON;
13006     for (size_t k = 32; k <= 160; k += 16) {
13007       GemmMicrokernelTester()
13008         .mr(1)
13009         .nr(8)
13010         .kr(8)
13011         .sr(1)
13012         .m(1)
13013         .n(8)
13014         .k(k)
13015         .a_stride(163)
13016         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13017     }
13018   }
13019 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16_subtile)13020   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16_subtile) {
13021     TEST_REQUIRES_ARM_NEON;
13022     for (size_t k = 32; k <= 160; k += 16) {
13023       for (uint32_t n = 1; n <= 8; n++) {
13024         for (uint32_t m = 1; m <= 1; m++) {
13025           GemmMicrokernelTester()
13026             .mr(1)
13027             .nr(8)
13028             .kr(8)
13029             .sr(1)
13030             .m(m)
13031             .n(n)
13032             .k(k)
13033             .iterations(1)
13034             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13035         }
13036       }
13037     }
13038   }
13039 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8)13040   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8) {
13041     TEST_REQUIRES_ARM_NEON;
13042     for (uint32_t n = 9; n < 16; n++) {
13043       for (size_t k = 1; k <= 80; k += 17) {
13044         GemmMicrokernelTester()
13045           .mr(1)
13046           .nr(8)
13047           .kr(8)
13048           .sr(1)
13049           .m(1)
13050           .n(n)
13051           .k(k)
13052           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13053       }
13054     }
13055   }
13056 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_strided_cn)13057   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_strided_cn) {
13058     TEST_REQUIRES_ARM_NEON;
13059     for (uint32_t n = 9; n < 16; n++) {
13060       for (size_t k = 1; k <= 80; k += 17) {
13061         GemmMicrokernelTester()
13062           .mr(1)
13063           .nr(8)
13064           .kr(8)
13065           .sr(1)
13066           .m(1)
13067           .n(n)
13068           .k(k)
13069           .cn_stride(11)
13070           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13071       }
13072     }
13073   }
13074 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_strided_a)13075   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_strided_a) {
13076     TEST_REQUIRES_ARM_NEON;
13077     for (uint32_t n = 9; n < 16; n++) {
13078       for (size_t k = 1; k <= 80; k += 17) {
13079         GemmMicrokernelTester()
13080           .mr(1)
13081           .nr(8)
13082           .kr(8)
13083           .sr(1)
13084           .m(1)
13085           .n(n)
13086           .k(k)
13087           .a_stride(83)
13088           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13089       }
13090     }
13091   }
13092 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_subtile)13093   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_subtile) {
13094     TEST_REQUIRES_ARM_NEON;
13095     for (uint32_t n = 9; n < 16; n++) {
13096       for (size_t k = 1; k <= 80; k += 17) {
13097         for (uint32_t m = 1; m <= 1; m++) {
13098           GemmMicrokernelTester()
13099             .mr(1)
13100             .nr(8)
13101             .kr(8)
13102             .sr(1)
13103             .m(m)
13104             .n(n)
13105             .k(k)
13106             .iterations(1)
13107             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13108         }
13109       }
13110     }
13111   }
13112 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8)13113   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8) {
13114     TEST_REQUIRES_ARM_NEON;
13115     for (uint32_t n = 16; n <= 24; n += 8) {
13116       for (size_t k = 1; k <= 80; k += 17) {
13117         GemmMicrokernelTester()
13118           .mr(1)
13119           .nr(8)
13120           .kr(8)
13121           .sr(1)
13122           .m(1)
13123           .n(n)
13124           .k(k)
13125           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13126       }
13127     }
13128   }
13129 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_strided_cn)13130   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_strided_cn) {
13131     TEST_REQUIRES_ARM_NEON;
13132     for (uint32_t n = 16; n <= 24; n += 8) {
13133       for (size_t k = 1; k <= 80; k += 17) {
13134         GemmMicrokernelTester()
13135           .mr(1)
13136           .nr(8)
13137           .kr(8)
13138           .sr(1)
13139           .m(1)
13140           .n(n)
13141           .k(k)
13142           .cn_stride(11)
13143           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13144       }
13145     }
13146   }
13147 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_strided_a)13148   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_strided_a) {
13149     TEST_REQUIRES_ARM_NEON;
13150     for (uint32_t n = 16; n <= 24; n += 8) {
13151       for (size_t k = 1; k <= 80; k += 17) {
13152         GemmMicrokernelTester()
13153           .mr(1)
13154           .nr(8)
13155           .kr(8)
13156           .sr(1)
13157           .m(1)
13158           .n(n)
13159           .k(k)
13160           .a_stride(83)
13161           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13162       }
13163     }
13164   }
13165 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_subtile)13166   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_subtile) {
13167     TEST_REQUIRES_ARM_NEON;
13168     for (uint32_t n = 16; n <= 24; n += 8) {
13169       for (size_t k = 1; k <= 80; k += 17) {
13170         for (uint32_t m = 1; m <= 1; m++) {
13171           GemmMicrokernelTester()
13172             .mr(1)
13173             .nr(8)
13174             .kr(8)
13175             .sr(1)
13176             .m(m)
13177             .n(n)
13178             .k(k)
13179             .iterations(1)
13180             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13181         }
13182       }
13183     }
13184   }
13185 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,strided_cm_subtile)13186   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, strided_cm_subtile) {
13187     TEST_REQUIRES_ARM_NEON;
13188     for (size_t k = 1; k <= 80; k += 17) {
13189       for (uint32_t n = 1; n <= 8; n++) {
13190         for (uint32_t m = 1; m <= 1; m++) {
13191           GemmMicrokernelTester()
13192             .mr(1)
13193             .nr(8)
13194             .kr(8)
13195             .sr(1)
13196             .m(m)
13197             .n(n)
13198             .k(k)
13199             .cm_stride(11)
13200             .iterations(1)
13201             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13202         }
13203       }
13204     }
13205   }
13206 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,qmin)13207   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, qmin) {
13208     TEST_REQUIRES_ARM_NEON;
13209     GemmMicrokernelTester()
13210       .mr(1)
13211       .nr(8)
13212       .kr(8)
13213       .sr(1)
13214       .m(1)
13215       .n(8)
13216       .k(16)
13217       .qmin(128)
13218       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13219   }
13220 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,qmax)13221   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, qmax) {
13222     TEST_REQUIRES_ARM_NEON;
13223     GemmMicrokernelTester()
13224       .mr(1)
13225       .nr(8)
13226       .kr(8)
13227       .sr(1)
13228       .m(1)
13229       .n(8)
13230       .k(16)
13231       .qmax(128)
13232       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13233   }
13234 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM,strided_cm)13235   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AARCH64_NEON_MLAL_PRFM, strided_cm) {
13236     TEST_REQUIRES_ARM_NEON;
13237     GemmMicrokernelTester()
13238       .mr(1)
13239       .nr(8)
13240       .kr(8)
13241       .sr(1)
13242       .m(1)
13243       .n(8)
13244       .k(16)
13245       .cm_stride(11)
13246       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13247   }
13248 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
13249 
13250 
13251 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_eq_16)13252   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_eq_16) {
13253     TEST_REQUIRES_ARM_NEON;
13254     GemmMicrokernelTester()
13255       .mr(2)
13256       .nr(8)
13257       .kr(8)
13258       .sr(1)
13259       .m(2)
13260       .n(8)
13261       .k(16)
13262       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13263   }
13264 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,strided_cn)13265   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, strided_cn) {
13266     TEST_REQUIRES_ARM_NEON;
13267     GemmMicrokernelTester()
13268       .mr(2)
13269       .nr(8)
13270       .kr(8)
13271       .sr(1)
13272       .m(2)
13273       .n(8)
13274       .k(16)
13275       .cn_stride(11)
13276       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13277   }
13278 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_eq_16_strided_a)13279   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_eq_16_strided_a) {
13280     TEST_REQUIRES_ARM_NEON;
13281     GemmMicrokernelTester()
13282       .mr(2)
13283       .nr(8)
13284       .kr(8)
13285       .sr(1)
13286       .m(2)
13287       .n(8)
13288       .k(16)
13289       .a_stride(19)
13290       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13291   }
13292 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile)13293   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile) {
13294     TEST_REQUIRES_ARM_NEON;
13295     for (uint32_t n = 1; n <= 8; n++) {
13296       for (uint32_t m = 1; m <= 2; m++) {
13297         GemmMicrokernelTester()
13298           .mr(2)
13299           .nr(8)
13300           .kr(8)
13301           .sr(1)
13302           .m(m)
13303           .n(n)
13304           .k(16)
13305           .iterations(1)
13306           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13307       }
13308     }
13309   }
13310 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile_m)13311   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile_m) {
13312     TEST_REQUIRES_ARM_NEON;
13313     for (uint32_t m = 1; m <= 2; m++) {
13314       GemmMicrokernelTester()
13315         .mr(2)
13316         .nr(8)
13317         .kr(8)
13318         .sr(1)
13319         .m(m)
13320         .n(8)
13321         .k(16)
13322         .iterations(1)
13323         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13324     }
13325   }
13326 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_eq_16_subtile_n)13327   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_eq_16_subtile_n) {
13328     TEST_REQUIRES_ARM_NEON;
13329     for (uint32_t n = 1; n <= 8; n++) {
13330       GemmMicrokernelTester()
13331         .mr(2)
13332         .nr(8)
13333         .kr(8)
13334         .sr(1)
13335         .m(2)
13336         .n(n)
13337         .k(16)
13338         .iterations(1)
13339         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13340     }
13341   }
13342 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_lt_16)13343   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_lt_16) {
13344     TEST_REQUIRES_ARM_NEON;
13345     for (size_t k = 1; k < 16; k++) {
13346       GemmMicrokernelTester()
13347         .mr(2)
13348         .nr(8)
13349         .kr(8)
13350         .sr(1)
13351         .m(2)
13352         .n(8)
13353         .k(k)
13354         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13355     }
13356   }
13357 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_lt_16_strided_a)13358   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_lt_16_strided_a) {
13359     TEST_REQUIRES_ARM_NEON;
13360     for (size_t k = 1; k < 16; k++) {
13361       GemmMicrokernelTester()
13362         .mr(2)
13363         .nr(8)
13364         .kr(8)
13365         .sr(1)
13366         .m(2)
13367         .n(8)
13368         .k(k)
13369         .a_stride(19)
13370         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13371     }
13372   }
13373 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_lt_16_subtile)13374   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_lt_16_subtile) {
13375     TEST_REQUIRES_ARM_NEON;
13376     for (size_t k = 1; k < 16; k++) {
13377       for (uint32_t n = 1; n <= 8; n++) {
13378         for (uint32_t m = 1; m <= 2; m++) {
13379           GemmMicrokernelTester()
13380             .mr(2)
13381             .nr(8)
13382             .kr(8)
13383             .sr(1)
13384             .m(m)
13385             .n(n)
13386             .k(k)
13387             .iterations(1)
13388             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13389         }
13390       }
13391     }
13392   }
13393 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_gt_16)13394   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_gt_16) {
13395     TEST_REQUIRES_ARM_NEON;
13396     for (size_t k = 17; k < 32; k++) {
13397       GemmMicrokernelTester()
13398         .mr(2)
13399         .nr(8)
13400         .kr(8)
13401         .sr(1)
13402         .m(2)
13403         .n(8)
13404         .k(k)
13405         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13406     }
13407   }
13408 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_gt_16_strided_a)13409   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_gt_16_strided_a) {
13410     TEST_REQUIRES_ARM_NEON;
13411     for (size_t k = 17; k < 32; k++) {
13412       GemmMicrokernelTester()
13413         .mr(2)
13414         .nr(8)
13415         .kr(8)
13416         .sr(1)
13417         .m(2)
13418         .n(8)
13419         .k(k)
13420         .a_stride(37)
13421         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13422     }
13423   }
13424 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_gt_16_subtile)13425   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_gt_16_subtile) {
13426     TEST_REQUIRES_ARM_NEON;
13427     for (size_t k = 17; k < 32; k++) {
13428       for (uint32_t n = 1; n <= 8; n++) {
13429         for (uint32_t m = 1; m <= 2; m++) {
13430           GemmMicrokernelTester()
13431             .mr(2)
13432             .nr(8)
13433             .kr(8)
13434             .sr(1)
13435             .m(m)
13436             .n(n)
13437             .k(k)
13438             .iterations(1)
13439             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13440         }
13441       }
13442     }
13443   }
13444 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_div_16)13445   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_div_16) {
13446     TEST_REQUIRES_ARM_NEON;
13447     for (size_t k = 32; k <= 160; k += 16) {
13448       GemmMicrokernelTester()
13449         .mr(2)
13450         .nr(8)
13451         .kr(8)
13452         .sr(1)
13453         .m(2)
13454         .n(8)
13455         .k(k)
13456         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13457     }
13458   }
13459 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_div_16_strided_a)13460   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_div_16_strided_a) {
13461     TEST_REQUIRES_ARM_NEON;
13462     for (size_t k = 32; k <= 160; k += 16) {
13463       GemmMicrokernelTester()
13464         .mr(2)
13465         .nr(8)
13466         .kr(8)
13467         .sr(1)
13468         .m(2)
13469         .n(8)
13470         .k(k)
13471         .a_stride(163)
13472         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13473     }
13474   }
13475 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,k_div_16_subtile)13476   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, k_div_16_subtile) {
13477     TEST_REQUIRES_ARM_NEON;
13478     for (size_t k = 32; k <= 160; k += 16) {
13479       for (uint32_t n = 1; n <= 8; n++) {
13480         for (uint32_t m = 1; m <= 2; m++) {
13481           GemmMicrokernelTester()
13482             .mr(2)
13483             .nr(8)
13484             .kr(8)
13485             .sr(1)
13486             .m(m)
13487             .n(n)
13488             .k(k)
13489             .iterations(1)
13490             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13491         }
13492       }
13493     }
13494   }
13495 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_gt_8)13496   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_gt_8) {
13497     TEST_REQUIRES_ARM_NEON;
13498     for (uint32_t n = 9; n < 16; n++) {
13499       for (size_t k = 1; k <= 80; k += 17) {
13500         GemmMicrokernelTester()
13501           .mr(2)
13502           .nr(8)
13503           .kr(8)
13504           .sr(1)
13505           .m(2)
13506           .n(n)
13507           .k(k)
13508           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13509       }
13510     }
13511   }
13512 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_gt_8_strided_cn)13513   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_gt_8_strided_cn) {
13514     TEST_REQUIRES_ARM_NEON;
13515     for (uint32_t n = 9; n < 16; n++) {
13516       for (size_t k = 1; k <= 80; k += 17) {
13517         GemmMicrokernelTester()
13518           .mr(2)
13519           .nr(8)
13520           .kr(8)
13521           .sr(1)
13522           .m(2)
13523           .n(n)
13524           .k(k)
13525           .cn_stride(11)
13526           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13527       }
13528     }
13529   }
13530 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_gt_8_strided_a)13531   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_gt_8_strided_a) {
13532     TEST_REQUIRES_ARM_NEON;
13533     for (uint32_t n = 9; n < 16; n++) {
13534       for (size_t k = 1; k <= 80; k += 17) {
13535         GemmMicrokernelTester()
13536           .mr(2)
13537           .nr(8)
13538           .kr(8)
13539           .sr(1)
13540           .m(2)
13541           .n(n)
13542           .k(k)
13543           .a_stride(83)
13544           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13545       }
13546     }
13547   }
13548 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_gt_8_subtile)13549   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_gt_8_subtile) {
13550     TEST_REQUIRES_ARM_NEON;
13551     for (uint32_t n = 9; n < 16; n++) {
13552       for (size_t k = 1; k <= 80; k += 17) {
13553         for (uint32_t m = 1; m <= 2; m++) {
13554           GemmMicrokernelTester()
13555             .mr(2)
13556             .nr(8)
13557             .kr(8)
13558             .sr(1)
13559             .m(m)
13560             .n(n)
13561             .k(k)
13562             .iterations(1)
13563             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13564         }
13565       }
13566     }
13567   }
13568 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_div_8)13569   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_div_8) {
13570     TEST_REQUIRES_ARM_NEON;
13571     for (uint32_t n = 16; n <= 24; n += 8) {
13572       for (size_t k = 1; k <= 80; k += 17) {
13573         GemmMicrokernelTester()
13574           .mr(2)
13575           .nr(8)
13576           .kr(8)
13577           .sr(1)
13578           .m(2)
13579           .n(n)
13580           .k(k)
13581           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13582       }
13583     }
13584   }
13585 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_div_8_strided_cn)13586   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_div_8_strided_cn) {
13587     TEST_REQUIRES_ARM_NEON;
13588     for (uint32_t n = 16; n <= 24; n += 8) {
13589       for (size_t k = 1; k <= 80; k += 17) {
13590         GemmMicrokernelTester()
13591           .mr(2)
13592           .nr(8)
13593           .kr(8)
13594           .sr(1)
13595           .m(2)
13596           .n(n)
13597           .k(k)
13598           .cn_stride(11)
13599           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13600       }
13601     }
13602   }
13603 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_div_8_strided_a)13604   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_div_8_strided_a) {
13605     TEST_REQUIRES_ARM_NEON;
13606     for (uint32_t n = 16; n <= 24; n += 8) {
13607       for (size_t k = 1; k <= 80; k += 17) {
13608         GemmMicrokernelTester()
13609           .mr(2)
13610           .nr(8)
13611           .kr(8)
13612           .sr(1)
13613           .m(2)
13614           .n(n)
13615           .k(k)
13616           .a_stride(83)
13617           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13618       }
13619     }
13620   }
13621 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,n_div_8_subtile)13622   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, n_div_8_subtile) {
13623     TEST_REQUIRES_ARM_NEON;
13624     for (uint32_t n = 16; n <= 24; n += 8) {
13625       for (size_t k = 1; k <= 80; k += 17) {
13626         for (uint32_t m = 1; m <= 2; m++) {
13627           GemmMicrokernelTester()
13628             .mr(2)
13629             .nr(8)
13630             .kr(8)
13631             .sr(1)
13632             .m(m)
13633             .n(n)
13634             .k(k)
13635             .iterations(1)
13636             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13637         }
13638       }
13639     }
13640   }
13641 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,strided_cm_subtile)13642   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, strided_cm_subtile) {
13643     TEST_REQUIRES_ARM_NEON;
13644     for (size_t k = 1; k <= 80; k += 17) {
13645       for (uint32_t n = 1; n <= 8; n++) {
13646         for (uint32_t m = 1; m <= 2; m++) {
13647           GemmMicrokernelTester()
13648             .mr(2)
13649             .nr(8)
13650             .kr(8)
13651             .sr(1)
13652             .m(m)
13653             .n(n)
13654             .k(k)
13655             .cm_stride(11)
13656             .iterations(1)
13657             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13658         }
13659       }
13660     }
13661   }
13662 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,qmin)13663   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, qmin) {
13664     TEST_REQUIRES_ARM_NEON;
13665     GemmMicrokernelTester()
13666       .mr(2)
13667       .nr(8)
13668       .kr(8)
13669       .sr(1)
13670       .m(2)
13671       .n(8)
13672       .k(16)
13673       .qmin(128)
13674       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13675   }
13676 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,qmax)13677   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, qmax) {
13678     TEST_REQUIRES_ARM_NEON;
13679     GemmMicrokernelTester()
13680       .mr(2)
13681       .nr(8)
13682       .kr(8)
13683       .sr(1)
13684       .m(2)
13685       .n(8)
13686       .k(16)
13687       .qmax(128)
13688       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13689   }
13690 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL,strided_cm)13691   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL, strided_cm) {
13692     TEST_REQUIRES_ARM_NEON;
13693     GemmMicrokernelTester()
13694       .mr(2)
13695       .nr(8)
13696       .kr(8)
13697       .sr(1)
13698       .m(2)
13699       .n(8)
13700       .k(16)
13701       .cm_stride(11)
13702       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13703   }
13704 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
13705 
13706 
13707 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16)13708   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16) {
13709     TEST_REQUIRES_ARM_NEON;
13710     GemmMicrokernelTester()
13711       .mr(2)
13712       .nr(8)
13713       .kr(8)
13714       .sr(1)
13715       .m(2)
13716       .n(8)
13717       .k(16)
13718       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13719   }
13720 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,strided_cn)13721   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, strided_cn) {
13722     TEST_REQUIRES_ARM_NEON;
13723     GemmMicrokernelTester()
13724       .mr(2)
13725       .nr(8)
13726       .kr(8)
13727       .sr(1)
13728       .m(2)
13729       .n(8)
13730       .k(16)
13731       .cn_stride(11)
13732       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13733   }
13734 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_strided_a)13735   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_strided_a) {
13736     TEST_REQUIRES_ARM_NEON;
13737     GemmMicrokernelTester()
13738       .mr(2)
13739       .nr(8)
13740       .kr(8)
13741       .sr(1)
13742       .m(2)
13743       .n(8)
13744       .k(16)
13745       .a_stride(19)
13746       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13747   }
13748 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile)13749   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile) {
13750     TEST_REQUIRES_ARM_NEON;
13751     for (uint32_t n = 1; n <= 8; n++) {
13752       for (uint32_t m = 1; m <= 2; m++) {
13753         GemmMicrokernelTester()
13754           .mr(2)
13755           .nr(8)
13756           .kr(8)
13757           .sr(1)
13758           .m(m)
13759           .n(n)
13760           .k(16)
13761           .iterations(1)
13762           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13763       }
13764     }
13765   }
13766 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile_m)13767   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile_m) {
13768     TEST_REQUIRES_ARM_NEON;
13769     for (uint32_t m = 1; m <= 2; m++) {
13770       GemmMicrokernelTester()
13771         .mr(2)
13772         .nr(8)
13773         .kr(8)
13774         .sr(1)
13775         .m(m)
13776         .n(8)
13777         .k(16)
13778         .iterations(1)
13779         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13780     }
13781   }
13782 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_eq_16_subtile_n)13783   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_eq_16_subtile_n) {
13784     TEST_REQUIRES_ARM_NEON;
13785     for (uint32_t n = 1; n <= 8; n++) {
13786       GemmMicrokernelTester()
13787         .mr(2)
13788         .nr(8)
13789         .kr(8)
13790         .sr(1)
13791         .m(2)
13792         .n(n)
13793         .k(16)
13794         .iterations(1)
13795         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13796     }
13797   }
13798 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16)13799   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16) {
13800     TEST_REQUIRES_ARM_NEON;
13801     for (size_t k = 1; k < 16; k++) {
13802       GemmMicrokernelTester()
13803         .mr(2)
13804         .nr(8)
13805         .kr(8)
13806         .sr(1)
13807         .m(2)
13808         .n(8)
13809         .k(k)
13810         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13811     }
13812   }
13813 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16_strided_a)13814   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16_strided_a) {
13815     TEST_REQUIRES_ARM_NEON;
13816     for (size_t k = 1; k < 16; k++) {
13817       GemmMicrokernelTester()
13818         .mr(2)
13819         .nr(8)
13820         .kr(8)
13821         .sr(1)
13822         .m(2)
13823         .n(8)
13824         .k(k)
13825         .a_stride(19)
13826         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13827     }
13828   }
13829 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_lt_16_subtile)13830   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_lt_16_subtile) {
13831     TEST_REQUIRES_ARM_NEON;
13832     for (size_t k = 1; k < 16; k++) {
13833       for (uint32_t n = 1; n <= 8; n++) {
13834         for (uint32_t m = 1; m <= 2; m++) {
13835           GemmMicrokernelTester()
13836             .mr(2)
13837             .nr(8)
13838             .kr(8)
13839             .sr(1)
13840             .m(m)
13841             .n(n)
13842             .k(k)
13843             .iterations(1)
13844             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13845         }
13846       }
13847     }
13848   }
13849 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16)13850   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16) {
13851     TEST_REQUIRES_ARM_NEON;
13852     for (size_t k = 17; k < 32; k++) {
13853       GemmMicrokernelTester()
13854         .mr(2)
13855         .nr(8)
13856         .kr(8)
13857         .sr(1)
13858         .m(2)
13859         .n(8)
13860         .k(k)
13861         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13862     }
13863   }
13864 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16_strided_a)13865   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16_strided_a) {
13866     TEST_REQUIRES_ARM_NEON;
13867     for (size_t k = 17; k < 32; k++) {
13868       GemmMicrokernelTester()
13869         .mr(2)
13870         .nr(8)
13871         .kr(8)
13872         .sr(1)
13873         .m(2)
13874         .n(8)
13875         .k(k)
13876         .a_stride(37)
13877         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13878     }
13879   }
13880 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_gt_16_subtile)13881   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_gt_16_subtile) {
13882     TEST_REQUIRES_ARM_NEON;
13883     for (size_t k = 17; k < 32; k++) {
13884       for (uint32_t n = 1; n <= 8; n++) {
13885         for (uint32_t m = 1; m <= 2; m++) {
13886           GemmMicrokernelTester()
13887             .mr(2)
13888             .nr(8)
13889             .kr(8)
13890             .sr(1)
13891             .m(m)
13892             .n(n)
13893             .k(k)
13894             .iterations(1)
13895             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13896         }
13897       }
13898     }
13899   }
13900 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16)13901   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16) {
13902     TEST_REQUIRES_ARM_NEON;
13903     for (size_t k = 32; k <= 160; k += 16) {
13904       GemmMicrokernelTester()
13905         .mr(2)
13906         .nr(8)
13907         .kr(8)
13908         .sr(1)
13909         .m(2)
13910         .n(8)
13911         .k(k)
13912         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13913     }
13914   }
13915 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16_strided_a)13916   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16_strided_a) {
13917     TEST_REQUIRES_ARM_NEON;
13918     for (size_t k = 32; k <= 160; k += 16) {
13919       GemmMicrokernelTester()
13920         .mr(2)
13921         .nr(8)
13922         .kr(8)
13923         .sr(1)
13924         .m(2)
13925         .n(8)
13926         .k(k)
13927         .a_stride(163)
13928         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13929     }
13930   }
13931 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,k_div_16_subtile)13932   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, k_div_16_subtile) {
13933     TEST_REQUIRES_ARM_NEON;
13934     for (size_t k = 32; k <= 160; k += 16) {
13935       for (uint32_t n = 1; n <= 8; n++) {
13936         for (uint32_t m = 1; m <= 2; m++) {
13937           GemmMicrokernelTester()
13938             .mr(2)
13939             .nr(8)
13940             .kr(8)
13941             .sr(1)
13942             .m(m)
13943             .n(n)
13944             .k(k)
13945             .iterations(1)
13946             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13947         }
13948       }
13949     }
13950   }
13951 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8)13952   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8) {
13953     TEST_REQUIRES_ARM_NEON;
13954     for (uint32_t n = 9; n < 16; n++) {
13955       for (size_t k = 1; k <= 80; k += 17) {
13956         GemmMicrokernelTester()
13957           .mr(2)
13958           .nr(8)
13959           .kr(8)
13960           .sr(1)
13961           .m(2)
13962           .n(n)
13963           .k(k)
13964           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13965       }
13966     }
13967   }
13968 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_strided_cn)13969   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_strided_cn) {
13970     TEST_REQUIRES_ARM_NEON;
13971     for (uint32_t n = 9; n < 16; n++) {
13972       for (size_t k = 1; k <= 80; k += 17) {
13973         GemmMicrokernelTester()
13974           .mr(2)
13975           .nr(8)
13976           .kr(8)
13977           .sr(1)
13978           .m(2)
13979           .n(n)
13980           .k(k)
13981           .cn_stride(11)
13982           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
13983       }
13984     }
13985   }
13986 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_strided_a)13987   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_strided_a) {
13988     TEST_REQUIRES_ARM_NEON;
13989     for (uint32_t n = 9; n < 16; n++) {
13990       for (size_t k = 1; k <= 80; k += 17) {
13991         GemmMicrokernelTester()
13992           .mr(2)
13993           .nr(8)
13994           .kr(8)
13995           .sr(1)
13996           .m(2)
13997           .n(n)
13998           .k(k)
13999           .a_stride(83)
14000           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14001       }
14002     }
14003   }
14004 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_gt_8_subtile)14005   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_gt_8_subtile) {
14006     TEST_REQUIRES_ARM_NEON;
14007     for (uint32_t n = 9; n < 16; n++) {
14008       for (size_t k = 1; k <= 80; k += 17) {
14009         for (uint32_t m = 1; m <= 2; m++) {
14010           GemmMicrokernelTester()
14011             .mr(2)
14012             .nr(8)
14013             .kr(8)
14014             .sr(1)
14015             .m(m)
14016             .n(n)
14017             .k(k)
14018             .iterations(1)
14019             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14020         }
14021       }
14022     }
14023   }
14024 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8)14025   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8) {
14026     TEST_REQUIRES_ARM_NEON;
14027     for (uint32_t n = 16; n <= 24; n += 8) {
14028       for (size_t k = 1; k <= 80; k += 17) {
14029         GemmMicrokernelTester()
14030           .mr(2)
14031           .nr(8)
14032           .kr(8)
14033           .sr(1)
14034           .m(2)
14035           .n(n)
14036           .k(k)
14037           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14038       }
14039     }
14040   }
14041 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_strided_cn)14042   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_strided_cn) {
14043     TEST_REQUIRES_ARM_NEON;
14044     for (uint32_t n = 16; n <= 24; n += 8) {
14045       for (size_t k = 1; k <= 80; k += 17) {
14046         GemmMicrokernelTester()
14047           .mr(2)
14048           .nr(8)
14049           .kr(8)
14050           .sr(1)
14051           .m(2)
14052           .n(n)
14053           .k(k)
14054           .cn_stride(11)
14055           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14056       }
14057     }
14058   }
14059 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_strided_a)14060   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_strided_a) {
14061     TEST_REQUIRES_ARM_NEON;
14062     for (uint32_t n = 16; n <= 24; n += 8) {
14063       for (size_t k = 1; k <= 80; k += 17) {
14064         GemmMicrokernelTester()
14065           .mr(2)
14066           .nr(8)
14067           .kr(8)
14068           .sr(1)
14069           .m(2)
14070           .n(n)
14071           .k(k)
14072           .a_stride(83)
14073           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14074       }
14075     }
14076   }
14077 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,n_div_8_subtile)14078   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, n_div_8_subtile) {
14079     TEST_REQUIRES_ARM_NEON;
14080     for (uint32_t n = 16; n <= 24; n += 8) {
14081       for (size_t k = 1; k <= 80; k += 17) {
14082         for (uint32_t m = 1; m <= 2; m++) {
14083           GemmMicrokernelTester()
14084             .mr(2)
14085             .nr(8)
14086             .kr(8)
14087             .sr(1)
14088             .m(m)
14089             .n(n)
14090             .k(k)
14091             .iterations(1)
14092             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14093         }
14094       }
14095     }
14096   }
14097 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,strided_cm_subtile)14098   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, strided_cm_subtile) {
14099     TEST_REQUIRES_ARM_NEON;
14100     for (size_t k = 1; k <= 80; k += 17) {
14101       for (uint32_t n = 1; n <= 8; n++) {
14102         for (uint32_t m = 1; m <= 2; m++) {
14103           GemmMicrokernelTester()
14104             .mr(2)
14105             .nr(8)
14106             .kr(8)
14107             .sr(1)
14108             .m(m)
14109             .n(n)
14110             .k(k)
14111             .cm_stride(11)
14112             .iterations(1)
14113             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14114         }
14115       }
14116     }
14117   }
14118 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,qmin)14119   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, qmin) {
14120     TEST_REQUIRES_ARM_NEON;
14121     GemmMicrokernelTester()
14122       .mr(2)
14123       .nr(8)
14124       .kr(8)
14125       .sr(1)
14126       .m(2)
14127       .n(8)
14128       .k(16)
14129       .qmin(128)
14130       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14131   }
14132 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,qmax)14133   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, qmax) {
14134     TEST_REQUIRES_ARM_NEON;
14135     GemmMicrokernelTester()
14136       .mr(2)
14137       .nr(8)
14138       .kr(8)
14139       .sr(1)
14140       .m(2)
14141       .n(8)
14142       .k(16)
14143       .qmax(128)
14144       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14145   }
14146 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM,strided_cm)14147   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MLAL_PRFM, strided_cm) {
14148     TEST_REQUIRES_ARM_NEON;
14149     GemmMicrokernelTester()
14150       .mr(2)
14151       .nr(8)
14152       .kr(8)
14153       .sr(1)
14154       .m(2)
14155       .n(8)
14156       .k(16)
14157       .cm_stride(11)
14158       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mlal_prfm, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14159   }
14160 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
14161 
14162 
14163 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_eq_8)14164   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_eq_8) {
14165     TEST_REQUIRES_ARM_NEON;
14166     GemmMicrokernelTester()
14167       .mr(2)
14168       .nr(8)
14169       .kr(8)
14170       .sr(1)
14171       .m(2)
14172       .n(8)
14173       .k(8)
14174       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14175   }
14176 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,strided_cn)14177   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, strided_cn) {
14178     TEST_REQUIRES_ARM_NEON;
14179     GemmMicrokernelTester()
14180       .mr(2)
14181       .nr(8)
14182       .kr(8)
14183       .sr(1)
14184       .m(2)
14185       .n(8)
14186       .k(8)
14187       .cn_stride(11)
14188       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14189   }
14190 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_eq_8_strided_a)14191   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_eq_8_strided_a) {
14192     TEST_REQUIRES_ARM_NEON;
14193     GemmMicrokernelTester()
14194       .mr(2)
14195       .nr(8)
14196       .kr(8)
14197       .sr(1)
14198       .m(2)
14199       .n(8)
14200       .k(8)
14201       .a_stride(11)
14202       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14203   }
14204 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_eq_8_subtile)14205   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_eq_8_subtile) {
14206     TEST_REQUIRES_ARM_NEON;
14207     for (uint32_t n = 1; n <= 8; n++) {
14208       for (uint32_t m = 1; m <= 2; m++) {
14209         GemmMicrokernelTester()
14210           .mr(2)
14211           .nr(8)
14212           .kr(8)
14213           .sr(1)
14214           .m(m)
14215           .n(n)
14216           .k(8)
14217           .iterations(1)
14218           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14219       }
14220     }
14221   }
14222 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_eq_8_subtile_m)14223   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_eq_8_subtile_m) {
14224     TEST_REQUIRES_ARM_NEON;
14225     for (uint32_t m = 1; m <= 2; m++) {
14226       GemmMicrokernelTester()
14227         .mr(2)
14228         .nr(8)
14229         .kr(8)
14230         .sr(1)
14231         .m(m)
14232         .n(8)
14233         .k(8)
14234         .iterations(1)
14235         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14236     }
14237   }
14238 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_eq_8_subtile_n)14239   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_eq_8_subtile_n) {
14240     TEST_REQUIRES_ARM_NEON;
14241     for (uint32_t n = 1; n <= 8; n++) {
14242       GemmMicrokernelTester()
14243         .mr(2)
14244         .nr(8)
14245         .kr(8)
14246         .sr(1)
14247         .m(2)
14248         .n(n)
14249         .k(8)
14250         .iterations(1)
14251         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14252     }
14253   }
14254 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_lt_8)14255   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_lt_8) {
14256     TEST_REQUIRES_ARM_NEON;
14257     for (size_t k = 1; k < 8; k++) {
14258       GemmMicrokernelTester()
14259         .mr(2)
14260         .nr(8)
14261         .kr(8)
14262         .sr(1)
14263         .m(2)
14264         .n(8)
14265         .k(k)
14266         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14267     }
14268   }
14269 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_lt_8_strided_a)14270   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_lt_8_strided_a) {
14271     TEST_REQUIRES_ARM_NEON;
14272     for (size_t k = 1; k < 8; k++) {
14273       GemmMicrokernelTester()
14274         .mr(2)
14275         .nr(8)
14276         .kr(8)
14277         .sr(1)
14278         .m(2)
14279         .n(8)
14280         .k(k)
14281         .a_stride(11)
14282         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14283     }
14284   }
14285 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_lt_8_subtile)14286   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_lt_8_subtile) {
14287     TEST_REQUIRES_ARM_NEON;
14288     for (size_t k = 1; k < 8; k++) {
14289       for (uint32_t n = 1; n <= 8; n++) {
14290         for (uint32_t m = 1; m <= 2; m++) {
14291           GemmMicrokernelTester()
14292             .mr(2)
14293             .nr(8)
14294             .kr(8)
14295             .sr(1)
14296             .m(m)
14297             .n(n)
14298             .k(k)
14299             .iterations(1)
14300             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14301         }
14302       }
14303     }
14304   }
14305 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_gt_8)14306   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_gt_8) {
14307     TEST_REQUIRES_ARM_NEON;
14308     for (size_t k = 9; k < 16; k++) {
14309       GemmMicrokernelTester()
14310         .mr(2)
14311         .nr(8)
14312         .kr(8)
14313         .sr(1)
14314         .m(2)
14315         .n(8)
14316         .k(k)
14317         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14318     }
14319   }
14320 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_gt_8_strided_a)14321   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_gt_8_strided_a) {
14322     TEST_REQUIRES_ARM_NEON;
14323     for (size_t k = 9; k < 16; k++) {
14324       GemmMicrokernelTester()
14325         .mr(2)
14326         .nr(8)
14327         .kr(8)
14328         .sr(1)
14329         .m(2)
14330         .n(8)
14331         .k(k)
14332         .a_stride(19)
14333         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14334     }
14335   }
14336 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_gt_8_subtile)14337   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_gt_8_subtile) {
14338     TEST_REQUIRES_ARM_NEON;
14339     for (size_t k = 9; k < 16; k++) {
14340       for (uint32_t n = 1; n <= 8; n++) {
14341         for (uint32_t m = 1; m <= 2; m++) {
14342           GemmMicrokernelTester()
14343             .mr(2)
14344             .nr(8)
14345             .kr(8)
14346             .sr(1)
14347             .m(m)
14348             .n(n)
14349             .k(k)
14350             .iterations(1)
14351             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14352         }
14353       }
14354     }
14355   }
14356 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_div_8)14357   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_div_8) {
14358     TEST_REQUIRES_ARM_NEON;
14359     for (size_t k = 16; k <= 80; k += 8) {
14360       GemmMicrokernelTester()
14361         .mr(2)
14362         .nr(8)
14363         .kr(8)
14364         .sr(1)
14365         .m(2)
14366         .n(8)
14367         .k(k)
14368         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14369     }
14370   }
14371 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_div_8_strided_a)14372   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_div_8_strided_a) {
14373     TEST_REQUIRES_ARM_NEON;
14374     for (size_t k = 16; k <= 80; k += 8) {
14375       GemmMicrokernelTester()
14376         .mr(2)
14377         .nr(8)
14378         .kr(8)
14379         .sr(1)
14380         .m(2)
14381         .n(8)
14382         .k(k)
14383         .a_stride(83)
14384         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14385     }
14386   }
14387 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,k_div_8_subtile)14388   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, k_div_8_subtile) {
14389     TEST_REQUIRES_ARM_NEON;
14390     for (size_t k = 16; k <= 80; k += 8) {
14391       for (uint32_t n = 1; n <= 8; n++) {
14392         for (uint32_t m = 1; m <= 2; m++) {
14393           GemmMicrokernelTester()
14394             .mr(2)
14395             .nr(8)
14396             .kr(8)
14397             .sr(1)
14398             .m(m)
14399             .n(n)
14400             .k(k)
14401             .iterations(1)
14402             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14403         }
14404       }
14405     }
14406   }
14407 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_gt_8)14408   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_gt_8) {
14409     TEST_REQUIRES_ARM_NEON;
14410     for (uint32_t n = 9; n < 16; n++) {
14411       for (size_t k = 1; k <= 40; k += 9) {
14412         GemmMicrokernelTester()
14413           .mr(2)
14414           .nr(8)
14415           .kr(8)
14416           .sr(1)
14417           .m(2)
14418           .n(n)
14419           .k(k)
14420           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14421       }
14422     }
14423   }
14424 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_gt_8_strided_cn)14425   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_gt_8_strided_cn) {
14426     TEST_REQUIRES_ARM_NEON;
14427     for (uint32_t n = 9; n < 16; n++) {
14428       for (size_t k = 1; k <= 40; k += 9) {
14429         GemmMicrokernelTester()
14430           .mr(2)
14431           .nr(8)
14432           .kr(8)
14433           .sr(1)
14434           .m(2)
14435           .n(n)
14436           .k(k)
14437           .cn_stride(11)
14438           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14439       }
14440     }
14441   }
14442 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_gt_8_strided_a)14443   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_gt_8_strided_a) {
14444     TEST_REQUIRES_ARM_NEON;
14445     for (uint32_t n = 9; n < 16; n++) {
14446       for (size_t k = 1; k <= 40; k += 9) {
14447         GemmMicrokernelTester()
14448           .mr(2)
14449           .nr(8)
14450           .kr(8)
14451           .sr(1)
14452           .m(2)
14453           .n(n)
14454           .k(k)
14455           .a_stride(43)
14456           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14457       }
14458     }
14459   }
14460 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_gt_8_subtile)14461   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_gt_8_subtile) {
14462     TEST_REQUIRES_ARM_NEON;
14463     for (uint32_t n = 9; n < 16; n++) {
14464       for (size_t k = 1; k <= 40; k += 9) {
14465         for (uint32_t m = 1; m <= 2; m++) {
14466           GemmMicrokernelTester()
14467             .mr(2)
14468             .nr(8)
14469             .kr(8)
14470             .sr(1)
14471             .m(m)
14472             .n(n)
14473             .k(k)
14474             .iterations(1)
14475             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14476         }
14477       }
14478     }
14479   }
14480 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_div_8)14481   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_div_8) {
14482     TEST_REQUIRES_ARM_NEON;
14483     for (uint32_t n = 16; n <= 24; n += 8) {
14484       for (size_t k = 1; k <= 40; k += 9) {
14485         GemmMicrokernelTester()
14486           .mr(2)
14487           .nr(8)
14488           .kr(8)
14489           .sr(1)
14490           .m(2)
14491           .n(n)
14492           .k(k)
14493           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14494       }
14495     }
14496   }
14497 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_div_8_strided_cn)14498   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_div_8_strided_cn) {
14499     TEST_REQUIRES_ARM_NEON;
14500     for (uint32_t n = 16; n <= 24; n += 8) {
14501       for (size_t k = 1; k <= 40; k += 9) {
14502         GemmMicrokernelTester()
14503           .mr(2)
14504           .nr(8)
14505           .kr(8)
14506           .sr(1)
14507           .m(2)
14508           .n(n)
14509           .k(k)
14510           .cn_stride(11)
14511           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14512       }
14513     }
14514   }
14515 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_div_8_strided_a)14516   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_div_8_strided_a) {
14517     TEST_REQUIRES_ARM_NEON;
14518     for (uint32_t n = 16; n <= 24; n += 8) {
14519       for (size_t k = 1; k <= 40; k += 9) {
14520         GemmMicrokernelTester()
14521           .mr(2)
14522           .nr(8)
14523           .kr(8)
14524           .sr(1)
14525           .m(2)
14526           .n(n)
14527           .k(k)
14528           .a_stride(43)
14529           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14530       }
14531     }
14532   }
14533 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,n_div_8_subtile)14534   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, n_div_8_subtile) {
14535     TEST_REQUIRES_ARM_NEON;
14536     for (uint32_t n = 16; n <= 24; n += 8) {
14537       for (size_t k = 1; k <= 40; k += 9) {
14538         for (uint32_t m = 1; m <= 2; m++) {
14539           GemmMicrokernelTester()
14540             .mr(2)
14541             .nr(8)
14542             .kr(8)
14543             .sr(1)
14544             .m(m)
14545             .n(n)
14546             .k(k)
14547             .iterations(1)
14548             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14549         }
14550       }
14551     }
14552   }
14553 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,strided_cm_subtile)14554   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, strided_cm_subtile) {
14555     TEST_REQUIRES_ARM_NEON;
14556     for (size_t k = 1; k <= 40; k += 9) {
14557       for (uint32_t n = 1; n <= 8; n++) {
14558         for (uint32_t m = 1; m <= 2; m++) {
14559           GemmMicrokernelTester()
14560             .mr(2)
14561             .nr(8)
14562             .kr(8)
14563             .sr(1)
14564             .m(m)
14565             .n(n)
14566             .k(k)
14567             .cm_stride(11)
14568             .iterations(1)
14569             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14570         }
14571       }
14572     }
14573   }
14574 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,qmin)14575   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, qmin) {
14576     TEST_REQUIRES_ARM_NEON;
14577     GemmMicrokernelTester()
14578       .mr(2)
14579       .nr(8)
14580       .kr(8)
14581       .sr(1)
14582       .m(2)
14583       .n(8)
14584       .k(8)
14585       .qmin(128)
14586       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14587   }
14588 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,qmax)14589   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, qmax) {
14590     TEST_REQUIRES_ARM_NEON;
14591     GemmMicrokernelTester()
14592       .mr(2)
14593       .nr(8)
14594       .kr(8)
14595       .sr(1)
14596       .m(2)
14597       .n(8)
14598       .k(8)
14599       .qmax(128)
14600       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14601   }
14602 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL,strided_cm)14603   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__AARCH64_NEON_MULL, strided_cm) {
14604     TEST_REQUIRES_ARM_NEON;
14605     GemmMicrokernelTester()
14606       .mr(2)
14607       .nr(8)
14608       .kr(8)
14609       .sr(1)
14610       .m(2)
14611       .n(8)
14612       .k(8)
14613       .cm_stride(11)
14614       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__aarch64_neon_mull, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14615   }
14616 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
14617 
14618 
14619 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_eq_16)14620   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_eq_16) {
14621     TEST_REQUIRES_ARM_NEON;
14622     GemmMicrokernelTester()
14623       .mr(2)
14624       .nr(8)
14625       .kr(16)
14626       .sr(1)
14627       .m(2)
14628       .n(8)
14629       .k(16)
14630       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14631   }
14632 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,strided_cn)14633   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, strided_cn) {
14634     TEST_REQUIRES_ARM_NEON;
14635     GemmMicrokernelTester()
14636       .mr(2)
14637       .nr(8)
14638       .kr(16)
14639       .sr(1)
14640       .m(2)
14641       .n(8)
14642       .k(16)
14643       .cn_stride(11)
14644       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14645   }
14646 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_eq_16_strided_a)14647   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_eq_16_strided_a) {
14648     TEST_REQUIRES_ARM_NEON;
14649     GemmMicrokernelTester()
14650       .mr(2)
14651       .nr(8)
14652       .kr(16)
14653       .sr(1)
14654       .m(2)
14655       .n(8)
14656       .k(16)
14657       .a_stride(19)
14658       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14659   }
14660 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_eq_16_subtile)14661   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_eq_16_subtile) {
14662     TEST_REQUIRES_ARM_NEON;
14663     for (uint32_t n = 1; n <= 8; n++) {
14664       for (uint32_t m = 1; m <= 2; m++) {
14665         GemmMicrokernelTester()
14666           .mr(2)
14667           .nr(8)
14668           .kr(16)
14669           .sr(1)
14670           .m(m)
14671           .n(n)
14672           .k(16)
14673           .iterations(1)
14674           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14675       }
14676     }
14677   }
14678 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_eq_16_subtile_m)14679   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_eq_16_subtile_m) {
14680     TEST_REQUIRES_ARM_NEON;
14681     for (uint32_t m = 1; m <= 2; m++) {
14682       GemmMicrokernelTester()
14683         .mr(2)
14684         .nr(8)
14685         .kr(16)
14686         .sr(1)
14687         .m(m)
14688         .n(8)
14689         .k(16)
14690         .iterations(1)
14691         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14692     }
14693   }
14694 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_eq_16_subtile_n)14695   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_eq_16_subtile_n) {
14696     TEST_REQUIRES_ARM_NEON;
14697     for (uint32_t n = 1; n <= 8; n++) {
14698       GemmMicrokernelTester()
14699         .mr(2)
14700         .nr(8)
14701         .kr(16)
14702         .sr(1)
14703         .m(2)
14704         .n(n)
14705         .k(16)
14706         .iterations(1)
14707         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14708     }
14709   }
14710 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_lt_16)14711   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_lt_16) {
14712     TEST_REQUIRES_ARM_NEON;
14713     for (size_t k = 1; k < 16; k++) {
14714       GemmMicrokernelTester()
14715         .mr(2)
14716         .nr(8)
14717         .kr(16)
14718         .sr(1)
14719         .m(2)
14720         .n(8)
14721         .k(k)
14722         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14723     }
14724   }
14725 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_lt_16_strided_a)14726   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_lt_16_strided_a) {
14727     TEST_REQUIRES_ARM_NEON;
14728     for (size_t k = 1; k < 16; k++) {
14729       GemmMicrokernelTester()
14730         .mr(2)
14731         .nr(8)
14732         .kr(16)
14733         .sr(1)
14734         .m(2)
14735         .n(8)
14736         .k(k)
14737         .a_stride(19)
14738         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14739     }
14740   }
14741 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_lt_16_subtile)14742   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_lt_16_subtile) {
14743     TEST_REQUIRES_ARM_NEON;
14744     for (size_t k = 1; k < 16; k++) {
14745       for (uint32_t n = 1; n <= 8; n++) {
14746         for (uint32_t m = 1; m <= 2; m++) {
14747           GemmMicrokernelTester()
14748             .mr(2)
14749             .nr(8)
14750             .kr(16)
14751             .sr(1)
14752             .m(m)
14753             .n(n)
14754             .k(k)
14755             .iterations(1)
14756             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14757         }
14758       }
14759     }
14760   }
14761 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_gt_16)14762   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_gt_16) {
14763     TEST_REQUIRES_ARM_NEON;
14764     for (size_t k = 17; k < 32; k++) {
14765       GemmMicrokernelTester()
14766         .mr(2)
14767         .nr(8)
14768         .kr(16)
14769         .sr(1)
14770         .m(2)
14771         .n(8)
14772         .k(k)
14773         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14774     }
14775   }
14776 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_gt_16_strided_a)14777   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_gt_16_strided_a) {
14778     TEST_REQUIRES_ARM_NEON;
14779     for (size_t k = 17; k < 32; k++) {
14780       GemmMicrokernelTester()
14781         .mr(2)
14782         .nr(8)
14783         .kr(16)
14784         .sr(1)
14785         .m(2)
14786         .n(8)
14787         .k(k)
14788         .a_stride(37)
14789         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14790     }
14791   }
14792 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_gt_16_subtile)14793   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_gt_16_subtile) {
14794     TEST_REQUIRES_ARM_NEON;
14795     for (size_t k = 17; k < 32; k++) {
14796       for (uint32_t n = 1; n <= 8; n++) {
14797         for (uint32_t m = 1; m <= 2; m++) {
14798           GemmMicrokernelTester()
14799             .mr(2)
14800             .nr(8)
14801             .kr(16)
14802             .sr(1)
14803             .m(m)
14804             .n(n)
14805             .k(k)
14806             .iterations(1)
14807             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14808         }
14809       }
14810     }
14811   }
14812 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_div_16)14813   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_div_16) {
14814     TEST_REQUIRES_ARM_NEON;
14815     for (size_t k = 32; k <= 160; k += 16) {
14816       GemmMicrokernelTester()
14817         .mr(2)
14818         .nr(8)
14819         .kr(16)
14820         .sr(1)
14821         .m(2)
14822         .n(8)
14823         .k(k)
14824         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14825     }
14826   }
14827 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_div_16_strided_a)14828   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_div_16_strided_a) {
14829     TEST_REQUIRES_ARM_NEON;
14830     for (size_t k = 32; k <= 160; k += 16) {
14831       GemmMicrokernelTester()
14832         .mr(2)
14833         .nr(8)
14834         .kr(16)
14835         .sr(1)
14836         .m(2)
14837         .n(8)
14838         .k(k)
14839         .a_stride(163)
14840         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14841     }
14842   }
14843 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,k_div_16_subtile)14844   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, k_div_16_subtile) {
14845     TEST_REQUIRES_ARM_NEON;
14846     for (size_t k = 32; k <= 160; k += 16) {
14847       for (uint32_t n = 1; n <= 8; n++) {
14848         for (uint32_t m = 1; m <= 2; m++) {
14849           GemmMicrokernelTester()
14850             .mr(2)
14851             .nr(8)
14852             .kr(16)
14853             .sr(1)
14854             .m(m)
14855             .n(n)
14856             .k(k)
14857             .iterations(1)
14858             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14859         }
14860       }
14861     }
14862   }
14863 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_gt_8)14864   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_gt_8) {
14865     TEST_REQUIRES_ARM_NEON;
14866     for (uint32_t n = 9; n < 16; n++) {
14867       for (size_t k = 1; k <= 80; k += 17) {
14868         GemmMicrokernelTester()
14869           .mr(2)
14870           .nr(8)
14871           .kr(16)
14872           .sr(1)
14873           .m(2)
14874           .n(n)
14875           .k(k)
14876           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14877       }
14878     }
14879   }
14880 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_gt_8_strided_cn)14881   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_gt_8_strided_cn) {
14882     TEST_REQUIRES_ARM_NEON;
14883     for (uint32_t n = 9; n < 16; n++) {
14884       for (size_t k = 1; k <= 80; k += 17) {
14885         GemmMicrokernelTester()
14886           .mr(2)
14887           .nr(8)
14888           .kr(16)
14889           .sr(1)
14890           .m(2)
14891           .n(n)
14892           .k(k)
14893           .cn_stride(11)
14894           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14895       }
14896     }
14897   }
14898 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_gt_8_strided_a)14899   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_gt_8_strided_a) {
14900     TEST_REQUIRES_ARM_NEON;
14901     for (uint32_t n = 9; n < 16; n++) {
14902       for (size_t k = 1; k <= 80; k += 17) {
14903         GemmMicrokernelTester()
14904           .mr(2)
14905           .nr(8)
14906           .kr(16)
14907           .sr(1)
14908           .m(2)
14909           .n(n)
14910           .k(k)
14911           .a_stride(83)
14912           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14913       }
14914     }
14915   }
14916 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_gt_8_subtile)14917   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_gt_8_subtile) {
14918     TEST_REQUIRES_ARM_NEON;
14919     for (uint32_t n = 9; n < 16; n++) {
14920       for (size_t k = 1; k <= 80; k += 17) {
14921         for (uint32_t m = 1; m <= 2; m++) {
14922           GemmMicrokernelTester()
14923             .mr(2)
14924             .nr(8)
14925             .kr(16)
14926             .sr(1)
14927             .m(m)
14928             .n(n)
14929             .k(k)
14930             .iterations(1)
14931             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14932         }
14933       }
14934     }
14935   }
14936 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_div_8)14937   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_div_8) {
14938     TEST_REQUIRES_ARM_NEON;
14939     for (uint32_t n = 16; n <= 24; n += 8) {
14940       for (size_t k = 1; k <= 80; k += 17) {
14941         GemmMicrokernelTester()
14942           .mr(2)
14943           .nr(8)
14944           .kr(16)
14945           .sr(1)
14946           .m(2)
14947           .n(n)
14948           .k(k)
14949           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14950       }
14951     }
14952   }
14953 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_div_8_strided_cn)14954   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_div_8_strided_cn) {
14955     TEST_REQUIRES_ARM_NEON;
14956     for (uint32_t n = 16; n <= 24; n += 8) {
14957       for (size_t k = 1; k <= 80; k += 17) {
14958         GemmMicrokernelTester()
14959           .mr(2)
14960           .nr(8)
14961           .kr(16)
14962           .sr(1)
14963           .m(2)
14964           .n(n)
14965           .k(k)
14966           .cn_stride(11)
14967           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14968       }
14969     }
14970   }
14971 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_div_8_strided_a)14972   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_div_8_strided_a) {
14973     TEST_REQUIRES_ARM_NEON;
14974     for (uint32_t n = 16; n <= 24; n += 8) {
14975       for (size_t k = 1; k <= 80; k += 17) {
14976         GemmMicrokernelTester()
14977           .mr(2)
14978           .nr(8)
14979           .kr(16)
14980           .sr(1)
14981           .m(2)
14982           .n(n)
14983           .k(k)
14984           .a_stride(83)
14985           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
14986       }
14987     }
14988   }
14989 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,n_div_8_subtile)14990   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, n_div_8_subtile) {
14991     TEST_REQUIRES_ARM_NEON;
14992     for (uint32_t n = 16; n <= 24; n += 8) {
14993       for (size_t k = 1; k <= 80; k += 17) {
14994         for (uint32_t m = 1; m <= 2; m++) {
14995           GemmMicrokernelTester()
14996             .mr(2)
14997             .nr(8)
14998             .kr(16)
14999             .sr(1)
15000             .m(m)
15001             .n(n)
15002             .k(k)
15003             .iterations(1)
15004             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15005         }
15006       }
15007     }
15008   }
15009 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,strided_cm_subtile)15010   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, strided_cm_subtile) {
15011     TEST_REQUIRES_ARM_NEON;
15012     for (size_t k = 1; k <= 80; k += 17) {
15013       for (uint32_t n = 1; n <= 8; n++) {
15014         for (uint32_t m = 1; m <= 2; m++) {
15015           GemmMicrokernelTester()
15016             .mr(2)
15017             .nr(8)
15018             .kr(16)
15019             .sr(1)
15020             .m(m)
15021             .n(n)
15022             .k(k)
15023             .cm_stride(11)
15024             .iterations(1)
15025             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15026         }
15027       }
15028     }
15029   }
15030 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,qmin)15031   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, qmin) {
15032     TEST_REQUIRES_ARM_NEON;
15033     GemmMicrokernelTester()
15034       .mr(2)
15035       .nr(8)
15036       .kr(16)
15037       .sr(1)
15038       .m(2)
15039       .n(8)
15040       .k(16)
15041       .qmin(128)
15042       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15043   }
15044 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,qmax)15045   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, qmax) {
15046     TEST_REQUIRES_ARM_NEON;
15047     GemmMicrokernelTester()
15048       .mr(2)
15049       .nr(8)
15050       .kr(16)
15051       .sr(1)
15052       .m(2)
15053       .n(8)
15054       .k(16)
15055       .qmax(128)
15056       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15057   }
15058 
TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL,strided_cm)15059   TEST(QS8_GEMM_MINMAX_FP32_2X8C16__AARCH64_NEON_MLAL, strided_cm) {
15060     TEST_REQUIRES_ARM_NEON;
15061     GemmMicrokernelTester()
15062       .mr(2)
15063       .nr(8)
15064       .kr(16)
15065       .sr(1)
15066       .m(2)
15067       .n(8)
15068       .k(16)
15069       .cm_stride(11)
15070       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c16__aarch64_neon_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15071   }
15072 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
15073 
15074 
15075 #if XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_eq_8)15076   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_eq_8) {
15077     TEST_REQUIRES_ARM_NEON;
15078     GemmMicrokernelTester()
15079       .mr(4)
15080       .nr(16)
15081       .kr(1)
15082       .sr(1)
15083       .m(4)
15084       .n(16)
15085       .k(8)
15086       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15087   }
15088 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,strided_cn)15089   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, strided_cn) {
15090     TEST_REQUIRES_ARM_NEON;
15091     GemmMicrokernelTester()
15092       .mr(4)
15093       .nr(16)
15094       .kr(1)
15095       .sr(1)
15096       .m(4)
15097       .n(16)
15098       .k(8)
15099       .cn_stride(19)
15100       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15101   }
15102 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_eq_8_strided_a)15103   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_eq_8_strided_a) {
15104     TEST_REQUIRES_ARM_NEON;
15105     GemmMicrokernelTester()
15106       .mr(4)
15107       .nr(16)
15108       .kr(1)
15109       .sr(1)
15110       .m(4)
15111       .n(16)
15112       .k(8)
15113       .a_stride(11)
15114       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15115   }
15116 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_eq_8_subtile)15117   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_eq_8_subtile) {
15118     TEST_REQUIRES_ARM_NEON;
15119     for (uint32_t n = 1; n <= 16; n++) {
15120       for (uint32_t m = 1; m <= 4; m++) {
15121         GemmMicrokernelTester()
15122           .mr(4)
15123           .nr(16)
15124           .kr(1)
15125           .sr(1)
15126           .m(m)
15127           .n(n)
15128           .k(8)
15129           .iterations(1)
15130           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15131       }
15132     }
15133   }
15134 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_eq_8_subtile_m)15135   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_eq_8_subtile_m) {
15136     TEST_REQUIRES_ARM_NEON;
15137     for (uint32_t m = 1; m <= 4; m++) {
15138       GemmMicrokernelTester()
15139         .mr(4)
15140         .nr(16)
15141         .kr(1)
15142         .sr(1)
15143         .m(m)
15144         .n(16)
15145         .k(8)
15146         .iterations(1)
15147         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15148     }
15149   }
15150 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_eq_8_subtile_n)15151   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_eq_8_subtile_n) {
15152     TEST_REQUIRES_ARM_NEON;
15153     for (uint32_t n = 1; n <= 16; n++) {
15154       GemmMicrokernelTester()
15155         .mr(4)
15156         .nr(16)
15157         .kr(1)
15158         .sr(1)
15159         .m(4)
15160         .n(n)
15161         .k(8)
15162         .iterations(1)
15163         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15164     }
15165   }
15166 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_lt_8)15167   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_lt_8) {
15168     TEST_REQUIRES_ARM_NEON;
15169     for (size_t k = 1; k < 8; k++) {
15170       GemmMicrokernelTester()
15171         .mr(4)
15172         .nr(16)
15173         .kr(1)
15174         .sr(1)
15175         .m(4)
15176         .n(16)
15177         .k(k)
15178         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15179     }
15180   }
15181 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_lt_8_strided_a)15182   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_lt_8_strided_a) {
15183     TEST_REQUIRES_ARM_NEON;
15184     for (size_t k = 1; k < 8; k++) {
15185       GemmMicrokernelTester()
15186         .mr(4)
15187         .nr(16)
15188         .kr(1)
15189         .sr(1)
15190         .m(4)
15191         .n(16)
15192         .k(k)
15193         .a_stride(11)
15194         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15195     }
15196   }
15197 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_lt_8_subtile)15198   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_lt_8_subtile) {
15199     TEST_REQUIRES_ARM_NEON;
15200     for (size_t k = 1; k < 8; k++) {
15201       for (uint32_t n = 1; n <= 16; n++) {
15202         for (uint32_t m = 1; m <= 4; m++) {
15203           GemmMicrokernelTester()
15204             .mr(4)
15205             .nr(16)
15206             .kr(1)
15207             .sr(1)
15208             .m(m)
15209             .n(n)
15210             .k(k)
15211             .iterations(1)
15212             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15213         }
15214       }
15215     }
15216   }
15217 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_gt_8)15218   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_gt_8) {
15219     TEST_REQUIRES_ARM_NEON;
15220     for (size_t k = 9; k < 16; k++) {
15221       GemmMicrokernelTester()
15222         .mr(4)
15223         .nr(16)
15224         .kr(1)
15225         .sr(1)
15226         .m(4)
15227         .n(16)
15228         .k(k)
15229         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15230     }
15231   }
15232 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_gt_8_strided_a)15233   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_gt_8_strided_a) {
15234     TEST_REQUIRES_ARM_NEON;
15235     for (size_t k = 9; k < 16; k++) {
15236       GemmMicrokernelTester()
15237         .mr(4)
15238         .nr(16)
15239         .kr(1)
15240         .sr(1)
15241         .m(4)
15242         .n(16)
15243         .k(k)
15244         .a_stride(19)
15245         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15246     }
15247   }
15248 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_gt_8_subtile)15249   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_gt_8_subtile) {
15250     TEST_REQUIRES_ARM_NEON;
15251     for (size_t k = 9; k < 16; k++) {
15252       for (uint32_t n = 1; n <= 16; n++) {
15253         for (uint32_t m = 1; m <= 4; m++) {
15254           GemmMicrokernelTester()
15255             .mr(4)
15256             .nr(16)
15257             .kr(1)
15258             .sr(1)
15259             .m(m)
15260             .n(n)
15261             .k(k)
15262             .iterations(1)
15263             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15264         }
15265       }
15266     }
15267   }
15268 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_div_8)15269   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_div_8) {
15270     TEST_REQUIRES_ARM_NEON;
15271     for (size_t k = 16; k <= 80; k += 8) {
15272       GemmMicrokernelTester()
15273         .mr(4)
15274         .nr(16)
15275         .kr(1)
15276         .sr(1)
15277         .m(4)
15278         .n(16)
15279         .k(k)
15280         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15281     }
15282   }
15283 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_div_8_strided_a)15284   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_div_8_strided_a) {
15285     TEST_REQUIRES_ARM_NEON;
15286     for (size_t k = 16; k <= 80; k += 8) {
15287       GemmMicrokernelTester()
15288         .mr(4)
15289         .nr(16)
15290         .kr(1)
15291         .sr(1)
15292         .m(4)
15293         .n(16)
15294         .k(k)
15295         .a_stride(83)
15296         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15297     }
15298   }
15299 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,k_div_8_subtile)15300   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, k_div_8_subtile) {
15301     TEST_REQUIRES_ARM_NEON;
15302     for (size_t k = 16; k <= 80; k += 8) {
15303       for (uint32_t n = 1; n <= 16; n++) {
15304         for (uint32_t m = 1; m <= 4; m++) {
15305           GemmMicrokernelTester()
15306             .mr(4)
15307             .nr(16)
15308             .kr(1)
15309             .sr(1)
15310             .m(m)
15311             .n(n)
15312             .k(k)
15313             .iterations(1)
15314             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15315         }
15316       }
15317     }
15318   }
15319 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_gt_16)15320   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_gt_16) {
15321     TEST_REQUIRES_ARM_NEON;
15322     for (uint32_t n = 17; n < 32; n++) {
15323       for (size_t k = 1; k <= 40; k += 9) {
15324         GemmMicrokernelTester()
15325           .mr(4)
15326           .nr(16)
15327           .kr(1)
15328           .sr(1)
15329           .m(4)
15330           .n(n)
15331           .k(k)
15332           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15333       }
15334     }
15335   }
15336 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_gt_16_strided_cn)15337   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_gt_16_strided_cn) {
15338     TEST_REQUIRES_ARM_NEON;
15339     for (uint32_t n = 17; n < 32; n++) {
15340       for (size_t k = 1; k <= 40; k += 9) {
15341         GemmMicrokernelTester()
15342           .mr(4)
15343           .nr(16)
15344           .kr(1)
15345           .sr(1)
15346           .m(4)
15347           .n(n)
15348           .k(k)
15349           .cn_stride(19)
15350           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15351       }
15352     }
15353   }
15354 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_gt_16_strided_a)15355   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_gt_16_strided_a) {
15356     TEST_REQUIRES_ARM_NEON;
15357     for (uint32_t n = 17; n < 32; n++) {
15358       for (size_t k = 1; k <= 40; k += 9) {
15359         GemmMicrokernelTester()
15360           .mr(4)
15361           .nr(16)
15362           .kr(1)
15363           .sr(1)
15364           .m(4)
15365           .n(n)
15366           .k(k)
15367           .a_stride(43)
15368           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15369       }
15370     }
15371   }
15372 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_gt_16_subtile)15373   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_gt_16_subtile) {
15374     TEST_REQUIRES_ARM_NEON;
15375     for (uint32_t n = 17; n < 32; n++) {
15376       for (size_t k = 1; k <= 40; k += 9) {
15377         for (uint32_t m = 1; m <= 4; m++) {
15378           GemmMicrokernelTester()
15379             .mr(4)
15380             .nr(16)
15381             .kr(1)
15382             .sr(1)
15383             .m(m)
15384             .n(n)
15385             .k(k)
15386             .iterations(1)
15387             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15388         }
15389       }
15390     }
15391   }
15392 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_div_16)15393   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_div_16) {
15394     TEST_REQUIRES_ARM_NEON;
15395     for (uint32_t n = 32; n <= 48; n += 16) {
15396       for (size_t k = 1; k <= 40; k += 9) {
15397         GemmMicrokernelTester()
15398           .mr(4)
15399           .nr(16)
15400           .kr(1)
15401           .sr(1)
15402           .m(4)
15403           .n(n)
15404           .k(k)
15405           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15406       }
15407     }
15408   }
15409 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_div_16_strided_cn)15410   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_div_16_strided_cn) {
15411     TEST_REQUIRES_ARM_NEON;
15412     for (uint32_t n = 32; n <= 48; n += 16) {
15413       for (size_t k = 1; k <= 40; k += 9) {
15414         GemmMicrokernelTester()
15415           .mr(4)
15416           .nr(16)
15417           .kr(1)
15418           .sr(1)
15419           .m(4)
15420           .n(n)
15421           .k(k)
15422           .cn_stride(19)
15423           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15424       }
15425     }
15426   }
15427 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_div_16_strided_a)15428   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_div_16_strided_a) {
15429     TEST_REQUIRES_ARM_NEON;
15430     for (uint32_t n = 32; n <= 48; n += 16) {
15431       for (size_t k = 1; k <= 40; k += 9) {
15432         GemmMicrokernelTester()
15433           .mr(4)
15434           .nr(16)
15435           .kr(1)
15436           .sr(1)
15437           .m(4)
15438           .n(n)
15439           .k(k)
15440           .a_stride(43)
15441           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15442       }
15443     }
15444   }
15445 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,n_div_16_subtile)15446   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, n_div_16_subtile) {
15447     TEST_REQUIRES_ARM_NEON;
15448     for (uint32_t n = 32; n <= 48; n += 16) {
15449       for (size_t k = 1; k <= 40; k += 9) {
15450         for (uint32_t m = 1; m <= 4; m++) {
15451           GemmMicrokernelTester()
15452             .mr(4)
15453             .nr(16)
15454             .kr(1)
15455             .sr(1)
15456             .m(m)
15457             .n(n)
15458             .k(k)
15459             .iterations(1)
15460             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15461         }
15462       }
15463     }
15464   }
15465 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,strided_cm_subtile)15466   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, strided_cm_subtile) {
15467     TEST_REQUIRES_ARM_NEON;
15468     for (size_t k = 1; k <= 40; k += 9) {
15469       for (uint32_t n = 1; n <= 16; n++) {
15470         for (uint32_t m = 1; m <= 4; m++) {
15471           GemmMicrokernelTester()
15472             .mr(4)
15473             .nr(16)
15474             .kr(1)
15475             .sr(1)
15476             .m(m)
15477             .n(n)
15478             .k(k)
15479             .cm_stride(19)
15480             .iterations(1)
15481             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15482         }
15483       }
15484     }
15485   }
15486 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,qmin)15487   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, qmin) {
15488     TEST_REQUIRES_ARM_NEON;
15489     GemmMicrokernelTester()
15490       .mr(4)
15491       .nr(16)
15492       .kr(1)
15493       .sr(1)
15494       .m(4)
15495       .n(16)
15496       .k(8)
15497       .qmin(128)
15498       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15499   }
15500 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,qmax)15501   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, qmax) {
15502     TEST_REQUIRES_ARM_NEON;
15503     GemmMicrokernelTester()
15504       .mr(4)
15505       .nr(16)
15506       .kr(1)
15507       .sr(1)
15508       .m(4)
15509       .n(16)
15510       .k(8)
15511       .qmax(128)
15512       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15513   }
15514 
TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53,strided_cm)15515   TEST(QS8_GEMM_MINMAX_FP32_4X16__AARCH64_NEON_MLAL_LANE_PRFM_CORTEX_A53, strided_cm) {
15516     TEST_REQUIRES_ARM_NEON;
15517     GemmMicrokernelTester()
15518       .mr(4)
15519       .nr(16)
15520       .kr(1)
15521       .sr(1)
15522       .m(4)
15523       .n(16)
15524       .k(8)
15525       .cm_stride(19)
15526       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__aarch64_neon_mlal_lane_prfm_cortex_a53, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15527   }
15528 #endif  // XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
15529 
15530 
15531 #if XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_eq_16)15532   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_eq_16) {
15533     TEST_REQUIRES_ARM_NEON_DOT;
15534     GemmMicrokernelTester()
15535       .mr(4)
15536       .nr(16)
15537       .kr(4)
15538       .sr(1)
15539       .m(4)
15540       .n(16)
15541       .k(16)
15542       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15543   }
15544 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,strided_cn)15545   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, strided_cn) {
15546     TEST_REQUIRES_ARM_NEON_DOT;
15547     GemmMicrokernelTester()
15548       .mr(4)
15549       .nr(16)
15550       .kr(4)
15551       .sr(1)
15552       .m(4)
15553       .n(16)
15554       .k(16)
15555       .cn_stride(19)
15556       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15557   }
15558 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_eq_16_strided_a)15559   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_eq_16_strided_a) {
15560     TEST_REQUIRES_ARM_NEON_DOT;
15561     GemmMicrokernelTester()
15562       .mr(4)
15563       .nr(16)
15564       .kr(4)
15565       .sr(1)
15566       .m(4)
15567       .n(16)
15568       .k(16)
15569       .a_stride(19)
15570       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15571   }
15572 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_eq_16_subtile)15573   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_eq_16_subtile) {
15574     TEST_REQUIRES_ARM_NEON_DOT;
15575     for (uint32_t n = 1; n <= 16; n++) {
15576       for (uint32_t m = 1; m <= 4; m++) {
15577         GemmMicrokernelTester()
15578           .mr(4)
15579           .nr(16)
15580           .kr(4)
15581           .sr(1)
15582           .m(m)
15583           .n(n)
15584           .k(16)
15585           .iterations(1)
15586           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15587       }
15588     }
15589   }
15590 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_eq_16_subtile_m)15591   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_eq_16_subtile_m) {
15592     TEST_REQUIRES_ARM_NEON_DOT;
15593     for (uint32_t m = 1; m <= 4; m++) {
15594       GemmMicrokernelTester()
15595         .mr(4)
15596         .nr(16)
15597         .kr(4)
15598         .sr(1)
15599         .m(m)
15600         .n(16)
15601         .k(16)
15602         .iterations(1)
15603         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15604     }
15605   }
15606 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_eq_16_subtile_n)15607   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_eq_16_subtile_n) {
15608     TEST_REQUIRES_ARM_NEON_DOT;
15609     for (uint32_t n = 1; n <= 16; n++) {
15610       GemmMicrokernelTester()
15611         .mr(4)
15612         .nr(16)
15613         .kr(4)
15614         .sr(1)
15615         .m(4)
15616         .n(n)
15617         .k(16)
15618         .iterations(1)
15619         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15620     }
15621   }
15622 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_lt_16)15623   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_lt_16) {
15624     TEST_REQUIRES_ARM_NEON_DOT;
15625     for (size_t k = 1; k < 16; k++) {
15626       GemmMicrokernelTester()
15627         .mr(4)
15628         .nr(16)
15629         .kr(4)
15630         .sr(1)
15631         .m(4)
15632         .n(16)
15633         .k(k)
15634         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15635     }
15636   }
15637 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_lt_16_strided_a)15638   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_lt_16_strided_a) {
15639     TEST_REQUIRES_ARM_NEON_DOT;
15640     for (size_t k = 1; k < 16; k++) {
15641       GemmMicrokernelTester()
15642         .mr(4)
15643         .nr(16)
15644         .kr(4)
15645         .sr(1)
15646         .m(4)
15647         .n(16)
15648         .k(k)
15649         .a_stride(19)
15650         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15651     }
15652   }
15653 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_lt_16_subtile)15654   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_lt_16_subtile) {
15655     TEST_REQUIRES_ARM_NEON_DOT;
15656     for (size_t k = 1; k < 16; k++) {
15657       for (uint32_t n = 1; n <= 16; n++) {
15658         for (uint32_t m = 1; m <= 4; m++) {
15659           GemmMicrokernelTester()
15660             .mr(4)
15661             .nr(16)
15662             .kr(4)
15663             .sr(1)
15664             .m(m)
15665             .n(n)
15666             .k(k)
15667             .iterations(1)
15668             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15669         }
15670       }
15671     }
15672   }
15673 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_gt_16)15674   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_gt_16) {
15675     TEST_REQUIRES_ARM_NEON_DOT;
15676     for (size_t k = 17; k < 32; k++) {
15677       GemmMicrokernelTester()
15678         .mr(4)
15679         .nr(16)
15680         .kr(4)
15681         .sr(1)
15682         .m(4)
15683         .n(16)
15684         .k(k)
15685         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15686     }
15687   }
15688 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_gt_16_strided_a)15689   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_gt_16_strided_a) {
15690     TEST_REQUIRES_ARM_NEON_DOT;
15691     for (size_t k = 17; k < 32; k++) {
15692       GemmMicrokernelTester()
15693         .mr(4)
15694         .nr(16)
15695         .kr(4)
15696         .sr(1)
15697         .m(4)
15698         .n(16)
15699         .k(k)
15700         .a_stride(37)
15701         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15702     }
15703   }
15704 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_gt_16_subtile)15705   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_gt_16_subtile) {
15706     TEST_REQUIRES_ARM_NEON_DOT;
15707     for (size_t k = 17; k < 32; k++) {
15708       for (uint32_t n = 1; n <= 16; n++) {
15709         for (uint32_t m = 1; m <= 4; m++) {
15710           GemmMicrokernelTester()
15711             .mr(4)
15712             .nr(16)
15713             .kr(4)
15714             .sr(1)
15715             .m(m)
15716             .n(n)
15717             .k(k)
15718             .iterations(1)
15719             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15720         }
15721       }
15722     }
15723   }
15724 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_div_16)15725   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_div_16) {
15726     TEST_REQUIRES_ARM_NEON_DOT;
15727     for (size_t k = 32; k <= 160; k += 16) {
15728       GemmMicrokernelTester()
15729         .mr(4)
15730         .nr(16)
15731         .kr(4)
15732         .sr(1)
15733         .m(4)
15734         .n(16)
15735         .k(k)
15736         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15737     }
15738   }
15739 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_div_16_strided_a)15740   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_div_16_strided_a) {
15741     TEST_REQUIRES_ARM_NEON_DOT;
15742     for (size_t k = 32; k <= 160; k += 16) {
15743       GemmMicrokernelTester()
15744         .mr(4)
15745         .nr(16)
15746         .kr(4)
15747         .sr(1)
15748         .m(4)
15749         .n(16)
15750         .k(k)
15751         .a_stride(163)
15752         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15753     }
15754   }
15755 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,k_div_16_subtile)15756   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, k_div_16_subtile) {
15757     TEST_REQUIRES_ARM_NEON_DOT;
15758     for (size_t k = 32; k <= 160; k += 16) {
15759       for (uint32_t n = 1; n <= 16; n++) {
15760         for (uint32_t m = 1; m <= 4; m++) {
15761           GemmMicrokernelTester()
15762             .mr(4)
15763             .nr(16)
15764             .kr(4)
15765             .sr(1)
15766             .m(m)
15767             .n(n)
15768             .k(k)
15769             .iterations(1)
15770             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15771         }
15772       }
15773     }
15774   }
15775 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_gt_16)15776   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_gt_16) {
15777     TEST_REQUIRES_ARM_NEON_DOT;
15778     for (uint32_t n = 17; n < 32; n++) {
15779       for (size_t k = 1; k <= 80; k += 17) {
15780         GemmMicrokernelTester()
15781           .mr(4)
15782           .nr(16)
15783           .kr(4)
15784           .sr(1)
15785           .m(4)
15786           .n(n)
15787           .k(k)
15788           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15789       }
15790     }
15791   }
15792 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_gt_16_strided_cn)15793   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_gt_16_strided_cn) {
15794     TEST_REQUIRES_ARM_NEON_DOT;
15795     for (uint32_t n = 17; n < 32; n++) {
15796       for (size_t k = 1; k <= 80; k += 17) {
15797         GemmMicrokernelTester()
15798           .mr(4)
15799           .nr(16)
15800           .kr(4)
15801           .sr(1)
15802           .m(4)
15803           .n(n)
15804           .k(k)
15805           .cn_stride(19)
15806           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15807       }
15808     }
15809   }
15810 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_gt_16_strided_a)15811   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_gt_16_strided_a) {
15812     TEST_REQUIRES_ARM_NEON_DOT;
15813     for (uint32_t n = 17; n < 32; n++) {
15814       for (size_t k = 1; k <= 80; k += 17) {
15815         GemmMicrokernelTester()
15816           .mr(4)
15817           .nr(16)
15818           .kr(4)
15819           .sr(1)
15820           .m(4)
15821           .n(n)
15822           .k(k)
15823           .a_stride(83)
15824           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15825       }
15826     }
15827   }
15828 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_gt_16_subtile)15829   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_gt_16_subtile) {
15830     TEST_REQUIRES_ARM_NEON_DOT;
15831     for (uint32_t n = 17; n < 32; n++) {
15832       for (size_t k = 1; k <= 80; k += 17) {
15833         for (uint32_t m = 1; m <= 4; m++) {
15834           GemmMicrokernelTester()
15835             .mr(4)
15836             .nr(16)
15837             .kr(4)
15838             .sr(1)
15839             .m(m)
15840             .n(n)
15841             .k(k)
15842             .iterations(1)
15843             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15844         }
15845       }
15846     }
15847   }
15848 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_div_16)15849   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_div_16) {
15850     TEST_REQUIRES_ARM_NEON_DOT;
15851     for (uint32_t n = 32; n <= 48; n += 16) {
15852       for (size_t k = 1; k <= 80; k += 17) {
15853         GemmMicrokernelTester()
15854           .mr(4)
15855           .nr(16)
15856           .kr(4)
15857           .sr(1)
15858           .m(4)
15859           .n(n)
15860           .k(k)
15861           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15862       }
15863     }
15864   }
15865 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_div_16_strided_cn)15866   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_div_16_strided_cn) {
15867     TEST_REQUIRES_ARM_NEON_DOT;
15868     for (uint32_t n = 32; n <= 48; n += 16) {
15869       for (size_t k = 1; k <= 80; k += 17) {
15870         GemmMicrokernelTester()
15871           .mr(4)
15872           .nr(16)
15873           .kr(4)
15874           .sr(1)
15875           .m(4)
15876           .n(n)
15877           .k(k)
15878           .cn_stride(19)
15879           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15880       }
15881     }
15882   }
15883 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_div_16_strided_a)15884   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_div_16_strided_a) {
15885     TEST_REQUIRES_ARM_NEON_DOT;
15886     for (uint32_t n = 32; n <= 48; n += 16) {
15887       for (size_t k = 1; k <= 80; k += 17) {
15888         GemmMicrokernelTester()
15889           .mr(4)
15890           .nr(16)
15891           .kr(4)
15892           .sr(1)
15893           .m(4)
15894           .n(n)
15895           .k(k)
15896           .a_stride(83)
15897           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15898       }
15899     }
15900   }
15901 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,n_div_16_subtile)15902   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, n_div_16_subtile) {
15903     TEST_REQUIRES_ARM_NEON_DOT;
15904     for (uint32_t n = 32; n <= 48; n += 16) {
15905       for (size_t k = 1; k <= 80; k += 17) {
15906         for (uint32_t m = 1; m <= 4; m++) {
15907           GemmMicrokernelTester()
15908             .mr(4)
15909             .nr(16)
15910             .kr(4)
15911             .sr(1)
15912             .m(m)
15913             .n(n)
15914             .k(k)
15915             .iterations(1)
15916             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15917         }
15918       }
15919     }
15920   }
15921 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,strided_cm_subtile)15922   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, strided_cm_subtile) {
15923     TEST_REQUIRES_ARM_NEON_DOT;
15924     for (size_t k = 1; k <= 80; k += 17) {
15925       for (uint32_t n = 1; n <= 16; n++) {
15926         for (uint32_t m = 1; m <= 4; m++) {
15927           GemmMicrokernelTester()
15928             .mr(4)
15929             .nr(16)
15930             .kr(4)
15931             .sr(1)
15932             .m(m)
15933             .n(n)
15934             .k(k)
15935             .cm_stride(19)
15936             .iterations(1)
15937             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15938         }
15939       }
15940     }
15941   }
15942 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,qmin)15943   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, qmin) {
15944     TEST_REQUIRES_ARM_NEON_DOT;
15945     GemmMicrokernelTester()
15946       .mr(4)
15947       .nr(16)
15948       .kr(4)
15949       .sr(1)
15950       .m(4)
15951       .n(16)
15952       .k(16)
15953       .qmin(128)
15954       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15955   }
15956 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,qmax)15957   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, qmax) {
15958     TEST_REQUIRES_ARM_NEON_DOT;
15959     GemmMicrokernelTester()
15960       .mr(4)
15961       .nr(16)
15962       .kr(4)
15963       .sr(1)
15964       .m(4)
15965       .n(16)
15966       .k(16)
15967       .qmax(128)
15968       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15969   }
15970 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55,strided_cm)15971   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_CORTEX_A55, strided_cm) {
15972     TEST_REQUIRES_ARM_NEON_DOT;
15973     GemmMicrokernelTester()
15974       .mr(4)
15975       .nr(16)
15976       .kr(4)
15977       .sr(1)
15978       .m(4)
15979       .n(16)
15980       .k(16)
15981       .cm_stride(19)
15982       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_cortex_a55, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15983   }
15984 #endif  // XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
15985 
15986 
15987 #if XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_eq_4)15988   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_eq_4) {
15989     TEST_REQUIRES_ARM_NEON_DOT;
15990     GemmMicrokernelTester()
15991       .mr(4)
15992       .nr(16)
15993       .kr(4)
15994       .sr(1)
15995       .m(4)
15996       .n(16)
15997       .k(4)
15998       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
15999   }
16000 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,strided_cn)16001   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, strided_cn) {
16002     TEST_REQUIRES_ARM_NEON_DOT;
16003     GemmMicrokernelTester()
16004       .mr(4)
16005       .nr(16)
16006       .kr(4)
16007       .sr(1)
16008       .m(4)
16009       .n(16)
16010       .k(4)
16011       .cn_stride(19)
16012       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16013   }
16014 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_eq_4_strided_a)16015   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_eq_4_strided_a) {
16016     TEST_REQUIRES_ARM_NEON_DOT;
16017     GemmMicrokernelTester()
16018       .mr(4)
16019       .nr(16)
16020       .kr(4)
16021       .sr(1)
16022       .m(4)
16023       .n(16)
16024       .k(4)
16025       .a_stride(7)
16026       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16027   }
16028 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_eq_4_subtile)16029   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_eq_4_subtile) {
16030     TEST_REQUIRES_ARM_NEON_DOT;
16031     for (uint32_t n = 1; n <= 16; n++) {
16032       for (uint32_t m = 1; m <= 4; m++) {
16033         GemmMicrokernelTester()
16034           .mr(4)
16035           .nr(16)
16036           .kr(4)
16037           .sr(1)
16038           .m(m)
16039           .n(n)
16040           .k(4)
16041           .iterations(1)
16042           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16043       }
16044     }
16045   }
16046 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_eq_4_subtile_m)16047   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_eq_4_subtile_m) {
16048     TEST_REQUIRES_ARM_NEON_DOT;
16049     for (uint32_t m = 1; m <= 4; m++) {
16050       GemmMicrokernelTester()
16051         .mr(4)
16052         .nr(16)
16053         .kr(4)
16054         .sr(1)
16055         .m(m)
16056         .n(16)
16057         .k(4)
16058         .iterations(1)
16059         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16060     }
16061   }
16062 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_eq_4_subtile_n)16063   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_eq_4_subtile_n) {
16064     TEST_REQUIRES_ARM_NEON_DOT;
16065     for (uint32_t n = 1; n <= 16; n++) {
16066       GemmMicrokernelTester()
16067         .mr(4)
16068         .nr(16)
16069         .kr(4)
16070         .sr(1)
16071         .m(4)
16072         .n(n)
16073         .k(4)
16074         .iterations(1)
16075         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16076     }
16077   }
16078 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_lt_4)16079   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_lt_4) {
16080     TEST_REQUIRES_ARM_NEON_DOT;
16081     for (size_t k = 1; k < 4; k++) {
16082       GemmMicrokernelTester()
16083         .mr(4)
16084         .nr(16)
16085         .kr(4)
16086         .sr(1)
16087         .m(4)
16088         .n(16)
16089         .k(k)
16090         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16091     }
16092   }
16093 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_lt_4_strided_a)16094   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_lt_4_strided_a) {
16095     TEST_REQUIRES_ARM_NEON_DOT;
16096     for (size_t k = 1; k < 4; k++) {
16097       GemmMicrokernelTester()
16098         .mr(4)
16099         .nr(16)
16100         .kr(4)
16101         .sr(1)
16102         .m(4)
16103         .n(16)
16104         .k(k)
16105         .a_stride(7)
16106         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16107     }
16108   }
16109 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_lt_4_subtile)16110   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_lt_4_subtile) {
16111     TEST_REQUIRES_ARM_NEON_DOT;
16112     for (size_t k = 1; k < 4; k++) {
16113       for (uint32_t n = 1; n <= 16; n++) {
16114         for (uint32_t m = 1; m <= 4; m++) {
16115           GemmMicrokernelTester()
16116             .mr(4)
16117             .nr(16)
16118             .kr(4)
16119             .sr(1)
16120             .m(m)
16121             .n(n)
16122             .k(k)
16123             .iterations(1)
16124             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16125         }
16126       }
16127     }
16128   }
16129 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_gt_4)16130   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_gt_4) {
16131     TEST_REQUIRES_ARM_NEON_DOT;
16132     for (size_t k = 5; k < 8; k++) {
16133       GemmMicrokernelTester()
16134         .mr(4)
16135         .nr(16)
16136         .kr(4)
16137         .sr(1)
16138         .m(4)
16139         .n(16)
16140         .k(k)
16141         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16142     }
16143   }
16144 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_gt_4_strided_a)16145   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_gt_4_strided_a) {
16146     TEST_REQUIRES_ARM_NEON_DOT;
16147     for (size_t k = 5; k < 8; k++) {
16148       GemmMicrokernelTester()
16149         .mr(4)
16150         .nr(16)
16151         .kr(4)
16152         .sr(1)
16153         .m(4)
16154         .n(16)
16155         .k(k)
16156         .a_stride(11)
16157         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16158     }
16159   }
16160 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_gt_4_subtile)16161   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_gt_4_subtile) {
16162     TEST_REQUIRES_ARM_NEON_DOT;
16163     for (size_t k = 5; k < 8; k++) {
16164       for (uint32_t n = 1; n <= 16; n++) {
16165         for (uint32_t m = 1; m <= 4; m++) {
16166           GemmMicrokernelTester()
16167             .mr(4)
16168             .nr(16)
16169             .kr(4)
16170             .sr(1)
16171             .m(m)
16172             .n(n)
16173             .k(k)
16174             .iterations(1)
16175             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16176         }
16177       }
16178     }
16179   }
16180 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_div_4)16181   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_div_4) {
16182     TEST_REQUIRES_ARM_NEON_DOT;
16183     for (size_t k = 8; k <= 40; k += 4) {
16184       GemmMicrokernelTester()
16185         .mr(4)
16186         .nr(16)
16187         .kr(4)
16188         .sr(1)
16189         .m(4)
16190         .n(16)
16191         .k(k)
16192         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16193     }
16194   }
16195 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_div_4_strided_a)16196   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_div_4_strided_a) {
16197     TEST_REQUIRES_ARM_NEON_DOT;
16198     for (size_t k = 8; k <= 40; k += 4) {
16199       GemmMicrokernelTester()
16200         .mr(4)
16201         .nr(16)
16202         .kr(4)
16203         .sr(1)
16204         .m(4)
16205         .n(16)
16206         .k(k)
16207         .a_stride(43)
16208         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16209     }
16210   }
16211 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,k_div_4_subtile)16212   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, k_div_4_subtile) {
16213     TEST_REQUIRES_ARM_NEON_DOT;
16214     for (size_t k = 8; k <= 40; k += 4) {
16215       for (uint32_t n = 1; n <= 16; n++) {
16216         for (uint32_t m = 1; m <= 4; m++) {
16217           GemmMicrokernelTester()
16218             .mr(4)
16219             .nr(16)
16220             .kr(4)
16221             .sr(1)
16222             .m(m)
16223             .n(n)
16224             .k(k)
16225             .iterations(1)
16226             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16227         }
16228       }
16229     }
16230   }
16231 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_gt_16)16232   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_gt_16) {
16233     TEST_REQUIRES_ARM_NEON_DOT;
16234     for (uint32_t n = 17; n < 32; n++) {
16235       for (size_t k = 1; k <= 20; k += 5) {
16236         GemmMicrokernelTester()
16237           .mr(4)
16238           .nr(16)
16239           .kr(4)
16240           .sr(1)
16241           .m(4)
16242           .n(n)
16243           .k(k)
16244           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16245       }
16246     }
16247   }
16248 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_gt_16_strided_cn)16249   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_gt_16_strided_cn) {
16250     TEST_REQUIRES_ARM_NEON_DOT;
16251     for (uint32_t n = 17; n < 32; n++) {
16252       for (size_t k = 1; k <= 20; k += 5) {
16253         GemmMicrokernelTester()
16254           .mr(4)
16255           .nr(16)
16256           .kr(4)
16257           .sr(1)
16258           .m(4)
16259           .n(n)
16260           .k(k)
16261           .cn_stride(19)
16262           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16263       }
16264     }
16265   }
16266 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_gt_16_strided_a)16267   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_gt_16_strided_a) {
16268     TEST_REQUIRES_ARM_NEON_DOT;
16269     for (uint32_t n = 17; n < 32; n++) {
16270       for (size_t k = 1; k <= 20; k += 5) {
16271         GemmMicrokernelTester()
16272           .mr(4)
16273           .nr(16)
16274           .kr(4)
16275           .sr(1)
16276           .m(4)
16277           .n(n)
16278           .k(k)
16279           .a_stride(23)
16280           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16281       }
16282     }
16283   }
16284 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_gt_16_subtile)16285   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_gt_16_subtile) {
16286     TEST_REQUIRES_ARM_NEON_DOT;
16287     for (uint32_t n = 17; n < 32; n++) {
16288       for (size_t k = 1; k <= 20; k += 5) {
16289         for (uint32_t m = 1; m <= 4; m++) {
16290           GemmMicrokernelTester()
16291             .mr(4)
16292             .nr(16)
16293             .kr(4)
16294             .sr(1)
16295             .m(m)
16296             .n(n)
16297             .k(k)
16298             .iterations(1)
16299             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16300         }
16301       }
16302     }
16303   }
16304 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_div_16)16305   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_div_16) {
16306     TEST_REQUIRES_ARM_NEON_DOT;
16307     for (uint32_t n = 32; n <= 48; n += 16) {
16308       for (size_t k = 1; k <= 20; k += 5) {
16309         GemmMicrokernelTester()
16310           .mr(4)
16311           .nr(16)
16312           .kr(4)
16313           .sr(1)
16314           .m(4)
16315           .n(n)
16316           .k(k)
16317           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16318       }
16319     }
16320   }
16321 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_div_16_strided_cn)16322   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_div_16_strided_cn) {
16323     TEST_REQUIRES_ARM_NEON_DOT;
16324     for (uint32_t n = 32; n <= 48; n += 16) {
16325       for (size_t k = 1; k <= 20; k += 5) {
16326         GemmMicrokernelTester()
16327           .mr(4)
16328           .nr(16)
16329           .kr(4)
16330           .sr(1)
16331           .m(4)
16332           .n(n)
16333           .k(k)
16334           .cn_stride(19)
16335           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16336       }
16337     }
16338   }
16339 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_div_16_strided_a)16340   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_div_16_strided_a) {
16341     TEST_REQUIRES_ARM_NEON_DOT;
16342     for (uint32_t n = 32; n <= 48; n += 16) {
16343       for (size_t k = 1; k <= 20; k += 5) {
16344         GemmMicrokernelTester()
16345           .mr(4)
16346           .nr(16)
16347           .kr(4)
16348           .sr(1)
16349           .m(4)
16350           .n(n)
16351           .k(k)
16352           .a_stride(23)
16353           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16354       }
16355     }
16356   }
16357 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,n_div_16_subtile)16358   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, n_div_16_subtile) {
16359     TEST_REQUIRES_ARM_NEON_DOT;
16360     for (uint32_t n = 32; n <= 48; n += 16) {
16361       for (size_t k = 1; k <= 20; k += 5) {
16362         for (uint32_t m = 1; m <= 4; m++) {
16363           GemmMicrokernelTester()
16364             .mr(4)
16365             .nr(16)
16366             .kr(4)
16367             .sr(1)
16368             .m(m)
16369             .n(n)
16370             .k(k)
16371             .iterations(1)
16372             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16373         }
16374       }
16375     }
16376   }
16377 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,strided_cm_subtile)16378   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, strided_cm_subtile) {
16379     TEST_REQUIRES_ARM_NEON_DOT;
16380     for (size_t k = 1; k <= 20; k += 5) {
16381       for (uint32_t n = 1; n <= 16; n++) {
16382         for (uint32_t m = 1; m <= 4; m++) {
16383           GemmMicrokernelTester()
16384             .mr(4)
16385             .nr(16)
16386             .kr(4)
16387             .sr(1)
16388             .m(m)
16389             .n(n)
16390             .k(k)
16391             .cm_stride(19)
16392             .iterations(1)
16393             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16394         }
16395       }
16396     }
16397   }
16398 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,qmin)16399   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, qmin) {
16400     TEST_REQUIRES_ARM_NEON_DOT;
16401     GemmMicrokernelTester()
16402       .mr(4)
16403       .nr(16)
16404       .kr(4)
16405       .sr(1)
16406       .m(4)
16407       .n(16)
16408       .k(4)
16409       .qmin(128)
16410       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16411   }
16412 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,qmax)16413   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, qmax) {
16414     TEST_REQUIRES_ARM_NEON_DOT;
16415     GemmMicrokernelTester()
16416       .mr(4)
16417       .nr(16)
16418       .kr(4)
16419       .sr(1)
16420       .m(4)
16421       .n(16)
16422       .k(4)
16423       .qmax(128)
16424       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16425   }
16426 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32,strided_cm)16427   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD32, strided_cm) {
16428     TEST_REQUIRES_ARM_NEON_DOT;
16429     GemmMicrokernelTester()
16430       .mr(4)
16431       .nr(16)
16432       .kr(4)
16433       .sr(1)
16434       .m(4)
16435       .n(16)
16436       .k(4)
16437       .cm_stride(19)
16438       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld32, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16439   }
16440 #endif  // XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
16441 
16442 
16443 #if XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_eq_8)16444   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_eq_8) {
16445     TEST_REQUIRES_ARM_NEON_DOT;
16446     GemmMicrokernelTester()
16447       .mr(4)
16448       .nr(16)
16449       .kr(4)
16450       .sr(1)
16451       .m(4)
16452       .n(16)
16453       .k(8)
16454       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16455   }
16456 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,strided_cn)16457   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, strided_cn) {
16458     TEST_REQUIRES_ARM_NEON_DOT;
16459     GemmMicrokernelTester()
16460       .mr(4)
16461       .nr(16)
16462       .kr(4)
16463       .sr(1)
16464       .m(4)
16465       .n(16)
16466       .k(8)
16467       .cn_stride(19)
16468       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16469   }
16470 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_eq_8_strided_a)16471   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_eq_8_strided_a) {
16472     TEST_REQUIRES_ARM_NEON_DOT;
16473     GemmMicrokernelTester()
16474       .mr(4)
16475       .nr(16)
16476       .kr(4)
16477       .sr(1)
16478       .m(4)
16479       .n(16)
16480       .k(8)
16481       .a_stride(11)
16482       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16483   }
16484 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_eq_8_subtile)16485   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_eq_8_subtile) {
16486     TEST_REQUIRES_ARM_NEON_DOT;
16487     for (uint32_t n = 1; n <= 16; n++) {
16488       for (uint32_t m = 1; m <= 4; m++) {
16489         GemmMicrokernelTester()
16490           .mr(4)
16491           .nr(16)
16492           .kr(4)
16493           .sr(1)
16494           .m(m)
16495           .n(n)
16496           .k(8)
16497           .iterations(1)
16498           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16499       }
16500     }
16501   }
16502 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_eq_8_subtile_m)16503   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_eq_8_subtile_m) {
16504     TEST_REQUIRES_ARM_NEON_DOT;
16505     for (uint32_t m = 1; m <= 4; m++) {
16506       GemmMicrokernelTester()
16507         .mr(4)
16508         .nr(16)
16509         .kr(4)
16510         .sr(1)
16511         .m(m)
16512         .n(16)
16513         .k(8)
16514         .iterations(1)
16515         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16516     }
16517   }
16518 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_eq_8_subtile_n)16519   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_eq_8_subtile_n) {
16520     TEST_REQUIRES_ARM_NEON_DOT;
16521     for (uint32_t n = 1; n <= 16; n++) {
16522       GemmMicrokernelTester()
16523         .mr(4)
16524         .nr(16)
16525         .kr(4)
16526         .sr(1)
16527         .m(4)
16528         .n(n)
16529         .k(8)
16530         .iterations(1)
16531         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16532     }
16533   }
16534 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_lt_8)16535   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_lt_8) {
16536     TEST_REQUIRES_ARM_NEON_DOT;
16537     for (size_t k = 1; k < 8; k++) {
16538       GemmMicrokernelTester()
16539         .mr(4)
16540         .nr(16)
16541         .kr(4)
16542         .sr(1)
16543         .m(4)
16544         .n(16)
16545         .k(k)
16546         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16547     }
16548   }
16549 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_lt_8_strided_a)16550   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_lt_8_strided_a) {
16551     TEST_REQUIRES_ARM_NEON_DOT;
16552     for (size_t k = 1; k < 8; k++) {
16553       GemmMicrokernelTester()
16554         .mr(4)
16555         .nr(16)
16556         .kr(4)
16557         .sr(1)
16558         .m(4)
16559         .n(16)
16560         .k(k)
16561         .a_stride(11)
16562         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16563     }
16564   }
16565 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_lt_8_subtile)16566   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_lt_8_subtile) {
16567     TEST_REQUIRES_ARM_NEON_DOT;
16568     for (size_t k = 1; k < 8; k++) {
16569       for (uint32_t n = 1; n <= 16; n++) {
16570         for (uint32_t m = 1; m <= 4; m++) {
16571           GemmMicrokernelTester()
16572             .mr(4)
16573             .nr(16)
16574             .kr(4)
16575             .sr(1)
16576             .m(m)
16577             .n(n)
16578             .k(k)
16579             .iterations(1)
16580             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16581         }
16582       }
16583     }
16584   }
16585 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_gt_8)16586   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_gt_8) {
16587     TEST_REQUIRES_ARM_NEON_DOT;
16588     for (size_t k = 9; k < 16; k++) {
16589       GemmMicrokernelTester()
16590         .mr(4)
16591         .nr(16)
16592         .kr(4)
16593         .sr(1)
16594         .m(4)
16595         .n(16)
16596         .k(k)
16597         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16598     }
16599   }
16600 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_gt_8_strided_a)16601   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_gt_8_strided_a) {
16602     TEST_REQUIRES_ARM_NEON_DOT;
16603     for (size_t k = 9; k < 16; k++) {
16604       GemmMicrokernelTester()
16605         .mr(4)
16606         .nr(16)
16607         .kr(4)
16608         .sr(1)
16609         .m(4)
16610         .n(16)
16611         .k(k)
16612         .a_stride(19)
16613         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16614     }
16615   }
16616 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_gt_8_subtile)16617   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_gt_8_subtile) {
16618     TEST_REQUIRES_ARM_NEON_DOT;
16619     for (size_t k = 9; k < 16; k++) {
16620       for (uint32_t n = 1; n <= 16; n++) {
16621         for (uint32_t m = 1; m <= 4; m++) {
16622           GemmMicrokernelTester()
16623             .mr(4)
16624             .nr(16)
16625             .kr(4)
16626             .sr(1)
16627             .m(m)
16628             .n(n)
16629             .k(k)
16630             .iterations(1)
16631             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16632         }
16633       }
16634     }
16635   }
16636 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_div_8)16637   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_div_8) {
16638     TEST_REQUIRES_ARM_NEON_DOT;
16639     for (size_t k = 16; k <= 80; k += 8) {
16640       GemmMicrokernelTester()
16641         .mr(4)
16642         .nr(16)
16643         .kr(4)
16644         .sr(1)
16645         .m(4)
16646         .n(16)
16647         .k(k)
16648         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16649     }
16650   }
16651 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_div_8_strided_a)16652   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_div_8_strided_a) {
16653     TEST_REQUIRES_ARM_NEON_DOT;
16654     for (size_t k = 16; k <= 80; k += 8) {
16655       GemmMicrokernelTester()
16656         .mr(4)
16657         .nr(16)
16658         .kr(4)
16659         .sr(1)
16660         .m(4)
16661         .n(16)
16662         .k(k)
16663         .a_stride(83)
16664         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16665     }
16666   }
16667 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,k_div_8_subtile)16668   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, k_div_8_subtile) {
16669     TEST_REQUIRES_ARM_NEON_DOT;
16670     for (size_t k = 16; k <= 80; k += 8) {
16671       for (uint32_t n = 1; n <= 16; n++) {
16672         for (uint32_t m = 1; m <= 4; m++) {
16673           GemmMicrokernelTester()
16674             .mr(4)
16675             .nr(16)
16676             .kr(4)
16677             .sr(1)
16678             .m(m)
16679             .n(n)
16680             .k(k)
16681             .iterations(1)
16682             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16683         }
16684       }
16685     }
16686   }
16687 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_gt_16)16688   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_gt_16) {
16689     TEST_REQUIRES_ARM_NEON_DOT;
16690     for (uint32_t n = 17; n < 32; n++) {
16691       for (size_t k = 1; k <= 40; k += 9) {
16692         GemmMicrokernelTester()
16693           .mr(4)
16694           .nr(16)
16695           .kr(4)
16696           .sr(1)
16697           .m(4)
16698           .n(n)
16699           .k(k)
16700           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16701       }
16702     }
16703   }
16704 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_gt_16_strided_cn)16705   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_gt_16_strided_cn) {
16706     TEST_REQUIRES_ARM_NEON_DOT;
16707     for (uint32_t n = 17; n < 32; n++) {
16708       for (size_t k = 1; k <= 40; k += 9) {
16709         GemmMicrokernelTester()
16710           .mr(4)
16711           .nr(16)
16712           .kr(4)
16713           .sr(1)
16714           .m(4)
16715           .n(n)
16716           .k(k)
16717           .cn_stride(19)
16718           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16719       }
16720     }
16721   }
16722 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_gt_16_strided_a)16723   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_gt_16_strided_a) {
16724     TEST_REQUIRES_ARM_NEON_DOT;
16725     for (uint32_t n = 17; n < 32; n++) {
16726       for (size_t k = 1; k <= 40; k += 9) {
16727         GemmMicrokernelTester()
16728           .mr(4)
16729           .nr(16)
16730           .kr(4)
16731           .sr(1)
16732           .m(4)
16733           .n(n)
16734           .k(k)
16735           .a_stride(43)
16736           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16737       }
16738     }
16739   }
16740 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_gt_16_subtile)16741   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_gt_16_subtile) {
16742     TEST_REQUIRES_ARM_NEON_DOT;
16743     for (uint32_t n = 17; n < 32; n++) {
16744       for (size_t k = 1; k <= 40; k += 9) {
16745         for (uint32_t m = 1; m <= 4; m++) {
16746           GemmMicrokernelTester()
16747             .mr(4)
16748             .nr(16)
16749             .kr(4)
16750             .sr(1)
16751             .m(m)
16752             .n(n)
16753             .k(k)
16754             .iterations(1)
16755             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16756         }
16757       }
16758     }
16759   }
16760 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_div_16)16761   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_div_16) {
16762     TEST_REQUIRES_ARM_NEON_DOT;
16763     for (uint32_t n = 32; n <= 48; n += 16) {
16764       for (size_t k = 1; k <= 40; k += 9) {
16765         GemmMicrokernelTester()
16766           .mr(4)
16767           .nr(16)
16768           .kr(4)
16769           .sr(1)
16770           .m(4)
16771           .n(n)
16772           .k(k)
16773           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16774       }
16775     }
16776   }
16777 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_div_16_strided_cn)16778   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_div_16_strided_cn) {
16779     TEST_REQUIRES_ARM_NEON_DOT;
16780     for (uint32_t n = 32; n <= 48; n += 16) {
16781       for (size_t k = 1; k <= 40; k += 9) {
16782         GemmMicrokernelTester()
16783           .mr(4)
16784           .nr(16)
16785           .kr(4)
16786           .sr(1)
16787           .m(4)
16788           .n(n)
16789           .k(k)
16790           .cn_stride(19)
16791           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16792       }
16793     }
16794   }
16795 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_div_16_strided_a)16796   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_div_16_strided_a) {
16797     TEST_REQUIRES_ARM_NEON_DOT;
16798     for (uint32_t n = 32; n <= 48; n += 16) {
16799       for (size_t k = 1; k <= 40; k += 9) {
16800         GemmMicrokernelTester()
16801           .mr(4)
16802           .nr(16)
16803           .kr(4)
16804           .sr(1)
16805           .m(4)
16806           .n(n)
16807           .k(k)
16808           .a_stride(43)
16809           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16810       }
16811     }
16812   }
16813 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,n_div_16_subtile)16814   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, n_div_16_subtile) {
16815     TEST_REQUIRES_ARM_NEON_DOT;
16816     for (uint32_t n = 32; n <= 48; n += 16) {
16817       for (size_t k = 1; k <= 40; k += 9) {
16818         for (uint32_t m = 1; m <= 4; m++) {
16819           GemmMicrokernelTester()
16820             .mr(4)
16821             .nr(16)
16822             .kr(4)
16823             .sr(1)
16824             .m(m)
16825             .n(n)
16826             .k(k)
16827             .iterations(1)
16828             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16829         }
16830       }
16831     }
16832   }
16833 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,strided_cm_subtile)16834   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, strided_cm_subtile) {
16835     TEST_REQUIRES_ARM_NEON_DOT;
16836     for (size_t k = 1; k <= 40; k += 9) {
16837       for (uint32_t n = 1; n <= 16; n++) {
16838         for (uint32_t m = 1; m <= 4; m++) {
16839           GemmMicrokernelTester()
16840             .mr(4)
16841             .nr(16)
16842             .kr(4)
16843             .sr(1)
16844             .m(m)
16845             .n(n)
16846             .k(k)
16847             .cm_stride(19)
16848             .iterations(1)
16849             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16850         }
16851       }
16852     }
16853   }
16854 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,qmin)16855   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, qmin) {
16856     TEST_REQUIRES_ARM_NEON_DOT;
16857     GemmMicrokernelTester()
16858       .mr(4)
16859       .nr(16)
16860       .kr(4)
16861       .sr(1)
16862       .m(4)
16863       .n(16)
16864       .k(8)
16865       .qmin(128)
16866       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16867   }
16868 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,qmax)16869   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, qmax) {
16870     TEST_REQUIRES_ARM_NEON_DOT;
16871     GemmMicrokernelTester()
16872       .mr(4)
16873       .nr(16)
16874       .kr(4)
16875       .sr(1)
16876       .m(4)
16877       .n(16)
16878       .k(8)
16879       .qmax(128)
16880       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16881   }
16882 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64,strided_cm)16883   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD64, strided_cm) {
16884     TEST_REQUIRES_ARM_NEON_DOT;
16885     GemmMicrokernelTester()
16886       .mr(4)
16887       .nr(16)
16888       .kr(4)
16889       .sr(1)
16890       .m(4)
16891       .n(16)
16892       .k(8)
16893       .cm_stride(19)
16894       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld64, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16895   }
16896 #endif  // XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
16897 
16898 
16899 #if XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_eq_16)16900   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_eq_16) {
16901     TEST_REQUIRES_ARM_NEON_DOT;
16902     GemmMicrokernelTester()
16903       .mr(4)
16904       .nr(16)
16905       .kr(4)
16906       .sr(1)
16907       .m(4)
16908       .n(16)
16909       .k(16)
16910       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16911   }
16912 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,strided_cn)16913   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, strided_cn) {
16914     TEST_REQUIRES_ARM_NEON_DOT;
16915     GemmMicrokernelTester()
16916       .mr(4)
16917       .nr(16)
16918       .kr(4)
16919       .sr(1)
16920       .m(4)
16921       .n(16)
16922       .k(16)
16923       .cn_stride(19)
16924       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16925   }
16926 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_eq_16_strided_a)16927   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_eq_16_strided_a) {
16928     TEST_REQUIRES_ARM_NEON_DOT;
16929     GemmMicrokernelTester()
16930       .mr(4)
16931       .nr(16)
16932       .kr(4)
16933       .sr(1)
16934       .m(4)
16935       .n(16)
16936       .k(16)
16937       .a_stride(19)
16938       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16939   }
16940 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_eq_16_subtile)16941   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_eq_16_subtile) {
16942     TEST_REQUIRES_ARM_NEON_DOT;
16943     for (uint32_t n = 1; n <= 16; n++) {
16944       for (uint32_t m = 1; m <= 4; m++) {
16945         GemmMicrokernelTester()
16946           .mr(4)
16947           .nr(16)
16948           .kr(4)
16949           .sr(1)
16950           .m(m)
16951           .n(n)
16952           .k(16)
16953           .iterations(1)
16954           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16955       }
16956     }
16957   }
16958 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_eq_16_subtile_m)16959   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_eq_16_subtile_m) {
16960     TEST_REQUIRES_ARM_NEON_DOT;
16961     for (uint32_t m = 1; m <= 4; m++) {
16962       GemmMicrokernelTester()
16963         .mr(4)
16964         .nr(16)
16965         .kr(4)
16966         .sr(1)
16967         .m(m)
16968         .n(16)
16969         .k(16)
16970         .iterations(1)
16971         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16972     }
16973   }
16974 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_eq_16_subtile_n)16975   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_eq_16_subtile_n) {
16976     TEST_REQUIRES_ARM_NEON_DOT;
16977     for (uint32_t n = 1; n <= 16; n++) {
16978       GemmMicrokernelTester()
16979         .mr(4)
16980         .nr(16)
16981         .kr(4)
16982         .sr(1)
16983         .m(4)
16984         .n(n)
16985         .k(16)
16986         .iterations(1)
16987         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
16988     }
16989   }
16990 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_lt_16)16991   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_lt_16) {
16992     TEST_REQUIRES_ARM_NEON_DOT;
16993     for (size_t k = 1; k < 16; k++) {
16994       GemmMicrokernelTester()
16995         .mr(4)
16996         .nr(16)
16997         .kr(4)
16998         .sr(1)
16999         .m(4)
17000         .n(16)
17001         .k(k)
17002         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17003     }
17004   }
17005 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_lt_16_strided_a)17006   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_lt_16_strided_a) {
17007     TEST_REQUIRES_ARM_NEON_DOT;
17008     for (size_t k = 1; k < 16; k++) {
17009       GemmMicrokernelTester()
17010         .mr(4)
17011         .nr(16)
17012         .kr(4)
17013         .sr(1)
17014         .m(4)
17015         .n(16)
17016         .k(k)
17017         .a_stride(19)
17018         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17019     }
17020   }
17021 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_lt_16_subtile)17022   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_lt_16_subtile) {
17023     TEST_REQUIRES_ARM_NEON_DOT;
17024     for (size_t k = 1; k < 16; k++) {
17025       for (uint32_t n = 1; n <= 16; n++) {
17026         for (uint32_t m = 1; m <= 4; m++) {
17027           GemmMicrokernelTester()
17028             .mr(4)
17029             .nr(16)
17030             .kr(4)
17031             .sr(1)
17032             .m(m)
17033             .n(n)
17034             .k(k)
17035             .iterations(1)
17036             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17037         }
17038       }
17039     }
17040   }
17041 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_gt_16)17042   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_gt_16) {
17043     TEST_REQUIRES_ARM_NEON_DOT;
17044     for (size_t k = 17; k < 32; k++) {
17045       GemmMicrokernelTester()
17046         .mr(4)
17047         .nr(16)
17048         .kr(4)
17049         .sr(1)
17050         .m(4)
17051         .n(16)
17052         .k(k)
17053         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17054     }
17055   }
17056 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_gt_16_strided_a)17057   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_gt_16_strided_a) {
17058     TEST_REQUIRES_ARM_NEON_DOT;
17059     for (size_t k = 17; k < 32; k++) {
17060       GemmMicrokernelTester()
17061         .mr(4)
17062         .nr(16)
17063         .kr(4)
17064         .sr(1)
17065         .m(4)
17066         .n(16)
17067         .k(k)
17068         .a_stride(37)
17069         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17070     }
17071   }
17072 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_gt_16_subtile)17073   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_gt_16_subtile) {
17074     TEST_REQUIRES_ARM_NEON_DOT;
17075     for (size_t k = 17; k < 32; k++) {
17076       for (uint32_t n = 1; n <= 16; n++) {
17077         for (uint32_t m = 1; m <= 4; m++) {
17078           GemmMicrokernelTester()
17079             .mr(4)
17080             .nr(16)
17081             .kr(4)
17082             .sr(1)
17083             .m(m)
17084             .n(n)
17085             .k(k)
17086             .iterations(1)
17087             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17088         }
17089       }
17090     }
17091   }
17092 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_div_16)17093   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_div_16) {
17094     TEST_REQUIRES_ARM_NEON_DOT;
17095     for (size_t k = 32; k <= 160; k += 16) {
17096       GemmMicrokernelTester()
17097         .mr(4)
17098         .nr(16)
17099         .kr(4)
17100         .sr(1)
17101         .m(4)
17102         .n(16)
17103         .k(k)
17104         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17105     }
17106   }
17107 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_div_16_strided_a)17108   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_div_16_strided_a) {
17109     TEST_REQUIRES_ARM_NEON_DOT;
17110     for (size_t k = 32; k <= 160; k += 16) {
17111       GemmMicrokernelTester()
17112         .mr(4)
17113         .nr(16)
17114         .kr(4)
17115         .sr(1)
17116         .m(4)
17117         .n(16)
17118         .k(k)
17119         .a_stride(163)
17120         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17121     }
17122   }
17123 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,k_div_16_subtile)17124   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, k_div_16_subtile) {
17125     TEST_REQUIRES_ARM_NEON_DOT;
17126     for (size_t k = 32; k <= 160; k += 16) {
17127       for (uint32_t n = 1; n <= 16; n++) {
17128         for (uint32_t m = 1; m <= 4; m++) {
17129           GemmMicrokernelTester()
17130             .mr(4)
17131             .nr(16)
17132             .kr(4)
17133             .sr(1)
17134             .m(m)
17135             .n(n)
17136             .k(k)
17137             .iterations(1)
17138             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17139         }
17140       }
17141     }
17142   }
17143 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_gt_16)17144   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_gt_16) {
17145     TEST_REQUIRES_ARM_NEON_DOT;
17146     for (uint32_t n = 17; n < 32; n++) {
17147       for (size_t k = 1; k <= 80; k += 17) {
17148         GemmMicrokernelTester()
17149           .mr(4)
17150           .nr(16)
17151           .kr(4)
17152           .sr(1)
17153           .m(4)
17154           .n(n)
17155           .k(k)
17156           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17157       }
17158     }
17159   }
17160 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_gt_16_strided_cn)17161   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_gt_16_strided_cn) {
17162     TEST_REQUIRES_ARM_NEON_DOT;
17163     for (uint32_t n = 17; n < 32; n++) {
17164       for (size_t k = 1; k <= 80; k += 17) {
17165         GemmMicrokernelTester()
17166           .mr(4)
17167           .nr(16)
17168           .kr(4)
17169           .sr(1)
17170           .m(4)
17171           .n(n)
17172           .k(k)
17173           .cn_stride(19)
17174           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17175       }
17176     }
17177   }
17178 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_gt_16_strided_a)17179   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_gt_16_strided_a) {
17180     TEST_REQUIRES_ARM_NEON_DOT;
17181     for (uint32_t n = 17; n < 32; n++) {
17182       for (size_t k = 1; k <= 80; k += 17) {
17183         GemmMicrokernelTester()
17184           .mr(4)
17185           .nr(16)
17186           .kr(4)
17187           .sr(1)
17188           .m(4)
17189           .n(n)
17190           .k(k)
17191           .a_stride(83)
17192           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17193       }
17194     }
17195   }
17196 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_gt_16_subtile)17197   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_gt_16_subtile) {
17198     TEST_REQUIRES_ARM_NEON_DOT;
17199     for (uint32_t n = 17; n < 32; n++) {
17200       for (size_t k = 1; k <= 80; k += 17) {
17201         for (uint32_t m = 1; m <= 4; m++) {
17202           GemmMicrokernelTester()
17203             .mr(4)
17204             .nr(16)
17205             .kr(4)
17206             .sr(1)
17207             .m(m)
17208             .n(n)
17209             .k(k)
17210             .iterations(1)
17211             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17212         }
17213       }
17214     }
17215   }
17216 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_div_16)17217   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_div_16) {
17218     TEST_REQUIRES_ARM_NEON_DOT;
17219     for (uint32_t n = 32; n <= 48; n += 16) {
17220       for (size_t k = 1; k <= 80; k += 17) {
17221         GemmMicrokernelTester()
17222           .mr(4)
17223           .nr(16)
17224           .kr(4)
17225           .sr(1)
17226           .m(4)
17227           .n(n)
17228           .k(k)
17229           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17230       }
17231     }
17232   }
17233 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_div_16_strided_cn)17234   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_div_16_strided_cn) {
17235     TEST_REQUIRES_ARM_NEON_DOT;
17236     for (uint32_t n = 32; n <= 48; n += 16) {
17237       for (size_t k = 1; k <= 80; k += 17) {
17238         GemmMicrokernelTester()
17239           .mr(4)
17240           .nr(16)
17241           .kr(4)
17242           .sr(1)
17243           .m(4)
17244           .n(n)
17245           .k(k)
17246           .cn_stride(19)
17247           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17248       }
17249     }
17250   }
17251 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_div_16_strided_a)17252   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_div_16_strided_a) {
17253     TEST_REQUIRES_ARM_NEON_DOT;
17254     for (uint32_t n = 32; n <= 48; n += 16) {
17255       for (size_t k = 1; k <= 80; k += 17) {
17256         GemmMicrokernelTester()
17257           .mr(4)
17258           .nr(16)
17259           .kr(4)
17260           .sr(1)
17261           .m(4)
17262           .n(n)
17263           .k(k)
17264           .a_stride(83)
17265           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17266       }
17267     }
17268   }
17269 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,n_div_16_subtile)17270   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, n_div_16_subtile) {
17271     TEST_REQUIRES_ARM_NEON_DOT;
17272     for (uint32_t n = 32; n <= 48; n += 16) {
17273       for (size_t k = 1; k <= 80; k += 17) {
17274         for (uint32_t m = 1; m <= 4; m++) {
17275           GemmMicrokernelTester()
17276             .mr(4)
17277             .nr(16)
17278             .kr(4)
17279             .sr(1)
17280             .m(m)
17281             .n(n)
17282             .k(k)
17283             .iterations(1)
17284             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17285         }
17286       }
17287     }
17288   }
17289 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,strided_cm_subtile)17290   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, strided_cm_subtile) {
17291     TEST_REQUIRES_ARM_NEON_DOT;
17292     for (size_t k = 1; k <= 80; k += 17) {
17293       for (uint32_t n = 1; n <= 16; n++) {
17294         for (uint32_t m = 1; m <= 4; m++) {
17295           GemmMicrokernelTester()
17296             .mr(4)
17297             .nr(16)
17298             .kr(4)
17299             .sr(1)
17300             .m(m)
17301             .n(n)
17302             .k(k)
17303             .cm_stride(19)
17304             .iterations(1)
17305             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17306         }
17307       }
17308     }
17309   }
17310 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,qmin)17311   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, qmin) {
17312     TEST_REQUIRES_ARM_NEON_DOT;
17313     GemmMicrokernelTester()
17314       .mr(4)
17315       .nr(16)
17316       .kr(4)
17317       .sr(1)
17318       .m(4)
17319       .n(16)
17320       .k(16)
17321       .qmin(128)
17322       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17323   }
17324 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,qmax)17325   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, qmax) {
17326     TEST_REQUIRES_ARM_NEON_DOT;
17327     GemmMicrokernelTester()
17328       .mr(4)
17329       .nr(16)
17330       .kr(4)
17331       .sr(1)
17332       .m(4)
17333       .n(16)
17334       .k(16)
17335       .qmax(128)
17336       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17337   }
17338 
TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128,strided_cm)17339   TEST(QS8_GEMM_MINMAX_FP32_4X16C4__AARCH64_NEONDOT_LD128, strided_cm) {
17340     TEST_REQUIRES_ARM_NEON_DOT;
17341     GemmMicrokernelTester()
17342       .mr(4)
17343       .nr(16)
17344       .kr(4)
17345       .sr(1)
17346       .m(4)
17347       .n(16)
17348       .k(16)
17349       .cm_stride(19)
17350       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16c4__aarch64_neondot_ld128, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17351   }
17352 #endif  // XNN_ENABLE_ARM_DOTPROD && XNN_ARCH_ARM64 && XNN_ENABLE_ASSEMBLY
17353 
17354 
17355 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_eq_16)17356   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_eq_16) {
17357     TEST_REQUIRES_ARM_NEON_V8;
17358     GemmMicrokernelTester()
17359       .mr(1)
17360       .nr(8)
17361       .kr(8)
17362       .sr(1)
17363       .m(1)
17364       .n(8)
17365       .k(16)
17366       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17367   }
17368 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,strided_cn)17369   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, strided_cn) {
17370     TEST_REQUIRES_ARM_NEON_V8;
17371     GemmMicrokernelTester()
17372       .mr(1)
17373       .nr(8)
17374       .kr(8)
17375       .sr(1)
17376       .m(1)
17377       .n(8)
17378       .k(16)
17379       .cn_stride(11)
17380       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17381   }
17382 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_eq_16_strided_a)17383   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_eq_16_strided_a) {
17384     TEST_REQUIRES_ARM_NEON_V8;
17385     GemmMicrokernelTester()
17386       .mr(1)
17387       .nr(8)
17388       .kr(8)
17389       .sr(1)
17390       .m(1)
17391       .n(8)
17392       .k(16)
17393       .a_stride(19)
17394       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17395   }
17396 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_eq_16_subtile)17397   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_eq_16_subtile) {
17398     TEST_REQUIRES_ARM_NEON_V8;
17399     for (uint32_t n = 1; n <= 8; n++) {
17400       for (uint32_t m = 1; m <= 1; m++) {
17401         GemmMicrokernelTester()
17402           .mr(1)
17403           .nr(8)
17404           .kr(8)
17405           .sr(1)
17406           .m(m)
17407           .n(n)
17408           .k(16)
17409           .iterations(1)
17410           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17411       }
17412     }
17413   }
17414 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_eq_16_subtile_m)17415   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_eq_16_subtile_m) {
17416     TEST_REQUIRES_ARM_NEON_V8;
17417     for (uint32_t m = 1; m <= 1; m++) {
17418       GemmMicrokernelTester()
17419         .mr(1)
17420         .nr(8)
17421         .kr(8)
17422         .sr(1)
17423         .m(m)
17424         .n(8)
17425         .k(16)
17426         .iterations(1)
17427         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17428     }
17429   }
17430 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_eq_16_subtile_n)17431   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_eq_16_subtile_n) {
17432     TEST_REQUIRES_ARM_NEON_V8;
17433     for (uint32_t n = 1; n <= 8; n++) {
17434       GemmMicrokernelTester()
17435         .mr(1)
17436         .nr(8)
17437         .kr(8)
17438         .sr(1)
17439         .m(1)
17440         .n(n)
17441         .k(16)
17442         .iterations(1)
17443         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17444     }
17445   }
17446 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_lt_16)17447   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_lt_16) {
17448     TEST_REQUIRES_ARM_NEON_V8;
17449     for (size_t k = 1; k < 16; k++) {
17450       GemmMicrokernelTester()
17451         .mr(1)
17452         .nr(8)
17453         .kr(8)
17454         .sr(1)
17455         .m(1)
17456         .n(8)
17457         .k(k)
17458         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17459     }
17460   }
17461 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_lt_16_strided_a)17462   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_lt_16_strided_a) {
17463     TEST_REQUIRES_ARM_NEON_V8;
17464     for (size_t k = 1; k < 16; k++) {
17465       GemmMicrokernelTester()
17466         .mr(1)
17467         .nr(8)
17468         .kr(8)
17469         .sr(1)
17470         .m(1)
17471         .n(8)
17472         .k(k)
17473         .a_stride(19)
17474         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17475     }
17476   }
17477 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_lt_16_subtile)17478   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_lt_16_subtile) {
17479     TEST_REQUIRES_ARM_NEON_V8;
17480     for (size_t k = 1; k < 16; k++) {
17481       for (uint32_t n = 1; n <= 8; n++) {
17482         for (uint32_t m = 1; m <= 1; m++) {
17483           GemmMicrokernelTester()
17484             .mr(1)
17485             .nr(8)
17486             .kr(8)
17487             .sr(1)
17488             .m(m)
17489             .n(n)
17490             .k(k)
17491             .iterations(1)
17492             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17493         }
17494       }
17495     }
17496   }
17497 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_gt_16)17498   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_gt_16) {
17499     TEST_REQUIRES_ARM_NEON_V8;
17500     for (size_t k = 17; k < 32; k++) {
17501       GemmMicrokernelTester()
17502         .mr(1)
17503         .nr(8)
17504         .kr(8)
17505         .sr(1)
17506         .m(1)
17507         .n(8)
17508         .k(k)
17509         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17510     }
17511   }
17512 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_gt_16_strided_a)17513   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_gt_16_strided_a) {
17514     TEST_REQUIRES_ARM_NEON_V8;
17515     for (size_t k = 17; k < 32; k++) {
17516       GemmMicrokernelTester()
17517         .mr(1)
17518         .nr(8)
17519         .kr(8)
17520         .sr(1)
17521         .m(1)
17522         .n(8)
17523         .k(k)
17524         .a_stride(37)
17525         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17526     }
17527   }
17528 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_gt_16_subtile)17529   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_gt_16_subtile) {
17530     TEST_REQUIRES_ARM_NEON_V8;
17531     for (size_t k = 17; k < 32; k++) {
17532       for (uint32_t n = 1; n <= 8; n++) {
17533         for (uint32_t m = 1; m <= 1; m++) {
17534           GemmMicrokernelTester()
17535             .mr(1)
17536             .nr(8)
17537             .kr(8)
17538             .sr(1)
17539             .m(m)
17540             .n(n)
17541             .k(k)
17542             .iterations(1)
17543             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17544         }
17545       }
17546     }
17547   }
17548 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_div_16)17549   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_div_16) {
17550     TEST_REQUIRES_ARM_NEON_V8;
17551     for (size_t k = 32; k <= 160; k += 16) {
17552       GemmMicrokernelTester()
17553         .mr(1)
17554         .nr(8)
17555         .kr(8)
17556         .sr(1)
17557         .m(1)
17558         .n(8)
17559         .k(k)
17560         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17561     }
17562   }
17563 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_div_16_strided_a)17564   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_div_16_strided_a) {
17565     TEST_REQUIRES_ARM_NEON_V8;
17566     for (size_t k = 32; k <= 160; k += 16) {
17567       GemmMicrokernelTester()
17568         .mr(1)
17569         .nr(8)
17570         .kr(8)
17571         .sr(1)
17572         .m(1)
17573         .n(8)
17574         .k(k)
17575         .a_stride(163)
17576         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17577     }
17578   }
17579 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,k_div_16_subtile)17580   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, k_div_16_subtile) {
17581     TEST_REQUIRES_ARM_NEON_V8;
17582     for (size_t k = 32; k <= 160; k += 16) {
17583       for (uint32_t n = 1; n <= 8; n++) {
17584         for (uint32_t m = 1; m <= 1; m++) {
17585           GemmMicrokernelTester()
17586             .mr(1)
17587             .nr(8)
17588             .kr(8)
17589             .sr(1)
17590             .m(m)
17591             .n(n)
17592             .k(k)
17593             .iterations(1)
17594             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17595         }
17596       }
17597     }
17598   }
17599 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_gt_8)17600   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_gt_8) {
17601     TEST_REQUIRES_ARM_NEON_V8;
17602     for (uint32_t n = 9; n < 16; n++) {
17603       for (size_t k = 1; k <= 80; k += 17) {
17604         GemmMicrokernelTester()
17605           .mr(1)
17606           .nr(8)
17607           .kr(8)
17608           .sr(1)
17609           .m(1)
17610           .n(n)
17611           .k(k)
17612           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17613       }
17614     }
17615   }
17616 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_gt_8_strided_cn)17617   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_gt_8_strided_cn) {
17618     TEST_REQUIRES_ARM_NEON_V8;
17619     for (uint32_t n = 9; n < 16; n++) {
17620       for (size_t k = 1; k <= 80; k += 17) {
17621         GemmMicrokernelTester()
17622           .mr(1)
17623           .nr(8)
17624           .kr(8)
17625           .sr(1)
17626           .m(1)
17627           .n(n)
17628           .k(k)
17629           .cn_stride(11)
17630           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17631       }
17632     }
17633   }
17634 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_gt_8_strided_a)17635   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_gt_8_strided_a) {
17636     TEST_REQUIRES_ARM_NEON_V8;
17637     for (uint32_t n = 9; n < 16; n++) {
17638       for (size_t k = 1; k <= 80; k += 17) {
17639         GemmMicrokernelTester()
17640           .mr(1)
17641           .nr(8)
17642           .kr(8)
17643           .sr(1)
17644           .m(1)
17645           .n(n)
17646           .k(k)
17647           .a_stride(83)
17648           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17649       }
17650     }
17651   }
17652 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_gt_8_subtile)17653   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_gt_8_subtile) {
17654     TEST_REQUIRES_ARM_NEON_V8;
17655     for (uint32_t n = 9; n < 16; n++) {
17656       for (size_t k = 1; k <= 80; k += 17) {
17657         for (uint32_t m = 1; m <= 1; m++) {
17658           GemmMicrokernelTester()
17659             .mr(1)
17660             .nr(8)
17661             .kr(8)
17662             .sr(1)
17663             .m(m)
17664             .n(n)
17665             .k(k)
17666             .iterations(1)
17667             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17668         }
17669       }
17670     }
17671   }
17672 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_div_8)17673   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_div_8) {
17674     TEST_REQUIRES_ARM_NEON_V8;
17675     for (uint32_t n = 16; n <= 24; n += 8) {
17676       for (size_t k = 1; k <= 80; k += 17) {
17677         GemmMicrokernelTester()
17678           .mr(1)
17679           .nr(8)
17680           .kr(8)
17681           .sr(1)
17682           .m(1)
17683           .n(n)
17684           .k(k)
17685           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17686       }
17687     }
17688   }
17689 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_div_8_strided_cn)17690   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_div_8_strided_cn) {
17691     TEST_REQUIRES_ARM_NEON_V8;
17692     for (uint32_t n = 16; n <= 24; n += 8) {
17693       for (size_t k = 1; k <= 80; k += 17) {
17694         GemmMicrokernelTester()
17695           .mr(1)
17696           .nr(8)
17697           .kr(8)
17698           .sr(1)
17699           .m(1)
17700           .n(n)
17701           .k(k)
17702           .cn_stride(11)
17703           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17704       }
17705     }
17706   }
17707 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_div_8_strided_a)17708   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_div_8_strided_a) {
17709     TEST_REQUIRES_ARM_NEON_V8;
17710     for (uint32_t n = 16; n <= 24; n += 8) {
17711       for (size_t k = 1; k <= 80; k += 17) {
17712         GemmMicrokernelTester()
17713           .mr(1)
17714           .nr(8)
17715           .kr(8)
17716           .sr(1)
17717           .m(1)
17718           .n(n)
17719           .k(k)
17720           .a_stride(83)
17721           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17722       }
17723     }
17724   }
17725 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,n_div_8_subtile)17726   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, n_div_8_subtile) {
17727     TEST_REQUIRES_ARM_NEON_V8;
17728     for (uint32_t n = 16; n <= 24; n += 8) {
17729       for (size_t k = 1; k <= 80; k += 17) {
17730         for (uint32_t m = 1; m <= 1; m++) {
17731           GemmMicrokernelTester()
17732             .mr(1)
17733             .nr(8)
17734             .kr(8)
17735             .sr(1)
17736             .m(m)
17737             .n(n)
17738             .k(k)
17739             .iterations(1)
17740             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17741         }
17742       }
17743     }
17744   }
17745 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,strided_cm_subtile)17746   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, strided_cm_subtile) {
17747     TEST_REQUIRES_ARM_NEON_V8;
17748     for (size_t k = 1; k <= 80; k += 17) {
17749       for (uint32_t n = 1; n <= 8; n++) {
17750         for (uint32_t m = 1; m <= 1; m++) {
17751           GemmMicrokernelTester()
17752             .mr(1)
17753             .nr(8)
17754             .kr(8)
17755             .sr(1)
17756             .m(m)
17757             .n(n)
17758             .k(k)
17759             .cm_stride(11)
17760             .iterations(1)
17761             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17762         }
17763       }
17764     }
17765   }
17766 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,qmin)17767   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, qmin) {
17768     TEST_REQUIRES_ARM_NEON_V8;
17769     GemmMicrokernelTester()
17770       .mr(1)
17771       .nr(8)
17772       .kr(8)
17773       .sr(1)
17774       .m(1)
17775       .n(8)
17776       .k(16)
17777       .qmin(128)
17778       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17779   }
17780 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,qmax)17781   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, qmax) {
17782     TEST_REQUIRES_ARM_NEON_V8;
17783     GemmMicrokernelTester()
17784       .mr(1)
17785       .nr(8)
17786       .kr(8)
17787       .sr(1)
17788       .m(1)
17789       .n(8)
17790       .k(16)
17791       .qmax(128)
17792       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17793   }
17794 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL,strided_cm)17795   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__NEONV8_MLAL, strided_cm) {
17796     TEST_REQUIRES_ARM_NEON_V8;
17797     GemmMicrokernelTester()
17798       .mr(1)
17799       .nr(8)
17800       .kr(8)
17801       .sr(1)
17802       .m(1)
17803       .n(8)
17804       .k(16)
17805       .cm_stride(11)
17806       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17807   }
17808 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
17809 
17810 
17811 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_eq_16)17812   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_eq_16) {
17813     TEST_REQUIRES_ARM_NEON_V8;
17814     GemmMicrokernelTester()
17815       .mr(2)
17816       .nr(8)
17817       .kr(8)
17818       .sr(1)
17819       .m(2)
17820       .n(8)
17821       .k(16)
17822       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17823   }
17824 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,strided_cn)17825   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, strided_cn) {
17826     TEST_REQUIRES_ARM_NEON_V8;
17827     GemmMicrokernelTester()
17828       .mr(2)
17829       .nr(8)
17830       .kr(8)
17831       .sr(1)
17832       .m(2)
17833       .n(8)
17834       .k(16)
17835       .cn_stride(11)
17836       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17837   }
17838 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_eq_16_strided_a)17839   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_eq_16_strided_a) {
17840     TEST_REQUIRES_ARM_NEON_V8;
17841     GemmMicrokernelTester()
17842       .mr(2)
17843       .nr(8)
17844       .kr(8)
17845       .sr(1)
17846       .m(2)
17847       .n(8)
17848       .k(16)
17849       .a_stride(19)
17850       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17851   }
17852 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_eq_16_subtile)17853   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_eq_16_subtile) {
17854     TEST_REQUIRES_ARM_NEON_V8;
17855     for (uint32_t n = 1; n <= 8; n++) {
17856       for (uint32_t m = 1; m <= 2; m++) {
17857         GemmMicrokernelTester()
17858           .mr(2)
17859           .nr(8)
17860           .kr(8)
17861           .sr(1)
17862           .m(m)
17863           .n(n)
17864           .k(16)
17865           .iterations(1)
17866           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17867       }
17868     }
17869   }
17870 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_eq_16_subtile_m)17871   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_eq_16_subtile_m) {
17872     TEST_REQUIRES_ARM_NEON_V8;
17873     for (uint32_t m = 1; m <= 2; m++) {
17874       GemmMicrokernelTester()
17875         .mr(2)
17876         .nr(8)
17877         .kr(8)
17878         .sr(1)
17879         .m(m)
17880         .n(8)
17881         .k(16)
17882         .iterations(1)
17883         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17884     }
17885   }
17886 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_eq_16_subtile_n)17887   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_eq_16_subtile_n) {
17888     TEST_REQUIRES_ARM_NEON_V8;
17889     for (uint32_t n = 1; n <= 8; n++) {
17890       GemmMicrokernelTester()
17891         .mr(2)
17892         .nr(8)
17893         .kr(8)
17894         .sr(1)
17895         .m(2)
17896         .n(n)
17897         .k(16)
17898         .iterations(1)
17899         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17900     }
17901   }
17902 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_lt_16)17903   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_lt_16) {
17904     TEST_REQUIRES_ARM_NEON_V8;
17905     for (size_t k = 1; k < 16; k++) {
17906       GemmMicrokernelTester()
17907         .mr(2)
17908         .nr(8)
17909         .kr(8)
17910         .sr(1)
17911         .m(2)
17912         .n(8)
17913         .k(k)
17914         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17915     }
17916   }
17917 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_lt_16_strided_a)17918   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_lt_16_strided_a) {
17919     TEST_REQUIRES_ARM_NEON_V8;
17920     for (size_t k = 1; k < 16; k++) {
17921       GemmMicrokernelTester()
17922         .mr(2)
17923         .nr(8)
17924         .kr(8)
17925         .sr(1)
17926         .m(2)
17927         .n(8)
17928         .k(k)
17929         .a_stride(19)
17930         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17931     }
17932   }
17933 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_lt_16_subtile)17934   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_lt_16_subtile) {
17935     TEST_REQUIRES_ARM_NEON_V8;
17936     for (size_t k = 1; k < 16; k++) {
17937       for (uint32_t n = 1; n <= 8; n++) {
17938         for (uint32_t m = 1; m <= 2; m++) {
17939           GemmMicrokernelTester()
17940             .mr(2)
17941             .nr(8)
17942             .kr(8)
17943             .sr(1)
17944             .m(m)
17945             .n(n)
17946             .k(k)
17947             .iterations(1)
17948             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17949         }
17950       }
17951     }
17952   }
17953 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_gt_16)17954   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_gt_16) {
17955     TEST_REQUIRES_ARM_NEON_V8;
17956     for (size_t k = 17; k < 32; k++) {
17957       GemmMicrokernelTester()
17958         .mr(2)
17959         .nr(8)
17960         .kr(8)
17961         .sr(1)
17962         .m(2)
17963         .n(8)
17964         .k(k)
17965         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17966     }
17967   }
17968 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_gt_16_strided_a)17969   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_gt_16_strided_a) {
17970     TEST_REQUIRES_ARM_NEON_V8;
17971     for (size_t k = 17; k < 32; k++) {
17972       GemmMicrokernelTester()
17973         .mr(2)
17974         .nr(8)
17975         .kr(8)
17976         .sr(1)
17977         .m(2)
17978         .n(8)
17979         .k(k)
17980         .a_stride(37)
17981         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
17982     }
17983   }
17984 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_gt_16_subtile)17985   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_gt_16_subtile) {
17986     TEST_REQUIRES_ARM_NEON_V8;
17987     for (size_t k = 17; k < 32; k++) {
17988       for (uint32_t n = 1; n <= 8; n++) {
17989         for (uint32_t m = 1; m <= 2; m++) {
17990           GemmMicrokernelTester()
17991             .mr(2)
17992             .nr(8)
17993             .kr(8)
17994             .sr(1)
17995             .m(m)
17996             .n(n)
17997             .k(k)
17998             .iterations(1)
17999             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18000         }
18001       }
18002     }
18003   }
18004 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_div_16)18005   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_div_16) {
18006     TEST_REQUIRES_ARM_NEON_V8;
18007     for (size_t k = 32; k <= 160; k += 16) {
18008       GemmMicrokernelTester()
18009         .mr(2)
18010         .nr(8)
18011         .kr(8)
18012         .sr(1)
18013         .m(2)
18014         .n(8)
18015         .k(k)
18016         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18017     }
18018   }
18019 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_div_16_strided_a)18020   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_div_16_strided_a) {
18021     TEST_REQUIRES_ARM_NEON_V8;
18022     for (size_t k = 32; k <= 160; k += 16) {
18023       GemmMicrokernelTester()
18024         .mr(2)
18025         .nr(8)
18026         .kr(8)
18027         .sr(1)
18028         .m(2)
18029         .n(8)
18030         .k(k)
18031         .a_stride(163)
18032         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18033     }
18034   }
18035 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,k_div_16_subtile)18036   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, k_div_16_subtile) {
18037     TEST_REQUIRES_ARM_NEON_V8;
18038     for (size_t k = 32; k <= 160; k += 16) {
18039       for (uint32_t n = 1; n <= 8; n++) {
18040         for (uint32_t m = 1; m <= 2; m++) {
18041           GemmMicrokernelTester()
18042             .mr(2)
18043             .nr(8)
18044             .kr(8)
18045             .sr(1)
18046             .m(m)
18047             .n(n)
18048             .k(k)
18049             .iterations(1)
18050             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18051         }
18052       }
18053     }
18054   }
18055 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_gt_8)18056   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_gt_8) {
18057     TEST_REQUIRES_ARM_NEON_V8;
18058     for (uint32_t n = 9; n < 16; n++) {
18059       for (size_t k = 1; k <= 80; k += 17) {
18060         GemmMicrokernelTester()
18061           .mr(2)
18062           .nr(8)
18063           .kr(8)
18064           .sr(1)
18065           .m(2)
18066           .n(n)
18067           .k(k)
18068           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18069       }
18070     }
18071   }
18072 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_gt_8_strided_cn)18073   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_gt_8_strided_cn) {
18074     TEST_REQUIRES_ARM_NEON_V8;
18075     for (uint32_t n = 9; n < 16; n++) {
18076       for (size_t k = 1; k <= 80; k += 17) {
18077         GemmMicrokernelTester()
18078           .mr(2)
18079           .nr(8)
18080           .kr(8)
18081           .sr(1)
18082           .m(2)
18083           .n(n)
18084           .k(k)
18085           .cn_stride(11)
18086           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18087       }
18088     }
18089   }
18090 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_gt_8_strided_a)18091   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_gt_8_strided_a) {
18092     TEST_REQUIRES_ARM_NEON_V8;
18093     for (uint32_t n = 9; n < 16; n++) {
18094       for (size_t k = 1; k <= 80; k += 17) {
18095         GemmMicrokernelTester()
18096           .mr(2)
18097           .nr(8)
18098           .kr(8)
18099           .sr(1)
18100           .m(2)
18101           .n(n)
18102           .k(k)
18103           .a_stride(83)
18104           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18105       }
18106     }
18107   }
18108 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_gt_8_subtile)18109   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_gt_8_subtile) {
18110     TEST_REQUIRES_ARM_NEON_V8;
18111     for (uint32_t n = 9; n < 16; n++) {
18112       for (size_t k = 1; k <= 80; k += 17) {
18113         for (uint32_t m = 1; m <= 2; m++) {
18114           GemmMicrokernelTester()
18115             .mr(2)
18116             .nr(8)
18117             .kr(8)
18118             .sr(1)
18119             .m(m)
18120             .n(n)
18121             .k(k)
18122             .iterations(1)
18123             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18124         }
18125       }
18126     }
18127   }
18128 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_div_8)18129   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_div_8) {
18130     TEST_REQUIRES_ARM_NEON_V8;
18131     for (uint32_t n = 16; n <= 24; n += 8) {
18132       for (size_t k = 1; k <= 80; k += 17) {
18133         GemmMicrokernelTester()
18134           .mr(2)
18135           .nr(8)
18136           .kr(8)
18137           .sr(1)
18138           .m(2)
18139           .n(n)
18140           .k(k)
18141           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18142       }
18143     }
18144   }
18145 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_div_8_strided_cn)18146   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_div_8_strided_cn) {
18147     TEST_REQUIRES_ARM_NEON_V8;
18148     for (uint32_t n = 16; n <= 24; n += 8) {
18149       for (size_t k = 1; k <= 80; k += 17) {
18150         GemmMicrokernelTester()
18151           .mr(2)
18152           .nr(8)
18153           .kr(8)
18154           .sr(1)
18155           .m(2)
18156           .n(n)
18157           .k(k)
18158           .cn_stride(11)
18159           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18160       }
18161     }
18162   }
18163 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_div_8_strided_a)18164   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_div_8_strided_a) {
18165     TEST_REQUIRES_ARM_NEON_V8;
18166     for (uint32_t n = 16; n <= 24; n += 8) {
18167       for (size_t k = 1; k <= 80; k += 17) {
18168         GemmMicrokernelTester()
18169           .mr(2)
18170           .nr(8)
18171           .kr(8)
18172           .sr(1)
18173           .m(2)
18174           .n(n)
18175           .k(k)
18176           .a_stride(83)
18177           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18178       }
18179     }
18180   }
18181 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,n_div_8_subtile)18182   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, n_div_8_subtile) {
18183     TEST_REQUIRES_ARM_NEON_V8;
18184     for (uint32_t n = 16; n <= 24; n += 8) {
18185       for (size_t k = 1; k <= 80; k += 17) {
18186         for (uint32_t m = 1; m <= 2; m++) {
18187           GemmMicrokernelTester()
18188             .mr(2)
18189             .nr(8)
18190             .kr(8)
18191             .sr(1)
18192             .m(m)
18193             .n(n)
18194             .k(k)
18195             .iterations(1)
18196             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18197         }
18198       }
18199     }
18200   }
18201 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,strided_cm_subtile)18202   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, strided_cm_subtile) {
18203     TEST_REQUIRES_ARM_NEON_V8;
18204     for (size_t k = 1; k <= 80; k += 17) {
18205       for (uint32_t n = 1; n <= 8; n++) {
18206         for (uint32_t m = 1; m <= 2; m++) {
18207           GemmMicrokernelTester()
18208             .mr(2)
18209             .nr(8)
18210             .kr(8)
18211             .sr(1)
18212             .m(m)
18213             .n(n)
18214             .k(k)
18215             .cm_stride(11)
18216             .iterations(1)
18217             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18218         }
18219       }
18220     }
18221   }
18222 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,qmin)18223   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, qmin) {
18224     TEST_REQUIRES_ARM_NEON_V8;
18225     GemmMicrokernelTester()
18226       .mr(2)
18227       .nr(8)
18228       .kr(8)
18229       .sr(1)
18230       .m(2)
18231       .n(8)
18232       .k(16)
18233       .qmin(128)
18234       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18235   }
18236 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,qmax)18237   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, qmax) {
18238     TEST_REQUIRES_ARM_NEON_V8;
18239     GemmMicrokernelTester()
18240       .mr(2)
18241       .nr(8)
18242       .kr(8)
18243       .sr(1)
18244       .m(2)
18245       .n(8)
18246       .k(16)
18247       .qmax(128)
18248       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18249   }
18250 
TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL,strided_cm)18251   TEST(QS8_GEMM_MINMAX_FP32_2X8C8__NEONV8_MLAL, strided_cm) {
18252     TEST_REQUIRES_ARM_NEON_V8;
18253     GemmMicrokernelTester()
18254       .mr(2)
18255       .nr(8)
18256       .kr(8)
18257       .sr(1)
18258       .m(2)
18259       .n(8)
18260       .k(16)
18261       .cm_stride(11)
18262       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x8c8__neonv8_mlal, xnn_init_qs8_conv_minmax_fp32_neonv8_params, xnn_qs8_requantize_fp32);
18263   }
18264 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
18265 
18266 
18267 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_eq_8)18268   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_eq_8) {
18269     TEST_REQUIRES_ARM_NEON;
18270     GemmMicrokernelTester()
18271       .mr(4)
18272       .nr(16)
18273       .kr(1)
18274       .sr(1)
18275       .m(4)
18276       .n(16)
18277       .k(8)
18278       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18279   }
18280 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,strided_cn)18281   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, strided_cn) {
18282     TEST_REQUIRES_ARM_NEON;
18283     GemmMicrokernelTester()
18284       .mr(4)
18285       .nr(16)
18286       .kr(1)
18287       .sr(1)
18288       .m(4)
18289       .n(16)
18290       .k(8)
18291       .cn_stride(19)
18292       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18293   }
18294 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_eq_8_strided_a)18295   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_eq_8_strided_a) {
18296     TEST_REQUIRES_ARM_NEON;
18297     GemmMicrokernelTester()
18298       .mr(4)
18299       .nr(16)
18300       .kr(1)
18301       .sr(1)
18302       .m(4)
18303       .n(16)
18304       .k(8)
18305       .a_stride(11)
18306       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18307   }
18308 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_eq_8_subtile)18309   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_eq_8_subtile) {
18310     TEST_REQUIRES_ARM_NEON;
18311     for (uint32_t n = 1; n <= 16; n++) {
18312       for (uint32_t m = 1; m <= 4; m++) {
18313         GemmMicrokernelTester()
18314           .mr(4)
18315           .nr(16)
18316           .kr(1)
18317           .sr(1)
18318           .m(m)
18319           .n(n)
18320           .k(8)
18321           .iterations(1)
18322           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18323       }
18324     }
18325   }
18326 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_eq_8_subtile_m)18327   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_eq_8_subtile_m) {
18328     TEST_REQUIRES_ARM_NEON;
18329     for (uint32_t m = 1; m <= 4; m++) {
18330       GemmMicrokernelTester()
18331         .mr(4)
18332         .nr(16)
18333         .kr(1)
18334         .sr(1)
18335         .m(m)
18336         .n(16)
18337         .k(8)
18338         .iterations(1)
18339         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18340     }
18341   }
18342 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_eq_8_subtile_n)18343   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_eq_8_subtile_n) {
18344     TEST_REQUIRES_ARM_NEON;
18345     for (uint32_t n = 1; n <= 16; n++) {
18346       GemmMicrokernelTester()
18347         .mr(4)
18348         .nr(16)
18349         .kr(1)
18350         .sr(1)
18351         .m(4)
18352         .n(n)
18353         .k(8)
18354         .iterations(1)
18355         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18356     }
18357   }
18358 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_lt_8)18359   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_lt_8) {
18360     TEST_REQUIRES_ARM_NEON;
18361     for (size_t k = 1; k < 8; k++) {
18362       GemmMicrokernelTester()
18363         .mr(4)
18364         .nr(16)
18365         .kr(1)
18366         .sr(1)
18367         .m(4)
18368         .n(16)
18369         .k(k)
18370         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18371     }
18372   }
18373 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_lt_8_strided_a)18374   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_lt_8_strided_a) {
18375     TEST_REQUIRES_ARM_NEON;
18376     for (size_t k = 1; k < 8; k++) {
18377       GemmMicrokernelTester()
18378         .mr(4)
18379         .nr(16)
18380         .kr(1)
18381         .sr(1)
18382         .m(4)
18383         .n(16)
18384         .k(k)
18385         .a_stride(11)
18386         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18387     }
18388   }
18389 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_lt_8_subtile)18390   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_lt_8_subtile) {
18391     TEST_REQUIRES_ARM_NEON;
18392     for (size_t k = 1; k < 8; k++) {
18393       for (uint32_t n = 1; n <= 16; n++) {
18394         for (uint32_t m = 1; m <= 4; m++) {
18395           GemmMicrokernelTester()
18396             .mr(4)
18397             .nr(16)
18398             .kr(1)
18399             .sr(1)
18400             .m(m)
18401             .n(n)
18402             .k(k)
18403             .iterations(1)
18404             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18405         }
18406       }
18407     }
18408   }
18409 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_gt_8)18410   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_gt_8) {
18411     TEST_REQUIRES_ARM_NEON;
18412     for (size_t k = 9; k < 16; k++) {
18413       GemmMicrokernelTester()
18414         .mr(4)
18415         .nr(16)
18416         .kr(1)
18417         .sr(1)
18418         .m(4)
18419         .n(16)
18420         .k(k)
18421         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18422     }
18423   }
18424 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_gt_8_strided_a)18425   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_gt_8_strided_a) {
18426     TEST_REQUIRES_ARM_NEON;
18427     for (size_t k = 9; k < 16; k++) {
18428       GemmMicrokernelTester()
18429         .mr(4)
18430         .nr(16)
18431         .kr(1)
18432         .sr(1)
18433         .m(4)
18434         .n(16)
18435         .k(k)
18436         .a_stride(19)
18437         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18438     }
18439   }
18440 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_gt_8_subtile)18441   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_gt_8_subtile) {
18442     TEST_REQUIRES_ARM_NEON;
18443     for (size_t k = 9; k < 16; k++) {
18444       for (uint32_t n = 1; n <= 16; n++) {
18445         for (uint32_t m = 1; m <= 4; m++) {
18446           GemmMicrokernelTester()
18447             .mr(4)
18448             .nr(16)
18449             .kr(1)
18450             .sr(1)
18451             .m(m)
18452             .n(n)
18453             .k(k)
18454             .iterations(1)
18455             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18456         }
18457       }
18458     }
18459   }
18460 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_div_8)18461   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_div_8) {
18462     TEST_REQUIRES_ARM_NEON;
18463     for (size_t k = 16; k <= 80; k += 8) {
18464       GemmMicrokernelTester()
18465         .mr(4)
18466         .nr(16)
18467         .kr(1)
18468         .sr(1)
18469         .m(4)
18470         .n(16)
18471         .k(k)
18472         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18473     }
18474   }
18475 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_div_8_strided_a)18476   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_div_8_strided_a) {
18477     TEST_REQUIRES_ARM_NEON;
18478     for (size_t k = 16; k <= 80; k += 8) {
18479       GemmMicrokernelTester()
18480         .mr(4)
18481         .nr(16)
18482         .kr(1)
18483         .sr(1)
18484         .m(4)
18485         .n(16)
18486         .k(k)
18487         .a_stride(83)
18488         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18489     }
18490   }
18491 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,k_div_8_subtile)18492   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, k_div_8_subtile) {
18493     TEST_REQUIRES_ARM_NEON;
18494     for (size_t k = 16; k <= 80; k += 8) {
18495       for (uint32_t n = 1; n <= 16; n++) {
18496         for (uint32_t m = 1; m <= 4; m++) {
18497           GemmMicrokernelTester()
18498             .mr(4)
18499             .nr(16)
18500             .kr(1)
18501             .sr(1)
18502             .m(m)
18503             .n(n)
18504             .k(k)
18505             .iterations(1)
18506             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18507         }
18508       }
18509     }
18510   }
18511 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_gt_16)18512   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_gt_16) {
18513     TEST_REQUIRES_ARM_NEON;
18514     for (uint32_t n = 17; n < 32; n++) {
18515       for (size_t k = 1; k <= 40; k += 9) {
18516         GemmMicrokernelTester()
18517           .mr(4)
18518           .nr(16)
18519           .kr(1)
18520           .sr(1)
18521           .m(4)
18522           .n(n)
18523           .k(k)
18524           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18525       }
18526     }
18527   }
18528 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_gt_16_strided_cn)18529   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_gt_16_strided_cn) {
18530     TEST_REQUIRES_ARM_NEON;
18531     for (uint32_t n = 17; n < 32; n++) {
18532       for (size_t k = 1; k <= 40; k += 9) {
18533         GemmMicrokernelTester()
18534           .mr(4)
18535           .nr(16)
18536           .kr(1)
18537           .sr(1)
18538           .m(4)
18539           .n(n)
18540           .k(k)
18541           .cn_stride(19)
18542           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18543       }
18544     }
18545   }
18546 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_gt_16_strided_a)18547   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_gt_16_strided_a) {
18548     TEST_REQUIRES_ARM_NEON;
18549     for (uint32_t n = 17; n < 32; n++) {
18550       for (size_t k = 1; k <= 40; k += 9) {
18551         GemmMicrokernelTester()
18552           .mr(4)
18553           .nr(16)
18554           .kr(1)
18555           .sr(1)
18556           .m(4)
18557           .n(n)
18558           .k(k)
18559           .a_stride(43)
18560           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18561       }
18562     }
18563   }
18564 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_gt_16_subtile)18565   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_gt_16_subtile) {
18566     TEST_REQUIRES_ARM_NEON;
18567     for (uint32_t n = 17; n < 32; n++) {
18568       for (size_t k = 1; k <= 40; k += 9) {
18569         for (uint32_t m = 1; m <= 4; m++) {
18570           GemmMicrokernelTester()
18571             .mr(4)
18572             .nr(16)
18573             .kr(1)
18574             .sr(1)
18575             .m(m)
18576             .n(n)
18577             .k(k)
18578             .iterations(1)
18579             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18580         }
18581       }
18582     }
18583   }
18584 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_div_16)18585   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_div_16) {
18586     TEST_REQUIRES_ARM_NEON;
18587     for (uint32_t n = 32; n <= 48; n += 16) {
18588       for (size_t k = 1; k <= 40; k += 9) {
18589         GemmMicrokernelTester()
18590           .mr(4)
18591           .nr(16)
18592           .kr(1)
18593           .sr(1)
18594           .m(4)
18595           .n(n)
18596           .k(k)
18597           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18598       }
18599     }
18600   }
18601 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_div_16_strided_cn)18602   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_div_16_strided_cn) {
18603     TEST_REQUIRES_ARM_NEON;
18604     for (uint32_t n = 32; n <= 48; n += 16) {
18605       for (size_t k = 1; k <= 40; k += 9) {
18606         GemmMicrokernelTester()
18607           .mr(4)
18608           .nr(16)
18609           .kr(1)
18610           .sr(1)
18611           .m(4)
18612           .n(n)
18613           .k(k)
18614           .cn_stride(19)
18615           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18616       }
18617     }
18618   }
18619 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_div_16_strided_a)18620   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_div_16_strided_a) {
18621     TEST_REQUIRES_ARM_NEON;
18622     for (uint32_t n = 32; n <= 48; n += 16) {
18623       for (size_t k = 1; k <= 40; k += 9) {
18624         GemmMicrokernelTester()
18625           .mr(4)
18626           .nr(16)
18627           .kr(1)
18628           .sr(1)
18629           .m(4)
18630           .n(n)
18631           .k(k)
18632           .a_stride(43)
18633           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18634       }
18635     }
18636   }
18637 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,n_div_16_subtile)18638   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, n_div_16_subtile) {
18639     TEST_REQUIRES_ARM_NEON;
18640     for (uint32_t n = 32; n <= 48; n += 16) {
18641       for (size_t k = 1; k <= 40; k += 9) {
18642         for (uint32_t m = 1; m <= 4; m++) {
18643           GemmMicrokernelTester()
18644             .mr(4)
18645             .nr(16)
18646             .kr(1)
18647             .sr(1)
18648             .m(m)
18649             .n(n)
18650             .k(k)
18651             .iterations(1)
18652             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18653         }
18654       }
18655     }
18656   }
18657 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,strided_cm_subtile)18658   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, strided_cm_subtile) {
18659     TEST_REQUIRES_ARM_NEON;
18660     for (size_t k = 1; k <= 40; k += 9) {
18661       for (uint32_t n = 1; n <= 16; n++) {
18662         for (uint32_t m = 1; m <= 4; m++) {
18663           GemmMicrokernelTester()
18664             .mr(4)
18665             .nr(16)
18666             .kr(1)
18667             .sr(1)
18668             .m(m)
18669             .n(n)
18670             .k(k)
18671             .cm_stride(19)
18672             .iterations(1)
18673             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18674         }
18675       }
18676     }
18677   }
18678 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,qmin)18679   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, qmin) {
18680     TEST_REQUIRES_ARM_NEON;
18681     GemmMicrokernelTester()
18682       .mr(4)
18683       .nr(16)
18684       .kr(1)
18685       .sr(1)
18686       .m(4)
18687       .n(16)
18688       .k(8)
18689       .qmin(128)
18690       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18691   }
18692 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,qmax)18693   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, qmax) {
18694     TEST_REQUIRES_ARM_NEON;
18695     GemmMicrokernelTester()
18696       .mr(4)
18697       .nr(16)
18698       .kr(1)
18699       .sr(1)
18700       .m(4)
18701       .n(16)
18702       .k(8)
18703       .qmax(128)
18704       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18705   }
18706 
TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE,strided_cm)18707   TEST(QS8_GEMM_MINMAX_FP32_4X16__NEON_MLAL_LANE, strided_cm) {
18708     TEST_REQUIRES_ARM_NEON;
18709     GemmMicrokernelTester()
18710       .mr(4)
18711       .nr(16)
18712       .kr(1)
18713       .sr(1)
18714       .m(4)
18715       .n(16)
18716       .k(8)
18717       .cm_stride(19)
18718       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x16__neon_mlal_lane, xnn_init_qs8_conv_minmax_fp32_neon_params, xnn_qs8_requantize_fp32);
18719   }
18720 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
18721 
18722 
18723 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_eq_8)18724   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_eq_8) {
18725     TEST_REQUIRES_X86_SSE2;
18726     GemmMicrokernelTester()
18727       .mr(3)
18728       .nr(4)
18729       .kr(2)
18730       .sr(1)
18731       .m(3)
18732       .n(4)
18733       .k(8)
18734       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18735   }
18736 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,strided_cn)18737   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, strided_cn) {
18738     TEST_REQUIRES_X86_SSE2;
18739     GemmMicrokernelTester()
18740       .mr(3)
18741       .nr(4)
18742       .kr(2)
18743       .sr(1)
18744       .m(3)
18745       .n(4)
18746       .k(8)
18747       .cn_stride(7)
18748       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18749   }
18750 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_eq_8_strided_a)18751   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_eq_8_strided_a) {
18752     TEST_REQUIRES_X86_SSE2;
18753     GemmMicrokernelTester()
18754       .mr(3)
18755       .nr(4)
18756       .kr(2)
18757       .sr(1)
18758       .m(3)
18759       .n(4)
18760       .k(8)
18761       .a_stride(11)
18762       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18763   }
18764 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_eq_8_subtile)18765   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_eq_8_subtile) {
18766     TEST_REQUIRES_X86_SSE2;
18767     for (uint32_t n = 1; n <= 4; n++) {
18768       for (uint32_t m = 1; m <= 3; m++) {
18769         GemmMicrokernelTester()
18770           .mr(3)
18771           .nr(4)
18772           .kr(2)
18773           .sr(1)
18774           .m(m)
18775           .n(n)
18776           .k(8)
18777           .iterations(1)
18778           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18779       }
18780     }
18781   }
18782 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_eq_8_subtile_m)18783   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_eq_8_subtile_m) {
18784     TEST_REQUIRES_X86_SSE2;
18785     for (uint32_t m = 1; m <= 3; m++) {
18786       GemmMicrokernelTester()
18787         .mr(3)
18788         .nr(4)
18789         .kr(2)
18790         .sr(1)
18791         .m(m)
18792         .n(4)
18793         .k(8)
18794         .iterations(1)
18795         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18796     }
18797   }
18798 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_eq_8_subtile_n)18799   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_eq_8_subtile_n) {
18800     TEST_REQUIRES_X86_SSE2;
18801     for (uint32_t n = 1; n <= 4; n++) {
18802       GemmMicrokernelTester()
18803         .mr(3)
18804         .nr(4)
18805         .kr(2)
18806         .sr(1)
18807         .m(3)
18808         .n(n)
18809         .k(8)
18810         .iterations(1)
18811         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18812     }
18813   }
18814 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_lt_8)18815   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_lt_8) {
18816     TEST_REQUIRES_X86_SSE2;
18817     for (size_t k = 1; k < 8; k++) {
18818       GemmMicrokernelTester()
18819         .mr(3)
18820         .nr(4)
18821         .kr(2)
18822         .sr(1)
18823         .m(3)
18824         .n(4)
18825         .k(k)
18826         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18827     }
18828   }
18829 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_lt_8_strided_a)18830   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_lt_8_strided_a) {
18831     TEST_REQUIRES_X86_SSE2;
18832     for (size_t k = 1; k < 8; k++) {
18833       GemmMicrokernelTester()
18834         .mr(3)
18835         .nr(4)
18836         .kr(2)
18837         .sr(1)
18838         .m(3)
18839         .n(4)
18840         .k(k)
18841         .a_stride(11)
18842         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18843     }
18844   }
18845 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_lt_8_subtile)18846   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_lt_8_subtile) {
18847     TEST_REQUIRES_X86_SSE2;
18848     for (size_t k = 1; k < 8; k++) {
18849       for (uint32_t n = 1; n <= 4; n++) {
18850         for (uint32_t m = 1; m <= 3; m++) {
18851           GemmMicrokernelTester()
18852             .mr(3)
18853             .nr(4)
18854             .kr(2)
18855             .sr(1)
18856             .m(m)
18857             .n(n)
18858             .k(k)
18859             .iterations(1)
18860             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18861         }
18862       }
18863     }
18864   }
18865 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_gt_8)18866   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_gt_8) {
18867     TEST_REQUIRES_X86_SSE2;
18868     for (size_t k = 9; k < 16; k++) {
18869       GemmMicrokernelTester()
18870         .mr(3)
18871         .nr(4)
18872         .kr(2)
18873         .sr(1)
18874         .m(3)
18875         .n(4)
18876         .k(k)
18877         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18878     }
18879   }
18880 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_gt_8_strided_a)18881   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_gt_8_strided_a) {
18882     TEST_REQUIRES_X86_SSE2;
18883     for (size_t k = 9; k < 16; k++) {
18884       GemmMicrokernelTester()
18885         .mr(3)
18886         .nr(4)
18887         .kr(2)
18888         .sr(1)
18889         .m(3)
18890         .n(4)
18891         .k(k)
18892         .a_stride(19)
18893         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18894     }
18895   }
18896 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_gt_8_subtile)18897   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_gt_8_subtile) {
18898     TEST_REQUIRES_X86_SSE2;
18899     for (size_t k = 9; k < 16; k++) {
18900       for (uint32_t n = 1; n <= 4; n++) {
18901         for (uint32_t m = 1; m <= 3; m++) {
18902           GemmMicrokernelTester()
18903             .mr(3)
18904             .nr(4)
18905             .kr(2)
18906             .sr(1)
18907             .m(m)
18908             .n(n)
18909             .k(k)
18910             .iterations(1)
18911             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18912         }
18913       }
18914     }
18915   }
18916 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_div_8)18917   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_div_8) {
18918     TEST_REQUIRES_X86_SSE2;
18919     for (size_t k = 16; k <= 80; k += 8) {
18920       GemmMicrokernelTester()
18921         .mr(3)
18922         .nr(4)
18923         .kr(2)
18924         .sr(1)
18925         .m(3)
18926         .n(4)
18927         .k(k)
18928         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18929     }
18930   }
18931 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_div_8_strided_a)18932   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_div_8_strided_a) {
18933     TEST_REQUIRES_X86_SSE2;
18934     for (size_t k = 16; k <= 80; k += 8) {
18935       GemmMicrokernelTester()
18936         .mr(3)
18937         .nr(4)
18938         .kr(2)
18939         .sr(1)
18940         .m(3)
18941         .n(4)
18942         .k(k)
18943         .a_stride(83)
18944         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18945     }
18946   }
18947 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,k_div_8_subtile)18948   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, k_div_8_subtile) {
18949     TEST_REQUIRES_X86_SSE2;
18950     for (size_t k = 16; k <= 80; k += 8) {
18951       for (uint32_t n = 1; n <= 4; n++) {
18952         for (uint32_t m = 1; m <= 3; m++) {
18953           GemmMicrokernelTester()
18954             .mr(3)
18955             .nr(4)
18956             .kr(2)
18957             .sr(1)
18958             .m(m)
18959             .n(n)
18960             .k(k)
18961             .iterations(1)
18962             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18963         }
18964       }
18965     }
18966   }
18967 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_gt_4)18968   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_gt_4) {
18969     TEST_REQUIRES_X86_SSE2;
18970     for (uint32_t n = 5; n < 8; n++) {
18971       for (size_t k = 1; k <= 40; k += 9) {
18972         GemmMicrokernelTester()
18973           .mr(3)
18974           .nr(4)
18975           .kr(2)
18976           .sr(1)
18977           .m(3)
18978           .n(n)
18979           .k(k)
18980           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18981       }
18982     }
18983   }
18984 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_gt_4_strided_cn)18985   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_gt_4_strided_cn) {
18986     TEST_REQUIRES_X86_SSE2;
18987     for (uint32_t n = 5; n < 8; n++) {
18988       for (size_t k = 1; k <= 40; k += 9) {
18989         GemmMicrokernelTester()
18990           .mr(3)
18991           .nr(4)
18992           .kr(2)
18993           .sr(1)
18994           .m(3)
18995           .n(n)
18996           .k(k)
18997           .cn_stride(7)
18998           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
18999       }
19000     }
19001   }
19002 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_gt_4_strided_a)19003   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_gt_4_strided_a) {
19004     TEST_REQUIRES_X86_SSE2;
19005     for (uint32_t n = 5; n < 8; n++) {
19006       for (size_t k = 1; k <= 40; k += 9) {
19007         GemmMicrokernelTester()
19008           .mr(3)
19009           .nr(4)
19010           .kr(2)
19011           .sr(1)
19012           .m(3)
19013           .n(n)
19014           .k(k)
19015           .a_stride(43)
19016           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19017       }
19018     }
19019   }
19020 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_gt_4_subtile)19021   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_gt_4_subtile) {
19022     TEST_REQUIRES_X86_SSE2;
19023     for (uint32_t n = 5; n < 8; n++) {
19024       for (size_t k = 1; k <= 40; k += 9) {
19025         for (uint32_t m = 1; m <= 3; m++) {
19026           GemmMicrokernelTester()
19027             .mr(3)
19028             .nr(4)
19029             .kr(2)
19030             .sr(1)
19031             .m(m)
19032             .n(n)
19033             .k(k)
19034             .iterations(1)
19035             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19036         }
19037       }
19038     }
19039   }
19040 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_div_4)19041   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_div_4) {
19042     TEST_REQUIRES_X86_SSE2;
19043     for (uint32_t n = 8; n <= 12; n += 4) {
19044       for (size_t k = 1; k <= 40; k += 9) {
19045         GemmMicrokernelTester()
19046           .mr(3)
19047           .nr(4)
19048           .kr(2)
19049           .sr(1)
19050           .m(3)
19051           .n(n)
19052           .k(k)
19053           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19054       }
19055     }
19056   }
19057 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_div_4_strided_cn)19058   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_div_4_strided_cn) {
19059     TEST_REQUIRES_X86_SSE2;
19060     for (uint32_t n = 8; n <= 12; n += 4) {
19061       for (size_t k = 1; k <= 40; k += 9) {
19062         GemmMicrokernelTester()
19063           .mr(3)
19064           .nr(4)
19065           .kr(2)
19066           .sr(1)
19067           .m(3)
19068           .n(n)
19069           .k(k)
19070           .cn_stride(7)
19071           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19072       }
19073     }
19074   }
19075 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_div_4_strided_a)19076   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_div_4_strided_a) {
19077     TEST_REQUIRES_X86_SSE2;
19078     for (uint32_t n = 8; n <= 12; n += 4) {
19079       for (size_t k = 1; k <= 40; k += 9) {
19080         GemmMicrokernelTester()
19081           .mr(3)
19082           .nr(4)
19083           .kr(2)
19084           .sr(1)
19085           .m(3)
19086           .n(n)
19087           .k(k)
19088           .a_stride(43)
19089           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19090       }
19091     }
19092   }
19093 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,n_div_4_subtile)19094   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, n_div_4_subtile) {
19095     TEST_REQUIRES_X86_SSE2;
19096     for (uint32_t n = 8; n <= 12; n += 4) {
19097       for (size_t k = 1; k <= 40; k += 9) {
19098         for (uint32_t m = 1; m <= 3; m++) {
19099           GemmMicrokernelTester()
19100             .mr(3)
19101             .nr(4)
19102             .kr(2)
19103             .sr(1)
19104             .m(m)
19105             .n(n)
19106             .k(k)
19107             .iterations(1)
19108             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19109         }
19110       }
19111     }
19112   }
19113 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,strided_cm_subtile)19114   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, strided_cm_subtile) {
19115     TEST_REQUIRES_X86_SSE2;
19116     for (size_t k = 1; k <= 40; k += 9) {
19117       for (uint32_t n = 1; n <= 4; n++) {
19118         for (uint32_t m = 1; m <= 3; m++) {
19119           GemmMicrokernelTester()
19120             .mr(3)
19121             .nr(4)
19122             .kr(2)
19123             .sr(1)
19124             .m(m)
19125             .n(n)
19126             .k(k)
19127             .cm_stride(7)
19128             .iterations(1)
19129             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19130         }
19131       }
19132     }
19133   }
19134 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,qmin)19135   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, qmin) {
19136     TEST_REQUIRES_X86_SSE2;
19137     GemmMicrokernelTester()
19138       .mr(3)
19139       .nr(4)
19140       .kr(2)
19141       .sr(1)
19142       .m(3)
19143       .n(4)
19144       .k(8)
19145       .qmin(128)
19146       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19147   }
19148 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,qmax)19149   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, qmax) {
19150     TEST_REQUIRES_X86_SSE2;
19151     GemmMicrokernelTester()
19152       .mr(3)
19153       .nr(4)
19154       .kr(2)
19155       .sr(1)
19156       .m(3)
19157       .n(4)
19158       .k(8)
19159       .qmax(128)
19160       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19161   }
19162 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64,strided_cm)19163   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE2_LD64, strided_cm) {
19164     TEST_REQUIRES_X86_SSE2;
19165     GemmMicrokernelTester()
19166       .mr(3)
19167       .nr(4)
19168       .kr(2)
19169       .sr(1)
19170       .m(3)
19171       .n(4)
19172       .k(8)
19173       .cm_stride(7)
19174       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
19175   }
19176 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
19177 
19178 
19179 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_eq_8)19180   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_eq_8) {
19181     TEST_REQUIRES_X86_SSE41;
19182     GemmMicrokernelTester()
19183       .mr(3)
19184       .nr(4)
19185       .kr(2)
19186       .sr(1)
19187       .m(3)
19188       .n(4)
19189       .k(8)
19190       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19191   }
19192 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,strided_cn)19193   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, strided_cn) {
19194     TEST_REQUIRES_X86_SSE41;
19195     GemmMicrokernelTester()
19196       .mr(3)
19197       .nr(4)
19198       .kr(2)
19199       .sr(1)
19200       .m(3)
19201       .n(4)
19202       .k(8)
19203       .cn_stride(7)
19204       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19205   }
19206 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_eq_8_strided_a)19207   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_eq_8_strided_a) {
19208     TEST_REQUIRES_X86_SSE41;
19209     GemmMicrokernelTester()
19210       .mr(3)
19211       .nr(4)
19212       .kr(2)
19213       .sr(1)
19214       .m(3)
19215       .n(4)
19216       .k(8)
19217       .a_stride(11)
19218       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19219   }
19220 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_eq_8_subtile)19221   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_eq_8_subtile) {
19222     TEST_REQUIRES_X86_SSE41;
19223     for (uint32_t n = 1; n <= 4; n++) {
19224       for (uint32_t m = 1; m <= 3; m++) {
19225         GemmMicrokernelTester()
19226           .mr(3)
19227           .nr(4)
19228           .kr(2)
19229           .sr(1)
19230           .m(m)
19231           .n(n)
19232           .k(8)
19233           .iterations(1)
19234           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19235       }
19236     }
19237   }
19238 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_eq_8_subtile_m)19239   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_eq_8_subtile_m) {
19240     TEST_REQUIRES_X86_SSE41;
19241     for (uint32_t m = 1; m <= 3; m++) {
19242       GemmMicrokernelTester()
19243         .mr(3)
19244         .nr(4)
19245         .kr(2)
19246         .sr(1)
19247         .m(m)
19248         .n(4)
19249         .k(8)
19250         .iterations(1)
19251         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19252     }
19253   }
19254 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_eq_8_subtile_n)19255   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_eq_8_subtile_n) {
19256     TEST_REQUIRES_X86_SSE41;
19257     for (uint32_t n = 1; n <= 4; n++) {
19258       GemmMicrokernelTester()
19259         .mr(3)
19260         .nr(4)
19261         .kr(2)
19262         .sr(1)
19263         .m(3)
19264         .n(n)
19265         .k(8)
19266         .iterations(1)
19267         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19268     }
19269   }
19270 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_lt_8)19271   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_lt_8) {
19272     TEST_REQUIRES_X86_SSE41;
19273     for (size_t k = 1; k < 8; k++) {
19274       GemmMicrokernelTester()
19275         .mr(3)
19276         .nr(4)
19277         .kr(2)
19278         .sr(1)
19279         .m(3)
19280         .n(4)
19281         .k(k)
19282         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19283     }
19284   }
19285 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_lt_8_strided_a)19286   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_lt_8_strided_a) {
19287     TEST_REQUIRES_X86_SSE41;
19288     for (size_t k = 1; k < 8; k++) {
19289       GemmMicrokernelTester()
19290         .mr(3)
19291         .nr(4)
19292         .kr(2)
19293         .sr(1)
19294         .m(3)
19295         .n(4)
19296         .k(k)
19297         .a_stride(11)
19298         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19299     }
19300   }
19301 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_lt_8_subtile)19302   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_lt_8_subtile) {
19303     TEST_REQUIRES_X86_SSE41;
19304     for (size_t k = 1; k < 8; k++) {
19305       for (uint32_t n = 1; n <= 4; n++) {
19306         for (uint32_t m = 1; m <= 3; m++) {
19307           GemmMicrokernelTester()
19308             .mr(3)
19309             .nr(4)
19310             .kr(2)
19311             .sr(1)
19312             .m(m)
19313             .n(n)
19314             .k(k)
19315             .iterations(1)
19316             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19317         }
19318       }
19319     }
19320   }
19321 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_gt_8)19322   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_gt_8) {
19323     TEST_REQUIRES_X86_SSE41;
19324     for (size_t k = 9; k < 16; k++) {
19325       GemmMicrokernelTester()
19326         .mr(3)
19327         .nr(4)
19328         .kr(2)
19329         .sr(1)
19330         .m(3)
19331         .n(4)
19332         .k(k)
19333         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19334     }
19335   }
19336 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_gt_8_strided_a)19337   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_gt_8_strided_a) {
19338     TEST_REQUIRES_X86_SSE41;
19339     for (size_t k = 9; k < 16; k++) {
19340       GemmMicrokernelTester()
19341         .mr(3)
19342         .nr(4)
19343         .kr(2)
19344         .sr(1)
19345         .m(3)
19346         .n(4)
19347         .k(k)
19348         .a_stride(19)
19349         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19350     }
19351   }
19352 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_gt_8_subtile)19353   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_gt_8_subtile) {
19354     TEST_REQUIRES_X86_SSE41;
19355     for (size_t k = 9; k < 16; k++) {
19356       for (uint32_t n = 1; n <= 4; n++) {
19357         for (uint32_t m = 1; m <= 3; m++) {
19358           GemmMicrokernelTester()
19359             .mr(3)
19360             .nr(4)
19361             .kr(2)
19362             .sr(1)
19363             .m(m)
19364             .n(n)
19365             .k(k)
19366             .iterations(1)
19367             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19368         }
19369       }
19370     }
19371   }
19372 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_div_8)19373   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_div_8) {
19374     TEST_REQUIRES_X86_SSE41;
19375     for (size_t k = 16; k <= 80; k += 8) {
19376       GemmMicrokernelTester()
19377         .mr(3)
19378         .nr(4)
19379         .kr(2)
19380         .sr(1)
19381         .m(3)
19382         .n(4)
19383         .k(k)
19384         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19385     }
19386   }
19387 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_div_8_strided_a)19388   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_div_8_strided_a) {
19389     TEST_REQUIRES_X86_SSE41;
19390     for (size_t k = 16; k <= 80; k += 8) {
19391       GemmMicrokernelTester()
19392         .mr(3)
19393         .nr(4)
19394         .kr(2)
19395         .sr(1)
19396         .m(3)
19397         .n(4)
19398         .k(k)
19399         .a_stride(83)
19400         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19401     }
19402   }
19403 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,k_div_8_subtile)19404   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, k_div_8_subtile) {
19405     TEST_REQUIRES_X86_SSE41;
19406     for (size_t k = 16; k <= 80; k += 8) {
19407       for (uint32_t n = 1; n <= 4; n++) {
19408         for (uint32_t m = 1; m <= 3; m++) {
19409           GemmMicrokernelTester()
19410             .mr(3)
19411             .nr(4)
19412             .kr(2)
19413             .sr(1)
19414             .m(m)
19415             .n(n)
19416             .k(k)
19417             .iterations(1)
19418             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19419         }
19420       }
19421     }
19422   }
19423 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_gt_4)19424   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_gt_4) {
19425     TEST_REQUIRES_X86_SSE41;
19426     for (uint32_t n = 5; n < 8; n++) {
19427       for (size_t k = 1; k <= 40; k += 9) {
19428         GemmMicrokernelTester()
19429           .mr(3)
19430           .nr(4)
19431           .kr(2)
19432           .sr(1)
19433           .m(3)
19434           .n(n)
19435           .k(k)
19436           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19437       }
19438     }
19439   }
19440 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_gt_4_strided_cn)19441   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_gt_4_strided_cn) {
19442     TEST_REQUIRES_X86_SSE41;
19443     for (uint32_t n = 5; n < 8; n++) {
19444       for (size_t k = 1; k <= 40; k += 9) {
19445         GemmMicrokernelTester()
19446           .mr(3)
19447           .nr(4)
19448           .kr(2)
19449           .sr(1)
19450           .m(3)
19451           .n(n)
19452           .k(k)
19453           .cn_stride(7)
19454           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19455       }
19456     }
19457   }
19458 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_gt_4_strided_a)19459   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_gt_4_strided_a) {
19460     TEST_REQUIRES_X86_SSE41;
19461     for (uint32_t n = 5; n < 8; n++) {
19462       for (size_t k = 1; k <= 40; k += 9) {
19463         GemmMicrokernelTester()
19464           .mr(3)
19465           .nr(4)
19466           .kr(2)
19467           .sr(1)
19468           .m(3)
19469           .n(n)
19470           .k(k)
19471           .a_stride(43)
19472           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19473       }
19474     }
19475   }
19476 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_gt_4_subtile)19477   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_gt_4_subtile) {
19478     TEST_REQUIRES_X86_SSE41;
19479     for (uint32_t n = 5; n < 8; n++) {
19480       for (size_t k = 1; k <= 40; k += 9) {
19481         for (uint32_t m = 1; m <= 3; m++) {
19482           GemmMicrokernelTester()
19483             .mr(3)
19484             .nr(4)
19485             .kr(2)
19486             .sr(1)
19487             .m(m)
19488             .n(n)
19489             .k(k)
19490             .iterations(1)
19491             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19492         }
19493       }
19494     }
19495   }
19496 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_div_4)19497   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_div_4) {
19498     TEST_REQUIRES_X86_SSE41;
19499     for (uint32_t n = 8; n <= 12; n += 4) {
19500       for (size_t k = 1; k <= 40; k += 9) {
19501         GemmMicrokernelTester()
19502           .mr(3)
19503           .nr(4)
19504           .kr(2)
19505           .sr(1)
19506           .m(3)
19507           .n(n)
19508           .k(k)
19509           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19510       }
19511     }
19512   }
19513 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_div_4_strided_cn)19514   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_div_4_strided_cn) {
19515     TEST_REQUIRES_X86_SSE41;
19516     for (uint32_t n = 8; n <= 12; n += 4) {
19517       for (size_t k = 1; k <= 40; k += 9) {
19518         GemmMicrokernelTester()
19519           .mr(3)
19520           .nr(4)
19521           .kr(2)
19522           .sr(1)
19523           .m(3)
19524           .n(n)
19525           .k(k)
19526           .cn_stride(7)
19527           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19528       }
19529     }
19530   }
19531 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_div_4_strided_a)19532   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_div_4_strided_a) {
19533     TEST_REQUIRES_X86_SSE41;
19534     for (uint32_t n = 8; n <= 12; n += 4) {
19535       for (size_t k = 1; k <= 40; k += 9) {
19536         GemmMicrokernelTester()
19537           .mr(3)
19538           .nr(4)
19539           .kr(2)
19540           .sr(1)
19541           .m(3)
19542           .n(n)
19543           .k(k)
19544           .a_stride(43)
19545           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19546       }
19547     }
19548   }
19549 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,n_div_4_subtile)19550   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, n_div_4_subtile) {
19551     TEST_REQUIRES_X86_SSE41;
19552     for (uint32_t n = 8; n <= 12; n += 4) {
19553       for (size_t k = 1; k <= 40; k += 9) {
19554         for (uint32_t m = 1; m <= 3; m++) {
19555           GemmMicrokernelTester()
19556             .mr(3)
19557             .nr(4)
19558             .kr(2)
19559             .sr(1)
19560             .m(m)
19561             .n(n)
19562             .k(k)
19563             .iterations(1)
19564             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19565         }
19566       }
19567     }
19568   }
19569 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,strided_cm_subtile)19570   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, strided_cm_subtile) {
19571     TEST_REQUIRES_X86_SSE41;
19572     for (size_t k = 1; k <= 40; k += 9) {
19573       for (uint32_t n = 1; n <= 4; n++) {
19574         for (uint32_t m = 1; m <= 3; m++) {
19575           GemmMicrokernelTester()
19576             .mr(3)
19577             .nr(4)
19578             .kr(2)
19579             .sr(1)
19580             .m(m)
19581             .n(n)
19582             .k(k)
19583             .cm_stride(7)
19584             .iterations(1)
19585             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19586         }
19587       }
19588     }
19589   }
19590 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,qmin)19591   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, qmin) {
19592     TEST_REQUIRES_X86_SSE41;
19593     GemmMicrokernelTester()
19594       .mr(3)
19595       .nr(4)
19596       .kr(2)
19597       .sr(1)
19598       .m(3)
19599       .n(4)
19600       .k(8)
19601       .qmin(128)
19602       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19603   }
19604 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,qmax)19605   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, qmax) {
19606     TEST_REQUIRES_X86_SSE41;
19607     GemmMicrokernelTester()
19608       .mr(3)
19609       .nr(4)
19610       .kr(2)
19611       .sr(1)
19612       .m(3)
19613       .n(4)
19614       .k(8)
19615       .qmax(128)
19616       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19617   }
19618 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64,strided_cm)19619   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__SSE41_LD64, strided_cm) {
19620     TEST_REQUIRES_X86_SSE41;
19621     GemmMicrokernelTester()
19622       .mr(3)
19623       .nr(4)
19624       .kr(2)
19625       .sr(1)
19626       .m(3)
19627       .n(4)
19628       .k(8)
19629       .cm_stride(7)
19630       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19631   }
19632 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
19633 
19634 
19635 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_eq_8)19636   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_eq_8) {
19637     TEST_REQUIRES_X86_AVX;
19638     GemmMicrokernelTester()
19639       .mr(1)
19640       .nr(4)
19641       .kr(2)
19642       .sr(1)
19643       .m(1)
19644       .n(4)
19645       .k(8)
19646       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19647   }
19648 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,strided_cn)19649   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, strided_cn) {
19650     TEST_REQUIRES_X86_AVX;
19651     GemmMicrokernelTester()
19652       .mr(1)
19653       .nr(4)
19654       .kr(2)
19655       .sr(1)
19656       .m(1)
19657       .n(4)
19658       .k(8)
19659       .cn_stride(7)
19660       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19661   }
19662 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_eq_8_strided_a)19663   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_eq_8_strided_a) {
19664     TEST_REQUIRES_X86_AVX;
19665     GemmMicrokernelTester()
19666       .mr(1)
19667       .nr(4)
19668       .kr(2)
19669       .sr(1)
19670       .m(1)
19671       .n(4)
19672       .k(8)
19673       .a_stride(11)
19674       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19675   }
19676 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_eq_8_subtile)19677   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_eq_8_subtile) {
19678     TEST_REQUIRES_X86_AVX;
19679     for (uint32_t n = 1; n <= 4; n++) {
19680       for (uint32_t m = 1; m <= 1; m++) {
19681         GemmMicrokernelTester()
19682           .mr(1)
19683           .nr(4)
19684           .kr(2)
19685           .sr(1)
19686           .m(m)
19687           .n(n)
19688           .k(8)
19689           .iterations(1)
19690           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19691       }
19692     }
19693   }
19694 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_eq_8_subtile_m)19695   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_eq_8_subtile_m) {
19696     TEST_REQUIRES_X86_AVX;
19697     for (uint32_t m = 1; m <= 1; m++) {
19698       GemmMicrokernelTester()
19699         .mr(1)
19700         .nr(4)
19701         .kr(2)
19702         .sr(1)
19703         .m(m)
19704         .n(4)
19705         .k(8)
19706         .iterations(1)
19707         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19708     }
19709   }
19710 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_eq_8_subtile_n)19711   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_eq_8_subtile_n) {
19712     TEST_REQUIRES_X86_AVX;
19713     for (uint32_t n = 1; n <= 4; n++) {
19714       GemmMicrokernelTester()
19715         .mr(1)
19716         .nr(4)
19717         .kr(2)
19718         .sr(1)
19719         .m(1)
19720         .n(n)
19721         .k(8)
19722         .iterations(1)
19723         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19724     }
19725   }
19726 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_lt_8)19727   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_lt_8) {
19728     TEST_REQUIRES_X86_AVX;
19729     for (size_t k = 1; k < 8; k++) {
19730       GemmMicrokernelTester()
19731         .mr(1)
19732         .nr(4)
19733         .kr(2)
19734         .sr(1)
19735         .m(1)
19736         .n(4)
19737         .k(k)
19738         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19739     }
19740   }
19741 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_lt_8_strided_a)19742   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_lt_8_strided_a) {
19743     TEST_REQUIRES_X86_AVX;
19744     for (size_t k = 1; k < 8; k++) {
19745       GemmMicrokernelTester()
19746         .mr(1)
19747         .nr(4)
19748         .kr(2)
19749         .sr(1)
19750         .m(1)
19751         .n(4)
19752         .k(k)
19753         .a_stride(11)
19754         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19755     }
19756   }
19757 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_lt_8_subtile)19758   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_lt_8_subtile) {
19759     TEST_REQUIRES_X86_AVX;
19760     for (size_t k = 1; k < 8; k++) {
19761       for (uint32_t n = 1; n <= 4; n++) {
19762         for (uint32_t m = 1; m <= 1; m++) {
19763           GemmMicrokernelTester()
19764             .mr(1)
19765             .nr(4)
19766             .kr(2)
19767             .sr(1)
19768             .m(m)
19769             .n(n)
19770             .k(k)
19771             .iterations(1)
19772             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19773         }
19774       }
19775     }
19776   }
19777 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_gt_8)19778   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_gt_8) {
19779     TEST_REQUIRES_X86_AVX;
19780     for (size_t k = 9; k < 16; k++) {
19781       GemmMicrokernelTester()
19782         .mr(1)
19783         .nr(4)
19784         .kr(2)
19785         .sr(1)
19786         .m(1)
19787         .n(4)
19788         .k(k)
19789         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19790     }
19791   }
19792 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_gt_8_strided_a)19793   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_gt_8_strided_a) {
19794     TEST_REQUIRES_X86_AVX;
19795     for (size_t k = 9; k < 16; k++) {
19796       GemmMicrokernelTester()
19797         .mr(1)
19798         .nr(4)
19799         .kr(2)
19800         .sr(1)
19801         .m(1)
19802         .n(4)
19803         .k(k)
19804         .a_stride(19)
19805         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19806     }
19807   }
19808 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_gt_8_subtile)19809   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_gt_8_subtile) {
19810     TEST_REQUIRES_X86_AVX;
19811     for (size_t k = 9; k < 16; k++) {
19812       for (uint32_t n = 1; n <= 4; n++) {
19813         for (uint32_t m = 1; m <= 1; m++) {
19814           GemmMicrokernelTester()
19815             .mr(1)
19816             .nr(4)
19817             .kr(2)
19818             .sr(1)
19819             .m(m)
19820             .n(n)
19821             .k(k)
19822             .iterations(1)
19823             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19824         }
19825       }
19826     }
19827   }
19828 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_div_8)19829   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_div_8) {
19830     TEST_REQUIRES_X86_AVX;
19831     for (size_t k = 16; k <= 80; k += 8) {
19832       GemmMicrokernelTester()
19833         .mr(1)
19834         .nr(4)
19835         .kr(2)
19836         .sr(1)
19837         .m(1)
19838         .n(4)
19839         .k(k)
19840         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19841     }
19842   }
19843 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_div_8_strided_a)19844   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_div_8_strided_a) {
19845     TEST_REQUIRES_X86_AVX;
19846     for (size_t k = 16; k <= 80; k += 8) {
19847       GemmMicrokernelTester()
19848         .mr(1)
19849         .nr(4)
19850         .kr(2)
19851         .sr(1)
19852         .m(1)
19853         .n(4)
19854         .k(k)
19855         .a_stride(83)
19856         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19857     }
19858   }
19859 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,k_div_8_subtile)19860   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, k_div_8_subtile) {
19861     TEST_REQUIRES_X86_AVX;
19862     for (size_t k = 16; k <= 80; k += 8) {
19863       for (uint32_t n = 1; n <= 4; n++) {
19864         for (uint32_t m = 1; m <= 1; m++) {
19865           GemmMicrokernelTester()
19866             .mr(1)
19867             .nr(4)
19868             .kr(2)
19869             .sr(1)
19870             .m(m)
19871             .n(n)
19872             .k(k)
19873             .iterations(1)
19874             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19875         }
19876       }
19877     }
19878   }
19879 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_gt_4)19880   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_gt_4) {
19881     TEST_REQUIRES_X86_AVX;
19882     for (uint32_t n = 5; n < 8; n++) {
19883       for (size_t k = 1; k <= 40; k += 9) {
19884         GemmMicrokernelTester()
19885           .mr(1)
19886           .nr(4)
19887           .kr(2)
19888           .sr(1)
19889           .m(1)
19890           .n(n)
19891           .k(k)
19892           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19893       }
19894     }
19895   }
19896 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_gt_4_strided_cn)19897   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_gt_4_strided_cn) {
19898     TEST_REQUIRES_X86_AVX;
19899     for (uint32_t n = 5; n < 8; n++) {
19900       for (size_t k = 1; k <= 40; k += 9) {
19901         GemmMicrokernelTester()
19902           .mr(1)
19903           .nr(4)
19904           .kr(2)
19905           .sr(1)
19906           .m(1)
19907           .n(n)
19908           .k(k)
19909           .cn_stride(7)
19910           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19911       }
19912     }
19913   }
19914 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_gt_4_strided_a)19915   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_gt_4_strided_a) {
19916     TEST_REQUIRES_X86_AVX;
19917     for (uint32_t n = 5; n < 8; n++) {
19918       for (size_t k = 1; k <= 40; k += 9) {
19919         GemmMicrokernelTester()
19920           .mr(1)
19921           .nr(4)
19922           .kr(2)
19923           .sr(1)
19924           .m(1)
19925           .n(n)
19926           .k(k)
19927           .a_stride(43)
19928           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19929       }
19930     }
19931   }
19932 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_gt_4_subtile)19933   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_gt_4_subtile) {
19934     TEST_REQUIRES_X86_AVX;
19935     for (uint32_t n = 5; n < 8; n++) {
19936       for (size_t k = 1; k <= 40; k += 9) {
19937         for (uint32_t m = 1; m <= 1; m++) {
19938           GemmMicrokernelTester()
19939             .mr(1)
19940             .nr(4)
19941             .kr(2)
19942             .sr(1)
19943             .m(m)
19944             .n(n)
19945             .k(k)
19946             .iterations(1)
19947             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19948         }
19949       }
19950     }
19951   }
19952 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_div_4)19953   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_div_4) {
19954     TEST_REQUIRES_X86_AVX;
19955     for (uint32_t n = 8; n <= 12; n += 4) {
19956       for (size_t k = 1; k <= 40; k += 9) {
19957         GemmMicrokernelTester()
19958           .mr(1)
19959           .nr(4)
19960           .kr(2)
19961           .sr(1)
19962           .m(1)
19963           .n(n)
19964           .k(k)
19965           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19966       }
19967     }
19968   }
19969 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_div_4_strided_cn)19970   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_div_4_strided_cn) {
19971     TEST_REQUIRES_X86_AVX;
19972     for (uint32_t n = 8; n <= 12; n += 4) {
19973       for (size_t k = 1; k <= 40; k += 9) {
19974         GemmMicrokernelTester()
19975           .mr(1)
19976           .nr(4)
19977           .kr(2)
19978           .sr(1)
19979           .m(1)
19980           .n(n)
19981           .k(k)
19982           .cn_stride(7)
19983           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
19984       }
19985     }
19986   }
19987 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_div_4_strided_a)19988   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_div_4_strided_a) {
19989     TEST_REQUIRES_X86_AVX;
19990     for (uint32_t n = 8; n <= 12; n += 4) {
19991       for (size_t k = 1; k <= 40; k += 9) {
19992         GemmMicrokernelTester()
19993           .mr(1)
19994           .nr(4)
19995           .kr(2)
19996           .sr(1)
19997           .m(1)
19998           .n(n)
19999           .k(k)
20000           .a_stride(43)
20001           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20002       }
20003     }
20004   }
20005 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,n_div_4_subtile)20006   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, n_div_4_subtile) {
20007     TEST_REQUIRES_X86_AVX;
20008     for (uint32_t n = 8; n <= 12; n += 4) {
20009       for (size_t k = 1; k <= 40; k += 9) {
20010         for (uint32_t m = 1; m <= 1; m++) {
20011           GemmMicrokernelTester()
20012             .mr(1)
20013             .nr(4)
20014             .kr(2)
20015             .sr(1)
20016             .m(m)
20017             .n(n)
20018             .k(k)
20019             .iterations(1)
20020             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20021         }
20022       }
20023     }
20024   }
20025 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,strided_cm_subtile)20026   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, strided_cm_subtile) {
20027     TEST_REQUIRES_X86_AVX;
20028     for (size_t k = 1; k <= 40; k += 9) {
20029       for (uint32_t n = 1; n <= 4; n++) {
20030         for (uint32_t m = 1; m <= 1; m++) {
20031           GemmMicrokernelTester()
20032             .mr(1)
20033             .nr(4)
20034             .kr(2)
20035             .sr(1)
20036             .m(m)
20037             .n(n)
20038             .k(k)
20039             .cm_stride(7)
20040             .iterations(1)
20041             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20042         }
20043       }
20044     }
20045   }
20046 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,qmin)20047   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, qmin) {
20048     TEST_REQUIRES_X86_AVX;
20049     GemmMicrokernelTester()
20050       .mr(1)
20051       .nr(4)
20052       .kr(2)
20053       .sr(1)
20054       .m(1)
20055       .n(4)
20056       .k(8)
20057       .qmin(128)
20058       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20059   }
20060 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,qmax)20061   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, qmax) {
20062     TEST_REQUIRES_X86_AVX;
20063     GemmMicrokernelTester()
20064       .mr(1)
20065       .nr(4)
20066       .kr(2)
20067       .sr(1)
20068       .m(1)
20069       .n(4)
20070       .k(8)
20071       .qmax(128)
20072       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20073   }
20074 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64,strided_cm)20075   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__AVX_LD64, strided_cm) {
20076     TEST_REQUIRES_X86_AVX;
20077     GemmMicrokernelTester()
20078       .mr(1)
20079       .nr(4)
20080       .kr(2)
20081       .sr(1)
20082       .m(1)
20083       .n(4)
20084       .k(8)
20085       .cm_stride(7)
20086       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20087   }
20088 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
20089 
20090 
20091 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_eq_8)20092   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_eq_8) {
20093     TEST_REQUIRES_X86_XOP;
20094     GemmMicrokernelTester()
20095       .mr(1)
20096       .nr(4)
20097       .kr(2)
20098       .sr(1)
20099       .m(1)
20100       .n(4)
20101       .k(8)
20102       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20103   }
20104 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,strided_cn)20105   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, strided_cn) {
20106     TEST_REQUIRES_X86_XOP;
20107     GemmMicrokernelTester()
20108       .mr(1)
20109       .nr(4)
20110       .kr(2)
20111       .sr(1)
20112       .m(1)
20113       .n(4)
20114       .k(8)
20115       .cn_stride(7)
20116       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20117   }
20118 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_eq_8_strided_a)20119   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_eq_8_strided_a) {
20120     TEST_REQUIRES_X86_XOP;
20121     GemmMicrokernelTester()
20122       .mr(1)
20123       .nr(4)
20124       .kr(2)
20125       .sr(1)
20126       .m(1)
20127       .n(4)
20128       .k(8)
20129       .a_stride(11)
20130       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20131   }
20132 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_eq_8_subtile)20133   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_eq_8_subtile) {
20134     TEST_REQUIRES_X86_XOP;
20135     for (uint32_t n = 1; n <= 4; n++) {
20136       for (uint32_t m = 1; m <= 1; m++) {
20137         GemmMicrokernelTester()
20138           .mr(1)
20139           .nr(4)
20140           .kr(2)
20141           .sr(1)
20142           .m(m)
20143           .n(n)
20144           .k(8)
20145           .iterations(1)
20146           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20147       }
20148     }
20149   }
20150 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_eq_8_subtile_m)20151   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_eq_8_subtile_m) {
20152     TEST_REQUIRES_X86_XOP;
20153     for (uint32_t m = 1; m <= 1; m++) {
20154       GemmMicrokernelTester()
20155         .mr(1)
20156         .nr(4)
20157         .kr(2)
20158         .sr(1)
20159         .m(m)
20160         .n(4)
20161         .k(8)
20162         .iterations(1)
20163         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20164     }
20165   }
20166 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_eq_8_subtile_n)20167   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_eq_8_subtile_n) {
20168     TEST_REQUIRES_X86_XOP;
20169     for (uint32_t n = 1; n <= 4; n++) {
20170       GemmMicrokernelTester()
20171         .mr(1)
20172         .nr(4)
20173         .kr(2)
20174         .sr(1)
20175         .m(1)
20176         .n(n)
20177         .k(8)
20178         .iterations(1)
20179         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20180     }
20181   }
20182 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_lt_8)20183   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_lt_8) {
20184     TEST_REQUIRES_X86_XOP;
20185     for (size_t k = 1; k < 8; k++) {
20186       GemmMicrokernelTester()
20187         .mr(1)
20188         .nr(4)
20189         .kr(2)
20190         .sr(1)
20191         .m(1)
20192         .n(4)
20193         .k(k)
20194         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20195     }
20196   }
20197 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_lt_8_strided_a)20198   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_lt_8_strided_a) {
20199     TEST_REQUIRES_X86_XOP;
20200     for (size_t k = 1; k < 8; k++) {
20201       GemmMicrokernelTester()
20202         .mr(1)
20203         .nr(4)
20204         .kr(2)
20205         .sr(1)
20206         .m(1)
20207         .n(4)
20208         .k(k)
20209         .a_stride(11)
20210         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20211     }
20212   }
20213 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_lt_8_subtile)20214   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_lt_8_subtile) {
20215     TEST_REQUIRES_X86_XOP;
20216     for (size_t k = 1; k < 8; k++) {
20217       for (uint32_t n = 1; n <= 4; n++) {
20218         for (uint32_t m = 1; m <= 1; m++) {
20219           GemmMicrokernelTester()
20220             .mr(1)
20221             .nr(4)
20222             .kr(2)
20223             .sr(1)
20224             .m(m)
20225             .n(n)
20226             .k(k)
20227             .iterations(1)
20228             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20229         }
20230       }
20231     }
20232   }
20233 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_gt_8)20234   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_gt_8) {
20235     TEST_REQUIRES_X86_XOP;
20236     for (size_t k = 9; k < 16; k++) {
20237       GemmMicrokernelTester()
20238         .mr(1)
20239         .nr(4)
20240         .kr(2)
20241         .sr(1)
20242         .m(1)
20243         .n(4)
20244         .k(k)
20245         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20246     }
20247   }
20248 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_gt_8_strided_a)20249   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_gt_8_strided_a) {
20250     TEST_REQUIRES_X86_XOP;
20251     for (size_t k = 9; k < 16; k++) {
20252       GemmMicrokernelTester()
20253         .mr(1)
20254         .nr(4)
20255         .kr(2)
20256         .sr(1)
20257         .m(1)
20258         .n(4)
20259         .k(k)
20260         .a_stride(19)
20261         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20262     }
20263   }
20264 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_gt_8_subtile)20265   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_gt_8_subtile) {
20266     TEST_REQUIRES_X86_XOP;
20267     for (size_t k = 9; k < 16; k++) {
20268       for (uint32_t n = 1; n <= 4; n++) {
20269         for (uint32_t m = 1; m <= 1; m++) {
20270           GemmMicrokernelTester()
20271             .mr(1)
20272             .nr(4)
20273             .kr(2)
20274             .sr(1)
20275             .m(m)
20276             .n(n)
20277             .k(k)
20278             .iterations(1)
20279             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20280         }
20281       }
20282     }
20283   }
20284 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_div_8)20285   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_div_8) {
20286     TEST_REQUIRES_X86_XOP;
20287     for (size_t k = 16; k <= 80; k += 8) {
20288       GemmMicrokernelTester()
20289         .mr(1)
20290         .nr(4)
20291         .kr(2)
20292         .sr(1)
20293         .m(1)
20294         .n(4)
20295         .k(k)
20296         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20297     }
20298   }
20299 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_div_8_strided_a)20300   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_div_8_strided_a) {
20301     TEST_REQUIRES_X86_XOP;
20302     for (size_t k = 16; k <= 80; k += 8) {
20303       GemmMicrokernelTester()
20304         .mr(1)
20305         .nr(4)
20306         .kr(2)
20307         .sr(1)
20308         .m(1)
20309         .n(4)
20310         .k(k)
20311         .a_stride(83)
20312         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20313     }
20314   }
20315 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,k_div_8_subtile)20316   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, k_div_8_subtile) {
20317     TEST_REQUIRES_X86_XOP;
20318     for (size_t k = 16; k <= 80; k += 8) {
20319       for (uint32_t n = 1; n <= 4; n++) {
20320         for (uint32_t m = 1; m <= 1; m++) {
20321           GemmMicrokernelTester()
20322             .mr(1)
20323             .nr(4)
20324             .kr(2)
20325             .sr(1)
20326             .m(m)
20327             .n(n)
20328             .k(k)
20329             .iterations(1)
20330             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20331         }
20332       }
20333     }
20334   }
20335 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_gt_4)20336   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_gt_4) {
20337     TEST_REQUIRES_X86_XOP;
20338     for (uint32_t n = 5; n < 8; n++) {
20339       for (size_t k = 1; k <= 40; k += 9) {
20340         GemmMicrokernelTester()
20341           .mr(1)
20342           .nr(4)
20343           .kr(2)
20344           .sr(1)
20345           .m(1)
20346           .n(n)
20347           .k(k)
20348           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20349       }
20350     }
20351   }
20352 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_gt_4_strided_cn)20353   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_gt_4_strided_cn) {
20354     TEST_REQUIRES_X86_XOP;
20355     for (uint32_t n = 5; n < 8; n++) {
20356       for (size_t k = 1; k <= 40; k += 9) {
20357         GemmMicrokernelTester()
20358           .mr(1)
20359           .nr(4)
20360           .kr(2)
20361           .sr(1)
20362           .m(1)
20363           .n(n)
20364           .k(k)
20365           .cn_stride(7)
20366           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20367       }
20368     }
20369   }
20370 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_gt_4_strided_a)20371   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_gt_4_strided_a) {
20372     TEST_REQUIRES_X86_XOP;
20373     for (uint32_t n = 5; n < 8; n++) {
20374       for (size_t k = 1; k <= 40; k += 9) {
20375         GemmMicrokernelTester()
20376           .mr(1)
20377           .nr(4)
20378           .kr(2)
20379           .sr(1)
20380           .m(1)
20381           .n(n)
20382           .k(k)
20383           .a_stride(43)
20384           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20385       }
20386     }
20387   }
20388 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_gt_4_subtile)20389   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_gt_4_subtile) {
20390     TEST_REQUIRES_X86_XOP;
20391     for (uint32_t n = 5; n < 8; n++) {
20392       for (size_t k = 1; k <= 40; k += 9) {
20393         for (uint32_t m = 1; m <= 1; m++) {
20394           GemmMicrokernelTester()
20395             .mr(1)
20396             .nr(4)
20397             .kr(2)
20398             .sr(1)
20399             .m(m)
20400             .n(n)
20401             .k(k)
20402             .iterations(1)
20403             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20404         }
20405       }
20406     }
20407   }
20408 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_div_4)20409   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_div_4) {
20410     TEST_REQUIRES_X86_XOP;
20411     for (uint32_t n = 8; n <= 12; n += 4) {
20412       for (size_t k = 1; k <= 40; k += 9) {
20413         GemmMicrokernelTester()
20414           .mr(1)
20415           .nr(4)
20416           .kr(2)
20417           .sr(1)
20418           .m(1)
20419           .n(n)
20420           .k(k)
20421           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20422       }
20423     }
20424   }
20425 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_div_4_strided_cn)20426   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_div_4_strided_cn) {
20427     TEST_REQUIRES_X86_XOP;
20428     for (uint32_t n = 8; n <= 12; n += 4) {
20429       for (size_t k = 1; k <= 40; k += 9) {
20430         GemmMicrokernelTester()
20431           .mr(1)
20432           .nr(4)
20433           .kr(2)
20434           .sr(1)
20435           .m(1)
20436           .n(n)
20437           .k(k)
20438           .cn_stride(7)
20439           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20440       }
20441     }
20442   }
20443 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_div_4_strided_a)20444   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_div_4_strided_a) {
20445     TEST_REQUIRES_X86_XOP;
20446     for (uint32_t n = 8; n <= 12; n += 4) {
20447       for (size_t k = 1; k <= 40; k += 9) {
20448         GemmMicrokernelTester()
20449           .mr(1)
20450           .nr(4)
20451           .kr(2)
20452           .sr(1)
20453           .m(1)
20454           .n(n)
20455           .k(k)
20456           .a_stride(43)
20457           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20458       }
20459     }
20460   }
20461 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,n_div_4_subtile)20462   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, n_div_4_subtile) {
20463     TEST_REQUIRES_X86_XOP;
20464     for (uint32_t n = 8; n <= 12; n += 4) {
20465       for (size_t k = 1; k <= 40; k += 9) {
20466         for (uint32_t m = 1; m <= 1; m++) {
20467           GemmMicrokernelTester()
20468             .mr(1)
20469             .nr(4)
20470             .kr(2)
20471             .sr(1)
20472             .m(m)
20473             .n(n)
20474             .k(k)
20475             .iterations(1)
20476             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20477         }
20478       }
20479     }
20480   }
20481 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,strided_cm_subtile)20482   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, strided_cm_subtile) {
20483     TEST_REQUIRES_X86_XOP;
20484     for (size_t k = 1; k <= 40; k += 9) {
20485       for (uint32_t n = 1; n <= 4; n++) {
20486         for (uint32_t m = 1; m <= 1; m++) {
20487           GemmMicrokernelTester()
20488             .mr(1)
20489             .nr(4)
20490             .kr(2)
20491             .sr(1)
20492             .m(m)
20493             .n(n)
20494             .k(k)
20495             .cm_stride(7)
20496             .iterations(1)
20497             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20498         }
20499       }
20500     }
20501   }
20502 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,qmin)20503   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, qmin) {
20504     TEST_REQUIRES_X86_XOP;
20505     GemmMicrokernelTester()
20506       .mr(1)
20507       .nr(4)
20508       .kr(2)
20509       .sr(1)
20510       .m(1)
20511       .n(4)
20512       .k(8)
20513       .qmin(128)
20514       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20515   }
20516 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,qmax)20517   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, qmax) {
20518     TEST_REQUIRES_X86_XOP;
20519     GemmMicrokernelTester()
20520       .mr(1)
20521       .nr(4)
20522       .kr(2)
20523       .sr(1)
20524       .m(1)
20525       .n(4)
20526       .k(8)
20527       .qmax(128)
20528       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20529   }
20530 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64,strided_cm)20531   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD64, strided_cm) {
20532     TEST_REQUIRES_X86_XOP;
20533     GemmMicrokernelTester()
20534       .mr(1)
20535       .nr(4)
20536       .kr(2)
20537       .sr(1)
20538       .m(1)
20539       .n(4)
20540       .k(8)
20541       .cm_stride(7)
20542       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
20543   }
20544 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
20545 
20546 
20547 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_eq_8)20548   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_eq_8) {
20549     TEST_REQUIRES_X86_SSE2;
20550     GemmMicrokernelTester()
20551       .mr(1)
20552       .nr(4)
20553       .kr(2)
20554       .sr(1)
20555       .m(1)
20556       .n(4)
20557       .k(8)
20558       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20559   }
20560 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,strided_cn)20561   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, strided_cn) {
20562     TEST_REQUIRES_X86_SSE2;
20563     GemmMicrokernelTester()
20564       .mr(1)
20565       .nr(4)
20566       .kr(2)
20567       .sr(1)
20568       .m(1)
20569       .n(4)
20570       .k(8)
20571       .cn_stride(7)
20572       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20573   }
20574 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_eq_8_strided_a)20575   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_eq_8_strided_a) {
20576     TEST_REQUIRES_X86_SSE2;
20577     GemmMicrokernelTester()
20578       .mr(1)
20579       .nr(4)
20580       .kr(2)
20581       .sr(1)
20582       .m(1)
20583       .n(4)
20584       .k(8)
20585       .a_stride(11)
20586       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20587   }
20588 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_eq_8_subtile)20589   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_eq_8_subtile) {
20590     TEST_REQUIRES_X86_SSE2;
20591     for (uint32_t n = 1; n <= 4; n++) {
20592       for (uint32_t m = 1; m <= 1; m++) {
20593         GemmMicrokernelTester()
20594           .mr(1)
20595           .nr(4)
20596           .kr(2)
20597           .sr(1)
20598           .m(m)
20599           .n(n)
20600           .k(8)
20601           .iterations(1)
20602           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20603       }
20604     }
20605   }
20606 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_eq_8_subtile_m)20607   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_eq_8_subtile_m) {
20608     TEST_REQUIRES_X86_SSE2;
20609     for (uint32_t m = 1; m <= 1; m++) {
20610       GemmMicrokernelTester()
20611         .mr(1)
20612         .nr(4)
20613         .kr(2)
20614         .sr(1)
20615         .m(m)
20616         .n(4)
20617         .k(8)
20618         .iterations(1)
20619         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20620     }
20621   }
20622 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_eq_8_subtile_n)20623   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_eq_8_subtile_n) {
20624     TEST_REQUIRES_X86_SSE2;
20625     for (uint32_t n = 1; n <= 4; n++) {
20626       GemmMicrokernelTester()
20627         .mr(1)
20628         .nr(4)
20629         .kr(2)
20630         .sr(1)
20631         .m(1)
20632         .n(n)
20633         .k(8)
20634         .iterations(1)
20635         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20636     }
20637   }
20638 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_lt_8)20639   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_lt_8) {
20640     TEST_REQUIRES_X86_SSE2;
20641     for (size_t k = 1; k < 8; k++) {
20642       GemmMicrokernelTester()
20643         .mr(1)
20644         .nr(4)
20645         .kr(2)
20646         .sr(1)
20647         .m(1)
20648         .n(4)
20649         .k(k)
20650         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20651     }
20652   }
20653 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_lt_8_strided_a)20654   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_lt_8_strided_a) {
20655     TEST_REQUIRES_X86_SSE2;
20656     for (size_t k = 1; k < 8; k++) {
20657       GemmMicrokernelTester()
20658         .mr(1)
20659         .nr(4)
20660         .kr(2)
20661         .sr(1)
20662         .m(1)
20663         .n(4)
20664         .k(k)
20665         .a_stride(11)
20666         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20667     }
20668   }
20669 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_lt_8_subtile)20670   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_lt_8_subtile) {
20671     TEST_REQUIRES_X86_SSE2;
20672     for (size_t k = 1; k < 8; k++) {
20673       for (uint32_t n = 1; n <= 4; n++) {
20674         for (uint32_t m = 1; m <= 1; m++) {
20675           GemmMicrokernelTester()
20676             .mr(1)
20677             .nr(4)
20678             .kr(2)
20679             .sr(1)
20680             .m(m)
20681             .n(n)
20682             .k(k)
20683             .iterations(1)
20684             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20685         }
20686       }
20687     }
20688   }
20689 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_gt_8)20690   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_gt_8) {
20691     TEST_REQUIRES_X86_SSE2;
20692     for (size_t k = 9; k < 16; k++) {
20693       GemmMicrokernelTester()
20694         .mr(1)
20695         .nr(4)
20696         .kr(2)
20697         .sr(1)
20698         .m(1)
20699         .n(4)
20700         .k(k)
20701         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20702     }
20703   }
20704 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_gt_8_strided_a)20705   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_gt_8_strided_a) {
20706     TEST_REQUIRES_X86_SSE2;
20707     for (size_t k = 9; k < 16; k++) {
20708       GemmMicrokernelTester()
20709         .mr(1)
20710         .nr(4)
20711         .kr(2)
20712         .sr(1)
20713         .m(1)
20714         .n(4)
20715         .k(k)
20716         .a_stride(19)
20717         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20718     }
20719   }
20720 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_gt_8_subtile)20721   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_gt_8_subtile) {
20722     TEST_REQUIRES_X86_SSE2;
20723     for (size_t k = 9; k < 16; k++) {
20724       for (uint32_t n = 1; n <= 4; n++) {
20725         for (uint32_t m = 1; m <= 1; m++) {
20726           GemmMicrokernelTester()
20727             .mr(1)
20728             .nr(4)
20729             .kr(2)
20730             .sr(1)
20731             .m(m)
20732             .n(n)
20733             .k(k)
20734             .iterations(1)
20735             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20736         }
20737       }
20738     }
20739   }
20740 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_div_8)20741   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_div_8) {
20742     TEST_REQUIRES_X86_SSE2;
20743     for (size_t k = 16; k <= 80; k += 8) {
20744       GemmMicrokernelTester()
20745         .mr(1)
20746         .nr(4)
20747         .kr(2)
20748         .sr(1)
20749         .m(1)
20750         .n(4)
20751         .k(k)
20752         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20753     }
20754   }
20755 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_div_8_strided_a)20756   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_div_8_strided_a) {
20757     TEST_REQUIRES_X86_SSE2;
20758     for (size_t k = 16; k <= 80; k += 8) {
20759       GemmMicrokernelTester()
20760         .mr(1)
20761         .nr(4)
20762         .kr(2)
20763         .sr(1)
20764         .m(1)
20765         .n(4)
20766         .k(k)
20767         .a_stride(83)
20768         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20769     }
20770   }
20771 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,k_div_8_subtile)20772   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, k_div_8_subtile) {
20773     TEST_REQUIRES_X86_SSE2;
20774     for (size_t k = 16; k <= 80; k += 8) {
20775       for (uint32_t n = 1; n <= 4; n++) {
20776         for (uint32_t m = 1; m <= 1; m++) {
20777           GemmMicrokernelTester()
20778             .mr(1)
20779             .nr(4)
20780             .kr(2)
20781             .sr(1)
20782             .m(m)
20783             .n(n)
20784             .k(k)
20785             .iterations(1)
20786             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20787         }
20788       }
20789     }
20790   }
20791 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_gt_4)20792   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_gt_4) {
20793     TEST_REQUIRES_X86_SSE2;
20794     for (uint32_t n = 5; n < 8; n++) {
20795       for (size_t k = 1; k <= 40; k += 9) {
20796         GemmMicrokernelTester()
20797           .mr(1)
20798           .nr(4)
20799           .kr(2)
20800           .sr(1)
20801           .m(1)
20802           .n(n)
20803           .k(k)
20804           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20805       }
20806     }
20807   }
20808 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_gt_4_strided_cn)20809   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_gt_4_strided_cn) {
20810     TEST_REQUIRES_X86_SSE2;
20811     for (uint32_t n = 5; n < 8; n++) {
20812       for (size_t k = 1; k <= 40; k += 9) {
20813         GemmMicrokernelTester()
20814           .mr(1)
20815           .nr(4)
20816           .kr(2)
20817           .sr(1)
20818           .m(1)
20819           .n(n)
20820           .k(k)
20821           .cn_stride(7)
20822           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20823       }
20824     }
20825   }
20826 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_gt_4_strided_a)20827   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_gt_4_strided_a) {
20828     TEST_REQUIRES_X86_SSE2;
20829     for (uint32_t n = 5; n < 8; n++) {
20830       for (size_t k = 1; k <= 40; k += 9) {
20831         GemmMicrokernelTester()
20832           .mr(1)
20833           .nr(4)
20834           .kr(2)
20835           .sr(1)
20836           .m(1)
20837           .n(n)
20838           .k(k)
20839           .a_stride(43)
20840           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20841       }
20842     }
20843   }
20844 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_gt_4_subtile)20845   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_gt_4_subtile) {
20846     TEST_REQUIRES_X86_SSE2;
20847     for (uint32_t n = 5; n < 8; n++) {
20848       for (size_t k = 1; k <= 40; k += 9) {
20849         for (uint32_t m = 1; m <= 1; m++) {
20850           GemmMicrokernelTester()
20851             .mr(1)
20852             .nr(4)
20853             .kr(2)
20854             .sr(1)
20855             .m(m)
20856             .n(n)
20857             .k(k)
20858             .iterations(1)
20859             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20860         }
20861       }
20862     }
20863   }
20864 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_div_4)20865   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_div_4) {
20866     TEST_REQUIRES_X86_SSE2;
20867     for (uint32_t n = 8; n <= 12; n += 4) {
20868       for (size_t k = 1; k <= 40; k += 9) {
20869         GemmMicrokernelTester()
20870           .mr(1)
20871           .nr(4)
20872           .kr(2)
20873           .sr(1)
20874           .m(1)
20875           .n(n)
20876           .k(k)
20877           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20878       }
20879     }
20880   }
20881 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_div_4_strided_cn)20882   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_div_4_strided_cn) {
20883     TEST_REQUIRES_X86_SSE2;
20884     for (uint32_t n = 8; n <= 12; n += 4) {
20885       for (size_t k = 1; k <= 40; k += 9) {
20886         GemmMicrokernelTester()
20887           .mr(1)
20888           .nr(4)
20889           .kr(2)
20890           .sr(1)
20891           .m(1)
20892           .n(n)
20893           .k(k)
20894           .cn_stride(7)
20895           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20896       }
20897     }
20898   }
20899 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_div_4_strided_a)20900   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_div_4_strided_a) {
20901     TEST_REQUIRES_X86_SSE2;
20902     for (uint32_t n = 8; n <= 12; n += 4) {
20903       for (size_t k = 1; k <= 40; k += 9) {
20904         GemmMicrokernelTester()
20905           .mr(1)
20906           .nr(4)
20907           .kr(2)
20908           .sr(1)
20909           .m(1)
20910           .n(n)
20911           .k(k)
20912           .a_stride(43)
20913           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20914       }
20915     }
20916   }
20917 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,n_div_4_subtile)20918   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, n_div_4_subtile) {
20919     TEST_REQUIRES_X86_SSE2;
20920     for (uint32_t n = 8; n <= 12; n += 4) {
20921       for (size_t k = 1; k <= 40; k += 9) {
20922         for (uint32_t m = 1; m <= 1; m++) {
20923           GemmMicrokernelTester()
20924             .mr(1)
20925             .nr(4)
20926             .kr(2)
20927             .sr(1)
20928             .m(m)
20929             .n(n)
20930             .k(k)
20931             .iterations(1)
20932             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20933         }
20934       }
20935     }
20936   }
20937 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,strided_cm_subtile)20938   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, strided_cm_subtile) {
20939     TEST_REQUIRES_X86_SSE2;
20940     for (size_t k = 1; k <= 40; k += 9) {
20941       for (uint32_t n = 1; n <= 4; n++) {
20942         for (uint32_t m = 1; m <= 1; m++) {
20943           GemmMicrokernelTester()
20944             .mr(1)
20945             .nr(4)
20946             .kr(2)
20947             .sr(1)
20948             .m(m)
20949             .n(n)
20950             .k(k)
20951             .cm_stride(7)
20952             .iterations(1)
20953             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20954         }
20955       }
20956     }
20957   }
20958 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,qmin)20959   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, qmin) {
20960     TEST_REQUIRES_X86_SSE2;
20961     GemmMicrokernelTester()
20962       .mr(1)
20963       .nr(4)
20964       .kr(2)
20965       .sr(1)
20966       .m(1)
20967       .n(4)
20968       .k(8)
20969       .qmin(128)
20970       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20971   }
20972 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,qmax)20973   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, qmax) {
20974     TEST_REQUIRES_X86_SSE2;
20975     GemmMicrokernelTester()
20976       .mr(1)
20977       .nr(4)
20978       .kr(2)
20979       .sr(1)
20980       .m(1)
20981       .n(4)
20982       .k(8)
20983       .qmax(128)
20984       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20985   }
20986 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128,strided_cm)20987   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE2_LD128, strided_cm) {
20988     TEST_REQUIRES_X86_SSE2;
20989     GemmMicrokernelTester()
20990       .mr(1)
20991       .nr(4)
20992       .kr(2)
20993       .sr(1)
20994       .m(1)
20995       .n(4)
20996       .k(8)
20997       .cm_stride(7)
20998       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
20999   }
21000 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21001 
21002 
21003 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_eq_8)21004   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_eq_8) {
21005     TEST_REQUIRES_X86_SSE41;
21006     GemmMicrokernelTester()
21007       .mr(1)
21008       .nr(4)
21009       .kr(2)
21010       .sr(1)
21011       .m(1)
21012       .n(4)
21013       .k(8)
21014       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21015   }
21016 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,strided_cn)21017   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, strided_cn) {
21018     TEST_REQUIRES_X86_SSE41;
21019     GemmMicrokernelTester()
21020       .mr(1)
21021       .nr(4)
21022       .kr(2)
21023       .sr(1)
21024       .m(1)
21025       .n(4)
21026       .k(8)
21027       .cn_stride(7)
21028       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21029   }
21030 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_eq_8_strided_a)21031   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_eq_8_strided_a) {
21032     TEST_REQUIRES_X86_SSE41;
21033     GemmMicrokernelTester()
21034       .mr(1)
21035       .nr(4)
21036       .kr(2)
21037       .sr(1)
21038       .m(1)
21039       .n(4)
21040       .k(8)
21041       .a_stride(11)
21042       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21043   }
21044 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_eq_8_subtile)21045   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_eq_8_subtile) {
21046     TEST_REQUIRES_X86_SSE41;
21047     for (uint32_t n = 1; n <= 4; n++) {
21048       for (uint32_t m = 1; m <= 1; m++) {
21049         GemmMicrokernelTester()
21050           .mr(1)
21051           .nr(4)
21052           .kr(2)
21053           .sr(1)
21054           .m(m)
21055           .n(n)
21056           .k(8)
21057           .iterations(1)
21058           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21059       }
21060     }
21061   }
21062 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_eq_8_subtile_m)21063   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_eq_8_subtile_m) {
21064     TEST_REQUIRES_X86_SSE41;
21065     for (uint32_t m = 1; m <= 1; m++) {
21066       GemmMicrokernelTester()
21067         .mr(1)
21068         .nr(4)
21069         .kr(2)
21070         .sr(1)
21071         .m(m)
21072         .n(4)
21073         .k(8)
21074         .iterations(1)
21075         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21076     }
21077   }
21078 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_eq_8_subtile_n)21079   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_eq_8_subtile_n) {
21080     TEST_REQUIRES_X86_SSE41;
21081     for (uint32_t n = 1; n <= 4; n++) {
21082       GemmMicrokernelTester()
21083         .mr(1)
21084         .nr(4)
21085         .kr(2)
21086         .sr(1)
21087         .m(1)
21088         .n(n)
21089         .k(8)
21090         .iterations(1)
21091         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21092     }
21093   }
21094 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_lt_8)21095   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_lt_8) {
21096     TEST_REQUIRES_X86_SSE41;
21097     for (size_t k = 1; k < 8; k++) {
21098       GemmMicrokernelTester()
21099         .mr(1)
21100         .nr(4)
21101         .kr(2)
21102         .sr(1)
21103         .m(1)
21104         .n(4)
21105         .k(k)
21106         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21107     }
21108   }
21109 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_lt_8_strided_a)21110   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_lt_8_strided_a) {
21111     TEST_REQUIRES_X86_SSE41;
21112     for (size_t k = 1; k < 8; k++) {
21113       GemmMicrokernelTester()
21114         .mr(1)
21115         .nr(4)
21116         .kr(2)
21117         .sr(1)
21118         .m(1)
21119         .n(4)
21120         .k(k)
21121         .a_stride(11)
21122         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21123     }
21124   }
21125 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_lt_8_subtile)21126   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_lt_8_subtile) {
21127     TEST_REQUIRES_X86_SSE41;
21128     for (size_t k = 1; k < 8; k++) {
21129       for (uint32_t n = 1; n <= 4; n++) {
21130         for (uint32_t m = 1; m <= 1; m++) {
21131           GemmMicrokernelTester()
21132             .mr(1)
21133             .nr(4)
21134             .kr(2)
21135             .sr(1)
21136             .m(m)
21137             .n(n)
21138             .k(k)
21139             .iterations(1)
21140             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21141         }
21142       }
21143     }
21144   }
21145 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_gt_8)21146   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_gt_8) {
21147     TEST_REQUIRES_X86_SSE41;
21148     for (size_t k = 9; k < 16; k++) {
21149       GemmMicrokernelTester()
21150         .mr(1)
21151         .nr(4)
21152         .kr(2)
21153         .sr(1)
21154         .m(1)
21155         .n(4)
21156         .k(k)
21157         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21158     }
21159   }
21160 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_gt_8_strided_a)21161   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_gt_8_strided_a) {
21162     TEST_REQUIRES_X86_SSE41;
21163     for (size_t k = 9; k < 16; k++) {
21164       GemmMicrokernelTester()
21165         .mr(1)
21166         .nr(4)
21167         .kr(2)
21168         .sr(1)
21169         .m(1)
21170         .n(4)
21171         .k(k)
21172         .a_stride(19)
21173         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21174     }
21175   }
21176 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_gt_8_subtile)21177   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_gt_8_subtile) {
21178     TEST_REQUIRES_X86_SSE41;
21179     for (size_t k = 9; k < 16; k++) {
21180       for (uint32_t n = 1; n <= 4; n++) {
21181         for (uint32_t m = 1; m <= 1; m++) {
21182           GemmMicrokernelTester()
21183             .mr(1)
21184             .nr(4)
21185             .kr(2)
21186             .sr(1)
21187             .m(m)
21188             .n(n)
21189             .k(k)
21190             .iterations(1)
21191             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21192         }
21193       }
21194     }
21195   }
21196 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_div_8)21197   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_div_8) {
21198     TEST_REQUIRES_X86_SSE41;
21199     for (size_t k = 16; k <= 80; k += 8) {
21200       GemmMicrokernelTester()
21201         .mr(1)
21202         .nr(4)
21203         .kr(2)
21204         .sr(1)
21205         .m(1)
21206         .n(4)
21207         .k(k)
21208         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21209     }
21210   }
21211 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_div_8_strided_a)21212   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_div_8_strided_a) {
21213     TEST_REQUIRES_X86_SSE41;
21214     for (size_t k = 16; k <= 80; k += 8) {
21215       GemmMicrokernelTester()
21216         .mr(1)
21217         .nr(4)
21218         .kr(2)
21219         .sr(1)
21220         .m(1)
21221         .n(4)
21222         .k(k)
21223         .a_stride(83)
21224         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21225     }
21226   }
21227 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,k_div_8_subtile)21228   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, k_div_8_subtile) {
21229     TEST_REQUIRES_X86_SSE41;
21230     for (size_t k = 16; k <= 80; k += 8) {
21231       for (uint32_t n = 1; n <= 4; n++) {
21232         for (uint32_t m = 1; m <= 1; m++) {
21233           GemmMicrokernelTester()
21234             .mr(1)
21235             .nr(4)
21236             .kr(2)
21237             .sr(1)
21238             .m(m)
21239             .n(n)
21240             .k(k)
21241             .iterations(1)
21242             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21243         }
21244       }
21245     }
21246   }
21247 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_gt_4)21248   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_gt_4) {
21249     TEST_REQUIRES_X86_SSE41;
21250     for (uint32_t n = 5; n < 8; n++) {
21251       for (size_t k = 1; k <= 40; k += 9) {
21252         GemmMicrokernelTester()
21253           .mr(1)
21254           .nr(4)
21255           .kr(2)
21256           .sr(1)
21257           .m(1)
21258           .n(n)
21259           .k(k)
21260           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21261       }
21262     }
21263   }
21264 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_gt_4_strided_cn)21265   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_gt_4_strided_cn) {
21266     TEST_REQUIRES_X86_SSE41;
21267     for (uint32_t n = 5; n < 8; n++) {
21268       for (size_t k = 1; k <= 40; k += 9) {
21269         GemmMicrokernelTester()
21270           .mr(1)
21271           .nr(4)
21272           .kr(2)
21273           .sr(1)
21274           .m(1)
21275           .n(n)
21276           .k(k)
21277           .cn_stride(7)
21278           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21279       }
21280     }
21281   }
21282 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_gt_4_strided_a)21283   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_gt_4_strided_a) {
21284     TEST_REQUIRES_X86_SSE41;
21285     for (uint32_t n = 5; n < 8; n++) {
21286       for (size_t k = 1; k <= 40; k += 9) {
21287         GemmMicrokernelTester()
21288           .mr(1)
21289           .nr(4)
21290           .kr(2)
21291           .sr(1)
21292           .m(1)
21293           .n(n)
21294           .k(k)
21295           .a_stride(43)
21296           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21297       }
21298     }
21299   }
21300 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_gt_4_subtile)21301   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_gt_4_subtile) {
21302     TEST_REQUIRES_X86_SSE41;
21303     for (uint32_t n = 5; n < 8; n++) {
21304       for (size_t k = 1; k <= 40; k += 9) {
21305         for (uint32_t m = 1; m <= 1; m++) {
21306           GemmMicrokernelTester()
21307             .mr(1)
21308             .nr(4)
21309             .kr(2)
21310             .sr(1)
21311             .m(m)
21312             .n(n)
21313             .k(k)
21314             .iterations(1)
21315             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21316         }
21317       }
21318     }
21319   }
21320 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_div_4)21321   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_div_4) {
21322     TEST_REQUIRES_X86_SSE41;
21323     for (uint32_t n = 8; n <= 12; n += 4) {
21324       for (size_t k = 1; k <= 40; k += 9) {
21325         GemmMicrokernelTester()
21326           .mr(1)
21327           .nr(4)
21328           .kr(2)
21329           .sr(1)
21330           .m(1)
21331           .n(n)
21332           .k(k)
21333           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21334       }
21335     }
21336   }
21337 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_div_4_strided_cn)21338   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_div_4_strided_cn) {
21339     TEST_REQUIRES_X86_SSE41;
21340     for (uint32_t n = 8; n <= 12; n += 4) {
21341       for (size_t k = 1; k <= 40; k += 9) {
21342         GemmMicrokernelTester()
21343           .mr(1)
21344           .nr(4)
21345           .kr(2)
21346           .sr(1)
21347           .m(1)
21348           .n(n)
21349           .k(k)
21350           .cn_stride(7)
21351           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21352       }
21353     }
21354   }
21355 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_div_4_strided_a)21356   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_div_4_strided_a) {
21357     TEST_REQUIRES_X86_SSE41;
21358     for (uint32_t n = 8; n <= 12; n += 4) {
21359       for (size_t k = 1; k <= 40; k += 9) {
21360         GemmMicrokernelTester()
21361           .mr(1)
21362           .nr(4)
21363           .kr(2)
21364           .sr(1)
21365           .m(1)
21366           .n(n)
21367           .k(k)
21368           .a_stride(43)
21369           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21370       }
21371     }
21372   }
21373 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,n_div_4_subtile)21374   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, n_div_4_subtile) {
21375     TEST_REQUIRES_X86_SSE41;
21376     for (uint32_t n = 8; n <= 12; n += 4) {
21377       for (size_t k = 1; k <= 40; k += 9) {
21378         for (uint32_t m = 1; m <= 1; m++) {
21379           GemmMicrokernelTester()
21380             .mr(1)
21381             .nr(4)
21382             .kr(2)
21383             .sr(1)
21384             .m(m)
21385             .n(n)
21386             .k(k)
21387             .iterations(1)
21388             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21389         }
21390       }
21391     }
21392   }
21393 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,strided_cm_subtile)21394   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, strided_cm_subtile) {
21395     TEST_REQUIRES_X86_SSE41;
21396     for (size_t k = 1; k <= 40; k += 9) {
21397       for (uint32_t n = 1; n <= 4; n++) {
21398         for (uint32_t m = 1; m <= 1; m++) {
21399           GemmMicrokernelTester()
21400             .mr(1)
21401             .nr(4)
21402             .kr(2)
21403             .sr(1)
21404             .m(m)
21405             .n(n)
21406             .k(k)
21407             .cm_stride(7)
21408             .iterations(1)
21409             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21410         }
21411       }
21412     }
21413   }
21414 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,qmin)21415   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, qmin) {
21416     TEST_REQUIRES_X86_SSE41;
21417     GemmMicrokernelTester()
21418       .mr(1)
21419       .nr(4)
21420       .kr(2)
21421       .sr(1)
21422       .m(1)
21423       .n(4)
21424       .k(8)
21425       .qmin(128)
21426       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21427   }
21428 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,qmax)21429   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, qmax) {
21430     TEST_REQUIRES_X86_SSE41;
21431     GemmMicrokernelTester()
21432       .mr(1)
21433       .nr(4)
21434       .kr(2)
21435       .sr(1)
21436       .m(1)
21437       .n(4)
21438       .k(8)
21439       .qmax(128)
21440       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21441   }
21442 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128,strided_cm)21443   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__SSE41_LD128, strided_cm) {
21444     TEST_REQUIRES_X86_SSE41;
21445     GemmMicrokernelTester()
21446       .mr(1)
21447       .nr(4)
21448       .kr(2)
21449       .sr(1)
21450       .m(1)
21451       .n(4)
21452       .k(8)
21453       .cm_stride(7)
21454       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21455   }
21456 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21457 
21458 
21459 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_eq_8)21460   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_eq_8) {
21461     TEST_REQUIRES_X86_SSE2;
21462     GemmMicrokernelTester()
21463       .mr(2)
21464       .nr(4)
21465       .kr(2)
21466       .sr(1)
21467       .m(2)
21468       .n(4)
21469       .k(8)
21470       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21471   }
21472 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,strided_cn)21473   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, strided_cn) {
21474     TEST_REQUIRES_X86_SSE2;
21475     GemmMicrokernelTester()
21476       .mr(2)
21477       .nr(4)
21478       .kr(2)
21479       .sr(1)
21480       .m(2)
21481       .n(4)
21482       .k(8)
21483       .cn_stride(7)
21484       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21485   }
21486 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_eq_8_strided_a)21487   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_eq_8_strided_a) {
21488     TEST_REQUIRES_X86_SSE2;
21489     GemmMicrokernelTester()
21490       .mr(2)
21491       .nr(4)
21492       .kr(2)
21493       .sr(1)
21494       .m(2)
21495       .n(4)
21496       .k(8)
21497       .a_stride(11)
21498       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21499   }
21500 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_eq_8_subtile)21501   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_eq_8_subtile) {
21502     TEST_REQUIRES_X86_SSE2;
21503     for (uint32_t n = 1; n <= 4; n++) {
21504       for (uint32_t m = 1; m <= 2; m++) {
21505         GemmMicrokernelTester()
21506           .mr(2)
21507           .nr(4)
21508           .kr(2)
21509           .sr(1)
21510           .m(m)
21511           .n(n)
21512           .k(8)
21513           .iterations(1)
21514           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21515       }
21516     }
21517   }
21518 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_eq_8_subtile_m)21519   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_eq_8_subtile_m) {
21520     TEST_REQUIRES_X86_SSE2;
21521     for (uint32_t m = 1; m <= 2; m++) {
21522       GemmMicrokernelTester()
21523         .mr(2)
21524         .nr(4)
21525         .kr(2)
21526         .sr(1)
21527         .m(m)
21528         .n(4)
21529         .k(8)
21530         .iterations(1)
21531         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21532     }
21533   }
21534 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_eq_8_subtile_n)21535   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_eq_8_subtile_n) {
21536     TEST_REQUIRES_X86_SSE2;
21537     for (uint32_t n = 1; n <= 4; n++) {
21538       GemmMicrokernelTester()
21539         .mr(2)
21540         .nr(4)
21541         .kr(2)
21542         .sr(1)
21543         .m(2)
21544         .n(n)
21545         .k(8)
21546         .iterations(1)
21547         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21548     }
21549   }
21550 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_lt_8)21551   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_lt_8) {
21552     TEST_REQUIRES_X86_SSE2;
21553     for (size_t k = 1; k < 8; k++) {
21554       GemmMicrokernelTester()
21555         .mr(2)
21556         .nr(4)
21557         .kr(2)
21558         .sr(1)
21559         .m(2)
21560         .n(4)
21561         .k(k)
21562         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21563     }
21564   }
21565 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_lt_8_strided_a)21566   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_lt_8_strided_a) {
21567     TEST_REQUIRES_X86_SSE2;
21568     for (size_t k = 1; k < 8; k++) {
21569       GemmMicrokernelTester()
21570         .mr(2)
21571         .nr(4)
21572         .kr(2)
21573         .sr(1)
21574         .m(2)
21575         .n(4)
21576         .k(k)
21577         .a_stride(11)
21578         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21579     }
21580   }
21581 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_lt_8_subtile)21582   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_lt_8_subtile) {
21583     TEST_REQUIRES_X86_SSE2;
21584     for (size_t k = 1; k < 8; k++) {
21585       for (uint32_t n = 1; n <= 4; n++) {
21586         for (uint32_t m = 1; m <= 2; m++) {
21587           GemmMicrokernelTester()
21588             .mr(2)
21589             .nr(4)
21590             .kr(2)
21591             .sr(1)
21592             .m(m)
21593             .n(n)
21594             .k(k)
21595             .iterations(1)
21596             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21597         }
21598       }
21599     }
21600   }
21601 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_gt_8)21602   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_gt_8) {
21603     TEST_REQUIRES_X86_SSE2;
21604     for (size_t k = 9; k < 16; k++) {
21605       GemmMicrokernelTester()
21606         .mr(2)
21607         .nr(4)
21608         .kr(2)
21609         .sr(1)
21610         .m(2)
21611         .n(4)
21612         .k(k)
21613         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21614     }
21615   }
21616 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_gt_8_strided_a)21617   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_gt_8_strided_a) {
21618     TEST_REQUIRES_X86_SSE2;
21619     for (size_t k = 9; k < 16; k++) {
21620       GemmMicrokernelTester()
21621         .mr(2)
21622         .nr(4)
21623         .kr(2)
21624         .sr(1)
21625         .m(2)
21626         .n(4)
21627         .k(k)
21628         .a_stride(19)
21629         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21630     }
21631   }
21632 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_gt_8_subtile)21633   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_gt_8_subtile) {
21634     TEST_REQUIRES_X86_SSE2;
21635     for (size_t k = 9; k < 16; k++) {
21636       for (uint32_t n = 1; n <= 4; n++) {
21637         for (uint32_t m = 1; m <= 2; m++) {
21638           GemmMicrokernelTester()
21639             .mr(2)
21640             .nr(4)
21641             .kr(2)
21642             .sr(1)
21643             .m(m)
21644             .n(n)
21645             .k(k)
21646             .iterations(1)
21647             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21648         }
21649       }
21650     }
21651   }
21652 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_div_8)21653   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_div_8) {
21654     TEST_REQUIRES_X86_SSE2;
21655     for (size_t k = 16; k <= 80; k += 8) {
21656       GemmMicrokernelTester()
21657         .mr(2)
21658         .nr(4)
21659         .kr(2)
21660         .sr(1)
21661         .m(2)
21662         .n(4)
21663         .k(k)
21664         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21665     }
21666   }
21667 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_div_8_strided_a)21668   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_div_8_strided_a) {
21669     TEST_REQUIRES_X86_SSE2;
21670     for (size_t k = 16; k <= 80; k += 8) {
21671       GemmMicrokernelTester()
21672         .mr(2)
21673         .nr(4)
21674         .kr(2)
21675         .sr(1)
21676         .m(2)
21677         .n(4)
21678         .k(k)
21679         .a_stride(83)
21680         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21681     }
21682   }
21683 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,k_div_8_subtile)21684   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, k_div_8_subtile) {
21685     TEST_REQUIRES_X86_SSE2;
21686     for (size_t k = 16; k <= 80; k += 8) {
21687       for (uint32_t n = 1; n <= 4; n++) {
21688         for (uint32_t m = 1; m <= 2; m++) {
21689           GemmMicrokernelTester()
21690             .mr(2)
21691             .nr(4)
21692             .kr(2)
21693             .sr(1)
21694             .m(m)
21695             .n(n)
21696             .k(k)
21697             .iterations(1)
21698             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21699         }
21700       }
21701     }
21702   }
21703 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_gt_4)21704   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_gt_4) {
21705     TEST_REQUIRES_X86_SSE2;
21706     for (uint32_t n = 5; n < 8; n++) {
21707       for (size_t k = 1; k <= 40; k += 9) {
21708         GemmMicrokernelTester()
21709           .mr(2)
21710           .nr(4)
21711           .kr(2)
21712           .sr(1)
21713           .m(2)
21714           .n(n)
21715           .k(k)
21716           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21717       }
21718     }
21719   }
21720 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_gt_4_strided_cn)21721   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_gt_4_strided_cn) {
21722     TEST_REQUIRES_X86_SSE2;
21723     for (uint32_t n = 5; n < 8; n++) {
21724       for (size_t k = 1; k <= 40; k += 9) {
21725         GemmMicrokernelTester()
21726           .mr(2)
21727           .nr(4)
21728           .kr(2)
21729           .sr(1)
21730           .m(2)
21731           .n(n)
21732           .k(k)
21733           .cn_stride(7)
21734           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21735       }
21736     }
21737   }
21738 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_gt_4_strided_a)21739   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_gt_4_strided_a) {
21740     TEST_REQUIRES_X86_SSE2;
21741     for (uint32_t n = 5; n < 8; n++) {
21742       for (size_t k = 1; k <= 40; k += 9) {
21743         GemmMicrokernelTester()
21744           .mr(2)
21745           .nr(4)
21746           .kr(2)
21747           .sr(1)
21748           .m(2)
21749           .n(n)
21750           .k(k)
21751           .a_stride(43)
21752           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21753       }
21754     }
21755   }
21756 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_gt_4_subtile)21757   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_gt_4_subtile) {
21758     TEST_REQUIRES_X86_SSE2;
21759     for (uint32_t n = 5; n < 8; n++) {
21760       for (size_t k = 1; k <= 40; k += 9) {
21761         for (uint32_t m = 1; m <= 2; m++) {
21762           GemmMicrokernelTester()
21763             .mr(2)
21764             .nr(4)
21765             .kr(2)
21766             .sr(1)
21767             .m(m)
21768             .n(n)
21769             .k(k)
21770             .iterations(1)
21771             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21772         }
21773       }
21774     }
21775   }
21776 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_div_4)21777   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_div_4) {
21778     TEST_REQUIRES_X86_SSE2;
21779     for (uint32_t n = 8; n <= 12; n += 4) {
21780       for (size_t k = 1; k <= 40; k += 9) {
21781         GemmMicrokernelTester()
21782           .mr(2)
21783           .nr(4)
21784           .kr(2)
21785           .sr(1)
21786           .m(2)
21787           .n(n)
21788           .k(k)
21789           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21790       }
21791     }
21792   }
21793 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_div_4_strided_cn)21794   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_div_4_strided_cn) {
21795     TEST_REQUIRES_X86_SSE2;
21796     for (uint32_t n = 8; n <= 12; n += 4) {
21797       for (size_t k = 1; k <= 40; k += 9) {
21798         GemmMicrokernelTester()
21799           .mr(2)
21800           .nr(4)
21801           .kr(2)
21802           .sr(1)
21803           .m(2)
21804           .n(n)
21805           .k(k)
21806           .cn_stride(7)
21807           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21808       }
21809     }
21810   }
21811 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_div_4_strided_a)21812   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_div_4_strided_a) {
21813     TEST_REQUIRES_X86_SSE2;
21814     for (uint32_t n = 8; n <= 12; n += 4) {
21815       for (size_t k = 1; k <= 40; k += 9) {
21816         GemmMicrokernelTester()
21817           .mr(2)
21818           .nr(4)
21819           .kr(2)
21820           .sr(1)
21821           .m(2)
21822           .n(n)
21823           .k(k)
21824           .a_stride(43)
21825           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21826       }
21827     }
21828   }
21829 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,n_div_4_subtile)21830   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, n_div_4_subtile) {
21831     TEST_REQUIRES_X86_SSE2;
21832     for (uint32_t n = 8; n <= 12; n += 4) {
21833       for (size_t k = 1; k <= 40; k += 9) {
21834         for (uint32_t m = 1; m <= 2; m++) {
21835           GemmMicrokernelTester()
21836             .mr(2)
21837             .nr(4)
21838             .kr(2)
21839             .sr(1)
21840             .m(m)
21841             .n(n)
21842             .k(k)
21843             .iterations(1)
21844             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21845         }
21846       }
21847     }
21848   }
21849 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,strided_cm_subtile)21850   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, strided_cm_subtile) {
21851     TEST_REQUIRES_X86_SSE2;
21852     for (size_t k = 1; k <= 40; k += 9) {
21853       for (uint32_t n = 1; n <= 4; n++) {
21854         for (uint32_t m = 1; m <= 2; m++) {
21855           GemmMicrokernelTester()
21856             .mr(2)
21857             .nr(4)
21858             .kr(2)
21859             .sr(1)
21860             .m(m)
21861             .n(n)
21862             .k(k)
21863             .cm_stride(7)
21864             .iterations(1)
21865             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21866         }
21867       }
21868     }
21869   }
21870 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,qmin)21871   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, qmin) {
21872     TEST_REQUIRES_X86_SSE2;
21873     GemmMicrokernelTester()
21874       .mr(2)
21875       .nr(4)
21876       .kr(2)
21877       .sr(1)
21878       .m(2)
21879       .n(4)
21880       .k(8)
21881       .qmin(128)
21882       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21883   }
21884 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,qmax)21885   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, qmax) {
21886     TEST_REQUIRES_X86_SSE2;
21887     GemmMicrokernelTester()
21888       .mr(2)
21889       .nr(4)
21890       .kr(2)
21891       .sr(1)
21892       .m(2)
21893       .n(4)
21894       .k(8)
21895       .qmax(128)
21896       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21897   }
21898 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128,strided_cm)21899   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE2_LD128, strided_cm) {
21900     TEST_REQUIRES_X86_SSE2;
21901     GemmMicrokernelTester()
21902       .mr(2)
21903       .nr(4)
21904       .kr(2)
21905       .sr(1)
21906       .m(2)
21907       .n(4)
21908       .k(8)
21909       .cm_stride(7)
21910       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
21911   }
21912 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
21913 
21914 
21915 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_eq_8)21916   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_eq_8) {
21917     TEST_REQUIRES_X86_SSE41;
21918     GemmMicrokernelTester()
21919       .mr(2)
21920       .nr(4)
21921       .kr(2)
21922       .sr(1)
21923       .m(2)
21924       .n(4)
21925       .k(8)
21926       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21927   }
21928 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,strided_cn)21929   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, strided_cn) {
21930     TEST_REQUIRES_X86_SSE41;
21931     GemmMicrokernelTester()
21932       .mr(2)
21933       .nr(4)
21934       .kr(2)
21935       .sr(1)
21936       .m(2)
21937       .n(4)
21938       .k(8)
21939       .cn_stride(7)
21940       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21941   }
21942 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_eq_8_strided_a)21943   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_eq_8_strided_a) {
21944     TEST_REQUIRES_X86_SSE41;
21945     GemmMicrokernelTester()
21946       .mr(2)
21947       .nr(4)
21948       .kr(2)
21949       .sr(1)
21950       .m(2)
21951       .n(4)
21952       .k(8)
21953       .a_stride(11)
21954       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21955   }
21956 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_eq_8_subtile)21957   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_eq_8_subtile) {
21958     TEST_REQUIRES_X86_SSE41;
21959     for (uint32_t n = 1; n <= 4; n++) {
21960       for (uint32_t m = 1; m <= 2; m++) {
21961         GemmMicrokernelTester()
21962           .mr(2)
21963           .nr(4)
21964           .kr(2)
21965           .sr(1)
21966           .m(m)
21967           .n(n)
21968           .k(8)
21969           .iterations(1)
21970           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21971       }
21972     }
21973   }
21974 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_eq_8_subtile_m)21975   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_eq_8_subtile_m) {
21976     TEST_REQUIRES_X86_SSE41;
21977     for (uint32_t m = 1; m <= 2; m++) {
21978       GemmMicrokernelTester()
21979         .mr(2)
21980         .nr(4)
21981         .kr(2)
21982         .sr(1)
21983         .m(m)
21984         .n(4)
21985         .k(8)
21986         .iterations(1)
21987         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
21988     }
21989   }
21990 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_eq_8_subtile_n)21991   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_eq_8_subtile_n) {
21992     TEST_REQUIRES_X86_SSE41;
21993     for (uint32_t n = 1; n <= 4; n++) {
21994       GemmMicrokernelTester()
21995         .mr(2)
21996         .nr(4)
21997         .kr(2)
21998         .sr(1)
21999         .m(2)
22000         .n(n)
22001         .k(8)
22002         .iterations(1)
22003         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22004     }
22005   }
22006 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_lt_8)22007   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_lt_8) {
22008     TEST_REQUIRES_X86_SSE41;
22009     for (size_t k = 1; k < 8; k++) {
22010       GemmMicrokernelTester()
22011         .mr(2)
22012         .nr(4)
22013         .kr(2)
22014         .sr(1)
22015         .m(2)
22016         .n(4)
22017         .k(k)
22018         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22019     }
22020   }
22021 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_lt_8_strided_a)22022   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_lt_8_strided_a) {
22023     TEST_REQUIRES_X86_SSE41;
22024     for (size_t k = 1; k < 8; k++) {
22025       GemmMicrokernelTester()
22026         .mr(2)
22027         .nr(4)
22028         .kr(2)
22029         .sr(1)
22030         .m(2)
22031         .n(4)
22032         .k(k)
22033         .a_stride(11)
22034         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22035     }
22036   }
22037 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_lt_8_subtile)22038   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_lt_8_subtile) {
22039     TEST_REQUIRES_X86_SSE41;
22040     for (size_t k = 1; k < 8; k++) {
22041       for (uint32_t n = 1; n <= 4; n++) {
22042         for (uint32_t m = 1; m <= 2; m++) {
22043           GemmMicrokernelTester()
22044             .mr(2)
22045             .nr(4)
22046             .kr(2)
22047             .sr(1)
22048             .m(m)
22049             .n(n)
22050             .k(k)
22051             .iterations(1)
22052             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22053         }
22054       }
22055     }
22056   }
22057 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_gt_8)22058   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_gt_8) {
22059     TEST_REQUIRES_X86_SSE41;
22060     for (size_t k = 9; k < 16; k++) {
22061       GemmMicrokernelTester()
22062         .mr(2)
22063         .nr(4)
22064         .kr(2)
22065         .sr(1)
22066         .m(2)
22067         .n(4)
22068         .k(k)
22069         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22070     }
22071   }
22072 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_gt_8_strided_a)22073   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_gt_8_strided_a) {
22074     TEST_REQUIRES_X86_SSE41;
22075     for (size_t k = 9; k < 16; k++) {
22076       GemmMicrokernelTester()
22077         .mr(2)
22078         .nr(4)
22079         .kr(2)
22080         .sr(1)
22081         .m(2)
22082         .n(4)
22083         .k(k)
22084         .a_stride(19)
22085         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22086     }
22087   }
22088 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_gt_8_subtile)22089   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_gt_8_subtile) {
22090     TEST_REQUIRES_X86_SSE41;
22091     for (size_t k = 9; k < 16; k++) {
22092       for (uint32_t n = 1; n <= 4; n++) {
22093         for (uint32_t m = 1; m <= 2; m++) {
22094           GemmMicrokernelTester()
22095             .mr(2)
22096             .nr(4)
22097             .kr(2)
22098             .sr(1)
22099             .m(m)
22100             .n(n)
22101             .k(k)
22102             .iterations(1)
22103             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22104         }
22105       }
22106     }
22107   }
22108 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_div_8)22109   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_div_8) {
22110     TEST_REQUIRES_X86_SSE41;
22111     for (size_t k = 16; k <= 80; k += 8) {
22112       GemmMicrokernelTester()
22113         .mr(2)
22114         .nr(4)
22115         .kr(2)
22116         .sr(1)
22117         .m(2)
22118         .n(4)
22119         .k(k)
22120         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22121     }
22122   }
22123 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_div_8_strided_a)22124   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_div_8_strided_a) {
22125     TEST_REQUIRES_X86_SSE41;
22126     for (size_t k = 16; k <= 80; k += 8) {
22127       GemmMicrokernelTester()
22128         .mr(2)
22129         .nr(4)
22130         .kr(2)
22131         .sr(1)
22132         .m(2)
22133         .n(4)
22134         .k(k)
22135         .a_stride(83)
22136         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22137     }
22138   }
22139 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,k_div_8_subtile)22140   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, k_div_8_subtile) {
22141     TEST_REQUIRES_X86_SSE41;
22142     for (size_t k = 16; k <= 80; k += 8) {
22143       for (uint32_t n = 1; n <= 4; n++) {
22144         for (uint32_t m = 1; m <= 2; m++) {
22145           GemmMicrokernelTester()
22146             .mr(2)
22147             .nr(4)
22148             .kr(2)
22149             .sr(1)
22150             .m(m)
22151             .n(n)
22152             .k(k)
22153             .iterations(1)
22154             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22155         }
22156       }
22157     }
22158   }
22159 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_gt_4)22160   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_gt_4) {
22161     TEST_REQUIRES_X86_SSE41;
22162     for (uint32_t n = 5; n < 8; n++) {
22163       for (size_t k = 1; k <= 40; k += 9) {
22164         GemmMicrokernelTester()
22165           .mr(2)
22166           .nr(4)
22167           .kr(2)
22168           .sr(1)
22169           .m(2)
22170           .n(n)
22171           .k(k)
22172           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22173       }
22174     }
22175   }
22176 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_gt_4_strided_cn)22177   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_gt_4_strided_cn) {
22178     TEST_REQUIRES_X86_SSE41;
22179     for (uint32_t n = 5; n < 8; n++) {
22180       for (size_t k = 1; k <= 40; k += 9) {
22181         GemmMicrokernelTester()
22182           .mr(2)
22183           .nr(4)
22184           .kr(2)
22185           .sr(1)
22186           .m(2)
22187           .n(n)
22188           .k(k)
22189           .cn_stride(7)
22190           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22191       }
22192     }
22193   }
22194 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_gt_4_strided_a)22195   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_gt_4_strided_a) {
22196     TEST_REQUIRES_X86_SSE41;
22197     for (uint32_t n = 5; n < 8; n++) {
22198       for (size_t k = 1; k <= 40; k += 9) {
22199         GemmMicrokernelTester()
22200           .mr(2)
22201           .nr(4)
22202           .kr(2)
22203           .sr(1)
22204           .m(2)
22205           .n(n)
22206           .k(k)
22207           .a_stride(43)
22208           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22209       }
22210     }
22211   }
22212 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_gt_4_subtile)22213   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_gt_4_subtile) {
22214     TEST_REQUIRES_X86_SSE41;
22215     for (uint32_t n = 5; n < 8; n++) {
22216       for (size_t k = 1; k <= 40; k += 9) {
22217         for (uint32_t m = 1; m <= 2; m++) {
22218           GemmMicrokernelTester()
22219             .mr(2)
22220             .nr(4)
22221             .kr(2)
22222             .sr(1)
22223             .m(m)
22224             .n(n)
22225             .k(k)
22226             .iterations(1)
22227             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22228         }
22229       }
22230     }
22231   }
22232 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_div_4)22233   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_div_4) {
22234     TEST_REQUIRES_X86_SSE41;
22235     for (uint32_t n = 8; n <= 12; n += 4) {
22236       for (size_t k = 1; k <= 40; k += 9) {
22237         GemmMicrokernelTester()
22238           .mr(2)
22239           .nr(4)
22240           .kr(2)
22241           .sr(1)
22242           .m(2)
22243           .n(n)
22244           .k(k)
22245           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22246       }
22247     }
22248   }
22249 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_div_4_strided_cn)22250   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_div_4_strided_cn) {
22251     TEST_REQUIRES_X86_SSE41;
22252     for (uint32_t n = 8; n <= 12; n += 4) {
22253       for (size_t k = 1; k <= 40; k += 9) {
22254         GemmMicrokernelTester()
22255           .mr(2)
22256           .nr(4)
22257           .kr(2)
22258           .sr(1)
22259           .m(2)
22260           .n(n)
22261           .k(k)
22262           .cn_stride(7)
22263           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22264       }
22265     }
22266   }
22267 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_div_4_strided_a)22268   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_div_4_strided_a) {
22269     TEST_REQUIRES_X86_SSE41;
22270     for (uint32_t n = 8; n <= 12; n += 4) {
22271       for (size_t k = 1; k <= 40; k += 9) {
22272         GemmMicrokernelTester()
22273           .mr(2)
22274           .nr(4)
22275           .kr(2)
22276           .sr(1)
22277           .m(2)
22278           .n(n)
22279           .k(k)
22280           .a_stride(43)
22281           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22282       }
22283     }
22284   }
22285 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,n_div_4_subtile)22286   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, n_div_4_subtile) {
22287     TEST_REQUIRES_X86_SSE41;
22288     for (uint32_t n = 8; n <= 12; n += 4) {
22289       for (size_t k = 1; k <= 40; k += 9) {
22290         for (uint32_t m = 1; m <= 2; m++) {
22291           GemmMicrokernelTester()
22292             .mr(2)
22293             .nr(4)
22294             .kr(2)
22295             .sr(1)
22296             .m(m)
22297             .n(n)
22298             .k(k)
22299             .iterations(1)
22300             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22301         }
22302       }
22303     }
22304   }
22305 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,strided_cm_subtile)22306   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, strided_cm_subtile) {
22307     TEST_REQUIRES_X86_SSE41;
22308     for (size_t k = 1; k <= 40; k += 9) {
22309       for (uint32_t n = 1; n <= 4; n++) {
22310         for (uint32_t m = 1; m <= 2; m++) {
22311           GemmMicrokernelTester()
22312             .mr(2)
22313             .nr(4)
22314             .kr(2)
22315             .sr(1)
22316             .m(m)
22317             .n(n)
22318             .k(k)
22319             .cm_stride(7)
22320             .iterations(1)
22321             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22322         }
22323       }
22324     }
22325   }
22326 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,qmin)22327   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, qmin) {
22328     TEST_REQUIRES_X86_SSE41;
22329     GemmMicrokernelTester()
22330       .mr(2)
22331       .nr(4)
22332       .kr(2)
22333       .sr(1)
22334       .m(2)
22335       .n(4)
22336       .k(8)
22337       .qmin(128)
22338       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22339   }
22340 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,qmax)22341   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, qmax) {
22342     TEST_REQUIRES_X86_SSE41;
22343     GemmMicrokernelTester()
22344       .mr(2)
22345       .nr(4)
22346       .kr(2)
22347       .sr(1)
22348       .m(2)
22349       .n(4)
22350       .k(8)
22351       .qmax(128)
22352       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22353   }
22354 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128,strided_cm)22355   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__SSE41_LD128, strided_cm) {
22356     TEST_REQUIRES_X86_SSE41;
22357     GemmMicrokernelTester()
22358       .mr(2)
22359       .nr(4)
22360       .kr(2)
22361       .sr(1)
22362       .m(2)
22363       .n(4)
22364       .k(8)
22365       .cm_stride(7)
22366       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22367   }
22368 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
22369 
22370 
22371 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_eq_8)22372   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_eq_8) {
22373     TEST_REQUIRES_X86_SSE2;
22374     GemmMicrokernelTester()
22375       .mr(4)
22376       .nr(4)
22377       .kr(2)
22378       .sr(1)
22379       .m(4)
22380       .n(4)
22381       .k(8)
22382       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22383   }
22384 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,strided_cn)22385   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, strided_cn) {
22386     TEST_REQUIRES_X86_SSE2;
22387     GemmMicrokernelTester()
22388       .mr(4)
22389       .nr(4)
22390       .kr(2)
22391       .sr(1)
22392       .m(4)
22393       .n(4)
22394       .k(8)
22395       .cn_stride(7)
22396       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22397   }
22398 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_eq_8_strided_a)22399   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_eq_8_strided_a) {
22400     TEST_REQUIRES_X86_SSE2;
22401     GemmMicrokernelTester()
22402       .mr(4)
22403       .nr(4)
22404       .kr(2)
22405       .sr(1)
22406       .m(4)
22407       .n(4)
22408       .k(8)
22409       .a_stride(11)
22410       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22411   }
22412 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_eq_8_subtile)22413   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_eq_8_subtile) {
22414     TEST_REQUIRES_X86_SSE2;
22415     for (uint32_t n = 1; n <= 4; n++) {
22416       for (uint32_t m = 1; m <= 4; m++) {
22417         GemmMicrokernelTester()
22418           .mr(4)
22419           .nr(4)
22420           .kr(2)
22421           .sr(1)
22422           .m(m)
22423           .n(n)
22424           .k(8)
22425           .iterations(1)
22426           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22427       }
22428     }
22429   }
22430 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_eq_8_subtile_m)22431   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_eq_8_subtile_m) {
22432     TEST_REQUIRES_X86_SSE2;
22433     for (uint32_t m = 1; m <= 4; m++) {
22434       GemmMicrokernelTester()
22435         .mr(4)
22436         .nr(4)
22437         .kr(2)
22438         .sr(1)
22439         .m(m)
22440         .n(4)
22441         .k(8)
22442         .iterations(1)
22443         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22444     }
22445   }
22446 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_eq_8_subtile_n)22447   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_eq_8_subtile_n) {
22448     TEST_REQUIRES_X86_SSE2;
22449     for (uint32_t n = 1; n <= 4; n++) {
22450       GemmMicrokernelTester()
22451         .mr(4)
22452         .nr(4)
22453         .kr(2)
22454         .sr(1)
22455         .m(4)
22456         .n(n)
22457         .k(8)
22458         .iterations(1)
22459         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22460     }
22461   }
22462 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_lt_8)22463   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_lt_8) {
22464     TEST_REQUIRES_X86_SSE2;
22465     for (size_t k = 1; k < 8; k++) {
22466       GemmMicrokernelTester()
22467         .mr(4)
22468         .nr(4)
22469         .kr(2)
22470         .sr(1)
22471         .m(4)
22472         .n(4)
22473         .k(k)
22474         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22475     }
22476   }
22477 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_lt_8_strided_a)22478   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_lt_8_strided_a) {
22479     TEST_REQUIRES_X86_SSE2;
22480     for (size_t k = 1; k < 8; k++) {
22481       GemmMicrokernelTester()
22482         .mr(4)
22483         .nr(4)
22484         .kr(2)
22485         .sr(1)
22486         .m(4)
22487         .n(4)
22488         .k(k)
22489         .a_stride(11)
22490         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22491     }
22492   }
22493 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_lt_8_subtile)22494   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_lt_8_subtile) {
22495     TEST_REQUIRES_X86_SSE2;
22496     for (size_t k = 1; k < 8; k++) {
22497       for (uint32_t n = 1; n <= 4; n++) {
22498         for (uint32_t m = 1; m <= 4; m++) {
22499           GemmMicrokernelTester()
22500             .mr(4)
22501             .nr(4)
22502             .kr(2)
22503             .sr(1)
22504             .m(m)
22505             .n(n)
22506             .k(k)
22507             .iterations(1)
22508             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22509         }
22510       }
22511     }
22512   }
22513 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_gt_8)22514   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_gt_8) {
22515     TEST_REQUIRES_X86_SSE2;
22516     for (size_t k = 9; k < 16; k++) {
22517       GemmMicrokernelTester()
22518         .mr(4)
22519         .nr(4)
22520         .kr(2)
22521         .sr(1)
22522         .m(4)
22523         .n(4)
22524         .k(k)
22525         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22526     }
22527   }
22528 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_gt_8_strided_a)22529   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_gt_8_strided_a) {
22530     TEST_REQUIRES_X86_SSE2;
22531     for (size_t k = 9; k < 16; k++) {
22532       GemmMicrokernelTester()
22533         .mr(4)
22534         .nr(4)
22535         .kr(2)
22536         .sr(1)
22537         .m(4)
22538         .n(4)
22539         .k(k)
22540         .a_stride(19)
22541         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22542     }
22543   }
22544 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_gt_8_subtile)22545   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_gt_8_subtile) {
22546     TEST_REQUIRES_X86_SSE2;
22547     for (size_t k = 9; k < 16; k++) {
22548       for (uint32_t n = 1; n <= 4; n++) {
22549         for (uint32_t m = 1; m <= 4; m++) {
22550           GemmMicrokernelTester()
22551             .mr(4)
22552             .nr(4)
22553             .kr(2)
22554             .sr(1)
22555             .m(m)
22556             .n(n)
22557             .k(k)
22558             .iterations(1)
22559             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22560         }
22561       }
22562     }
22563   }
22564 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_div_8)22565   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_div_8) {
22566     TEST_REQUIRES_X86_SSE2;
22567     for (size_t k = 16; k <= 80; k += 8) {
22568       GemmMicrokernelTester()
22569         .mr(4)
22570         .nr(4)
22571         .kr(2)
22572         .sr(1)
22573         .m(4)
22574         .n(4)
22575         .k(k)
22576         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22577     }
22578   }
22579 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_div_8_strided_a)22580   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_div_8_strided_a) {
22581     TEST_REQUIRES_X86_SSE2;
22582     for (size_t k = 16; k <= 80; k += 8) {
22583       GemmMicrokernelTester()
22584         .mr(4)
22585         .nr(4)
22586         .kr(2)
22587         .sr(1)
22588         .m(4)
22589         .n(4)
22590         .k(k)
22591         .a_stride(83)
22592         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22593     }
22594   }
22595 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,k_div_8_subtile)22596   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, k_div_8_subtile) {
22597     TEST_REQUIRES_X86_SSE2;
22598     for (size_t k = 16; k <= 80; k += 8) {
22599       for (uint32_t n = 1; n <= 4; n++) {
22600         for (uint32_t m = 1; m <= 4; m++) {
22601           GemmMicrokernelTester()
22602             .mr(4)
22603             .nr(4)
22604             .kr(2)
22605             .sr(1)
22606             .m(m)
22607             .n(n)
22608             .k(k)
22609             .iterations(1)
22610             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22611         }
22612       }
22613     }
22614   }
22615 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_gt_4)22616   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_gt_4) {
22617     TEST_REQUIRES_X86_SSE2;
22618     for (uint32_t n = 5; n < 8; n++) {
22619       for (size_t k = 1; k <= 40; k += 9) {
22620         GemmMicrokernelTester()
22621           .mr(4)
22622           .nr(4)
22623           .kr(2)
22624           .sr(1)
22625           .m(4)
22626           .n(n)
22627           .k(k)
22628           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22629       }
22630     }
22631   }
22632 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_gt_4_strided_cn)22633   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_gt_4_strided_cn) {
22634     TEST_REQUIRES_X86_SSE2;
22635     for (uint32_t n = 5; n < 8; n++) {
22636       for (size_t k = 1; k <= 40; k += 9) {
22637         GemmMicrokernelTester()
22638           .mr(4)
22639           .nr(4)
22640           .kr(2)
22641           .sr(1)
22642           .m(4)
22643           .n(n)
22644           .k(k)
22645           .cn_stride(7)
22646           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22647       }
22648     }
22649   }
22650 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_gt_4_strided_a)22651   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_gt_4_strided_a) {
22652     TEST_REQUIRES_X86_SSE2;
22653     for (uint32_t n = 5; n < 8; n++) {
22654       for (size_t k = 1; k <= 40; k += 9) {
22655         GemmMicrokernelTester()
22656           .mr(4)
22657           .nr(4)
22658           .kr(2)
22659           .sr(1)
22660           .m(4)
22661           .n(n)
22662           .k(k)
22663           .a_stride(43)
22664           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22665       }
22666     }
22667   }
22668 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_gt_4_subtile)22669   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_gt_4_subtile) {
22670     TEST_REQUIRES_X86_SSE2;
22671     for (uint32_t n = 5; n < 8; n++) {
22672       for (size_t k = 1; k <= 40; k += 9) {
22673         for (uint32_t m = 1; m <= 4; m++) {
22674           GemmMicrokernelTester()
22675             .mr(4)
22676             .nr(4)
22677             .kr(2)
22678             .sr(1)
22679             .m(m)
22680             .n(n)
22681             .k(k)
22682             .iterations(1)
22683             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22684         }
22685       }
22686     }
22687   }
22688 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_div_4)22689   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_div_4) {
22690     TEST_REQUIRES_X86_SSE2;
22691     for (uint32_t n = 8; n <= 12; n += 4) {
22692       for (size_t k = 1; k <= 40; k += 9) {
22693         GemmMicrokernelTester()
22694           .mr(4)
22695           .nr(4)
22696           .kr(2)
22697           .sr(1)
22698           .m(4)
22699           .n(n)
22700           .k(k)
22701           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22702       }
22703     }
22704   }
22705 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_div_4_strided_cn)22706   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_div_4_strided_cn) {
22707     TEST_REQUIRES_X86_SSE2;
22708     for (uint32_t n = 8; n <= 12; n += 4) {
22709       for (size_t k = 1; k <= 40; k += 9) {
22710         GemmMicrokernelTester()
22711           .mr(4)
22712           .nr(4)
22713           .kr(2)
22714           .sr(1)
22715           .m(4)
22716           .n(n)
22717           .k(k)
22718           .cn_stride(7)
22719           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22720       }
22721     }
22722   }
22723 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_div_4_strided_a)22724   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_div_4_strided_a) {
22725     TEST_REQUIRES_X86_SSE2;
22726     for (uint32_t n = 8; n <= 12; n += 4) {
22727       for (size_t k = 1; k <= 40; k += 9) {
22728         GemmMicrokernelTester()
22729           .mr(4)
22730           .nr(4)
22731           .kr(2)
22732           .sr(1)
22733           .m(4)
22734           .n(n)
22735           .k(k)
22736           .a_stride(43)
22737           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22738       }
22739     }
22740   }
22741 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,n_div_4_subtile)22742   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, n_div_4_subtile) {
22743     TEST_REQUIRES_X86_SSE2;
22744     for (uint32_t n = 8; n <= 12; n += 4) {
22745       for (size_t k = 1; k <= 40; k += 9) {
22746         for (uint32_t m = 1; m <= 4; m++) {
22747           GemmMicrokernelTester()
22748             .mr(4)
22749             .nr(4)
22750             .kr(2)
22751             .sr(1)
22752             .m(m)
22753             .n(n)
22754             .k(k)
22755             .iterations(1)
22756             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22757         }
22758       }
22759     }
22760   }
22761 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,strided_cm_subtile)22762   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, strided_cm_subtile) {
22763     TEST_REQUIRES_X86_SSE2;
22764     for (size_t k = 1; k <= 40; k += 9) {
22765       for (uint32_t n = 1; n <= 4; n++) {
22766         for (uint32_t m = 1; m <= 4; m++) {
22767           GemmMicrokernelTester()
22768             .mr(4)
22769             .nr(4)
22770             .kr(2)
22771             .sr(1)
22772             .m(m)
22773             .n(n)
22774             .k(k)
22775             .cm_stride(7)
22776             .iterations(1)
22777             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22778         }
22779       }
22780     }
22781   }
22782 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,qmin)22783   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, qmin) {
22784     TEST_REQUIRES_X86_SSE2;
22785     GemmMicrokernelTester()
22786       .mr(4)
22787       .nr(4)
22788       .kr(2)
22789       .sr(1)
22790       .m(4)
22791       .n(4)
22792       .k(8)
22793       .qmin(128)
22794       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22795   }
22796 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,qmax)22797   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, qmax) {
22798     TEST_REQUIRES_X86_SSE2;
22799     GemmMicrokernelTester()
22800       .mr(4)
22801       .nr(4)
22802       .kr(2)
22803       .sr(1)
22804       .m(4)
22805       .n(4)
22806       .k(8)
22807       .qmax(128)
22808       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22809   }
22810 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128,strided_cm)22811   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__SSE2_LD128, strided_cm) {
22812     TEST_REQUIRES_X86_SSE2;
22813     GemmMicrokernelTester()
22814       .mr(4)
22815       .nr(4)
22816       .kr(2)
22817       .sr(1)
22818       .m(4)
22819       .n(4)
22820       .k(8)
22821       .cm_stride(7)
22822       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
22823   }
22824 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
22825 
22826 
22827 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_eq_8)22828   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_eq_8) {
22829     TEST_REQUIRES_X86_XOP;
22830     GemmMicrokernelTester()
22831       .mr(1)
22832       .nr(4)
22833       .kr(2)
22834       .sr(1)
22835       .m(1)
22836       .n(4)
22837       .k(8)
22838       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22839   }
22840 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,strided_cn)22841   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, strided_cn) {
22842     TEST_REQUIRES_X86_XOP;
22843     GemmMicrokernelTester()
22844       .mr(1)
22845       .nr(4)
22846       .kr(2)
22847       .sr(1)
22848       .m(1)
22849       .n(4)
22850       .k(8)
22851       .cn_stride(7)
22852       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22853   }
22854 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_eq_8_strided_a)22855   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_eq_8_strided_a) {
22856     TEST_REQUIRES_X86_XOP;
22857     GemmMicrokernelTester()
22858       .mr(1)
22859       .nr(4)
22860       .kr(2)
22861       .sr(1)
22862       .m(1)
22863       .n(4)
22864       .k(8)
22865       .a_stride(11)
22866       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22867   }
22868 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_eq_8_subtile)22869   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_eq_8_subtile) {
22870     TEST_REQUIRES_X86_XOP;
22871     for (uint32_t n = 1; n <= 4; n++) {
22872       for (uint32_t m = 1; m <= 1; m++) {
22873         GemmMicrokernelTester()
22874           .mr(1)
22875           .nr(4)
22876           .kr(2)
22877           .sr(1)
22878           .m(m)
22879           .n(n)
22880           .k(8)
22881           .iterations(1)
22882           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22883       }
22884     }
22885   }
22886 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_eq_8_subtile_m)22887   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_eq_8_subtile_m) {
22888     TEST_REQUIRES_X86_XOP;
22889     for (uint32_t m = 1; m <= 1; m++) {
22890       GemmMicrokernelTester()
22891         .mr(1)
22892         .nr(4)
22893         .kr(2)
22894         .sr(1)
22895         .m(m)
22896         .n(4)
22897         .k(8)
22898         .iterations(1)
22899         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22900     }
22901   }
22902 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_eq_8_subtile_n)22903   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_eq_8_subtile_n) {
22904     TEST_REQUIRES_X86_XOP;
22905     for (uint32_t n = 1; n <= 4; n++) {
22906       GemmMicrokernelTester()
22907         .mr(1)
22908         .nr(4)
22909         .kr(2)
22910         .sr(1)
22911         .m(1)
22912         .n(n)
22913         .k(8)
22914         .iterations(1)
22915         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22916     }
22917   }
22918 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_lt_8)22919   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_lt_8) {
22920     TEST_REQUIRES_X86_XOP;
22921     for (size_t k = 1; k < 8; k++) {
22922       GemmMicrokernelTester()
22923         .mr(1)
22924         .nr(4)
22925         .kr(2)
22926         .sr(1)
22927         .m(1)
22928         .n(4)
22929         .k(k)
22930         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22931     }
22932   }
22933 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_lt_8_strided_a)22934   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_lt_8_strided_a) {
22935     TEST_REQUIRES_X86_XOP;
22936     for (size_t k = 1; k < 8; k++) {
22937       GemmMicrokernelTester()
22938         .mr(1)
22939         .nr(4)
22940         .kr(2)
22941         .sr(1)
22942         .m(1)
22943         .n(4)
22944         .k(k)
22945         .a_stride(11)
22946         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22947     }
22948   }
22949 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_lt_8_subtile)22950   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_lt_8_subtile) {
22951     TEST_REQUIRES_X86_XOP;
22952     for (size_t k = 1; k < 8; k++) {
22953       for (uint32_t n = 1; n <= 4; n++) {
22954         for (uint32_t m = 1; m <= 1; m++) {
22955           GemmMicrokernelTester()
22956             .mr(1)
22957             .nr(4)
22958             .kr(2)
22959             .sr(1)
22960             .m(m)
22961             .n(n)
22962             .k(k)
22963             .iterations(1)
22964             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22965         }
22966       }
22967     }
22968   }
22969 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_gt_8)22970   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_gt_8) {
22971     TEST_REQUIRES_X86_XOP;
22972     for (size_t k = 9; k < 16; k++) {
22973       GemmMicrokernelTester()
22974         .mr(1)
22975         .nr(4)
22976         .kr(2)
22977         .sr(1)
22978         .m(1)
22979         .n(4)
22980         .k(k)
22981         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22982     }
22983   }
22984 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_gt_8_strided_a)22985   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_gt_8_strided_a) {
22986     TEST_REQUIRES_X86_XOP;
22987     for (size_t k = 9; k < 16; k++) {
22988       GemmMicrokernelTester()
22989         .mr(1)
22990         .nr(4)
22991         .kr(2)
22992         .sr(1)
22993         .m(1)
22994         .n(4)
22995         .k(k)
22996         .a_stride(19)
22997         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
22998     }
22999   }
23000 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_gt_8_subtile)23001   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_gt_8_subtile) {
23002     TEST_REQUIRES_X86_XOP;
23003     for (size_t k = 9; k < 16; k++) {
23004       for (uint32_t n = 1; n <= 4; n++) {
23005         for (uint32_t m = 1; m <= 1; m++) {
23006           GemmMicrokernelTester()
23007             .mr(1)
23008             .nr(4)
23009             .kr(2)
23010             .sr(1)
23011             .m(m)
23012             .n(n)
23013             .k(k)
23014             .iterations(1)
23015             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23016         }
23017       }
23018     }
23019   }
23020 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_div_8)23021   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_div_8) {
23022     TEST_REQUIRES_X86_XOP;
23023     for (size_t k = 16; k <= 80; k += 8) {
23024       GemmMicrokernelTester()
23025         .mr(1)
23026         .nr(4)
23027         .kr(2)
23028         .sr(1)
23029         .m(1)
23030         .n(4)
23031         .k(k)
23032         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23033     }
23034   }
23035 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_div_8_strided_a)23036   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_div_8_strided_a) {
23037     TEST_REQUIRES_X86_XOP;
23038     for (size_t k = 16; k <= 80; k += 8) {
23039       GemmMicrokernelTester()
23040         .mr(1)
23041         .nr(4)
23042         .kr(2)
23043         .sr(1)
23044         .m(1)
23045         .n(4)
23046         .k(k)
23047         .a_stride(83)
23048         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23049     }
23050   }
23051 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,k_div_8_subtile)23052   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, k_div_8_subtile) {
23053     TEST_REQUIRES_X86_XOP;
23054     for (size_t k = 16; k <= 80; k += 8) {
23055       for (uint32_t n = 1; n <= 4; n++) {
23056         for (uint32_t m = 1; m <= 1; m++) {
23057           GemmMicrokernelTester()
23058             .mr(1)
23059             .nr(4)
23060             .kr(2)
23061             .sr(1)
23062             .m(m)
23063             .n(n)
23064             .k(k)
23065             .iterations(1)
23066             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23067         }
23068       }
23069     }
23070   }
23071 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_gt_4)23072   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_gt_4) {
23073     TEST_REQUIRES_X86_XOP;
23074     for (uint32_t n = 5; n < 8; n++) {
23075       for (size_t k = 1; k <= 40; k += 9) {
23076         GemmMicrokernelTester()
23077           .mr(1)
23078           .nr(4)
23079           .kr(2)
23080           .sr(1)
23081           .m(1)
23082           .n(n)
23083           .k(k)
23084           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23085       }
23086     }
23087   }
23088 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_gt_4_strided_cn)23089   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_gt_4_strided_cn) {
23090     TEST_REQUIRES_X86_XOP;
23091     for (uint32_t n = 5; n < 8; n++) {
23092       for (size_t k = 1; k <= 40; k += 9) {
23093         GemmMicrokernelTester()
23094           .mr(1)
23095           .nr(4)
23096           .kr(2)
23097           .sr(1)
23098           .m(1)
23099           .n(n)
23100           .k(k)
23101           .cn_stride(7)
23102           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23103       }
23104     }
23105   }
23106 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_gt_4_strided_a)23107   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_gt_4_strided_a) {
23108     TEST_REQUIRES_X86_XOP;
23109     for (uint32_t n = 5; n < 8; n++) {
23110       for (size_t k = 1; k <= 40; k += 9) {
23111         GemmMicrokernelTester()
23112           .mr(1)
23113           .nr(4)
23114           .kr(2)
23115           .sr(1)
23116           .m(1)
23117           .n(n)
23118           .k(k)
23119           .a_stride(43)
23120           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23121       }
23122     }
23123   }
23124 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_gt_4_subtile)23125   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_gt_4_subtile) {
23126     TEST_REQUIRES_X86_XOP;
23127     for (uint32_t n = 5; n < 8; n++) {
23128       for (size_t k = 1; k <= 40; k += 9) {
23129         for (uint32_t m = 1; m <= 1; m++) {
23130           GemmMicrokernelTester()
23131             .mr(1)
23132             .nr(4)
23133             .kr(2)
23134             .sr(1)
23135             .m(m)
23136             .n(n)
23137             .k(k)
23138             .iterations(1)
23139             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23140         }
23141       }
23142     }
23143   }
23144 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_div_4)23145   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_div_4) {
23146     TEST_REQUIRES_X86_XOP;
23147     for (uint32_t n = 8; n <= 12; n += 4) {
23148       for (size_t k = 1; k <= 40; k += 9) {
23149         GemmMicrokernelTester()
23150           .mr(1)
23151           .nr(4)
23152           .kr(2)
23153           .sr(1)
23154           .m(1)
23155           .n(n)
23156           .k(k)
23157           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23158       }
23159     }
23160   }
23161 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_div_4_strided_cn)23162   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_div_4_strided_cn) {
23163     TEST_REQUIRES_X86_XOP;
23164     for (uint32_t n = 8; n <= 12; n += 4) {
23165       for (size_t k = 1; k <= 40; k += 9) {
23166         GemmMicrokernelTester()
23167           .mr(1)
23168           .nr(4)
23169           .kr(2)
23170           .sr(1)
23171           .m(1)
23172           .n(n)
23173           .k(k)
23174           .cn_stride(7)
23175           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23176       }
23177     }
23178   }
23179 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_div_4_strided_a)23180   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_div_4_strided_a) {
23181     TEST_REQUIRES_X86_XOP;
23182     for (uint32_t n = 8; n <= 12; n += 4) {
23183       for (size_t k = 1; k <= 40; k += 9) {
23184         GemmMicrokernelTester()
23185           .mr(1)
23186           .nr(4)
23187           .kr(2)
23188           .sr(1)
23189           .m(1)
23190           .n(n)
23191           .k(k)
23192           .a_stride(43)
23193           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23194       }
23195     }
23196   }
23197 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,n_div_4_subtile)23198   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, n_div_4_subtile) {
23199     TEST_REQUIRES_X86_XOP;
23200     for (uint32_t n = 8; n <= 12; n += 4) {
23201       for (size_t k = 1; k <= 40; k += 9) {
23202         for (uint32_t m = 1; m <= 1; m++) {
23203           GemmMicrokernelTester()
23204             .mr(1)
23205             .nr(4)
23206             .kr(2)
23207             .sr(1)
23208             .m(m)
23209             .n(n)
23210             .k(k)
23211             .iterations(1)
23212             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23213         }
23214       }
23215     }
23216   }
23217 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,strided_cm_subtile)23218   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, strided_cm_subtile) {
23219     TEST_REQUIRES_X86_XOP;
23220     for (size_t k = 1; k <= 40; k += 9) {
23221       for (uint32_t n = 1; n <= 4; n++) {
23222         for (uint32_t m = 1; m <= 1; m++) {
23223           GemmMicrokernelTester()
23224             .mr(1)
23225             .nr(4)
23226             .kr(2)
23227             .sr(1)
23228             .m(m)
23229             .n(n)
23230             .k(k)
23231             .cm_stride(7)
23232             .iterations(1)
23233             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23234         }
23235       }
23236     }
23237   }
23238 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,qmin)23239   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, qmin) {
23240     TEST_REQUIRES_X86_XOP;
23241     GemmMicrokernelTester()
23242       .mr(1)
23243       .nr(4)
23244       .kr(2)
23245       .sr(1)
23246       .m(1)
23247       .n(4)
23248       .k(8)
23249       .qmin(128)
23250       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23251   }
23252 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,qmax)23253   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, qmax) {
23254     TEST_REQUIRES_X86_XOP;
23255     GemmMicrokernelTester()
23256       .mr(1)
23257       .nr(4)
23258       .kr(2)
23259       .sr(1)
23260       .m(1)
23261       .n(4)
23262       .k(8)
23263       .qmax(128)
23264       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23265   }
23266 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128,strided_cm)23267   TEST(QS8_GEMM_MINMAX_FP32_1X4C2__XOP_LD128, strided_cm) {
23268     TEST_REQUIRES_X86_XOP;
23269     GemmMicrokernelTester()
23270       .mr(1)
23271       .nr(4)
23272       .kr(2)
23273       .sr(1)
23274       .m(1)
23275       .n(4)
23276       .k(8)
23277       .cm_stride(7)
23278       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23279   }
23280 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
23281 
23282 
23283 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_eq_8)23284   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_eq_8) {
23285     TEST_REQUIRES_X86_XOP;
23286     GemmMicrokernelTester()
23287       .mr(2)
23288       .nr(4)
23289       .kr(2)
23290       .sr(1)
23291       .m(2)
23292       .n(4)
23293       .k(8)
23294       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23295   }
23296 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,strided_cn)23297   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, strided_cn) {
23298     TEST_REQUIRES_X86_XOP;
23299     GemmMicrokernelTester()
23300       .mr(2)
23301       .nr(4)
23302       .kr(2)
23303       .sr(1)
23304       .m(2)
23305       .n(4)
23306       .k(8)
23307       .cn_stride(7)
23308       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23309   }
23310 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_eq_8_strided_a)23311   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_eq_8_strided_a) {
23312     TEST_REQUIRES_X86_XOP;
23313     GemmMicrokernelTester()
23314       .mr(2)
23315       .nr(4)
23316       .kr(2)
23317       .sr(1)
23318       .m(2)
23319       .n(4)
23320       .k(8)
23321       .a_stride(11)
23322       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23323   }
23324 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_eq_8_subtile)23325   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_eq_8_subtile) {
23326     TEST_REQUIRES_X86_XOP;
23327     for (uint32_t n = 1; n <= 4; n++) {
23328       for (uint32_t m = 1; m <= 2; m++) {
23329         GemmMicrokernelTester()
23330           .mr(2)
23331           .nr(4)
23332           .kr(2)
23333           .sr(1)
23334           .m(m)
23335           .n(n)
23336           .k(8)
23337           .iterations(1)
23338           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23339       }
23340     }
23341   }
23342 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_eq_8_subtile_m)23343   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_eq_8_subtile_m) {
23344     TEST_REQUIRES_X86_XOP;
23345     for (uint32_t m = 1; m <= 2; m++) {
23346       GemmMicrokernelTester()
23347         .mr(2)
23348         .nr(4)
23349         .kr(2)
23350         .sr(1)
23351         .m(m)
23352         .n(4)
23353         .k(8)
23354         .iterations(1)
23355         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23356     }
23357   }
23358 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_eq_8_subtile_n)23359   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_eq_8_subtile_n) {
23360     TEST_REQUIRES_X86_XOP;
23361     for (uint32_t n = 1; n <= 4; n++) {
23362       GemmMicrokernelTester()
23363         .mr(2)
23364         .nr(4)
23365         .kr(2)
23366         .sr(1)
23367         .m(2)
23368         .n(n)
23369         .k(8)
23370         .iterations(1)
23371         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23372     }
23373   }
23374 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_lt_8)23375   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_lt_8) {
23376     TEST_REQUIRES_X86_XOP;
23377     for (size_t k = 1; k < 8; k++) {
23378       GemmMicrokernelTester()
23379         .mr(2)
23380         .nr(4)
23381         .kr(2)
23382         .sr(1)
23383         .m(2)
23384         .n(4)
23385         .k(k)
23386         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23387     }
23388   }
23389 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_lt_8_strided_a)23390   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_lt_8_strided_a) {
23391     TEST_REQUIRES_X86_XOP;
23392     for (size_t k = 1; k < 8; k++) {
23393       GemmMicrokernelTester()
23394         .mr(2)
23395         .nr(4)
23396         .kr(2)
23397         .sr(1)
23398         .m(2)
23399         .n(4)
23400         .k(k)
23401         .a_stride(11)
23402         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23403     }
23404   }
23405 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_lt_8_subtile)23406   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_lt_8_subtile) {
23407     TEST_REQUIRES_X86_XOP;
23408     for (size_t k = 1; k < 8; k++) {
23409       for (uint32_t n = 1; n <= 4; n++) {
23410         for (uint32_t m = 1; m <= 2; m++) {
23411           GemmMicrokernelTester()
23412             .mr(2)
23413             .nr(4)
23414             .kr(2)
23415             .sr(1)
23416             .m(m)
23417             .n(n)
23418             .k(k)
23419             .iterations(1)
23420             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23421         }
23422       }
23423     }
23424   }
23425 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_gt_8)23426   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_gt_8) {
23427     TEST_REQUIRES_X86_XOP;
23428     for (size_t k = 9; k < 16; k++) {
23429       GemmMicrokernelTester()
23430         .mr(2)
23431         .nr(4)
23432         .kr(2)
23433         .sr(1)
23434         .m(2)
23435         .n(4)
23436         .k(k)
23437         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23438     }
23439   }
23440 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_gt_8_strided_a)23441   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_gt_8_strided_a) {
23442     TEST_REQUIRES_X86_XOP;
23443     for (size_t k = 9; k < 16; k++) {
23444       GemmMicrokernelTester()
23445         .mr(2)
23446         .nr(4)
23447         .kr(2)
23448         .sr(1)
23449         .m(2)
23450         .n(4)
23451         .k(k)
23452         .a_stride(19)
23453         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23454     }
23455   }
23456 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_gt_8_subtile)23457   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_gt_8_subtile) {
23458     TEST_REQUIRES_X86_XOP;
23459     for (size_t k = 9; k < 16; k++) {
23460       for (uint32_t n = 1; n <= 4; n++) {
23461         for (uint32_t m = 1; m <= 2; m++) {
23462           GemmMicrokernelTester()
23463             .mr(2)
23464             .nr(4)
23465             .kr(2)
23466             .sr(1)
23467             .m(m)
23468             .n(n)
23469             .k(k)
23470             .iterations(1)
23471             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23472         }
23473       }
23474     }
23475   }
23476 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_div_8)23477   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_div_8) {
23478     TEST_REQUIRES_X86_XOP;
23479     for (size_t k = 16; k <= 80; k += 8) {
23480       GemmMicrokernelTester()
23481         .mr(2)
23482         .nr(4)
23483         .kr(2)
23484         .sr(1)
23485         .m(2)
23486         .n(4)
23487         .k(k)
23488         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23489     }
23490   }
23491 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_div_8_strided_a)23492   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_div_8_strided_a) {
23493     TEST_REQUIRES_X86_XOP;
23494     for (size_t k = 16; k <= 80; k += 8) {
23495       GemmMicrokernelTester()
23496         .mr(2)
23497         .nr(4)
23498         .kr(2)
23499         .sr(1)
23500         .m(2)
23501         .n(4)
23502         .k(k)
23503         .a_stride(83)
23504         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23505     }
23506   }
23507 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,k_div_8_subtile)23508   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, k_div_8_subtile) {
23509     TEST_REQUIRES_X86_XOP;
23510     for (size_t k = 16; k <= 80; k += 8) {
23511       for (uint32_t n = 1; n <= 4; n++) {
23512         for (uint32_t m = 1; m <= 2; m++) {
23513           GemmMicrokernelTester()
23514             .mr(2)
23515             .nr(4)
23516             .kr(2)
23517             .sr(1)
23518             .m(m)
23519             .n(n)
23520             .k(k)
23521             .iterations(1)
23522             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23523         }
23524       }
23525     }
23526   }
23527 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_gt_4)23528   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_gt_4) {
23529     TEST_REQUIRES_X86_XOP;
23530     for (uint32_t n = 5; n < 8; n++) {
23531       for (size_t k = 1; k <= 40; k += 9) {
23532         GemmMicrokernelTester()
23533           .mr(2)
23534           .nr(4)
23535           .kr(2)
23536           .sr(1)
23537           .m(2)
23538           .n(n)
23539           .k(k)
23540           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23541       }
23542     }
23543   }
23544 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_gt_4_strided_cn)23545   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_gt_4_strided_cn) {
23546     TEST_REQUIRES_X86_XOP;
23547     for (uint32_t n = 5; n < 8; n++) {
23548       for (size_t k = 1; k <= 40; k += 9) {
23549         GemmMicrokernelTester()
23550           .mr(2)
23551           .nr(4)
23552           .kr(2)
23553           .sr(1)
23554           .m(2)
23555           .n(n)
23556           .k(k)
23557           .cn_stride(7)
23558           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23559       }
23560     }
23561   }
23562 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_gt_4_strided_a)23563   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_gt_4_strided_a) {
23564     TEST_REQUIRES_X86_XOP;
23565     for (uint32_t n = 5; n < 8; n++) {
23566       for (size_t k = 1; k <= 40; k += 9) {
23567         GemmMicrokernelTester()
23568           .mr(2)
23569           .nr(4)
23570           .kr(2)
23571           .sr(1)
23572           .m(2)
23573           .n(n)
23574           .k(k)
23575           .a_stride(43)
23576           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23577       }
23578     }
23579   }
23580 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_gt_4_subtile)23581   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_gt_4_subtile) {
23582     TEST_REQUIRES_X86_XOP;
23583     for (uint32_t n = 5; n < 8; n++) {
23584       for (size_t k = 1; k <= 40; k += 9) {
23585         for (uint32_t m = 1; m <= 2; m++) {
23586           GemmMicrokernelTester()
23587             .mr(2)
23588             .nr(4)
23589             .kr(2)
23590             .sr(1)
23591             .m(m)
23592             .n(n)
23593             .k(k)
23594             .iterations(1)
23595             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23596         }
23597       }
23598     }
23599   }
23600 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_div_4)23601   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_div_4) {
23602     TEST_REQUIRES_X86_XOP;
23603     for (uint32_t n = 8; n <= 12; n += 4) {
23604       for (size_t k = 1; k <= 40; k += 9) {
23605         GemmMicrokernelTester()
23606           .mr(2)
23607           .nr(4)
23608           .kr(2)
23609           .sr(1)
23610           .m(2)
23611           .n(n)
23612           .k(k)
23613           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23614       }
23615     }
23616   }
23617 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_div_4_strided_cn)23618   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_div_4_strided_cn) {
23619     TEST_REQUIRES_X86_XOP;
23620     for (uint32_t n = 8; n <= 12; n += 4) {
23621       for (size_t k = 1; k <= 40; k += 9) {
23622         GemmMicrokernelTester()
23623           .mr(2)
23624           .nr(4)
23625           .kr(2)
23626           .sr(1)
23627           .m(2)
23628           .n(n)
23629           .k(k)
23630           .cn_stride(7)
23631           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23632       }
23633     }
23634   }
23635 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_div_4_strided_a)23636   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_div_4_strided_a) {
23637     TEST_REQUIRES_X86_XOP;
23638     for (uint32_t n = 8; n <= 12; n += 4) {
23639       for (size_t k = 1; k <= 40; k += 9) {
23640         GemmMicrokernelTester()
23641           .mr(2)
23642           .nr(4)
23643           .kr(2)
23644           .sr(1)
23645           .m(2)
23646           .n(n)
23647           .k(k)
23648           .a_stride(43)
23649           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23650       }
23651     }
23652   }
23653 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,n_div_4_subtile)23654   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, n_div_4_subtile) {
23655     TEST_REQUIRES_X86_XOP;
23656     for (uint32_t n = 8; n <= 12; n += 4) {
23657       for (size_t k = 1; k <= 40; k += 9) {
23658         for (uint32_t m = 1; m <= 2; m++) {
23659           GemmMicrokernelTester()
23660             .mr(2)
23661             .nr(4)
23662             .kr(2)
23663             .sr(1)
23664             .m(m)
23665             .n(n)
23666             .k(k)
23667             .iterations(1)
23668             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23669         }
23670       }
23671     }
23672   }
23673 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,strided_cm_subtile)23674   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, strided_cm_subtile) {
23675     TEST_REQUIRES_X86_XOP;
23676     for (size_t k = 1; k <= 40; k += 9) {
23677       for (uint32_t n = 1; n <= 4; n++) {
23678         for (uint32_t m = 1; m <= 2; m++) {
23679           GemmMicrokernelTester()
23680             .mr(2)
23681             .nr(4)
23682             .kr(2)
23683             .sr(1)
23684             .m(m)
23685             .n(n)
23686             .k(k)
23687             .cm_stride(7)
23688             .iterations(1)
23689             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23690         }
23691       }
23692     }
23693   }
23694 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,qmin)23695   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, qmin) {
23696     TEST_REQUIRES_X86_XOP;
23697     GemmMicrokernelTester()
23698       .mr(2)
23699       .nr(4)
23700       .kr(2)
23701       .sr(1)
23702       .m(2)
23703       .n(4)
23704       .k(8)
23705       .qmin(128)
23706       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23707   }
23708 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,qmax)23709   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, qmax) {
23710     TEST_REQUIRES_X86_XOP;
23711     GemmMicrokernelTester()
23712       .mr(2)
23713       .nr(4)
23714       .kr(2)
23715       .sr(1)
23716       .m(2)
23717       .n(4)
23718       .k(8)
23719       .qmax(128)
23720       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23721   }
23722 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128,strided_cm)23723   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__XOP_LD128, strided_cm) {
23724     TEST_REQUIRES_X86_XOP;
23725     GemmMicrokernelTester()
23726       .mr(2)
23727       .nr(4)
23728       .kr(2)
23729       .sr(1)
23730       .m(2)
23731       .n(4)
23732       .k(8)
23733       .cm_stride(7)
23734       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23735   }
23736 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
23737 
23738 
23739 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_eq_8)23740   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_eq_8) {
23741     TEST_REQUIRES_X86_AVX;
23742     GemmMicrokernelTester()
23743       .mr(3)
23744       .nr(4)
23745       .kr(2)
23746       .sr(1)
23747       .m(3)
23748       .n(4)
23749       .k(8)
23750       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23751   }
23752 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,strided_cn)23753   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, strided_cn) {
23754     TEST_REQUIRES_X86_AVX;
23755     GemmMicrokernelTester()
23756       .mr(3)
23757       .nr(4)
23758       .kr(2)
23759       .sr(1)
23760       .m(3)
23761       .n(4)
23762       .k(8)
23763       .cn_stride(7)
23764       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23765   }
23766 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_eq_8_strided_a)23767   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_eq_8_strided_a) {
23768     TEST_REQUIRES_X86_AVX;
23769     GemmMicrokernelTester()
23770       .mr(3)
23771       .nr(4)
23772       .kr(2)
23773       .sr(1)
23774       .m(3)
23775       .n(4)
23776       .k(8)
23777       .a_stride(11)
23778       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23779   }
23780 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_eq_8_subtile)23781   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_eq_8_subtile) {
23782     TEST_REQUIRES_X86_AVX;
23783     for (uint32_t n = 1; n <= 4; n++) {
23784       for (uint32_t m = 1; m <= 3; m++) {
23785         GemmMicrokernelTester()
23786           .mr(3)
23787           .nr(4)
23788           .kr(2)
23789           .sr(1)
23790           .m(m)
23791           .n(n)
23792           .k(8)
23793           .iterations(1)
23794           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23795       }
23796     }
23797   }
23798 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_eq_8_subtile_m)23799   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_eq_8_subtile_m) {
23800     TEST_REQUIRES_X86_AVX;
23801     for (uint32_t m = 1; m <= 3; m++) {
23802       GemmMicrokernelTester()
23803         .mr(3)
23804         .nr(4)
23805         .kr(2)
23806         .sr(1)
23807         .m(m)
23808         .n(4)
23809         .k(8)
23810         .iterations(1)
23811         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23812     }
23813   }
23814 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_eq_8_subtile_n)23815   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_eq_8_subtile_n) {
23816     TEST_REQUIRES_X86_AVX;
23817     for (uint32_t n = 1; n <= 4; n++) {
23818       GemmMicrokernelTester()
23819         .mr(3)
23820         .nr(4)
23821         .kr(2)
23822         .sr(1)
23823         .m(3)
23824         .n(n)
23825         .k(8)
23826         .iterations(1)
23827         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23828     }
23829   }
23830 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_lt_8)23831   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_lt_8) {
23832     TEST_REQUIRES_X86_AVX;
23833     for (size_t k = 1; k < 8; k++) {
23834       GemmMicrokernelTester()
23835         .mr(3)
23836         .nr(4)
23837         .kr(2)
23838         .sr(1)
23839         .m(3)
23840         .n(4)
23841         .k(k)
23842         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23843     }
23844   }
23845 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_lt_8_strided_a)23846   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_lt_8_strided_a) {
23847     TEST_REQUIRES_X86_AVX;
23848     for (size_t k = 1; k < 8; k++) {
23849       GemmMicrokernelTester()
23850         .mr(3)
23851         .nr(4)
23852         .kr(2)
23853         .sr(1)
23854         .m(3)
23855         .n(4)
23856         .k(k)
23857         .a_stride(11)
23858         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23859     }
23860   }
23861 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_lt_8_subtile)23862   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_lt_8_subtile) {
23863     TEST_REQUIRES_X86_AVX;
23864     for (size_t k = 1; k < 8; k++) {
23865       for (uint32_t n = 1; n <= 4; n++) {
23866         for (uint32_t m = 1; m <= 3; m++) {
23867           GemmMicrokernelTester()
23868             .mr(3)
23869             .nr(4)
23870             .kr(2)
23871             .sr(1)
23872             .m(m)
23873             .n(n)
23874             .k(k)
23875             .iterations(1)
23876             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23877         }
23878       }
23879     }
23880   }
23881 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_gt_8)23882   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_gt_8) {
23883     TEST_REQUIRES_X86_AVX;
23884     for (size_t k = 9; k < 16; k++) {
23885       GemmMicrokernelTester()
23886         .mr(3)
23887         .nr(4)
23888         .kr(2)
23889         .sr(1)
23890         .m(3)
23891         .n(4)
23892         .k(k)
23893         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23894     }
23895   }
23896 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_gt_8_strided_a)23897   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_gt_8_strided_a) {
23898     TEST_REQUIRES_X86_AVX;
23899     for (size_t k = 9; k < 16; k++) {
23900       GemmMicrokernelTester()
23901         .mr(3)
23902         .nr(4)
23903         .kr(2)
23904         .sr(1)
23905         .m(3)
23906         .n(4)
23907         .k(k)
23908         .a_stride(19)
23909         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23910     }
23911   }
23912 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_gt_8_subtile)23913   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_gt_8_subtile) {
23914     TEST_REQUIRES_X86_AVX;
23915     for (size_t k = 9; k < 16; k++) {
23916       for (uint32_t n = 1; n <= 4; n++) {
23917         for (uint32_t m = 1; m <= 3; m++) {
23918           GemmMicrokernelTester()
23919             .mr(3)
23920             .nr(4)
23921             .kr(2)
23922             .sr(1)
23923             .m(m)
23924             .n(n)
23925             .k(k)
23926             .iterations(1)
23927             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23928         }
23929       }
23930     }
23931   }
23932 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_div_8)23933   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_div_8) {
23934     TEST_REQUIRES_X86_AVX;
23935     for (size_t k = 16; k <= 80; k += 8) {
23936       GemmMicrokernelTester()
23937         .mr(3)
23938         .nr(4)
23939         .kr(2)
23940         .sr(1)
23941         .m(3)
23942         .n(4)
23943         .k(k)
23944         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23945     }
23946   }
23947 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_div_8_strided_a)23948   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_div_8_strided_a) {
23949     TEST_REQUIRES_X86_AVX;
23950     for (size_t k = 16; k <= 80; k += 8) {
23951       GemmMicrokernelTester()
23952         .mr(3)
23953         .nr(4)
23954         .kr(2)
23955         .sr(1)
23956         .m(3)
23957         .n(4)
23958         .k(k)
23959         .a_stride(83)
23960         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23961     }
23962   }
23963 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,k_div_8_subtile)23964   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, k_div_8_subtile) {
23965     TEST_REQUIRES_X86_AVX;
23966     for (size_t k = 16; k <= 80; k += 8) {
23967       for (uint32_t n = 1; n <= 4; n++) {
23968         for (uint32_t m = 1; m <= 3; m++) {
23969           GemmMicrokernelTester()
23970             .mr(3)
23971             .nr(4)
23972             .kr(2)
23973             .sr(1)
23974             .m(m)
23975             .n(n)
23976             .k(k)
23977             .iterations(1)
23978             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23979         }
23980       }
23981     }
23982   }
23983 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_gt_4)23984   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_gt_4) {
23985     TEST_REQUIRES_X86_AVX;
23986     for (uint32_t n = 5; n < 8; n++) {
23987       for (size_t k = 1; k <= 40; k += 9) {
23988         GemmMicrokernelTester()
23989           .mr(3)
23990           .nr(4)
23991           .kr(2)
23992           .sr(1)
23993           .m(3)
23994           .n(n)
23995           .k(k)
23996           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
23997       }
23998     }
23999   }
24000 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_gt_4_strided_cn)24001   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_gt_4_strided_cn) {
24002     TEST_REQUIRES_X86_AVX;
24003     for (uint32_t n = 5; n < 8; n++) {
24004       for (size_t k = 1; k <= 40; k += 9) {
24005         GemmMicrokernelTester()
24006           .mr(3)
24007           .nr(4)
24008           .kr(2)
24009           .sr(1)
24010           .m(3)
24011           .n(n)
24012           .k(k)
24013           .cn_stride(7)
24014           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24015       }
24016     }
24017   }
24018 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_gt_4_strided_a)24019   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_gt_4_strided_a) {
24020     TEST_REQUIRES_X86_AVX;
24021     for (uint32_t n = 5; n < 8; n++) {
24022       for (size_t k = 1; k <= 40; k += 9) {
24023         GemmMicrokernelTester()
24024           .mr(3)
24025           .nr(4)
24026           .kr(2)
24027           .sr(1)
24028           .m(3)
24029           .n(n)
24030           .k(k)
24031           .a_stride(43)
24032           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24033       }
24034     }
24035   }
24036 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_gt_4_subtile)24037   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_gt_4_subtile) {
24038     TEST_REQUIRES_X86_AVX;
24039     for (uint32_t n = 5; n < 8; n++) {
24040       for (size_t k = 1; k <= 40; k += 9) {
24041         for (uint32_t m = 1; m <= 3; m++) {
24042           GemmMicrokernelTester()
24043             .mr(3)
24044             .nr(4)
24045             .kr(2)
24046             .sr(1)
24047             .m(m)
24048             .n(n)
24049             .k(k)
24050             .iterations(1)
24051             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24052         }
24053       }
24054     }
24055   }
24056 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_div_4)24057   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_div_4) {
24058     TEST_REQUIRES_X86_AVX;
24059     for (uint32_t n = 8; n <= 12; n += 4) {
24060       for (size_t k = 1; k <= 40; k += 9) {
24061         GemmMicrokernelTester()
24062           .mr(3)
24063           .nr(4)
24064           .kr(2)
24065           .sr(1)
24066           .m(3)
24067           .n(n)
24068           .k(k)
24069           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24070       }
24071     }
24072   }
24073 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_div_4_strided_cn)24074   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_div_4_strided_cn) {
24075     TEST_REQUIRES_X86_AVX;
24076     for (uint32_t n = 8; n <= 12; n += 4) {
24077       for (size_t k = 1; k <= 40; k += 9) {
24078         GemmMicrokernelTester()
24079           .mr(3)
24080           .nr(4)
24081           .kr(2)
24082           .sr(1)
24083           .m(3)
24084           .n(n)
24085           .k(k)
24086           .cn_stride(7)
24087           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24088       }
24089     }
24090   }
24091 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_div_4_strided_a)24092   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_div_4_strided_a) {
24093     TEST_REQUIRES_X86_AVX;
24094     for (uint32_t n = 8; n <= 12; n += 4) {
24095       for (size_t k = 1; k <= 40; k += 9) {
24096         GemmMicrokernelTester()
24097           .mr(3)
24098           .nr(4)
24099           .kr(2)
24100           .sr(1)
24101           .m(3)
24102           .n(n)
24103           .k(k)
24104           .a_stride(43)
24105           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24106       }
24107     }
24108   }
24109 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,n_div_4_subtile)24110   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, n_div_4_subtile) {
24111     TEST_REQUIRES_X86_AVX;
24112     for (uint32_t n = 8; n <= 12; n += 4) {
24113       for (size_t k = 1; k <= 40; k += 9) {
24114         for (uint32_t m = 1; m <= 3; m++) {
24115           GemmMicrokernelTester()
24116             .mr(3)
24117             .nr(4)
24118             .kr(2)
24119             .sr(1)
24120             .m(m)
24121             .n(n)
24122             .k(k)
24123             .iterations(1)
24124             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24125         }
24126       }
24127     }
24128   }
24129 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,strided_cm_subtile)24130   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, strided_cm_subtile) {
24131     TEST_REQUIRES_X86_AVX;
24132     for (size_t k = 1; k <= 40; k += 9) {
24133       for (uint32_t n = 1; n <= 4; n++) {
24134         for (uint32_t m = 1; m <= 3; m++) {
24135           GemmMicrokernelTester()
24136             .mr(3)
24137             .nr(4)
24138             .kr(2)
24139             .sr(1)
24140             .m(m)
24141             .n(n)
24142             .k(k)
24143             .cm_stride(7)
24144             .iterations(1)
24145             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24146         }
24147       }
24148     }
24149   }
24150 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,qmin)24151   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, qmin) {
24152     TEST_REQUIRES_X86_AVX;
24153     GemmMicrokernelTester()
24154       .mr(3)
24155       .nr(4)
24156       .kr(2)
24157       .sr(1)
24158       .m(3)
24159       .n(4)
24160       .k(8)
24161       .qmin(128)
24162       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24163   }
24164 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,qmax)24165   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, qmax) {
24166     TEST_REQUIRES_X86_AVX;
24167     GemmMicrokernelTester()
24168       .mr(3)
24169       .nr(4)
24170       .kr(2)
24171       .sr(1)
24172       .m(3)
24173       .n(4)
24174       .k(8)
24175       .qmax(128)
24176       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24177   }
24178 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128,strided_cm)24179   TEST(QS8_GEMM_MINMAX_FP32_3X4C2__AVX_LD128, strided_cm) {
24180     TEST_REQUIRES_X86_AVX;
24181     GemmMicrokernelTester()
24182       .mr(3)
24183       .nr(4)
24184       .kr(2)
24185       .sr(1)
24186       .m(3)
24187       .n(4)
24188       .k(8)
24189       .cm_stride(7)
24190       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24191   }
24192 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
24193 
24194 
24195 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_eq_8)24196   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_eq_8) {
24197     TEST_REQUIRES_X86_XOP;
24198     GemmMicrokernelTester()
24199       .mr(4)
24200       .nr(4)
24201       .kr(2)
24202       .sr(1)
24203       .m(4)
24204       .n(4)
24205       .k(8)
24206       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24207   }
24208 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,strided_cn)24209   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, strided_cn) {
24210     TEST_REQUIRES_X86_XOP;
24211     GemmMicrokernelTester()
24212       .mr(4)
24213       .nr(4)
24214       .kr(2)
24215       .sr(1)
24216       .m(4)
24217       .n(4)
24218       .k(8)
24219       .cn_stride(7)
24220       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24221   }
24222 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_eq_8_strided_a)24223   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_eq_8_strided_a) {
24224     TEST_REQUIRES_X86_XOP;
24225     GemmMicrokernelTester()
24226       .mr(4)
24227       .nr(4)
24228       .kr(2)
24229       .sr(1)
24230       .m(4)
24231       .n(4)
24232       .k(8)
24233       .a_stride(11)
24234       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24235   }
24236 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_eq_8_subtile)24237   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_eq_8_subtile) {
24238     TEST_REQUIRES_X86_XOP;
24239     for (uint32_t n = 1; n <= 4; n++) {
24240       for (uint32_t m = 1; m <= 4; m++) {
24241         GemmMicrokernelTester()
24242           .mr(4)
24243           .nr(4)
24244           .kr(2)
24245           .sr(1)
24246           .m(m)
24247           .n(n)
24248           .k(8)
24249           .iterations(1)
24250           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24251       }
24252     }
24253   }
24254 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_eq_8_subtile_m)24255   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_eq_8_subtile_m) {
24256     TEST_REQUIRES_X86_XOP;
24257     for (uint32_t m = 1; m <= 4; m++) {
24258       GemmMicrokernelTester()
24259         .mr(4)
24260         .nr(4)
24261         .kr(2)
24262         .sr(1)
24263         .m(m)
24264         .n(4)
24265         .k(8)
24266         .iterations(1)
24267         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24268     }
24269   }
24270 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_eq_8_subtile_n)24271   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_eq_8_subtile_n) {
24272     TEST_REQUIRES_X86_XOP;
24273     for (uint32_t n = 1; n <= 4; n++) {
24274       GemmMicrokernelTester()
24275         .mr(4)
24276         .nr(4)
24277         .kr(2)
24278         .sr(1)
24279         .m(4)
24280         .n(n)
24281         .k(8)
24282         .iterations(1)
24283         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24284     }
24285   }
24286 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_lt_8)24287   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_lt_8) {
24288     TEST_REQUIRES_X86_XOP;
24289     for (size_t k = 1; k < 8; k++) {
24290       GemmMicrokernelTester()
24291         .mr(4)
24292         .nr(4)
24293         .kr(2)
24294         .sr(1)
24295         .m(4)
24296         .n(4)
24297         .k(k)
24298         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24299     }
24300   }
24301 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_lt_8_strided_a)24302   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_lt_8_strided_a) {
24303     TEST_REQUIRES_X86_XOP;
24304     for (size_t k = 1; k < 8; k++) {
24305       GemmMicrokernelTester()
24306         .mr(4)
24307         .nr(4)
24308         .kr(2)
24309         .sr(1)
24310         .m(4)
24311         .n(4)
24312         .k(k)
24313         .a_stride(11)
24314         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24315     }
24316   }
24317 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_lt_8_subtile)24318   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_lt_8_subtile) {
24319     TEST_REQUIRES_X86_XOP;
24320     for (size_t k = 1; k < 8; k++) {
24321       for (uint32_t n = 1; n <= 4; n++) {
24322         for (uint32_t m = 1; m <= 4; m++) {
24323           GemmMicrokernelTester()
24324             .mr(4)
24325             .nr(4)
24326             .kr(2)
24327             .sr(1)
24328             .m(m)
24329             .n(n)
24330             .k(k)
24331             .iterations(1)
24332             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24333         }
24334       }
24335     }
24336   }
24337 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_gt_8)24338   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_gt_8) {
24339     TEST_REQUIRES_X86_XOP;
24340     for (size_t k = 9; k < 16; k++) {
24341       GemmMicrokernelTester()
24342         .mr(4)
24343         .nr(4)
24344         .kr(2)
24345         .sr(1)
24346         .m(4)
24347         .n(4)
24348         .k(k)
24349         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24350     }
24351   }
24352 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_gt_8_strided_a)24353   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_gt_8_strided_a) {
24354     TEST_REQUIRES_X86_XOP;
24355     for (size_t k = 9; k < 16; k++) {
24356       GemmMicrokernelTester()
24357         .mr(4)
24358         .nr(4)
24359         .kr(2)
24360         .sr(1)
24361         .m(4)
24362         .n(4)
24363         .k(k)
24364         .a_stride(19)
24365         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24366     }
24367   }
24368 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_gt_8_subtile)24369   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_gt_8_subtile) {
24370     TEST_REQUIRES_X86_XOP;
24371     for (size_t k = 9; k < 16; k++) {
24372       for (uint32_t n = 1; n <= 4; n++) {
24373         for (uint32_t m = 1; m <= 4; m++) {
24374           GemmMicrokernelTester()
24375             .mr(4)
24376             .nr(4)
24377             .kr(2)
24378             .sr(1)
24379             .m(m)
24380             .n(n)
24381             .k(k)
24382             .iterations(1)
24383             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24384         }
24385       }
24386     }
24387   }
24388 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_div_8)24389   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_div_8) {
24390     TEST_REQUIRES_X86_XOP;
24391     for (size_t k = 16; k <= 80; k += 8) {
24392       GemmMicrokernelTester()
24393         .mr(4)
24394         .nr(4)
24395         .kr(2)
24396         .sr(1)
24397         .m(4)
24398         .n(4)
24399         .k(k)
24400         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24401     }
24402   }
24403 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_div_8_strided_a)24404   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_div_8_strided_a) {
24405     TEST_REQUIRES_X86_XOP;
24406     for (size_t k = 16; k <= 80; k += 8) {
24407       GemmMicrokernelTester()
24408         .mr(4)
24409         .nr(4)
24410         .kr(2)
24411         .sr(1)
24412         .m(4)
24413         .n(4)
24414         .k(k)
24415         .a_stride(83)
24416         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24417     }
24418   }
24419 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,k_div_8_subtile)24420   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, k_div_8_subtile) {
24421     TEST_REQUIRES_X86_XOP;
24422     for (size_t k = 16; k <= 80; k += 8) {
24423       for (uint32_t n = 1; n <= 4; n++) {
24424         for (uint32_t m = 1; m <= 4; m++) {
24425           GemmMicrokernelTester()
24426             .mr(4)
24427             .nr(4)
24428             .kr(2)
24429             .sr(1)
24430             .m(m)
24431             .n(n)
24432             .k(k)
24433             .iterations(1)
24434             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24435         }
24436       }
24437     }
24438   }
24439 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_gt_4)24440   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_gt_4) {
24441     TEST_REQUIRES_X86_XOP;
24442     for (uint32_t n = 5; n < 8; n++) {
24443       for (size_t k = 1; k <= 40; k += 9) {
24444         GemmMicrokernelTester()
24445           .mr(4)
24446           .nr(4)
24447           .kr(2)
24448           .sr(1)
24449           .m(4)
24450           .n(n)
24451           .k(k)
24452           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24453       }
24454     }
24455   }
24456 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_gt_4_strided_cn)24457   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_gt_4_strided_cn) {
24458     TEST_REQUIRES_X86_XOP;
24459     for (uint32_t n = 5; n < 8; n++) {
24460       for (size_t k = 1; k <= 40; k += 9) {
24461         GemmMicrokernelTester()
24462           .mr(4)
24463           .nr(4)
24464           .kr(2)
24465           .sr(1)
24466           .m(4)
24467           .n(n)
24468           .k(k)
24469           .cn_stride(7)
24470           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24471       }
24472     }
24473   }
24474 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_gt_4_strided_a)24475   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_gt_4_strided_a) {
24476     TEST_REQUIRES_X86_XOP;
24477     for (uint32_t n = 5; n < 8; n++) {
24478       for (size_t k = 1; k <= 40; k += 9) {
24479         GemmMicrokernelTester()
24480           .mr(4)
24481           .nr(4)
24482           .kr(2)
24483           .sr(1)
24484           .m(4)
24485           .n(n)
24486           .k(k)
24487           .a_stride(43)
24488           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24489       }
24490     }
24491   }
24492 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_gt_4_subtile)24493   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_gt_4_subtile) {
24494     TEST_REQUIRES_X86_XOP;
24495     for (uint32_t n = 5; n < 8; n++) {
24496       for (size_t k = 1; k <= 40; k += 9) {
24497         for (uint32_t m = 1; m <= 4; m++) {
24498           GemmMicrokernelTester()
24499             .mr(4)
24500             .nr(4)
24501             .kr(2)
24502             .sr(1)
24503             .m(m)
24504             .n(n)
24505             .k(k)
24506             .iterations(1)
24507             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24508         }
24509       }
24510     }
24511   }
24512 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_div_4)24513   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_div_4) {
24514     TEST_REQUIRES_X86_XOP;
24515     for (uint32_t n = 8; n <= 12; n += 4) {
24516       for (size_t k = 1; k <= 40; k += 9) {
24517         GemmMicrokernelTester()
24518           .mr(4)
24519           .nr(4)
24520           .kr(2)
24521           .sr(1)
24522           .m(4)
24523           .n(n)
24524           .k(k)
24525           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24526       }
24527     }
24528   }
24529 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_div_4_strided_cn)24530   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_div_4_strided_cn) {
24531     TEST_REQUIRES_X86_XOP;
24532     for (uint32_t n = 8; n <= 12; n += 4) {
24533       for (size_t k = 1; k <= 40; k += 9) {
24534         GemmMicrokernelTester()
24535           .mr(4)
24536           .nr(4)
24537           .kr(2)
24538           .sr(1)
24539           .m(4)
24540           .n(n)
24541           .k(k)
24542           .cn_stride(7)
24543           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24544       }
24545     }
24546   }
24547 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_div_4_strided_a)24548   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_div_4_strided_a) {
24549     TEST_REQUIRES_X86_XOP;
24550     for (uint32_t n = 8; n <= 12; n += 4) {
24551       for (size_t k = 1; k <= 40; k += 9) {
24552         GemmMicrokernelTester()
24553           .mr(4)
24554           .nr(4)
24555           .kr(2)
24556           .sr(1)
24557           .m(4)
24558           .n(n)
24559           .k(k)
24560           .a_stride(43)
24561           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24562       }
24563     }
24564   }
24565 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,n_div_4_subtile)24566   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, n_div_4_subtile) {
24567     TEST_REQUIRES_X86_XOP;
24568     for (uint32_t n = 8; n <= 12; n += 4) {
24569       for (size_t k = 1; k <= 40; k += 9) {
24570         for (uint32_t m = 1; m <= 4; m++) {
24571           GemmMicrokernelTester()
24572             .mr(4)
24573             .nr(4)
24574             .kr(2)
24575             .sr(1)
24576             .m(m)
24577             .n(n)
24578             .k(k)
24579             .iterations(1)
24580             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24581         }
24582       }
24583     }
24584   }
24585 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,strided_cm_subtile)24586   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, strided_cm_subtile) {
24587     TEST_REQUIRES_X86_XOP;
24588     for (size_t k = 1; k <= 40; k += 9) {
24589       for (uint32_t n = 1; n <= 4; n++) {
24590         for (uint32_t m = 1; m <= 4; m++) {
24591           GemmMicrokernelTester()
24592             .mr(4)
24593             .nr(4)
24594             .kr(2)
24595             .sr(1)
24596             .m(m)
24597             .n(n)
24598             .k(k)
24599             .cm_stride(7)
24600             .iterations(1)
24601             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24602         }
24603       }
24604     }
24605   }
24606 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,qmin)24607   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, qmin) {
24608     TEST_REQUIRES_X86_XOP;
24609     GemmMicrokernelTester()
24610       .mr(4)
24611       .nr(4)
24612       .kr(2)
24613       .sr(1)
24614       .m(4)
24615       .n(4)
24616       .k(8)
24617       .qmin(128)
24618       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24619   }
24620 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,qmax)24621   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, qmax) {
24622     TEST_REQUIRES_X86_XOP;
24623     GemmMicrokernelTester()
24624       .mr(4)
24625       .nr(4)
24626       .kr(2)
24627       .sr(1)
24628       .m(4)
24629       .n(4)
24630       .k(8)
24631       .qmax(128)
24632       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24633   }
24634 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128,strided_cm)24635   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__XOP_LD128, strided_cm) {
24636     TEST_REQUIRES_X86_XOP;
24637     GemmMicrokernelTester()
24638       .mr(4)
24639       .nr(4)
24640       .kr(2)
24641       .sr(1)
24642       .m(4)
24643       .n(4)
24644       .k(8)
24645       .cm_stride(7)
24646       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
24647   }
24648 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
24649 
24650 
24651 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_eq_8)24652   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_eq_8) {
24653     TEST_REQUIRES_X86_SSE2;
24654     GemmMicrokernelTester()
24655       .mr(1)
24656       .nr(4)
24657       .kr(2)
24658       .sr(4)
24659       .m(1)
24660       .n(4)
24661       .k(8)
24662       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24663   }
24664 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,strided_cn)24665   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, strided_cn) {
24666     TEST_REQUIRES_X86_SSE2;
24667     GemmMicrokernelTester()
24668       .mr(1)
24669       .nr(4)
24670       .kr(2)
24671       .sr(4)
24672       .m(1)
24673       .n(4)
24674       .k(8)
24675       .cn_stride(7)
24676       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24677   }
24678 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_eq_8_strided_a)24679   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_eq_8_strided_a) {
24680     TEST_REQUIRES_X86_SSE2;
24681     GemmMicrokernelTester()
24682       .mr(1)
24683       .nr(4)
24684       .kr(2)
24685       .sr(4)
24686       .m(1)
24687       .n(4)
24688       .k(8)
24689       .a_stride(11)
24690       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24691   }
24692 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_eq_8_subtile)24693   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_eq_8_subtile) {
24694     TEST_REQUIRES_X86_SSE2;
24695     for (uint32_t n = 1; n <= 4; n++) {
24696       for (uint32_t m = 1; m <= 1; m++) {
24697         GemmMicrokernelTester()
24698           .mr(1)
24699           .nr(4)
24700           .kr(2)
24701           .sr(4)
24702           .m(m)
24703           .n(n)
24704           .k(8)
24705           .iterations(1)
24706           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24707       }
24708     }
24709   }
24710 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_eq_8_subtile_m)24711   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_eq_8_subtile_m) {
24712     TEST_REQUIRES_X86_SSE2;
24713     for (uint32_t m = 1; m <= 1; m++) {
24714       GemmMicrokernelTester()
24715         .mr(1)
24716         .nr(4)
24717         .kr(2)
24718         .sr(4)
24719         .m(m)
24720         .n(4)
24721         .k(8)
24722         .iterations(1)
24723         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24724     }
24725   }
24726 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_eq_8_subtile_n)24727   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_eq_8_subtile_n) {
24728     TEST_REQUIRES_X86_SSE2;
24729     for (uint32_t n = 1; n <= 4; n++) {
24730       GemmMicrokernelTester()
24731         .mr(1)
24732         .nr(4)
24733         .kr(2)
24734         .sr(4)
24735         .m(1)
24736         .n(n)
24737         .k(8)
24738         .iterations(1)
24739         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24740     }
24741   }
24742 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_lt_8)24743   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_lt_8) {
24744     TEST_REQUIRES_X86_SSE2;
24745     for (size_t k = 1; k < 8; k++) {
24746       GemmMicrokernelTester()
24747         .mr(1)
24748         .nr(4)
24749         .kr(2)
24750         .sr(4)
24751         .m(1)
24752         .n(4)
24753         .k(k)
24754         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24755     }
24756   }
24757 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_lt_8_strided_a)24758   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_lt_8_strided_a) {
24759     TEST_REQUIRES_X86_SSE2;
24760     for (size_t k = 1; k < 8; k++) {
24761       GemmMicrokernelTester()
24762         .mr(1)
24763         .nr(4)
24764         .kr(2)
24765         .sr(4)
24766         .m(1)
24767         .n(4)
24768         .k(k)
24769         .a_stride(11)
24770         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24771     }
24772   }
24773 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_lt_8_subtile)24774   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_lt_8_subtile) {
24775     TEST_REQUIRES_X86_SSE2;
24776     for (size_t k = 1; k < 8; k++) {
24777       for (uint32_t n = 1; n <= 4; n++) {
24778         for (uint32_t m = 1; m <= 1; m++) {
24779           GemmMicrokernelTester()
24780             .mr(1)
24781             .nr(4)
24782             .kr(2)
24783             .sr(4)
24784             .m(m)
24785             .n(n)
24786             .k(k)
24787             .iterations(1)
24788             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24789         }
24790       }
24791     }
24792   }
24793 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_gt_8)24794   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_gt_8) {
24795     TEST_REQUIRES_X86_SSE2;
24796     for (size_t k = 9; k < 16; k++) {
24797       GemmMicrokernelTester()
24798         .mr(1)
24799         .nr(4)
24800         .kr(2)
24801         .sr(4)
24802         .m(1)
24803         .n(4)
24804         .k(k)
24805         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24806     }
24807   }
24808 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_gt_8_strided_a)24809   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_gt_8_strided_a) {
24810     TEST_REQUIRES_X86_SSE2;
24811     for (size_t k = 9; k < 16; k++) {
24812       GemmMicrokernelTester()
24813         .mr(1)
24814         .nr(4)
24815         .kr(2)
24816         .sr(4)
24817         .m(1)
24818         .n(4)
24819         .k(k)
24820         .a_stride(19)
24821         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24822     }
24823   }
24824 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_gt_8_subtile)24825   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_gt_8_subtile) {
24826     TEST_REQUIRES_X86_SSE2;
24827     for (size_t k = 9; k < 16; k++) {
24828       for (uint32_t n = 1; n <= 4; n++) {
24829         for (uint32_t m = 1; m <= 1; m++) {
24830           GemmMicrokernelTester()
24831             .mr(1)
24832             .nr(4)
24833             .kr(2)
24834             .sr(4)
24835             .m(m)
24836             .n(n)
24837             .k(k)
24838             .iterations(1)
24839             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24840         }
24841       }
24842     }
24843   }
24844 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_div_8)24845   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_div_8) {
24846     TEST_REQUIRES_X86_SSE2;
24847     for (size_t k = 16; k <= 80; k += 8) {
24848       GemmMicrokernelTester()
24849         .mr(1)
24850         .nr(4)
24851         .kr(2)
24852         .sr(4)
24853         .m(1)
24854         .n(4)
24855         .k(k)
24856         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24857     }
24858   }
24859 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_div_8_strided_a)24860   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_div_8_strided_a) {
24861     TEST_REQUIRES_X86_SSE2;
24862     for (size_t k = 16; k <= 80; k += 8) {
24863       GemmMicrokernelTester()
24864         .mr(1)
24865         .nr(4)
24866         .kr(2)
24867         .sr(4)
24868         .m(1)
24869         .n(4)
24870         .k(k)
24871         .a_stride(83)
24872         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24873     }
24874   }
24875 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,k_div_8_subtile)24876   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, k_div_8_subtile) {
24877     TEST_REQUIRES_X86_SSE2;
24878     for (size_t k = 16; k <= 80; k += 8) {
24879       for (uint32_t n = 1; n <= 4; n++) {
24880         for (uint32_t m = 1; m <= 1; m++) {
24881           GemmMicrokernelTester()
24882             .mr(1)
24883             .nr(4)
24884             .kr(2)
24885             .sr(4)
24886             .m(m)
24887             .n(n)
24888             .k(k)
24889             .iterations(1)
24890             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24891         }
24892       }
24893     }
24894   }
24895 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_gt_4)24896   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_gt_4) {
24897     TEST_REQUIRES_X86_SSE2;
24898     for (uint32_t n = 5; n < 8; n++) {
24899       for (size_t k = 1; k <= 40; k += 9) {
24900         GemmMicrokernelTester()
24901           .mr(1)
24902           .nr(4)
24903           .kr(2)
24904           .sr(4)
24905           .m(1)
24906           .n(n)
24907           .k(k)
24908           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24909       }
24910     }
24911   }
24912 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_gt_4_strided_cn)24913   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_gt_4_strided_cn) {
24914     TEST_REQUIRES_X86_SSE2;
24915     for (uint32_t n = 5; n < 8; n++) {
24916       for (size_t k = 1; k <= 40; k += 9) {
24917         GemmMicrokernelTester()
24918           .mr(1)
24919           .nr(4)
24920           .kr(2)
24921           .sr(4)
24922           .m(1)
24923           .n(n)
24924           .k(k)
24925           .cn_stride(7)
24926           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24927       }
24928     }
24929   }
24930 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_gt_4_strided_a)24931   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_gt_4_strided_a) {
24932     TEST_REQUIRES_X86_SSE2;
24933     for (uint32_t n = 5; n < 8; n++) {
24934       for (size_t k = 1; k <= 40; k += 9) {
24935         GemmMicrokernelTester()
24936           .mr(1)
24937           .nr(4)
24938           .kr(2)
24939           .sr(4)
24940           .m(1)
24941           .n(n)
24942           .k(k)
24943           .a_stride(43)
24944           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24945       }
24946     }
24947   }
24948 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_gt_4_subtile)24949   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_gt_4_subtile) {
24950     TEST_REQUIRES_X86_SSE2;
24951     for (uint32_t n = 5; n < 8; n++) {
24952       for (size_t k = 1; k <= 40; k += 9) {
24953         for (uint32_t m = 1; m <= 1; m++) {
24954           GemmMicrokernelTester()
24955             .mr(1)
24956             .nr(4)
24957             .kr(2)
24958             .sr(4)
24959             .m(m)
24960             .n(n)
24961             .k(k)
24962             .iterations(1)
24963             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24964         }
24965       }
24966     }
24967   }
24968 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_div_4)24969   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_div_4) {
24970     TEST_REQUIRES_X86_SSE2;
24971     for (uint32_t n = 8; n <= 12; n += 4) {
24972       for (size_t k = 1; k <= 40; k += 9) {
24973         GemmMicrokernelTester()
24974           .mr(1)
24975           .nr(4)
24976           .kr(2)
24977           .sr(4)
24978           .m(1)
24979           .n(n)
24980           .k(k)
24981           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
24982       }
24983     }
24984   }
24985 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_div_4_strided_cn)24986   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_div_4_strided_cn) {
24987     TEST_REQUIRES_X86_SSE2;
24988     for (uint32_t n = 8; n <= 12; n += 4) {
24989       for (size_t k = 1; k <= 40; k += 9) {
24990         GemmMicrokernelTester()
24991           .mr(1)
24992           .nr(4)
24993           .kr(2)
24994           .sr(4)
24995           .m(1)
24996           .n(n)
24997           .k(k)
24998           .cn_stride(7)
24999           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25000       }
25001     }
25002   }
25003 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_div_4_strided_a)25004   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_div_4_strided_a) {
25005     TEST_REQUIRES_X86_SSE2;
25006     for (uint32_t n = 8; n <= 12; n += 4) {
25007       for (size_t k = 1; k <= 40; k += 9) {
25008         GemmMicrokernelTester()
25009           .mr(1)
25010           .nr(4)
25011           .kr(2)
25012           .sr(4)
25013           .m(1)
25014           .n(n)
25015           .k(k)
25016           .a_stride(43)
25017           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25018       }
25019     }
25020   }
25021 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,n_div_4_subtile)25022   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, n_div_4_subtile) {
25023     TEST_REQUIRES_X86_SSE2;
25024     for (uint32_t n = 8; n <= 12; n += 4) {
25025       for (size_t k = 1; k <= 40; k += 9) {
25026         for (uint32_t m = 1; m <= 1; m++) {
25027           GemmMicrokernelTester()
25028             .mr(1)
25029             .nr(4)
25030             .kr(2)
25031             .sr(4)
25032             .m(m)
25033             .n(n)
25034             .k(k)
25035             .iterations(1)
25036             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25037         }
25038       }
25039     }
25040   }
25041 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,strided_cm_subtile)25042   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, strided_cm_subtile) {
25043     TEST_REQUIRES_X86_SSE2;
25044     for (size_t k = 1; k <= 40; k += 9) {
25045       for (uint32_t n = 1; n <= 4; n++) {
25046         for (uint32_t m = 1; m <= 1; m++) {
25047           GemmMicrokernelTester()
25048             .mr(1)
25049             .nr(4)
25050             .kr(2)
25051             .sr(4)
25052             .m(m)
25053             .n(n)
25054             .k(k)
25055             .cm_stride(7)
25056             .iterations(1)
25057             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25058         }
25059       }
25060     }
25061   }
25062 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,qmin)25063   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, qmin) {
25064     TEST_REQUIRES_X86_SSE2;
25065     GemmMicrokernelTester()
25066       .mr(1)
25067       .nr(4)
25068       .kr(2)
25069       .sr(4)
25070       .m(1)
25071       .n(4)
25072       .k(8)
25073       .qmin(128)
25074       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25075   }
25076 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,qmax)25077   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, qmax) {
25078     TEST_REQUIRES_X86_SSE2;
25079     GemmMicrokernelTester()
25080       .mr(1)
25081       .nr(4)
25082       .kr(2)
25083       .sr(4)
25084       .m(1)
25085       .n(4)
25086       .k(8)
25087       .qmax(128)
25088       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25089   }
25090 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64,strided_cm)25091   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE2_LD64, strided_cm) {
25092     TEST_REQUIRES_X86_SSE2;
25093     GemmMicrokernelTester()
25094       .mr(1)
25095       .nr(4)
25096       .kr(2)
25097       .sr(4)
25098       .m(1)
25099       .n(4)
25100       .k(8)
25101       .cm_stride(7)
25102       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25103   }
25104 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
25105 
25106 
25107 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_eq_8)25108   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_eq_8) {
25109     TEST_REQUIRES_X86_SSE41;
25110     GemmMicrokernelTester()
25111       .mr(1)
25112       .nr(4)
25113       .kr(2)
25114       .sr(4)
25115       .m(1)
25116       .n(4)
25117       .k(8)
25118       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25119   }
25120 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,strided_cn)25121   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, strided_cn) {
25122     TEST_REQUIRES_X86_SSE41;
25123     GemmMicrokernelTester()
25124       .mr(1)
25125       .nr(4)
25126       .kr(2)
25127       .sr(4)
25128       .m(1)
25129       .n(4)
25130       .k(8)
25131       .cn_stride(7)
25132       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25133   }
25134 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_eq_8_strided_a)25135   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_eq_8_strided_a) {
25136     TEST_REQUIRES_X86_SSE41;
25137     GemmMicrokernelTester()
25138       .mr(1)
25139       .nr(4)
25140       .kr(2)
25141       .sr(4)
25142       .m(1)
25143       .n(4)
25144       .k(8)
25145       .a_stride(11)
25146       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25147   }
25148 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_eq_8_subtile)25149   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_eq_8_subtile) {
25150     TEST_REQUIRES_X86_SSE41;
25151     for (uint32_t n = 1; n <= 4; n++) {
25152       for (uint32_t m = 1; m <= 1; m++) {
25153         GemmMicrokernelTester()
25154           .mr(1)
25155           .nr(4)
25156           .kr(2)
25157           .sr(4)
25158           .m(m)
25159           .n(n)
25160           .k(8)
25161           .iterations(1)
25162           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25163       }
25164     }
25165   }
25166 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_eq_8_subtile_m)25167   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_eq_8_subtile_m) {
25168     TEST_REQUIRES_X86_SSE41;
25169     for (uint32_t m = 1; m <= 1; m++) {
25170       GemmMicrokernelTester()
25171         .mr(1)
25172         .nr(4)
25173         .kr(2)
25174         .sr(4)
25175         .m(m)
25176         .n(4)
25177         .k(8)
25178         .iterations(1)
25179         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25180     }
25181   }
25182 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_eq_8_subtile_n)25183   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_eq_8_subtile_n) {
25184     TEST_REQUIRES_X86_SSE41;
25185     for (uint32_t n = 1; n <= 4; n++) {
25186       GemmMicrokernelTester()
25187         .mr(1)
25188         .nr(4)
25189         .kr(2)
25190         .sr(4)
25191         .m(1)
25192         .n(n)
25193         .k(8)
25194         .iterations(1)
25195         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25196     }
25197   }
25198 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_lt_8)25199   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_lt_8) {
25200     TEST_REQUIRES_X86_SSE41;
25201     for (size_t k = 1; k < 8; k++) {
25202       GemmMicrokernelTester()
25203         .mr(1)
25204         .nr(4)
25205         .kr(2)
25206         .sr(4)
25207         .m(1)
25208         .n(4)
25209         .k(k)
25210         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25211     }
25212   }
25213 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_lt_8_strided_a)25214   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_lt_8_strided_a) {
25215     TEST_REQUIRES_X86_SSE41;
25216     for (size_t k = 1; k < 8; k++) {
25217       GemmMicrokernelTester()
25218         .mr(1)
25219         .nr(4)
25220         .kr(2)
25221         .sr(4)
25222         .m(1)
25223         .n(4)
25224         .k(k)
25225         .a_stride(11)
25226         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25227     }
25228   }
25229 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_lt_8_subtile)25230   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_lt_8_subtile) {
25231     TEST_REQUIRES_X86_SSE41;
25232     for (size_t k = 1; k < 8; k++) {
25233       for (uint32_t n = 1; n <= 4; n++) {
25234         for (uint32_t m = 1; m <= 1; m++) {
25235           GemmMicrokernelTester()
25236             .mr(1)
25237             .nr(4)
25238             .kr(2)
25239             .sr(4)
25240             .m(m)
25241             .n(n)
25242             .k(k)
25243             .iterations(1)
25244             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25245         }
25246       }
25247     }
25248   }
25249 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_gt_8)25250   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_gt_8) {
25251     TEST_REQUIRES_X86_SSE41;
25252     for (size_t k = 9; k < 16; k++) {
25253       GemmMicrokernelTester()
25254         .mr(1)
25255         .nr(4)
25256         .kr(2)
25257         .sr(4)
25258         .m(1)
25259         .n(4)
25260         .k(k)
25261         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25262     }
25263   }
25264 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_gt_8_strided_a)25265   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_gt_8_strided_a) {
25266     TEST_REQUIRES_X86_SSE41;
25267     for (size_t k = 9; k < 16; k++) {
25268       GemmMicrokernelTester()
25269         .mr(1)
25270         .nr(4)
25271         .kr(2)
25272         .sr(4)
25273         .m(1)
25274         .n(4)
25275         .k(k)
25276         .a_stride(19)
25277         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25278     }
25279   }
25280 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_gt_8_subtile)25281   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_gt_8_subtile) {
25282     TEST_REQUIRES_X86_SSE41;
25283     for (size_t k = 9; k < 16; k++) {
25284       for (uint32_t n = 1; n <= 4; n++) {
25285         for (uint32_t m = 1; m <= 1; m++) {
25286           GemmMicrokernelTester()
25287             .mr(1)
25288             .nr(4)
25289             .kr(2)
25290             .sr(4)
25291             .m(m)
25292             .n(n)
25293             .k(k)
25294             .iterations(1)
25295             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25296         }
25297       }
25298     }
25299   }
25300 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_div_8)25301   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_div_8) {
25302     TEST_REQUIRES_X86_SSE41;
25303     for (size_t k = 16; k <= 80; k += 8) {
25304       GemmMicrokernelTester()
25305         .mr(1)
25306         .nr(4)
25307         .kr(2)
25308         .sr(4)
25309         .m(1)
25310         .n(4)
25311         .k(k)
25312         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25313     }
25314   }
25315 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_div_8_strided_a)25316   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_div_8_strided_a) {
25317     TEST_REQUIRES_X86_SSE41;
25318     for (size_t k = 16; k <= 80; k += 8) {
25319       GemmMicrokernelTester()
25320         .mr(1)
25321         .nr(4)
25322         .kr(2)
25323         .sr(4)
25324         .m(1)
25325         .n(4)
25326         .k(k)
25327         .a_stride(83)
25328         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25329     }
25330   }
25331 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,k_div_8_subtile)25332   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, k_div_8_subtile) {
25333     TEST_REQUIRES_X86_SSE41;
25334     for (size_t k = 16; k <= 80; k += 8) {
25335       for (uint32_t n = 1; n <= 4; n++) {
25336         for (uint32_t m = 1; m <= 1; m++) {
25337           GemmMicrokernelTester()
25338             .mr(1)
25339             .nr(4)
25340             .kr(2)
25341             .sr(4)
25342             .m(m)
25343             .n(n)
25344             .k(k)
25345             .iterations(1)
25346             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25347         }
25348       }
25349     }
25350   }
25351 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_gt_4)25352   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_gt_4) {
25353     TEST_REQUIRES_X86_SSE41;
25354     for (uint32_t n = 5; n < 8; n++) {
25355       for (size_t k = 1; k <= 40; k += 9) {
25356         GemmMicrokernelTester()
25357           .mr(1)
25358           .nr(4)
25359           .kr(2)
25360           .sr(4)
25361           .m(1)
25362           .n(n)
25363           .k(k)
25364           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25365       }
25366     }
25367   }
25368 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_gt_4_strided_cn)25369   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_gt_4_strided_cn) {
25370     TEST_REQUIRES_X86_SSE41;
25371     for (uint32_t n = 5; n < 8; n++) {
25372       for (size_t k = 1; k <= 40; k += 9) {
25373         GemmMicrokernelTester()
25374           .mr(1)
25375           .nr(4)
25376           .kr(2)
25377           .sr(4)
25378           .m(1)
25379           .n(n)
25380           .k(k)
25381           .cn_stride(7)
25382           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25383       }
25384     }
25385   }
25386 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_gt_4_strided_a)25387   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_gt_4_strided_a) {
25388     TEST_REQUIRES_X86_SSE41;
25389     for (uint32_t n = 5; n < 8; n++) {
25390       for (size_t k = 1; k <= 40; k += 9) {
25391         GemmMicrokernelTester()
25392           .mr(1)
25393           .nr(4)
25394           .kr(2)
25395           .sr(4)
25396           .m(1)
25397           .n(n)
25398           .k(k)
25399           .a_stride(43)
25400           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25401       }
25402     }
25403   }
25404 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_gt_4_subtile)25405   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_gt_4_subtile) {
25406     TEST_REQUIRES_X86_SSE41;
25407     for (uint32_t n = 5; n < 8; n++) {
25408       for (size_t k = 1; k <= 40; k += 9) {
25409         for (uint32_t m = 1; m <= 1; m++) {
25410           GemmMicrokernelTester()
25411             .mr(1)
25412             .nr(4)
25413             .kr(2)
25414             .sr(4)
25415             .m(m)
25416             .n(n)
25417             .k(k)
25418             .iterations(1)
25419             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25420         }
25421       }
25422     }
25423   }
25424 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_div_4)25425   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_div_4) {
25426     TEST_REQUIRES_X86_SSE41;
25427     for (uint32_t n = 8; n <= 12; n += 4) {
25428       for (size_t k = 1; k <= 40; k += 9) {
25429         GemmMicrokernelTester()
25430           .mr(1)
25431           .nr(4)
25432           .kr(2)
25433           .sr(4)
25434           .m(1)
25435           .n(n)
25436           .k(k)
25437           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25438       }
25439     }
25440   }
25441 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_div_4_strided_cn)25442   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_div_4_strided_cn) {
25443     TEST_REQUIRES_X86_SSE41;
25444     for (uint32_t n = 8; n <= 12; n += 4) {
25445       for (size_t k = 1; k <= 40; k += 9) {
25446         GemmMicrokernelTester()
25447           .mr(1)
25448           .nr(4)
25449           .kr(2)
25450           .sr(4)
25451           .m(1)
25452           .n(n)
25453           .k(k)
25454           .cn_stride(7)
25455           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25456       }
25457     }
25458   }
25459 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_div_4_strided_a)25460   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_div_4_strided_a) {
25461     TEST_REQUIRES_X86_SSE41;
25462     for (uint32_t n = 8; n <= 12; n += 4) {
25463       for (size_t k = 1; k <= 40; k += 9) {
25464         GemmMicrokernelTester()
25465           .mr(1)
25466           .nr(4)
25467           .kr(2)
25468           .sr(4)
25469           .m(1)
25470           .n(n)
25471           .k(k)
25472           .a_stride(43)
25473           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25474       }
25475     }
25476   }
25477 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,n_div_4_subtile)25478   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, n_div_4_subtile) {
25479     TEST_REQUIRES_X86_SSE41;
25480     for (uint32_t n = 8; n <= 12; n += 4) {
25481       for (size_t k = 1; k <= 40; k += 9) {
25482         for (uint32_t m = 1; m <= 1; m++) {
25483           GemmMicrokernelTester()
25484             .mr(1)
25485             .nr(4)
25486             .kr(2)
25487             .sr(4)
25488             .m(m)
25489             .n(n)
25490             .k(k)
25491             .iterations(1)
25492             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25493         }
25494       }
25495     }
25496   }
25497 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,strided_cm_subtile)25498   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, strided_cm_subtile) {
25499     TEST_REQUIRES_X86_SSE41;
25500     for (size_t k = 1; k <= 40; k += 9) {
25501       for (uint32_t n = 1; n <= 4; n++) {
25502         for (uint32_t m = 1; m <= 1; m++) {
25503           GemmMicrokernelTester()
25504             .mr(1)
25505             .nr(4)
25506             .kr(2)
25507             .sr(4)
25508             .m(m)
25509             .n(n)
25510             .k(k)
25511             .cm_stride(7)
25512             .iterations(1)
25513             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25514         }
25515       }
25516     }
25517   }
25518 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,qmin)25519   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, qmin) {
25520     TEST_REQUIRES_X86_SSE41;
25521     GemmMicrokernelTester()
25522       .mr(1)
25523       .nr(4)
25524       .kr(2)
25525       .sr(4)
25526       .m(1)
25527       .n(4)
25528       .k(8)
25529       .qmin(128)
25530       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25531   }
25532 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,qmax)25533   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, qmax) {
25534     TEST_REQUIRES_X86_SSE41;
25535     GemmMicrokernelTester()
25536       .mr(1)
25537       .nr(4)
25538       .kr(2)
25539       .sr(4)
25540       .m(1)
25541       .n(4)
25542       .k(8)
25543       .qmax(128)
25544       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25545   }
25546 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64,strided_cm)25547   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__SSE41_LD64, strided_cm) {
25548     TEST_REQUIRES_X86_SSE41;
25549     GemmMicrokernelTester()
25550       .mr(1)
25551       .nr(4)
25552       .kr(2)
25553       .sr(4)
25554       .m(1)
25555       .n(4)
25556       .k(8)
25557       .cm_stride(7)
25558       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
25559   }
25560 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
25561 
25562 
25563 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_eq_8)25564   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_eq_8) {
25565     TEST_REQUIRES_X86_SSE2;
25566     GemmMicrokernelTester()
25567       .mr(2)
25568       .nr(4)
25569       .kr(2)
25570       .sr(4)
25571       .m(2)
25572       .n(4)
25573       .k(8)
25574       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25575   }
25576 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,strided_cn)25577   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, strided_cn) {
25578     TEST_REQUIRES_X86_SSE2;
25579     GemmMicrokernelTester()
25580       .mr(2)
25581       .nr(4)
25582       .kr(2)
25583       .sr(4)
25584       .m(2)
25585       .n(4)
25586       .k(8)
25587       .cn_stride(7)
25588       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25589   }
25590 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_eq_8_strided_a)25591   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_eq_8_strided_a) {
25592     TEST_REQUIRES_X86_SSE2;
25593     GemmMicrokernelTester()
25594       .mr(2)
25595       .nr(4)
25596       .kr(2)
25597       .sr(4)
25598       .m(2)
25599       .n(4)
25600       .k(8)
25601       .a_stride(11)
25602       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25603   }
25604 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_eq_8_subtile)25605   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_eq_8_subtile) {
25606     TEST_REQUIRES_X86_SSE2;
25607     for (uint32_t n = 1; n <= 4; n++) {
25608       for (uint32_t m = 1; m <= 2; m++) {
25609         GemmMicrokernelTester()
25610           .mr(2)
25611           .nr(4)
25612           .kr(2)
25613           .sr(4)
25614           .m(m)
25615           .n(n)
25616           .k(8)
25617           .iterations(1)
25618           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25619       }
25620     }
25621   }
25622 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_eq_8_subtile_m)25623   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_eq_8_subtile_m) {
25624     TEST_REQUIRES_X86_SSE2;
25625     for (uint32_t m = 1; m <= 2; m++) {
25626       GemmMicrokernelTester()
25627         .mr(2)
25628         .nr(4)
25629         .kr(2)
25630         .sr(4)
25631         .m(m)
25632         .n(4)
25633         .k(8)
25634         .iterations(1)
25635         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25636     }
25637   }
25638 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_eq_8_subtile_n)25639   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_eq_8_subtile_n) {
25640     TEST_REQUIRES_X86_SSE2;
25641     for (uint32_t n = 1; n <= 4; n++) {
25642       GemmMicrokernelTester()
25643         .mr(2)
25644         .nr(4)
25645         .kr(2)
25646         .sr(4)
25647         .m(2)
25648         .n(n)
25649         .k(8)
25650         .iterations(1)
25651         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25652     }
25653   }
25654 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_lt_8)25655   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_lt_8) {
25656     TEST_REQUIRES_X86_SSE2;
25657     for (size_t k = 1; k < 8; k++) {
25658       GemmMicrokernelTester()
25659         .mr(2)
25660         .nr(4)
25661         .kr(2)
25662         .sr(4)
25663         .m(2)
25664         .n(4)
25665         .k(k)
25666         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25667     }
25668   }
25669 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_lt_8_strided_a)25670   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_lt_8_strided_a) {
25671     TEST_REQUIRES_X86_SSE2;
25672     for (size_t k = 1; k < 8; k++) {
25673       GemmMicrokernelTester()
25674         .mr(2)
25675         .nr(4)
25676         .kr(2)
25677         .sr(4)
25678         .m(2)
25679         .n(4)
25680         .k(k)
25681         .a_stride(11)
25682         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25683     }
25684   }
25685 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_lt_8_subtile)25686   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_lt_8_subtile) {
25687     TEST_REQUIRES_X86_SSE2;
25688     for (size_t k = 1; k < 8; k++) {
25689       for (uint32_t n = 1; n <= 4; n++) {
25690         for (uint32_t m = 1; m <= 2; m++) {
25691           GemmMicrokernelTester()
25692             .mr(2)
25693             .nr(4)
25694             .kr(2)
25695             .sr(4)
25696             .m(m)
25697             .n(n)
25698             .k(k)
25699             .iterations(1)
25700             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25701         }
25702       }
25703     }
25704   }
25705 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_gt_8)25706   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_gt_8) {
25707     TEST_REQUIRES_X86_SSE2;
25708     for (size_t k = 9; k < 16; k++) {
25709       GemmMicrokernelTester()
25710         .mr(2)
25711         .nr(4)
25712         .kr(2)
25713         .sr(4)
25714         .m(2)
25715         .n(4)
25716         .k(k)
25717         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25718     }
25719   }
25720 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_gt_8_strided_a)25721   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_gt_8_strided_a) {
25722     TEST_REQUIRES_X86_SSE2;
25723     for (size_t k = 9; k < 16; k++) {
25724       GemmMicrokernelTester()
25725         .mr(2)
25726         .nr(4)
25727         .kr(2)
25728         .sr(4)
25729         .m(2)
25730         .n(4)
25731         .k(k)
25732         .a_stride(19)
25733         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25734     }
25735   }
25736 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_gt_8_subtile)25737   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_gt_8_subtile) {
25738     TEST_REQUIRES_X86_SSE2;
25739     for (size_t k = 9; k < 16; k++) {
25740       for (uint32_t n = 1; n <= 4; n++) {
25741         for (uint32_t m = 1; m <= 2; m++) {
25742           GemmMicrokernelTester()
25743             .mr(2)
25744             .nr(4)
25745             .kr(2)
25746             .sr(4)
25747             .m(m)
25748             .n(n)
25749             .k(k)
25750             .iterations(1)
25751             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25752         }
25753       }
25754     }
25755   }
25756 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_div_8)25757   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_div_8) {
25758     TEST_REQUIRES_X86_SSE2;
25759     for (size_t k = 16; k <= 80; k += 8) {
25760       GemmMicrokernelTester()
25761         .mr(2)
25762         .nr(4)
25763         .kr(2)
25764         .sr(4)
25765         .m(2)
25766         .n(4)
25767         .k(k)
25768         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25769     }
25770   }
25771 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_div_8_strided_a)25772   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_div_8_strided_a) {
25773     TEST_REQUIRES_X86_SSE2;
25774     for (size_t k = 16; k <= 80; k += 8) {
25775       GemmMicrokernelTester()
25776         .mr(2)
25777         .nr(4)
25778         .kr(2)
25779         .sr(4)
25780         .m(2)
25781         .n(4)
25782         .k(k)
25783         .a_stride(83)
25784         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25785     }
25786   }
25787 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,k_div_8_subtile)25788   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, k_div_8_subtile) {
25789     TEST_REQUIRES_X86_SSE2;
25790     for (size_t k = 16; k <= 80; k += 8) {
25791       for (uint32_t n = 1; n <= 4; n++) {
25792         for (uint32_t m = 1; m <= 2; m++) {
25793           GemmMicrokernelTester()
25794             .mr(2)
25795             .nr(4)
25796             .kr(2)
25797             .sr(4)
25798             .m(m)
25799             .n(n)
25800             .k(k)
25801             .iterations(1)
25802             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25803         }
25804       }
25805     }
25806   }
25807 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_gt_4)25808   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_gt_4) {
25809     TEST_REQUIRES_X86_SSE2;
25810     for (uint32_t n = 5; n < 8; n++) {
25811       for (size_t k = 1; k <= 40; k += 9) {
25812         GemmMicrokernelTester()
25813           .mr(2)
25814           .nr(4)
25815           .kr(2)
25816           .sr(4)
25817           .m(2)
25818           .n(n)
25819           .k(k)
25820           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25821       }
25822     }
25823   }
25824 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_gt_4_strided_cn)25825   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_gt_4_strided_cn) {
25826     TEST_REQUIRES_X86_SSE2;
25827     for (uint32_t n = 5; n < 8; n++) {
25828       for (size_t k = 1; k <= 40; k += 9) {
25829         GemmMicrokernelTester()
25830           .mr(2)
25831           .nr(4)
25832           .kr(2)
25833           .sr(4)
25834           .m(2)
25835           .n(n)
25836           .k(k)
25837           .cn_stride(7)
25838           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25839       }
25840     }
25841   }
25842 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_gt_4_strided_a)25843   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_gt_4_strided_a) {
25844     TEST_REQUIRES_X86_SSE2;
25845     for (uint32_t n = 5; n < 8; n++) {
25846       for (size_t k = 1; k <= 40; k += 9) {
25847         GemmMicrokernelTester()
25848           .mr(2)
25849           .nr(4)
25850           .kr(2)
25851           .sr(4)
25852           .m(2)
25853           .n(n)
25854           .k(k)
25855           .a_stride(43)
25856           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25857       }
25858     }
25859   }
25860 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_gt_4_subtile)25861   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_gt_4_subtile) {
25862     TEST_REQUIRES_X86_SSE2;
25863     for (uint32_t n = 5; n < 8; n++) {
25864       for (size_t k = 1; k <= 40; k += 9) {
25865         for (uint32_t m = 1; m <= 2; m++) {
25866           GemmMicrokernelTester()
25867             .mr(2)
25868             .nr(4)
25869             .kr(2)
25870             .sr(4)
25871             .m(m)
25872             .n(n)
25873             .k(k)
25874             .iterations(1)
25875             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25876         }
25877       }
25878     }
25879   }
25880 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_div_4)25881   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_div_4) {
25882     TEST_REQUIRES_X86_SSE2;
25883     for (uint32_t n = 8; n <= 12; n += 4) {
25884       for (size_t k = 1; k <= 40; k += 9) {
25885         GemmMicrokernelTester()
25886           .mr(2)
25887           .nr(4)
25888           .kr(2)
25889           .sr(4)
25890           .m(2)
25891           .n(n)
25892           .k(k)
25893           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25894       }
25895     }
25896   }
25897 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_div_4_strided_cn)25898   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_div_4_strided_cn) {
25899     TEST_REQUIRES_X86_SSE2;
25900     for (uint32_t n = 8; n <= 12; n += 4) {
25901       for (size_t k = 1; k <= 40; k += 9) {
25902         GemmMicrokernelTester()
25903           .mr(2)
25904           .nr(4)
25905           .kr(2)
25906           .sr(4)
25907           .m(2)
25908           .n(n)
25909           .k(k)
25910           .cn_stride(7)
25911           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25912       }
25913     }
25914   }
25915 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_div_4_strided_a)25916   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_div_4_strided_a) {
25917     TEST_REQUIRES_X86_SSE2;
25918     for (uint32_t n = 8; n <= 12; n += 4) {
25919       for (size_t k = 1; k <= 40; k += 9) {
25920         GemmMicrokernelTester()
25921           .mr(2)
25922           .nr(4)
25923           .kr(2)
25924           .sr(4)
25925           .m(2)
25926           .n(n)
25927           .k(k)
25928           .a_stride(43)
25929           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25930       }
25931     }
25932   }
25933 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,n_div_4_subtile)25934   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, n_div_4_subtile) {
25935     TEST_REQUIRES_X86_SSE2;
25936     for (uint32_t n = 8; n <= 12; n += 4) {
25937       for (size_t k = 1; k <= 40; k += 9) {
25938         for (uint32_t m = 1; m <= 2; m++) {
25939           GemmMicrokernelTester()
25940             .mr(2)
25941             .nr(4)
25942             .kr(2)
25943             .sr(4)
25944             .m(m)
25945             .n(n)
25946             .k(k)
25947             .iterations(1)
25948             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25949         }
25950       }
25951     }
25952   }
25953 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,strided_cm_subtile)25954   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, strided_cm_subtile) {
25955     TEST_REQUIRES_X86_SSE2;
25956     for (size_t k = 1; k <= 40; k += 9) {
25957       for (uint32_t n = 1; n <= 4; n++) {
25958         for (uint32_t m = 1; m <= 2; m++) {
25959           GemmMicrokernelTester()
25960             .mr(2)
25961             .nr(4)
25962             .kr(2)
25963             .sr(4)
25964             .m(m)
25965             .n(n)
25966             .k(k)
25967             .cm_stride(7)
25968             .iterations(1)
25969             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25970         }
25971       }
25972     }
25973   }
25974 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,qmin)25975   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, qmin) {
25976     TEST_REQUIRES_X86_SSE2;
25977     GemmMicrokernelTester()
25978       .mr(2)
25979       .nr(4)
25980       .kr(2)
25981       .sr(4)
25982       .m(2)
25983       .n(4)
25984       .k(8)
25985       .qmin(128)
25986       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
25987   }
25988 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,qmax)25989   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, qmax) {
25990     TEST_REQUIRES_X86_SSE2;
25991     GemmMicrokernelTester()
25992       .mr(2)
25993       .nr(4)
25994       .kr(2)
25995       .sr(4)
25996       .m(2)
25997       .n(4)
25998       .k(8)
25999       .qmax(128)
26000       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
26001   }
26002 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64,strided_cm)26003   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD64, strided_cm) {
26004     TEST_REQUIRES_X86_SSE2;
26005     GemmMicrokernelTester()
26006       .mr(2)
26007       .nr(4)
26008       .kr(2)
26009       .sr(4)
26010       .m(2)
26011       .n(4)
26012       .k(8)
26013       .cm_stride(7)
26014       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
26015   }
26016 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
26017 
26018 
26019 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_eq_8)26020   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_eq_8) {
26021     TEST_REQUIRES_X86_SSE41;
26022     GemmMicrokernelTester()
26023       .mr(4)
26024       .nr(4)
26025       .kr(2)
26026       .sr(4)
26027       .m(4)
26028       .n(4)
26029       .k(8)
26030       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26031   }
26032 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,strided_cn)26033   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, strided_cn) {
26034     TEST_REQUIRES_X86_SSE41;
26035     GemmMicrokernelTester()
26036       .mr(4)
26037       .nr(4)
26038       .kr(2)
26039       .sr(4)
26040       .m(4)
26041       .n(4)
26042       .k(8)
26043       .cn_stride(7)
26044       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26045   }
26046 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_eq_8_strided_a)26047   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_eq_8_strided_a) {
26048     TEST_REQUIRES_X86_SSE41;
26049     GemmMicrokernelTester()
26050       .mr(4)
26051       .nr(4)
26052       .kr(2)
26053       .sr(4)
26054       .m(4)
26055       .n(4)
26056       .k(8)
26057       .a_stride(11)
26058       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26059   }
26060 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_eq_8_subtile)26061   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_eq_8_subtile) {
26062     TEST_REQUIRES_X86_SSE41;
26063     for (uint32_t n = 1; n <= 4; n++) {
26064       for (uint32_t m = 1; m <= 4; m++) {
26065         GemmMicrokernelTester()
26066           .mr(4)
26067           .nr(4)
26068           .kr(2)
26069           .sr(4)
26070           .m(m)
26071           .n(n)
26072           .k(8)
26073           .iterations(1)
26074           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26075       }
26076     }
26077   }
26078 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_eq_8_subtile_m)26079   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_eq_8_subtile_m) {
26080     TEST_REQUIRES_X86_SSE41;
26081     for (uint32_t m = 1; m <= 4; m++) {
26082       GemmMicrokernelTester()
26083         .mr(4)
26084         .nr(4)
26085         .kr(2)
26086         .sr(4)
26087         .m(m)
26088         .n(4)
26089         .k(8)
26090         .iterations(1)
26091         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26092     }
26093   }
26094 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_eq_8_subtile_n)26095   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_eq_8_subtile_n) {
26096     TEST_REQUIRES_X86_SSE41;
26097     for (uint32_t n = 1; n <= 4; n++) {
26098       GemmMicrokernelTester()
26099         .mr(4)
26100         .nr(4)
26101         .kr(2)
26102         .sr(4)
26103         .m(4)
26104         .n(n)
26105         .k(8)
26106         .iterations(1)
26107         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26108     }
26109   }
26110 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_lt_8)26111   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_lt_8) {
26112     TEST_REQUIRES_X86_SSE41;
26113     for (size_t k = 1; k < 8; k++) {
26114       GemmMicrokernelTester()
26115         .mr(4)
26116         .nr(4)
26117         .kr(2)
26118         .sr(4)
26119         .m(4)
26120         .n(4)
26121         .k(k)
26122         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26123     }
26124   }
26125 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_lt_8_strided_a)26126   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_lt_8_strided_a) {
26127     TEST_REQUIRES_X86_SSE41;
26128     for (size_t k = 1; k < 8; k++) {
26129       GemmMicrokernelTester()
26130         .mr(4)
26131         .nr(4)
26132         .kr(2)
26133         .sr(4)
26134         .m(4)
26135         .n(4)
26136         .k(k)
26137         .a_stride(11)
26138         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26139     }
26140   }
26141 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_lt_8_subtile)26142   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_lt_8_subtile) {
26143     TEST_REQUIRES_X86_SSE41;
26144     for (size_t k = 1; k < 8; k++) {
26145       for (uint32_t n = 1; n <= 4; n++) {
26146         for (uint32_t m = 1; m <= 4; m++) {
26147           GemmMicrokernelTester()
26148             .mr(4)
26149             .nr(4)
26150             .kr(2)
26151             .sr(4)
26152             .m(m)
26153             .n(n)
26154             .k(k)
26155             .iterations(1)
26156             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26157         }
26158       }
26159     }
26160   }
26161 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_gt_8)26162   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_gt_8) {
26163     TEST_REQUIRES_X86_SSE41;
26164     for (size_t k = 9; k < 16; k++) {
26165       GemmMicrokernelTester()
26166         .mr(4)
26167         .nr(4)
26168         .kr(2)
26169         .sr(4)
26170         .m(4)
26171         .n(4)
26172         .k(k)
26173         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26174     }
26175   }
26176 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_gt_8_strided_a)26177   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_gt_8_strided_a) {
26178     TEST_REQUIRES_X86_SSE41;
26179     for (size_t k = 9; k < 16; k++) {
26180       GemmMicrokernelTester()
26181         .mr(4)
26182         .nr(4)
26183         .kr(2)
26184         .sr(4)
26185         .m(4)
26186         .n(4)
26187         .k(k)
26188         .a_stride(19)
26189         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26190     }
26191   }
26192 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_gt_8_subtile)26193   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_gt_8_subtile) {
26194     TEST_REQUIRES_X86_SSE41;
26195     for (size_t k = 9; k < 16; k++) {
26196       for (uint32_t n = 1; n <= 4; n++) {
26197         for (uint32_t m = 1; m <= 4; m++) {
26198           GemmMicrokernelTester()
26199             .mr(4)
26200             .nr(4)
26201             .kr(2)
26202             .sr(4)
26203             .m(m)
26204             .n(n)
26205             .k(k)
26206             .iterations(1)
26207             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26208         }
26209       }
26210     }
26211   }
26212 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_div_8)26213   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_div_8) {
26214     TEST_REQUIRES_X86_SSE41;
26215     for (size_t k = 16; k <= 80; k += 8) {
26216       GemmMicrokernelTester()
26217         .mr(4)
26218         .nr(4)
26219         .kr(2)
26220         .sr(4)
26221         .m(4)
26222         .n(4)
26223         .k(k)
26224         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26225     }
26226   }
26227 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_div_8_strided_a)26228   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_div_8_strided_a) {
26229     TEST_REQUIRES_X86_SSE41;
26230     for (size_t k = 16; k <= 80; k += 8) {
26231       GemmMicrokernelTester()
26232         .mr(4)
26233         .nr(4)
26234         .kr(2)
26235         .sr(4)
26236         .m(4)
26237         .n(4)
26238         .k(k)
26239         .a_stride(83)
26240         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26241     }
26242   }
26243 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,k_div_8_subtile)26244   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, k_div_8_subtile) {
26245     TEST_REQUIRES_X86_SSE41;
26246     for (size_t k = 16; k <= 80; k += 8) {
26247       for (uint32_t n = 1; n <= 4; n++) {
26248         for (uint32_t m = 1; m <= 4; m++) {
26249           GemmMicrokernelTester()
26250             .mr(4)
26251             .nr(4)
26252             .kr(2)
26253             .sr(4)
26254             .m(m)
26255             .n(n)
26256             .k(k)
26257             .iterations(1)
26258             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26259         }
26260       }
26261     }
26262   }
26263 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_gt_4)26264   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_gt_4) {
26265     TEST_REQUIRES_X86_SSE41;
26266     for (uint32_t n = 5; n < 8; n++) {
26267       for (size_t k = 1; k <= 40; k += 9) {
26268         GemmMicrokernelTester()
26269           .mr(4)
26270           .nr(4)
26271           .kr(2)
26272           .sr(4)
26273           .m(4)
26274           .n(n)
26275           .k(k)
26276           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26277       }
26278     }
26279   }
26280 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_gt_4_strided_cn)26281   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_gt_4_strided_cn) {
26282     TEST_REQUIRES_X86_SSE41;
26283     for (uint32_t n = 5; n < 8; n++) {
26284       for (size_t k = 1; k <= 40; k += 9) {
26285         GemmMicrokernelTester()
26286           .mr(4)
26287           .nr(4)
26288           .kr(2)
26289           .sr(4)
26290           .m(4)
26291           .n(n)
26292           .k(k)
26293           .cn_stride(7)
26294           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26295       }
26296     }
26297   }
26298 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_gt_4_strided_a)26299   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_gt_4_strided_a) {
26300     TEST_REQUIRES_X86_SSE41;
26301     for (uint32_t n = 5; n < 8; n++) {
26302       for (size_t k = 1; k <= 40; k += 9) {
26303         GemmMicrokernelTester()
26304           .mr(4)
26305           .nr(4)
26306           .kr(2)
26307           .sr(4)
26308           .m(4)
26309           .n(n)
26310           .k(k)
26311           .a_stride(43)
26312           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26313       }
26314     }
26315   }
26316 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_gt_4_subtile)26317   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_gt_4_subtile) {
26318     TEST_REQUIRES_X86_SSE41;
26319     for (uint32_t n = 5; n < 8; n++) {
26320       for (size_t k = 1; k <= 40; k += 9) {
26321         for (uint32_t m = 1; m <= 4; m++) {
26322           GemmMicrokernelTester()
26323             .mr(4)
26324             .nr(4)
26325             .kr(2)
26326             .sr(4)
26327             .m(m)
26328             .n(n)
26329             .k(k)
26330             .iterations(1)
26331             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26332         }
26333       }
26334     }
26335   }
26336 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_div_4)26337   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_div_4) {
26338     TEST_REQUIRES_X86_SSE41;
26339     for (uint32_t n = 8; n <= 12; n += 4) {
26340       for (size_t k = 1; k <= 40; k += 9) {
26341         GemmMicrokernelTester()
26342           .mr(4)
26343           .nr(4)
26344           .kr(2)
26345           .sr(4)
26346           .m(4)
26347           .n(n)
26348           .k(k)
26349           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26350       }
26351     }
26352   }
26353 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_div_4_strided_cn)26354   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_div_4_strided_cn) {
26355     TEST_REQUIRES_X86_SSE41;
26356     for (uint32_t n = 8; n <= 12; n += 4) {
26357       for (size_t k = 1; k <= 40; k += 9) {
26358         GemmMicrokernelTester()
26359           .mr(4)
26360           .nr(4)
26361           .kr(2)
26362           .sr(4)
26363           .m(4)
26364           .n(n)
26365           .k(k)
26366           .cn_stride(7)
26367           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26368       }
26369     }
26370   }
26371 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_div_4_strided_a)26372   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_div_4_strided_a) {
26373     TEST_REQUIRES_X86_SSE41;
26374     for (uint32_t n = 8; n <= 12; n += 4) {
26375       for (size_t k = 1; k <= 40; k += 9) {
26376         GemmMicrokernelTester()
26377           .mr(4)
26378           .nr(4)
26379           .kr(2)
26380           .sr(4)
26381           .m(4)
26382           .n(n)
26383           .k(k)
26384           .a_stride(43)
26385           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26386       }
26387     }
26388   }
26389 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,n_div_4_subtile)26390   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, n_div_4_subtile) {
26391     TEST_REQUIRES_X86_SSE41;
26392     for (uint32_t n = 8; n <= 12; n += 4) {
26393       for (size_t k = 1; k <= 40; k += 9) {
26394         for (uint32_t m = 1; m <= 4; m++) {
26395           GemmMicrokernelTester()
26396             .mr(4)
26397             .nr(4)
26398             .kr(2)
26399             .sr(4)
26400             .m(m)
26401             .n(n)
26402             .k(k)
26403             .iterations(1)
26404             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26405         }
26406       }
26407     }
26408   }
26409 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,strided_cm_subtile)26410   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, strided_cm_subtile) {
26411     TEST_REQUIRES_X86_SSE41;
26412     for (size_t k = 1; k <= 40; k += 9) {
26413       for (uint32_t n = 1; n <= 4; n++) {
26414         for (uint32_t m = 1; m <= 4; m++) {
26415           GemmMicrokernelTester()
26416             .mr(4)
26417             .nr(4)
26418             .kr(2)
26419             .sr(4)
26420             .m(m)
26421             .n(n)
26422             .k(k)
26423             .cm_stride(7)
26424             .iterations(1)
26425             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26426         }
26427       }
26428     }
26429   }
26430 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,qmin)26431   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, qmin) {
26432     TEST_REQUIRES_X86_SSE41;
26433     GemmMicrokernelTester()
26434       .mr(4)
26435       .nr(4)
26436       .kr(2)
26437       .sr(4)
26438       .m(4)
26439       .n(4)
26440       .k(8)
26441       .qmin(128)
26442       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26443   }
26444 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,qmax)26445   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, qmax) {
26446     TEST_REQUIRES_X86_SSE41;
26447     GemmMicrokernelTester()
26448       .mr(4)
26449       .nr(4)
26450       .kr(2)
26451       .sr(4)
26452       .m(4)
26453       .n(4)
26454       .k(8)
26455       .qmax(128)
26456       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26457   }
26458 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64,strided_cm)26459   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD64, strided_cm) {
26460     TEST_REQUIRES_X86_SSE41;
26461     GemmMicrokernelTester()
26462       .mr(4)
26463       .nr(4)
26464       .kr(2)
26465       .sr(4)
26466       .m(4)
26467       .n(4)
26468       .k(8)
26469       .cm_stride(7)
26470       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26471   }
26472 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
26473 
26474 
26475 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_eq_8)26476   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_eq_8) {
26477     TEST_REQUIRES_X86_AVX;
26478     GemmMicrokernelTester()
26479       .mr(3)
26480       .nr(4)
26481       .kr(2)
26482       .sr(4)
26483       .m(3)
26484       .n(4)
26485       .k(8)
26486       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26487   }
26488 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,strided_cn)26489   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, strided_cn) {
26490     TEST_REQUIRES_X86_AVX;
26491     GemmMicrokernelTester()
26492       .mr(3)
26493       .nr(4)
26494       .kr(2)
26495       .sr(4)
26496       .m(3)
26497       .n(4)
26498       .k(8)
26499       .cn_stride(7)
26500       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26501   }
26502 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_eq_8_strided_a)26503   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_eq_8_strided_a) {
26504     TEST_REQUIRES_X86_AVX;
26505     GemmMicrokernelTester()
26506       .mr(3)
26507       .nr(4)
26508       .kr(2)
26509       .sr(4)
26510       .m(3)
26511       .n(4)
26512       .k(8)
26513       .a_stride(11)
26514       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26515   }
26516 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_eq_8_subtile)26517   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_eq_8_subtile) {
26518     TEST_REQUIRES_X86_AVX;
26519     for (uint32_t n = 1; n <= 4; n++) {
26520       for (uint32_t m = 1; m <= 3; m++) {
26521         GemmMicrokernelTester()
26522           .mr(3)
26523           .nr(4)
26524           .kr(2)
26525           .sr(4)
26526           .m(m)
26527           .n(n)
26528           .k(8)
26529           .iterations(1)
26530           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26531       }
26532     }
26533   }
26534 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_eq_8_subtile_m)26535   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_eq_8_subtile_m) {
26536     TEST_REQUIRES_X86_AVX;
26537     for (uint32_t m = 1; m <= 3; m++) {
26538       GemmMicrokernelTester()
26539         .mr(3)
26540         .nr(4)
26541         .kr(2)
26542         .sr(4)
26543         .m(m)
26544         .n(4)
26545         .k(8)
26546         .iterations(1)
26547         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26548     }
26549   }
26550 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_eq_8_subtile_n)26551   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_eq_8_subtile_n) {
26552     TEST_REQUIRES_X86_AVX;
26553     for (uint32_t n = 1; n <= 4; n++) {
26554       GemmMicrokernelTester()
26555         .mr(3)
26556         .nr(4)
26557         .kr(2)
26558         .sr(4)
26559         .m(3)
26560         .n(n)
26561         .k(8)
26562         .iterations(1)
26563         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26564     }
26565   }
26566 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_lt_8)26567   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_lt_8) {
26568     TEST_REQUIRES_X86_AVX;
26569     for (size_t k = 1; k < 8; k++) {
26570       GemmMicrokernelTester()
26571         .mr(3)
26572         .nr(4)
26573         .kr(2)
26574         .sr(4)
26575         .m(3)
26576         .n(4)
26577         .k(k)
26578         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26579     }
26580   }
26581 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_lt_8_strided_a)26582   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_lt_8_strided_a) {
26583     TEST_REQUIRES_X86_AVX;
26584     for (size_t k = 1; k < 8; k++) {
26585       GemmMicrokernelTester()
26586         .mr(3)
26587         .nr(4)
26588         .kr(2)
26589         .sr(4)
26590         .m(3)
26591         .n(4)
26592         .k(k)
26593         .a_stride(11)
26594         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26595     }
26596   }
26597 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_lt_8_subtile)26598   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_lt_8_subtile) {
26599     TEST_REQUIRES_X86_AVX;
26600     for (size_t k = 1; k < 8; k++) {
26601       for (uint32_t n = 1; n <= 4; n++) {
26602         for (uint32_t m = 1; m <= 3; m++) {
26603           GemmMicrokernelTester()
26604             .mr(3)
26605             .nr(4)
26606             .kr(2)
26607             .sr(4)
26608             .m(m)
26609             .n(n)
26610             .k(k)
26611             .iterations(1)
26612             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26613         }
26614       }
26615     }
26616   }
26617 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_gt_8)26618   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_gt_8) {
26619     TEST_REQUIRES_X86_AVX;
26620     for (size_t k = 9; k < 16; k++) {
26621       GemmMicrokernelTester()
26622         .mr(3)
26623         .nr(4)
26624         .kr(2)
26625         .sr(4)
26626         .m(3)
26627         .n(4)
26628         .k(k)
26629         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26630     }
26631   }
26632 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_gt_8_strided_a)26633   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_gt_8_strided_a) {
26634     TEST_REQUIRES_X86_AVX;
26635     for (size_t k = 9; k < 16; k++) {
26636       GemmMicrokernelTester()
26637         .mr(3)
26638         .nr(4)
26639         .kr(2)
26640         .sr(4)
26641         .m(3)
26642         .n(4)
26643         .k(k)
26644         .a_stride(19)
26645         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26646     }
26647   }
26648 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_gt_8_subtile)26649   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_gt_8_subtile) {
26650     TEST_REQUIRES_X86_AVX;
26651     for (size_t k = 9; k < 16; k++) {
26652       for (uint32_t n = 1; n <= 4; n++) {
26653         for (uint32_t m = 1; m <= 3; m++) {
26654           GemmMicrokernelTester()
26655             .mr(3)
26656             .nr(4)
26657             .kr(2)
26658             .sr(4)
26659             .m(m)
26660             .n(n)
26661             .k(k)
26662             .iterations(1)
26663             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26664         }
26665       }
26666     }
26667   }
26668 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_div_8)26669   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_div_8) {
26670     TEST_REQUIRES_X86_AVX;
26671     for (size_t k = 16; k <= 80; k += 8) {
26672       GemmMicrokernelTester()
26673         .mr(3)
26674         .nr(4)
26675         .kr(2)
26676         .sr(4)
26677         .m(3)
26678         .n(4)
26679         .k(k)
26680         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26681     }
26682   }
26683 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_div_8_strided_a)26684   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_div_8_strided_a) {
26685     TEST_REQUIRES_X86_AVX;
26686     for (size_t k = 16; k <= 80; k += 8) {
26687       GemmMicrokernelTester()
26688         .mr(3)
26689         .nr(4)
26690         .kr(2)
26691         .sr(4)
26692         .m(3)
26693         .n(4)
26694         .k(k)
26695         .a_stride(83)
26696         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26697     }
26698   }
26699 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,k_div_8_subtile)26700   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, k_div_8_subtile) {
26701     TEST_REQUIRES_X86_AVX;
26702     for (size_t k = 16; k <= 80; k += 8) {
26703       for (uint32_t n = 1; n <= 4; n++) {
26704         for (uint32_t m = 1; m <= 3; m++) {
26705           GemmMicrokernelTester()
26706             .mr(3)
26707             .nr(4)
26708             .kr(2)
26709             .sr(4)
26710             .m(m)
26711             .n(n)
26712             .k(k)
26713             .iterations(1)
26714             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26715         }
26716       }
26717     }
26718   }
26719 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_gt_4)26720   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_gt_4) {
26721     TEST_REQUIRES_X86_AVX;
26722     for (uint32_t n = 5; n < 8; n++) {
26723       for (size_t k = 1; k <= 40; k += 9) {
26724         GemmMicrokernelTester()
26725           .mr(3)
26726           .nr(4)
26727           .kr(2)
26728           .sr(4)
26729           .m(3)
26730           .n(n)
26731           .k(k)
26732           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26733       }
26734     }
26735   }
26736 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_gt_4_strided_cn)26737   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_gt_4_strided_cn) {
26738     TEST_REQUIRES_X86_AVX;
26739     for (uint32_t n = 5; n < 8; n++) {
26740       for (size_t k = 1; k <= 40; k += 9) {
26741         GemmMicrokernelTester()
26742           .mr(3)
26743           .nr(4)
26744           .kr(2)
26745           .sr(4)
26746           .m(3)
26747           .n(n)
26748           .k(k)
26749           .cn_stride(7)
26750           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26751       }
26752     }
26753   }
26754 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_gt_4_strided_a)26755   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_gt_4_strided_a) {
26756     TEST_REQUIRES_X86_AVX;
26757     for (uint32_t n = 5; n < 8; n++) {
26758       for (size_t k = 1; k <= 40; k += 9) {
26759         GemmMicrokernelTester()
26760           .mr(3)
26761           .nr(4)
26762           .kr(2)
26763           .sr(4)
26764           .m(3)
26765           .n(n)
26766           .k(k)
26767           .a_stride(43)
26768           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26769       }
26770     }
26771   }
26772 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_gt_4_subtile)26773   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_gt_4_subtile) {
26774     TEST_REQUIRES_X86_AVX;
26775     for (uint32_t n = 5; n < 8; n++) {
26776       for (size_t k = 1; k <= 40; k += 9) {
26777         for (uint32_t m = 1; m <= 3; m++) {
26778           GemmMicrokernelTester()
26779             .mr(3)
26780             .nr(4)
26781             .kr(2)
26782             .sr(4)
26783             .m(m)
26784             .n(n)
26785             .k(k)
26786             .iterations(1)
26787             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26788         }
26789       }
26790     }
26791   }
26792 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_div_4)26793   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_div_4) {
26794     TEST_REQUIRES_X86_AVX;
26795     for (uint32_t n = 8; n <= 12; n += 4) {
26796       for (size_t k = 1; k <= 40; k += 9) {
26797         GemmMicrokernelTester()
26798           .mr(3)
26799           .nr(4)
26800           .kr(2)
26801           .sr(4)
26802           .m(3)
26803           .n(n)
26804           .k(k)
26805           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26806       }
26807     }
26808   }
26809 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_div_4_strided_cn)26810   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_div_4_strided_cn) {
26811     TEST_REQUIRES_X86_AVX;
26812     for (uint32_t n = 8; n <= 12; n += 4) {
26813       for (size_t k = 1; k <= 40; k += 9) {
26814         GemmMicrokernelTester()
26815           .mr(3)
26816           .nr(4)
26817           .kr(2)
26818           .sr(4)
26819           .m(3)
26820           .n(n)
26821           .k(k)
26822           .cn_stride(7)
26823           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26824       }
26825     }
26826   }
26827 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_div_4_strided_a)26828   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_div_4_strided_a) {
26829     TEST_REQUIRES_X86_AVX;
26830     for (uint32_t n = 8; n <= 12; n += 4) {
26831       for (size_t k = 1; k <= 40; k += 9) {
26832         GemmMicrokernelTester()
26833           .mr(3)
26834           .nr(4)
26835           .kr(2)
26836           .sr(4)
26837           .m(3)
26838           .n(n)
26839           .k(k)
26840           .a_stride(43)
26841           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26842       }
26843     }
26844   }
26845 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,n_div_4_subtile)26846   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, n_div_4_subtile) {
26847     TEST_REQUIRES_X86_AVX;
26848     for (uint32_t n = 8; n <= 12; n += 4) {
26849       for (size_t k = 1; k <= 40; k += 9) {
26850         for (uint32_t m = 1; m <= 3; m++) {
26851           GemmMicrokernelTester()
26852             .mr(3)
26853             .nr(4)
26854             .kr(2)
26855             .sr(4)
26856             .m(m)
26857             .n(n)
26858             .k(k)
26859             .iterations(1)
26860             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26861         }
26862       }
26863     }
26864   }
26865 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,strided_cm_subtile)26866   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, strided_cm_subtile) {
26867     TEST_REQUIRES_X86_AVX;
26868     for (size_t k = 1; k <= 40; k += 9) {
26869       for (uint32_t n = 1; n <= 4; n++) {
26870         for (uint32_t m = 1; m <= 3; m++) {
26871           GemmMicrokernelTester()
26872             .mr(3)
26873             .nr(4)
26874             .kr(2)
26875             .sr(4)
26876             .m(m)
26877             .n(n)
26878             .k(k)
26879             .cm_stride(7)
26880             .iterations(1)
26881             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26882         }
26883       }
26884     }
26885   }
26886 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,qmin)26887   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, qmin) {
26888     TEST_REQUIRES_X86_AVX;
26889     GemmMicrokernelTester()
26890       .mr(3)
26891       .nr(4)
26892       .kr(2)
26893       .sr(4)
26894       .m(3)
26895       .n(4)
26896       .k(8)
26897       .qmin(128)
26898       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26899   }
26900 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,qmax)26901   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, qmax) {
26902     TEST_REQUIRES_X86_AVX;
26903     GemmMicrokernelTester()
26904       .mr(3)
26905       .nr(4)
26906       .kr(2)
26907       .sr(4)
26908       .m(3)
26909       .n(4)
26910       .k(8)
26911       .qmax(128)
26912       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26913   }
26914 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64,strided_cm)26915   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__AVX_LD64, strided_cm) {
26916     TEST_REQUIRES_X86_AVX;
26917     GemmMicrokernelTester()
26918       .mr(3)
26919       .nr(4)
26920       .kr(2)
26921       .sr(4)
26922       .m(3)
26923       .n(4)
26924       .k(8)
26925       .cm_stride(7)
26926       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26927   }
26928 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
26929 
26930 
26931 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_eq_8)26932   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_eq_8) {
26933     TEST_REQUIRES_X86_XOP;
26934     GemmMicrokernelTester()
26935       .mr(3)
26936       .nr(4)
26937       .kr(2)
26938       .sr(4)
26939       .m(3)
26940       .n(4)
26941       .k(8)
26942       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26943   }
26944 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,strided_cn)26945   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, strided_cn) {
26946     TEST_REQUIRES_X86_XOP;
26947     GemmMicrokernelTester()
26948       .mr(3)
26949       .nr(4)
26950       .kr(2)
26951       .sr(4)
26952       .m(3)
26953       .n(4)
26954       .k(8)
26955       .cn_stride(7)
26956       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26957   }
26958 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_eq_8_strided_a)26959   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_eq_8_strided_a) {
26960     TEST_REQUIRES_X86_XOP;
26961     GemmMicrokernelTester()
26962       .mr(3)
26963       .nr(4)
26964       .kr(2)
26965       .sr(4)
26966       .m(3)
26967       .n(4)
26968       .k(8)
26969       .a_stride(11)
26970       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26971   }
26972 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_eq_8_subtile)26973   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_eq_8_subtile) {
26974     TEST_REQUIRES_X86_XOP;
26975     for (uint32_t n = 1; n <= 4; n++) {
26976       for (uint32_t m = 1; m <= 3; m++) {
26977         GemmMicrokernelTester()
26978           .mr(3)
26979           .nr(4)
26980           .kr(2)
26981           .sr(4)
26982           .m(m)
26983           .n(n)
26984           .k(8)
26985           .iterations(1)
26986           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
26987       }
26988     }
26989   }
26990 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_eq_8_subtile_m)26991   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_eq_8_subtile_m) {
26992     TEST_REQUIRES_X86_XOP;
26993     for (uint32_t m = 1; m <= 3; m++) {
26994       GemmMicrokernelTester()
26995         .mr(3)
26996         .nr(4)
26997         .kr(2)
26998         .sr(4)
26999         .m(m)
27000         .n(4)
27001         .k(8)
27002         .iterations(1)
27003         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27004     }
27005   }
27006 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_eq_8_subtile_n)27007   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_eq_8_subtile_n) {
27008     TEST_REQUIRES_X86_XOP;
27009     for (uint32_t n = 1; n <= 4; n++) {
27010       GemmMicrokernelTester()
27011         .mr(3)
27012         .nr(4)
27013         .kr(2)
27014         .sr(4)
27015         .m(3)
27016         .n(n)
27017         .k(8)
27018         .iterations(1)
27019         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27020     }
27021   }
27022 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_lt_8)27023   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_lt_8) {
27024     TEST_REQUIRES_X86_XOP;
27025     for (size_t k = 1; k < 8; k++) {
27026       GemmMicrokernelTester()
27027         .mr(3)
27028         .nr(4)
27029         .kr(2)
27030         .sr(4)
27031         .m(3)
27032         .n(4)
27033         .k(k)
27034         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27035     }
27036   }
27037 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_lt_8_strided_a)27038   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_lt_8_strided_a) {
27039     TEST_REQUIRES_X86_XOP;
27040     for (size_t k = 1; k < 8; k++) {
27041       GemmMicrokernelTester()
27042         .mr(3)
27043         .nr(4)
27044         .kr(2)
27045         .sr(4)
27046         .m(3)
27047         .n(4)
27048         .k(k)
27049         .a_stride(11)
27050         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27051     }
27052   }
27053 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_lt_8_subtile)27054   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_lt_8_subtile) {
27055     TEST_REQUIRES_X86_XOP;
27056     for (size_t k = 1; k < 8; k++) {
27057       for (uint32_t n = 1; n <= 4; n++) {
27058         for (uint32_t m = 1; m <= 3; m++) {
27059           GemmMicrokernelTester()
27060             .mr(3)
27061             .nr(4)
27062             .kr(2)
27063             .sr(4)
27064             .m(m)
27065             .n(n)
27066             .k(k)
27067             .iterations(1)
27068             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27069         }
27070       }
27071     }
27072   }
27073 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_gt_8)27074   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_gt_8) {
27075     TEST_REQUIRES_X86_XOP;
27076     for (size_t k = 9; k < 16; k++) {
27077       GemmMicrokernelTester()
27078         .mr(3)
27079         .nr(4)
27080         .kr(2)
27081         .sr(4)
27082         .m(3)
27083         .n(4)
27084         .k(k)
27085         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27086     }
27087   }
27088 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_gt_8_strided_a)27089   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_gt_8_strided_a) {
27090     TEST_REQUIRES_X86_XOP;
27091     for (size_t k = 9; k < 16; k++) {
27092       GemmMicrokernelTester()
27093         .mr(3)
27094         .nr(4)
27095         .kr(2)
27096         .sr(4)
27097         .m(3)
27098         .n(4)
27099         .k(k)
27100         .a_stride(19)
27101         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27102     }
27103   }
27104 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_gt_8_subtile)27105   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_gt_8_subtile) {
27106     TEST_REQUIRES_X86_XOP;
27107     for (size_t k = 9; k < 16; k++) {
27108       for (uint32_t n = 1; n <= 4; n++) {
27109         for (uint32_t m = 1; m <= 3; m++) {
27110           GemmMicrokernelTester()
27111             .mr(3)
27112             .nr(4)
27113             .kr(2)
27114             .sr(4)
27115             .m(m)
27116             .n(n)
27117             .k(k)
27118             .iterations(1)
27119             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27120         }
27121       }
27122     }
27123   }
27124 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_div_8)27125   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_div_8) {
27126     TEST_REQUIRES_X86_XOP;
27127     for (size_t k = 16; k <= 80; k += 8) {
27128       GemmMicrokernelTester()
27129         .mr(3)
27130         .nr(4)
27131         .kr(2)
27132         .sr(4)
27133         .m(3)
27134         .n(4)
27135         .k(k)
27136         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27137     }
27138   }
27139 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_div_8_strided_a)27140   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_div_8_strided_a) {
27141     TEST_REQUIRES_X86_XOP;
27142     for (size_t k = 16; k <= 80; k += 8) {
27143       GemmMicrokernelTester()
27144         .mr(3)
27145         .nr(4)
27146         .kr(2)
27147         .sr(4)
27148         .m(3)
27149         .n(4)
27150         .k(k)
27151         .a_stride(83)
27152         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27153     }
27154   }
27155 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,k_div_8_subtile)27156   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, k_div_8_subtile) {
27157     TEST_REQUIRES_X86_XOP;
27158     for (size_t k = 16; k <= 80; k += 8) {
27159       for (uint32_t n = 1; n <= 4; n++) {
27160         for (uint32_t m = 1; m <= 3; m++) {
27161           GemmMicrokernelTester()
27162             .mr(3)
27163             .nr(4)
27164             .kr(2)
27165             .sr(4)
27166             .m(m)
27167             .n(n)
27168             .k(k)
27169             .iterations(1)
27170             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27171         }
27172       }
27173     }
27174   }
27175 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_gt_4)27176   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_gt_4) {
27177     TEST_REQUIRES_X86_XOP;
27178     for (uint32_t n = 5; n < 8; n++) {
27179       for (size_t k = 1; k <= 40; k += 9) {
27180         GemmMicrokernelTester()
27181           .mr(3)
27182           .nr(4)
27183           .kr(2)
27184           .sr(4)
27185           .m(3)
27186           .n(n)
27187           .k(k)
27188           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27189       }
27190     }
27191   }
27192 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_gt_4_strided_cn)27193   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_gt_4_strided_cn) {
27194     TEST_REQUIRES_X86_XOP;
27195     for (uint32_t n = 5; n < 8; n++) {
27196       for (size_t k = 1; k <= 40; k += 9) {
27197         GemmMicrokernelTester()
27198           .mr(3)
27199           .nr(4)
27200           .kr(2)
27201           .sr(4)
27202           .m(3)
27203           .n(n)
27204           .k(k)
27205           .cn_stride(7)
27206           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27207       }
27208     }
27209   }
27210 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_gt_4_strided_a)27211   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_gt_4_strided_a) {
27212     TEST_REQUIRES_X86_XOP;
27213     for (uint32_t n = 5; n < 8; n++) {
27214       for (size_t k = 1; k <= 40; k += 9) {
27215         GemmMicrokernelTester()
27216           .mr(3)
27217           .nr(4)
27218           .kr(2)
27219           .sr(4)
27220           .m(3)
27221           .n(n)
27222           .k(k)
27223           .a_stride(43)
27224           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27225       }
27226     }
27227   }
27228 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_gt_4_subtile)27229   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_gt_4_subtile) {
27230     TEST_REQUIRES_X86_XOP;
27231     for (uint32_t n = 5; n < 8; n++) {
27232       for (size_t k = 1; k <= 40; k += 9) {
27233         for (uint32_t m = 1; m <= 3; m++) {
27234           GemmMicrokernelTester()
27235             .mr(3)
27236             .nr(4)
27237             .kr(2)
27238             .sr(4)
27239             .m(m)
27240             .n(n)
27241             .k(k)
27242             .iterations(1)
27243             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27244         }
27245       }
27246     }
27247   }
27248 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_div_4)27249   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_div_4) {
27250     TEST_REQUIRES_X86_XOP;
27251     for (uint32_t n = 8; n <= 12; n += 4) {
27252       for (size_t k = 1; k <= 40; k += 9) {
27253         GemmMicrokernelTester()
27254           .mr(3)
27255           .nr(4)
27256           .kr(2)
27257           .sr(4)
27258           .m(3)
27259           .n(n)
27260           .k(k)
27261           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27262       }
27263     }
27264   }
27265 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_div_4_strided_cn)27266   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_div_4_strided_cn) {
27267     TEST_REQUIRES_X86_XOP;
27268     for (uint32_t n = 8; n <= 12; n += 4) {
27269       for (size_t k = 1; k <= 40; k += 9) {
27270         GemmMicrokernelTester()
27271           .mr(3)
27272           .nr(4)
27273           .kr(2)
27274           .sr(4)
27275           .m(3)
27276           .n(n)
27277           .k(k)
27278           .cn_stride(7)
27279           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27280       }
27281     }
27282   }
27283 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_div_4_strided_a)27284   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_div_4_strided_a) {
27285     TEST_REQUIRES_X86_XOP;
27286     for (uint32_t n = 8; n <= 12; n += 4) {
27287       for (size_t k = 1; k <= 40; k += 9) {
27288         GemmMicrokernelTester()
27289           .mr(3)
27290           .nr(4)
27291           .kr(2)
27292           .sr(4)
27293           .m(3)
27294           .n(n)
27295           .k(k)
27296           .a_stride(43)
27297           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27298       }
27299     }
27300   }
27301 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,n_div_4_subtile)27302   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, n_div_4_subtile) {
27303     TEST_REQUIRES_X86_XOP;
27304     for (uint32_t n = 8; n <= 12; n += 4) {
27305       for (size_t k = 1; k <= 40; k += 9) {
27306         for (uint32_t m = 1; m <= 3; m++) {
27307           GemmMicrokernelTester()
27308             .mr(3)
27309             .nr(4)
27310             .kr(2)
27311             .sr(4)
27312             .m(m)
27313             .n(n)
27314             .k(k)
27315             .iterations(1)
27316             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27317         }
27318       }
27319     }
27320   }
27321 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,strided_cm_subtile)27322   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, strided_cm_subtile) {
27323     TEST_REQUIRES_X86_XOP;
27324     for (size_t k = 1; k <= 40; k += 9) {
27325       for (uint32_t n = 1; n <= 4; n++) {
27326         for (uint32_t m = 1; m <= 3; m++) {
27327           GemmMicrokernelTester()
27328             .mr(3)
27329             .nr(4)
27330             .kr(2)
27331             .sr(4)
27332             .m(m)
27333             .n(n)
27334             .k(k)
27335             .cm_stride(7)
27336             .iterations(1)
27337             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27338         }
27339       }
27340     }
27341   }
27342 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,qmin)27343   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, qmin) {
27344     TEST_REQUIRES_X86_XOP;
27345     GemmMicrokernelTester()
27346       .mr(3)
27347       .nr(4)
27348       .kr(2)
27349       .sr(4)
27350       .m(3)
27351       .n(4)
27352       .k(8)
27353       .qmin(128)
27354       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27355   }
27356 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,qmax)27357   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, qmax) {
27358     TEST_REQUIRES_X86_XOP;
27359     GemmMicrokernelTester()
27360       .mr(3)
27361       .nr(4)
27362       .kr(2)
27363       .sr(4)
27364       .m(3)
27365       .n(4)
27366       .k(8)
27367       .qmax(128)
27368       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27369   }
27370 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64,strided_cm)27371   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD64, strided_cm) {
27372     TEST_REQUIRES_X86_XOP;
27373     GemmMicrokernelTester()
27374       .mr(3)
27375       .nr(4)
27376       .kr(2)
27377       .sr(4)
27378       .m(3)
27379       .n(4)
27380       .k(8)
27381       .cm_stride(7)
27382       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
27383   }
27384 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
27385 
27386 
27387 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_eq_8)27388   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_eq_8) {
27389     TEST_REQUIRES_X86_SSE2;
27390     GemmMicrokernelTester()
27391       .mr(2)
27392       .nr(4)
27393       .kr(2)
27394       .sr(4)
27395       .m(2)
27396       .n(4)
27397       .k(8)
27398       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27399   }
27400 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,strided_cn)27401   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, strided_cn) {
27402     TEST_REQUIRES_X86_SSE2;
27403     GemmMicrokernelTester()
27404       .mr(2)
27405       .nr(4)
27406       .kr(2)
27407       .sr(4)
27408       .m(2)
27409       .n(4)
27410       .k(8)
27411       .cn_stride(7)
27412       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27413   }
27414 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_eq_8_strided_a)27415   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_eq_8_strided_a) {
27416     TEST_REQUIRES_X86_SSE2;
27417     GemmMicrokernelTester()
27418       .mr(2)
27419       .nr(4)
27420       .kr(2)
27421       .sr(4)
27422       .m(2)
27423       .n(4)
27424       .k(8)
27425       .a_stride(11)
27426       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27427   }
27428 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_eq_8_subtile)27429   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_eq_8_subtile) {
27430     TEST_REQUIRES_X86_SSE2;
27431     for (uint32_t n = 1; n <= 4; n++) {
27432       for (uint32_t m = 1; m <= 2; m++) {
27433         GemmMicrokernelTester()
27434           .mr(2)
27435           .nr(4)
27436           .kr(2)
27437           .sr(4)
27438           .m(m)
27439           .n(n)
27440           .k(8)
27441           .iterations(1)
27442           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27443       }
27444     }
27445   }
27446 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_eq_8_subtile_m)27447   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_eq_8_subtile_m) {
27448     TEST_REQUIRES_X86_SSE2;
27449     for (uint32_t m = 1; m <= 2; m++) {
27450       GemmMicrokernelTester()
27451         .mr(2)
27452         .nr(4)
27453         .kr(2)
27454         .sr(4)
27455         .m(m)
27456         .n(4)
27457         .k(8)
27458         .iterations(1)
27459         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27460     }
27461   }
27462 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_eq_8_subtile_n)27463   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_eq_8_subtile_n) {
27464     TEST_REQUIRES_X86_SSE2;
27465     for (uint32_t n = 1; n <= 4; n++) {
27466       GemmMicrokernelTester()
27467         .mr(2)
27468         .nr(4)
27469         .kr(2)
27470         .sr(4)
27471         .m(2)
27472         .n(n)
27473         .k(8)
27474         .iterations(1)
27475         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27476     }
27477   }
27478 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_lt_8)27479   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_lt_8) {
27480     TEST_REQUIRES_X86_SSE2;
27481     for (size_t k = 1; k < 8; k++) {
27482       GemmMicrokernelTester()
27483         .mr(2)
27484         .nr(4)
27485         .kr(2)
27486         .sr(4)
27487         .m(2)
27488         .n(4)
27489         .k(k)
27490         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27491     }
27492   }
27493 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_lt_8_strided_a)27494   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_lt_8_strided_a) {
27495     TEST_REQUIRES_X86_SSE2;
27496     for (size_t k = 1; k < 8; k++) {
27497       GemmMicrokernelTester()
27498         .mr(2)
27499         .nr(4)
27500         .kr(2)
27501         .sr(4)
27502         .m(2)
27503         .n(4)
27504         .k(k)
27505         .a_stride(11)
27506         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27507     }
27508   }
27509 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_lt_8_subtile)27510   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_lt_8_subtile) {
27511     TEST_REQUIRES_X86_SSE2;
27512     for (size_t k = 1; k < 8; k++) {
27513       for (uint32_t n = 1; n <= 4; n++) {
27514         for (uint32_t m = 1; m <= 2; m++) {
27515           GemmMicrokernelTester()
27516             .mr(2)
27517             .nr(4)
27518             .kr(2)
27519             .sr(4)
27520             .m(m)
27521             .n(n)
27522             .k(k)
27523             .iterations(1)
27524             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27525         }
27526       }
27527     }
27528   }
27529 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_gt_8)27530   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_gt_8) {
27531     TEST_REQUIRES_X86_SSE2;
27532     for (size_t k = 9; k < 16; k++) {
27533       GemmMicrokernelTester()
27534         .mr(2)
27535         .nr(4)
27536         .kr(2)
27537         .sr(4)
27538         .m(2)
27539         .n(4)
27540         .k(k)
27541         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27542     }
27543   }
27544 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_gt_8_strided_a)27545   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_gt_8_strided_a) {
27546     TEST_REQUIRES_X86_SSE2;
27547     for (size_t k = 9; k < 16; k++) {
27548       GemmMicrokernelTester()
27549         .mr(2)
27550         .nr(4)
27551         .kr(2)
27552         .sr(4)
27553         .m(2)
27554         .n(4)
27555         .k(k)
27556         .a_stride(19)
27557         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27558     }
27559   }
27560 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_gt_8_subtile)27561   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_gt_8_subtile) {
27562     TEST_REQUIRES_X86_SSE2;
27563     for (size_t k = 9; k < 16; k++) {
27564       for (uint32_t n = 1; n <= 4; n++) {
27565         for (uint32_t m = 1; m <= 2; m++) {
27566           GemmMicrokernelTester()
27567             .mr(2)
27568             .nr(4)
27569             .kr(2)
27570             .sr(4)
27571             .m(m)
27572             .n(n)
27573             .k(k)
27574             .iterations(1)
27575             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27576         }
27577       }
27578     }
27579   }
27580 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_div_8)27581   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_div_8) {
27582     TEST_REQUIRES_X86_SSE2;
27583     for (size_t k = 16; k <= 80; k += 8) {
27584       GemmMicrokernelTester()
27585         .mr(2)
27586         .nr(4)
27587         .kr(2)
27588         .sr(4)
27589         .m(2)
27590         .n(4)
27591         .k(k)
27592         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27593     }
27594   }
27595 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_div_8_strided_a)27596   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_div_8_strided_a) {
27597     TEST_REQUIRES_X86_SSE2;
27598     for (size_t k = 16; k <= 80; k += 8) {
27599       GemmMicrokernelTester()
27600         .mr(2)
27601         .nr(4)
27602         .kr(2)
27603         .sr(4)
27604         .m(2)
27605         .n(4)
27606         .k(k)
27607         .a_stride(83)
27608         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27609     }
27610   }
27611 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,k_div_8_subtile)27612   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, k_div_8_subtile) {
27613     TEST_REQUIRES_X86_SSE2;
27614     for (size_t k = 16; k <= 80; k += 8) {
27615       for (uint32_t n = 1; n <= 4; n++) {
27616         for (uint32_t m = 1; m <= 2; m++) {
27617           GemmMicrokernelTester()
27618             .mr(2)
27619             .nr(4)
27620             .kr(2)
27621             .sr(4)
27622             .m(m)
27623             .n(n)
27624             .k(k)
27625             .iterations(1)
27626             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27627         }
27628       }
27629     }
27630   }
27631 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_gt_4)27632   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_gt_4) {
27633     TEST_REQUIRES_X86_SSE2;
27634     for (uint32_t n = 5; n < 8; n++) {
27635       for (size_t k = 1; k <= 40; k += 9) {
27636         GemmMicrokernelTester()
27637           .mr(2)
27638           .nr(4)
27639           .kr(2)
27640           .sr(4)
27641           .m(2)
27642           .n(n)
27643           .k(k)
27644           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27645       }
27646     }
27647   }
27648 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_gt_4_strided_cn)27649   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_gt_4_strided_cn) {
27650     TEST_REQUIRES_X86_SSE2;
27651     for (uint32_t n = 5; n < 8; n++) {
27652       for (size_t k = 1; k <= 40; k += 9) {
27653         GemmMicrokernelTester()
27654           .mr(2)
27655           .nr(4)
27656           .kr(2)
27657           .sr(4)
27658           .m(2)
27659           .n(n)
27660           .k(k)
27661           .cn_stride(7)
27662           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27663       }
27664     }
27665   }
27666 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_gt_4_strided_a)27667   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_gt_4_strided_a) {
27668     TEST_REQUIRES_X86_SSE2;
27669     for (uint32_t n = 5; n < 8; n++) {
27670       for (size_t k = 1; k <= 40; k += 9) {
27671         GemmMicrokernelTester()
27672           .mr(2)
27673           .nr(4)
27674           .kr(2)
27675           .sr(4)
27676           .m(2)
27677           .n(n)
27678           .k(k)
27679           .a_stride(43)
27680           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27681       }
27682     }
27683   }
27684 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_gt_4_subtile)27685   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_gt_4_subtile) {
27686     TEST_REQUIRES_X86_SSE2;
27687     for (uint32_t n = 5; n < 8; n++) {
27688       for (size_t k = 1; k <= 40; k += 9) {
27689         for (uint32_t m = 1; m <= 2; m++) {
27690           GemmMicrokernelTester()
27691             .mr(2)
27692             .nr(4)
27693             .kr(2)
27694             .sr(4)
27695             .m(m)
27696             .n(n)
27697             .k(k)
27698             .iterations(1)
27699             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27700         }
27701       }
27702     }
27703   }
27704 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_div_4)27705   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_div_4) {
27706     TEST_REQUIRES_X86_SSE2;
27707     for (uint32_t n = 8; n <= 12; n += 4) {
27708       for (size_t k = 1; k <= 40; k += 9) {
27709         GemmMicrokernelTester()
27710           .mr(2)
27711           .nr(4)
27712           .kr(2)
27713           .sr(4)
27714           .m(2)
27715           .n(n)
27716           .k(k)
27717           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27718       }
27719     }
27720   }
27721 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_div_4_strided_cn)27722   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_div_4_strided_cn) {
27723     TEST_REQUIRES_X86_SSE2;
27724     for (uint32_t n = 8; n <= 12; n += 4) {
27725       for (size_t k = 1; k <= 40; k += 9) {
27726         GemmMicrokernelTester()
27727           .mr(2)
27728           .nr(4)
27729           .kr(2)
27730           .sr(4)
27731           .m(2)
27732           .n(n)
27733           .k(k)
27734           .cn_stride(7)
27735           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27736       }
27737     }
27738   }
27739 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_div_4_strided_a)27740   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_div_4_strided_a) {
27741     TEST_REQUIRES_X86_SSE2;
27742     for (uint32_t n = 8; n <= 12; n += 4) {
27743       for (size_t k = 1; k <= 40; k += 9) {
27744         GemmMicrokernelTester()
27745           .mr(2)
27746           .nr(4)
27747           .kr(2)
27748           .sr(4)
27749           .m(2)
27750           .n(n)
27751           .k(k)
27752           .a_stride(43)
27753           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27754       }
27755     }
27756   }
27757 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,n_div_4_subtile)27758   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, n_div_4_subtile) {
27759     TEST_REQUIRES_X86_SSE2;
27760     for (uint32_t n = 8; n <= 12; n += 4) {
27761       for (size_t k = 1; k <= 40; k += 9) {
27762         for (uint32_t m = 1; m <= 2; m++) {
27763           GemmMicrokernelTester()
27764             .mr(2)
27765             .nr(4)
27766             .kr(2)
27767             .sr(4)
27768             .m(m)
27769             .n(n)
27770             .k(k)
27771             .iterations(1)
27772             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27773         }
27774       }
27775     }
27776   }
27777 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,strided_cm_subtile)27778   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, strided_cm_subtile) {
27779     TEST_REQUIRES_X86_SSE2;
27780     for (size_t k = 1; k <= 40; k += 9) {
27781       for (uint32_t n = 1; n <= 4; n++) {
27782         for (uint32_t m = 1; m <= 2; m++) {
27783           GemmMicrokernelTester()
27784             .mr(2)
27785             .nr(4)
27786             .kr(2)
27787             .sr(4)
27788             .m(m)
27789             .n(n)
27790             .k(k)
27791             .cm_stride(7)
27792             .iterations(1)
27793             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27794         }
27795       }
27796     }
27797   }
27798 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,qmin)27799   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, qmin) {
27800     TEST_REQUIRES_X86_SSE2;
27801     GemmMicrokernelTester()
27802       .mr(2)
27803       .nr(4)
27804       .kr(2)
27805       .sr(4)
27806       .m(2)
27807       .n(4)
27808       .k(8)
27809       .qmin(128)
27810       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27811   }
27812 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,qmax)27813   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, qmax) {
27814     TEST_REQUIRES_X86_SSE2;
27815     GemmMicrokernelTester()
27816       .mr(2)
27817       .nr(4)
27818       .kr(2)
27819       .sr(4)
27820       .m(2)
27821       .n(4)
27822       .k(8)
27823       .qmax(128)
27824       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27825   }
27826 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128,strided_cm)27827   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__SSE2_LD128, strided_cm) {
27828     TEST_REQUIRES_X86_SSE2;
27829     GemmMicrokernelTester()
27830       .mr(2)
27831       .nr(4)
27832       .kr(2)
27833       .sr(4)
27834       .m(2)
27835       .n(4)
27836       .k(8)
27837       .cm_stride(7)
27838       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27839   }
27840 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
27841 
27842 
27843 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_eq_8)27844   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_eq_8) {
27845     TEST_REQUIRES_X86_SSE2;
27846     GemmMicrokernelTester()
27847       .mr(3)
27848       .nr(4)
27849       .kr(2)
27850       .sr(4)
27851       .m(3)
27852       .n(4)
27853       .k(8)
27854       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27855   }
27856 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,strided_cn)27857   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, strided_cn) {
27858     TEST_REQUIRES_X86_SSE2;
27859     GemmMicrokernelTester()
27860       .mr(3)
27861       .nr(4)
27862       .kr(2)
27863       .sr(4)
27864       .m(3)
27865       .n(4)
27866       .k(8)
27867       .cn_stride(7)
27868       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27869   }
27870 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_eq_8_strided_a)27871   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_eq_8_strided_a) {
27872     TEST_REQUIRES_X86_SSE2;
27873     GemmMicrokernelTester()
27874       .mr(3)
27875       .nr(4)
27876       .kr(2)
27877       .sr(4)
27878       .m(3)
27879       .n(4)
27880       .k(8)
27881       .a_stride(11)
27882       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27883   }
27884 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_eq_8_subtile)27885   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_eq_8_subtile) {
27886     TEST_REQUIRES_X86_SSE2;
27887     for (uint32_t n = 1; n <= 4; n++) {
27888       for (uint32_t m = 1; m <= 3; m++) {
27889         GemmMicrokernelTester()
27890           .mr(3)
27891           .nr(4)
27892           .kr(2)
27893           .sr(4)
27894           .m(m)
27895           .n(n)
27896           .k(8)
27897           .iterations(1)
27898           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27899       }
27900     }
27901   }
27902 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_eq_8_subtile_m)27903   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_eq_8_subtile_m) {
27904     TEST_REQUIRES_X86_SSE2;
27905     for (uint32_t m = 1; m <= 3; m++) {
27906       GemmMicrokernelTester()
27907         .mr(3)
27908         .nr(4)
27909         .kr(2)
27910         .sr(4)
27911         .m(m)
27912         .n(4)
27913         .k(8)
27914         .iterations(1)
27915         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27916     }
27917   }
27918 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_eq_8_subtile_n)27919   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_eq_8_subtile_n) {
27920     TEST_REQUIRES_X86_SSE2;
27921     for (uint32_t n = 1; n <= 4; n++) {
27922       GemmMicrokernelTester()
27923         .mr(3)
27924         .nr(4)
27925         .kr(2)
27926         .sr(4)
27927         .m(3)
27928         .n(n)
27929         .k(8)
27930         .iterations(1)
27931         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27932     }
27933   }
27934 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_lt_8)27935   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_lt_8) {
27936     TEST_REQUIRES_X86_SSE2;
27937     for (size_t k = 1; k < 8; k++) {
27938       GemmMicrokernelTester()
27939         .mr(3)
27940         .nr(4)
27941         .kr(2)
27942         .sr(4)
27943         .m(3)
27944         .n(4)
27945         .k(k)
27946         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27947     }
27948   }
27949 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_lt_8_strided_a)27950   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_lt_8_strided_a) {
27951     TEST_REQUIRES_X86_SSE2;
27952     for (size_t k = 1; k < 8; k++) {
27953       GemmMicrokernelTester()
27954         .mr(3)
27955         .nr(4)
27956         .kr(2)
27957         .sr(4)
27958         .m(3)
27959         .n(4)
27960         .k(k)
27961         .a_stride(11)
27962         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27963     }
27964   }
27965 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_lt_8_subtile)27966   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_lt_8_subtile) {
27967     TEST_REQUIRES_X86_SSE2;
27968     for (size_t k = 1; k < 8; k++) {
27969       for (uint32_t n = 1; n <= 4; n++) {
27970         for (uint32_t m = 1; m <= 3; m++) {
27971           GemmMicrokernelTester()
27972             .mr(3)
27973             .nr(4)
27974             .kr(2)
27975             .sr(4)
27976             .m(m)
27977             .n(n)
27978             .k(k)
27979             .iterations(1)
27980             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27981         }
27982       }
27983     }
27984   }
27985 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_gt_8)27986   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_gt_8) {
27987     TEST_REQUIRES_X86_SSE2;
27988     for (size_t k = 9; k < 16; k++) {
27989       GemmMicrokernelTester()
27990         .mr(3)
27991         .nr(4)
27992         .kr(2)
27993         .sr(4)
27994         .m(3)
27995         .n(4)
27996         .k(k)
27997         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
27998     }
27999   }
28000 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_gt_8_strided_a)28001   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_gt_8_strided_a) {
28002     TEST_REQUIRES_X86_SSE2;
28003     for (size_t k = 9; k < 16; k++) {
28004       GemmMicrokernelTester()
28005         .mr(3)
28006         .nr(4)
28007         .kr(2)
28008         .sr(4)
28009         .m(3)
28010         .n(4)
28011         .k(k)
28012         .a_stride(19)
28013         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28014     }
28015   }
28016 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_gt_8_subtile)28017   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_gt_8_subtile) {
28018     TEST_REQUIRES_X86_SSE2;
28019     for (size_t k = 9; k < 16; k++) {
28020       for (uint32_t n = 1; n <= 4; n++) {
28021         for (uint32_t m = 1; m <= 3; m++) {
28022           GemmMicrokernelTester()
28023             .mr(3)
28024             .nr(4)
28025             .kr(2)
28026             .sr(4)
28027             .m(m)
28028             .n(n)
28029             .k(k)
28030             .iterations(1)
28031             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28032         }
28033       }
28034     }
28035   }
28036 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_div_8)28037   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_div_8) {
28038     TEST_REQUIRES_X86_SSE2;
28039     for (size_t k = 16; k <= 80; k += 8) {
28040       GemmMicrokernelTester()
28041         .mr(3)
28042         .nr(4)
28043         .kr(2)
28044         .sr(4)
28045         .m(3)
28046         .n(4)
28047         .k(k)
28048         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28049     }
28050   }
28051 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_div_8_strided_a)28052   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_div_8_strided_a) {
28053     TEST_REQUIRES_X86_SSE2;
28054     for (size_t k = 16; k <= 80; k += 8) {
28055       GemmMicrokernelTester()
28056         .mr(3)
28057         .nr(4)
28058         .kr(2)
28059         .sr(4)
28060         .m(3)
28061         .n(4)
28062         .k(k)
28063         .a_stride(83)
28064         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28065     }
28066   }
28067 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,k_div_8_subtile)28068   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, k_div_8_subtile) {
28069     TEST_REQUIRES_X86_SSE2;
28070     for (size_t k = 16; k <= 80; k += 8) {
28071       for (uint32_t n = 1; n <= 4; n++) {
28072         for (uint32_t m = 1; m <= 3; m++) {
28073           GemmMicrokernelTester()
28074             .mr(3)
28075             .nr(4)
28076             .kr(2)
28077             .sr(4)
28078             .m(m)
28079             .n(n)
28080             .k(k)
28081             .iterations(1)
28082             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28083         }
28084       }
28085     }
28086   }
28087 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_gt_4)28088   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_gt_4) {
28089     TEST_REQUIRES_X86_SSE2;
28090     for (uint32_t n = 5; n < 8; n++) {
28091       for (size_t k = 1; k <= 40; k += 9) {
28092         GemmMicrokernelTester()
28093           .mr(3)
28094           .nr(4)
28095           .kr(2)
28096           .sr(4)
28097           .m(3)
28098           .n(n)
28099           .k(k)
28100           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28101       }
28102     }
28103   }
28104 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_gt_4_strided_cn)28105   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_gt_4_strided_cn) {
28106     TEST_REQUIRES_X86_SSE2;
28107     for (uint32_t n = 5; n < 8; n++) {
28108       for (size_t k = 1; k <= 40; k += 9) {
28109         GemmMicrokernelTester()
28110           .mr(3)
28111           .nr(4)
28112           .kr(2)
28113           .sr(4)
28114           .m(3)
28115           .n(n)
28116           .k(k)
28117           .cn_stride(7)
28118           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28119       }
28120     }
28121   }
28122 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_gt_4_strided_a)28123   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_gt_4_strided_a) {
28124     TEST_REQUIRES_X86_SSE2;
28125     for (uint32_t n = 5; n < 8; n++) {
28126       for (size_t k = 1; k <= 40; k += 9) {
28127         GemmMicrokernelTester()
28128           .mr(3)
28129           .nr(4)
28130           .kr(2)
28131           .sr(4)
28132           .m(3)
28133           .n(n)
28134           .k(k)
28135           .a_stride(43)
28136           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28137       }
28138     }
28139   }
28140 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_gt_4_subtile)28141   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_gt_4_subtile) {
28142     TEST_REQUIRES_X86_SSE2;
28143     for (uint32_t n = 5; n < 8; n++) {
28144       for (size_t k = 1; k <= 40; k += 9) {
28145         for (uint32_t m = 1; m <= 3; m++) {
28146           GemmMicrokernelTester()
28147             .mr(3)
28148             .nr(4)
28149             .kr(2)
28150             .sr(4)
28151             .m(m)
28152             .n(n)
28153             .k(k)
28154             .iterations(1)
28155             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28156         }
28157       }
28158     }
28159   }
28160 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_div_4)28161   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_div_4) {
28162     TEST_REQUIRES_X86_SSE2;
28163     for (uint32_t n = 8; n <= 12; n += 4) {
28164       for (size_t k = 1; k <= 40; k += 9) {
28165         GemmMicrokernelTester()
28166           .mr(3)
28167           .nr(4)
28168           .kr(2)
28169           .sr(4)
28170           .m(3)
28171           .n(n)
28172           .k(k)
28173           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28174       }
28175     }
28176   }
28177 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_div_4_strided_cn)28178   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_div_4_strided_cn) {
28179     TEST_REQUIRES_X86_SSE2;
28180     for (uint32_t n = 8; n <= 12; n += 4) {
28181       for (size_t k = 1; k <= 40; k += 9) {
28182         GemmMicrokernelTester()
28183           .mr(3)
28184           .nr(4)
28185           .kr(2)
28186           .sr(4)
28187           .m(3)
28188           .n(n)
28189           .k(k)
28190           .cn_stride(7)
28191           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28192       }
28193     }
28194   }
28195 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_div_4_strided_a)28196   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_div_4_strided_a) {
28197     TEST_REQUIRES_X86_SSE2;
28198     for (uint32_t n = 8; n <= 12; n += 4) {
28199       for (size_t k = 1; k <= 40; k += 9) {
28200         GemmMicrokernelTester()
28201           .mr(3)
28202           .nr(4)
28203           .kr(2)
28204           .sr(4)
28205           .m(3)
28206           .n(n)
28207           .k(k)
28208           .a_stride(43)
28209           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28210       }
28211     }
28212   }
28213 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,n_div_4_subtile)28214   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, n_div_4_subtile) {
28215     TEST_REQUIRES_X86_SSE2;
28216     for (uint32_t n = 8; n <= 12; n += 4) {
28217       for (size_t k = 1; k <= 40; k += 9) {
28218         for (uint32_t m = 1; m <= 3; m++) {
28219           GemmMicrokernelTester()
28220             .mr(3)
28221             .nr(4)
28222             .kr(2)
28223             .sr(4)
28224             .m(m)
28225             .n(n)
28226             .k(k)
28227             .iterations(1)
28228             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28229         }
28230       }
28231     }
28232   }
28233 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,strided_cm_subtile)28234   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, strided_cm_subtile) {
28235     TEST_REQUIRES_X86_SSE2;
28236     for (size_t k = 1; k <= 40; k += 9) {
28237       for (uint32_t n = 1; n <= 4; n++) {
28238         for (uint32_t m = 1; m <= 3; m++) {
28239           GemmMicrokernelTester()
28240             .mr(3)
28241             .nr(4)
28242             .kr(2)
28243             .sr(4)
28244             .m(m)
28245             .n(n)
28246             .k(k)
28247             .cm_stride(7)
28248             .iterations(1)
28249             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28250         }
28251       }
28252     }
28253   }
28254 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,qmin)28255   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, qmin) {
28256     TEST_REQUIRES_X86_SSE2;
28257     GemmMicrokernelTester()
28258       .mr(3)
28259       .nr(4)
28260       .kr(2)
28261       .sr(4)
28262       .m(3)
28263       .n(4)
28264       .k(8)
28265       .qmin(128)
28266       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28267   }
28268 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,qmax)28269   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, qmax) {
28270     TEST_REQUIRES_X86_SSE2;
28271     GemmMicrokernelTester()
28272       .mr(3)
28273       .nr(4)
28274       .kr(2)
28275       .sr(4)
28276       .m(3)
28277       .n(4)
28278       .k(8)
28279       .qmax(128)
28280       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28281   }
28282 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128,strided_cm)28283   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__SSE2_LD128, strided_cm) {
28284     TEST_REQUIRES_X86_SSE2;
28285     GemmMicrokernelTester()
28286       .mr(3)
28287       .nr(4)
28288       .kr(2)
28289       .sr(4)
28290       .m(3)
28291       .n(4)
28292       .k(8)
28293       .cm_stride(7)
28294       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
28295   }
28296 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
28297 
28298 
28299 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_eq_8)28300   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_eq_8) {
28301     TEST_REQUIRES_X86_SSE41;
28302     GemmMicrokernelTester()
28303       .mr(4)
28304       .nr(4)
28305       .kr(2)
28306       .sr(4)
28307       .m(4)
28308       .n(4)
28309       .k(8)
28310       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28311   }
28312 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,strided_cn)28313   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, strided_cn) {
28314     TEST_REQUIRES_X86_SSE41;
28315     GemmMicrokernelTester()
28316       .mr(4)
28317       .nr(4)
28318       .kr(2)
28319       .sr(4)
28320       .m(4)
28321       .n(4)
28322       .k(8)
28323       .cn_stride(7)
28324       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28325   }
28326 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_eq_8_strided_a)28327   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_eq_8_strided_a) {
28328     TEST_REQUIRES_X86_SSE41;
28329     GemmMicrokernelTester()
28330       .mr(4)
28331       .nr(4)
28332       .kr(2)
28333       .sr(4)
28334       .m(4)
28335       .n(4)
28336       .k(8)
28337       .a_stride(11)
28338       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28339   }
28340 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_eq_8_subtile)28341   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_eq_8_subtile) {
28342     TEST_REQUIRES_X86_SSE41;
28343     for (uint32_t n = 1; n <= 4; n++) {
28344       for (uint32_t m = 1; m <= 4; m++) {
28345         GemmMicrokernelTester()
28346           .mr(4)
28347           .nr(4)
28348           .kr(2)
28349           .sr(4)
28350           .m(m)
28351           .n(n)
28352           .k(8)
28353           .iterations(1)
28354           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28355       }
28356     }
28357   }
28358 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_eq_8_subtile_m)28359   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_eq_8_subtile_m) {
28360     TEST_REQUIRES_X86_SSE41;
28361     for (uint32_t m = 1; m <= 4; m++) {
28362       GemmMicrokernelTester()
28363         .mr(4)
28364         .nr(4)
28365         .kr(2)
28366         .sr(4)
28367         .m(m)
28368         .n(4)
28369         .k(8)
28370         .iterations(1)
28371         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28372     }
28373   }
28374 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_eq_8_subtile_n)28375   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_eq_8_subtile_n) {
28376     TEST_REQUIRES_X86_SSE41;
28377     for (uint32_t n = 1; n <= 4; n++) {
28378       GemmMicrokernelTester()
28379         .mr(4)
28380         .nr(4)
28381         .kr(2)
28382         .sr(4)
28383         .m(4)
28384         .n(n)
28385         .k(8)
28386         .iterations(1)
28387         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28388     }
28389   }
28390 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_lt_8)28391   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_lt_8) {
28392     TEST_REQUIRES_X86_SSE41;
28393     for (size_t k = 1; k < 8; k++) {
28394       GemmMicrokernelTester()
28395         .mr(4)
28396         .nr(4)
28397         .kr(2)
28398         .sr(4)
28399         .m(4)
28400         .n(4)
28401         .k(k)
28402         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28403     }
28404   }
28405 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_lt_8_strided_a)28406   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_lt_8_strided_a) {
28407     TEST_REQUIRES_X86_SSE41;
28408     for (size_t k = 1; k < 8; k++) {
28409       GemmMicrokernelTester()
28410         .mr(4)
28411         .nr(4)
28412         .kr(2)
28413         .sr(4)
28414         .m(4)
28415         .n(4)
28416         .k(k)
28417         .a_stride(11)
28418         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28419     }
28420   }
28421 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_lt_8_subtile)28422   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_lt_8_subtile) {
28423     TEST_REQUIRES_X86_SSE41;
28424     for (size_t k = 1; k < 8; k++) {
28425       for (uint32_t n = 1; n <= 4; n++) {
28426         for (uint32_t m = 1; m <= 4; m++) {
28427           GemmMicrokernelTester()
28428             .mr(4)
28429             .nr(4)
28430             .kr(2)
28431             .sr(4)
28432             .m(m)
28433             .n(n)
28434             .k(k)
28435             .iterations(1)
28436             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28437         }
28438       }
28439     }
28440   }
28441 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_gt_8)28442   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_gt_8) {
28443     TEST_REQUIRES_X86_SSE41;
28444     for (size_t k = 9; k < 16; k++) {
28445       GemmMicrokernelTester()
28446         .mr(4)
28447         .nr(4)
28448         .kr(2)
28449         .sr(4)
28450         .m(4)
28451         .n(4)
28452         .k(k)
28453         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28454     }
28455   }
28456 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_gt_8_strided_a)28457   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_gt_8_strided_a) {
28458     TEST_REQUIRES_X86_SSE41;
28459     for (size_t k = 9; k < 16; k++) {
28460       GemmMicrokernelTester()
28461         .mr(4)
28462         .nr(4)
28463         .kr(2)
28464         .sr(4)
28465         .m(4)
28466         .n(4)
28467         .k(k)
28468         .a_stride(19)
28469         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28470     }
28471   }
28472 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_gt_8_subtile)28473   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_gt_8_subtile) {
28474     TEST_REQUIRES_X86_SSE41;
28475     for (size_t k = 9; k < 16; k++) {
28476       for (uint32_t n = 1; n <= 4; n++) {
28477         for (uint32_t m = 1; m <= 4; m++) {
28478           GemmMicrokernelTester()
28479             .mr(4)
28480             .nr(4)
28481             .kr(2)
28482             .sr(4)
28483             .m(m)
28484             .n(n)
28485             .k(k)
28486             .iterations(1)
28487             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28488         }
28489       }
28490     }
28491   }
28492 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_div_8)28493   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_div_8) {
28494     TEST_REQUIRES_X86_SSE41;
28495     for (size_t k = 16; k <= 80; k += 8) {
28496       GemmMicrokernelTester()
28497         .mr(4)
28498         .nr(4)
28499         .kr(2)
28500         .sr(4)
28501         .m(4)
28502         .n(4)
28503         .k(k)
28504         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28505     }
28506   }
28507 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_div_8_strided_a)28508   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_div_8_strided_a) {
28509     TEST_REQUIRES_X86_SSE41;
28510     for (size_t k = 16; k <= 80; k += 8) {
28511       GemmMicrokernelTester()
28512         .mr(4)
28513         .nr(4)
28514         .kr(2)
28515         .sr(4)
28516         .m(4)
28517         .n(4)
28518         .k(k)
28519         .a_stride(83)
28520         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28521     }
28522   }
28523 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,k_div_8_subtile)28524   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, k_div_8_subtile) {
28525     TEST_REQUIRES_X86_SSE41;
28526     for (size_t k = 16; k <= 80; k += 8) {
28527       for (uint32_t n = 1; n <= 4; n++) {
28528         for (uint32_t m = 1; m <= 4; m++) {
28529           GemmMicrokernelTester()
28530             .mr(4)
28531             .nr(4)
28532             .kr(2)
28533             .sr(4)
28534             .m(m)
28535             .n(n)
28536             .k(k)
28537             .iterations(1)
28538             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28539         }
28540       }
28541     }
28542   }
28543 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_gt_4)28544   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_gt_4) {
28545     TEST_REQUIRES_X86_SSE41;
28546     for (uint32_t n = 5; n < 8; n++) {
28547       for (size_t k = 1; k <= 40; k += 9) {
28548         GemmMicrokernelTester()
28549           .mr(4)
28550           .nr(4)
28551           .kr(2)
28552           .sr(4)
28553           .m(4)
28554           .n(n)
28555           .k(k)
28556           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28557       }
28558     }
28559   }
28560 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_gt_4_strided_cn)28561   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_gt_4_strided_cn) {
28562     TEST_REQUIRES_X86_SSE41;
28563     for (uint32_t n = 5; n < 8; n++) {
28564       for (size_t k = 1; k <= 40; k += 9) {
28565         GemmMicrokernelTester()
28566           .mr(4)
28567           .nr(4)
28568           .kr(2)
28569           .sr(4)
28570           .m(4)
28571           .n(n)
28572           .k(k)
28573           .cn_stride(7)
28574           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28575       }
28576     }
28577   }
28578 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_gt_4_strided_a)28579   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_gt_4_strided_a) {
28580     TEST_REQUIRES_X86_SSE41;
28581     for (uint32_t n = 5; n < 8; n++) {
28582       for (size_t k = 1; k <= 40; k += 9) {
28583         GemmMicrokernelTester()
28584           .mr(4)
28585           .nr(4)
28586           .kr(2)
28587           .sr(4)
28588           .m(4)
28589           .n(n)
28590           .k(k)
28591           .a_stride(43)
28592           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28593       }
28594     }
28595   }
28596 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_gt_4_subtile)28597   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_gt_4_subtile) {
28598     TEST_REQUIRES_X86_SSE41;
28599     for (uint32_t n = 5; n < 8; n++) {
28600       for (size_t k = 1; k <= 40; k += 9) {
28601         for (uint32_t m = 1; m <= 4; m++) {
28602           GemmMicrokernelTester()
28603             .mr(4)
28604             .nr(4)
28605             .kr(2)
28606             .sr(4)
28607             .m(m)
28608             .n(n)
28609             .k(k)
28610             .iterations(1)
28611             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28612         }
28613       }
28614     }
28615   }
28616 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_div_4)28617   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_div_4) {
28618     TEST_REQUIRES_X86_SSE41;
28619     for (uint32_t n = 8; n <= 12; n += 4) {
28620       for (size_t k = 1; k <= 40; k += 9) {
28621         GemmMicrokernelTester()
28622           .mr(4)
28623           .nr(4)
28624           .kr(2)
28625           .sr(4)
28626           .m(4)
28627           .n(n)
28628           .k(k)
28629           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28630       }
28631     }
28632   }
28633 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_div_4_strided_cn)28634   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_div_4_strided_cn) {
28635     TEST_REQUIRES_X86_SSE41;
28636     for (uint32_t n = 8; n <= 12; n += 4) {
28637       for (size_t k = 1; k <= 40; k += 9) {
28638         GemmMicrokernelTester()
28639           .mr(4)
28640           .nr(4)
28641           .kr(2)
28642           .sr(4)
28643           .m(4)
28644           .n(n)
28645           .k(k)
28646           .cn_stride(7)
28647           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28648       }
28649     }
28650   }
28651 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_div_4_strided_a)28652   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_div_4_strided_a) {
28653     TEST_REQUIRES_X86_SSE41;
28654     for (uint32_t n = 8; n <= 12; n += 4) {
28655       for (size_t k = 1; k <= 40; k += 9) {
28656         GemmMicrokernelTester()
28657           .mr(4)
28658           .nr(4)
28659           .kr(2)
28660           .sr(4)
28661           .m(4)
28662           .n(n)
28663           .k(k)
28664           .a_stride(43)
28665           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28666       }
28667     }
28668   }
28669 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,n_div_4_subtile)28670   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, n_div_4_subtile) {
28671     TEST_REQUIRES_X86_SSE41;
28672     for (uint32_t n = 8; n <= 12; n += 4) {
28673       for (size_t k = 1; k <= 40; k += 9) {
28674         for (uint32_t m = 1; m <= 4; m++) {
28675           GemmMicrokernelTester()
28676             .mr(4)
28677             .nr(4)
28678             .kr(2)
28679             .sr(4)
28680             .m(m)
28681             .n(n)
28682             .k(k)
28683             .iterations(1)
28684             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28685         }
28686       }
28687     }
28688   }
28689 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,strided_cm_subtile)28690   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, strided_cm_subtile) {
28691     TEST_REQUIRES_X86_SSE41;
28692     for (size_t k = 1; k <= 40; k += 9) {
28693       for (uint32_t n = 1; n <= 4; n++) {
28694         for (uint32_t m = 1; m <= 4; m++) {
28695           GemmMicrokernelTester()
28696             .mr(4)
28697             .nr(4)
28698             .kr(2)
28699             .sr(4)
28700             .m(m)
28701             .n(n)
28702             .k(k)
28703             .cm_stride(7)
28704             .iterations(1)
28705             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28706         }
28707       }
28708     }
28709   }
28710 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,qmin)28711   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, qmin) {
28712     TEST_REQUIRES_X86_SSE41;
28713     GemmMicrokernelTester()
28714       .mr(4)
28715       .nr(4)
28716       .kr(2)
28717       .sr(4)
28718       .m(4)
28719       .n(4)
28720       .k(8)
28721       .qmin(128)
28722       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28723   }
28724 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,qmax)28725   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, qmax) {
28726     TEST_REQUIRES_X86_SSE41;
28727     GemmMicrokernelTester()
28728       .mr(4)
28729       .nr(4)
28730       .kr(2)
28731       .sr(4)
28732       .m(4)
28733       .n(4)
28734       .k(8)
28735       .qmax(128)
28736       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28737   }
28738 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128,strided_cm)28739   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__SSE41_LD128, strided_cm) {
28740     TEST_REQUIRES_X86_SSE41;
28741     GemmMicrokernelTester()
28742       .mr(4)
28743       .nr(4)
28744       .kr(2)
28745       .sr(4)
28746       .m(4)
28747       .n(4)
28748       .k(8)
28749       .cm_stride(7)
28750       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28751   }
28752 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
28753 
28754 
28755 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_eq_8)28756   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_eq_8) {
28757     TEST_REQUIRES_X86_AVX;
28758     GemmMicrokernelTester()
28759       .mr(1)
28760       .nr(4)
28761       .kr(2)
28762       .sr(4)
28763       .m(1)
28764       .n(4)
28765       .k(8)
28766       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28767   }
28768 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,strided_cn)28769   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, strided_cn) {
28770     TEST_REQUIRES_X86_AVX;
28771     GemmMicrokernelTester()
28772       .mr(1)
28773       .nr(4)
28774       .kr(2)
28775       .sr(4)
28776       .m(1)
28777       .n(4)
28778       .k(8)
28779       .cn_stride(7)
28780       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28781   }
28782 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_eq_8_strided_a)28783   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_eq_8_strided_a) {
28784     TEST_REQUIRES_X86_AVX;
28785     GemmMicrokernelTester()
28786       .mr(1)
28787       .nr(4)
28788       .kr(2)
28789       .sr(4)
28790       .m(1)
28791       .n(4)
28792       .k(8)
28793       .a_stride(11)
28794       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28795   }
28796 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_eq_8_subtile)28797   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_eq_8_subtile) {
28798     TEST_REQUIRES_X86_AVX;
28799     for (uint32_t n = 1; n <= 4; n++) {
28800       for (uint32_t m = 1; m <= 1; m++) {
28801         GemmMicrokernelTester()
28802           .mr(1)
28803           .nr(4)
28804           .kr(2)
28805           .sr(4)
28806           .m(m)
28807           .n(n)
28808           .k(8)
28809           .iterations(1)
28810           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28811       }
28812     }
28813   }
28814 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_eq_8_subtile_m)28815   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_eq_8_subtile_m) {
28816     TEST_REQUIRES_X86_AVX;
28817     for (uint32_t m = 1; m <= 1; m++) {
28818       GemmMicrokernelTester()
28819         .mr(1)
28820         .nr(4)
28821         .kr(2)
28822         .sr(4)
28823         .m(m)
28824         .n(4)
28825         .k(8)
28826         .iterations(1)
28827         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28828     }
28829   }
28830 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_eq_8_subtile_n)28831   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_eq_8_subtile_n) {
28832     TEST_REQUIRES_X86_AVX;
28833     for (uint32_t n = 1; n <= 4; n++) {
28834       GemmMicrokernelTester()
28835         .mr(1)
28836         .nr(4)
28837         .kr(2)
28838         .sr(4)
28839         .m(1)
28840         .n(n)
28841         .k(8)
28842         .iterations(1)
28843         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28844     }
28845   }
28846 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_lt_8)28847   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_lt_8) {
28848     TEST_REQUIRES_X86_AVX;
28849     for (size_t k = 1; k < 8; k++) {
28850       GemmMicrokernelTester()
28851         .mr(1)
28852         .nr(4)
28853         .kr(2)
28854         .sr(4)
28855         .m(1)
28856         .n(4)
28857         .k(k)
28858         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28859     }
28860   }
28861 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_lt_8_strided_a)28862   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_lt_8_strided_a) {
28863     TEST_REQUIRES_X86_AVX;
28864     for (size_t k = 1; k < 8; k++) {
28865       GemmMicrokernelTester()
28866         .mr(1)
28867         .nr(4)
28868         .kr(2)
28869         .sr(4)
28870         .m(1)
28871         .n(4)
28872         .k(k)
28873         .a_stride(11)
28874         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28875     }
28876   }
28877 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_lt_8_subtile)28878   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_lt_8_subtile) {
28879     TEST_REQUIRES_X86_AVX;
28880     for (size_t k = 1; k < 8; k++) {
28881       for (uint32_t n = 1; n <= 4; n++) {
28882         for (uint32_t m = 1; m <= 1; m++) {
28883           GemmMicrokernelTester()
28884             .mr(1)
28885             .nr(4)
28886             .kr(2)
28887             .sr(4)
28888             .m(m)
28889             .n(n)
28890             .k(k)
28891             .iterations(1)
28892             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28893         }
28894       }
28895     }
28896   }
28897 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_gt_8)28898   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_gt_8) {
28899     TEST_REQUIRES_X86_AVX;
28900     for (size_t k = 9; k < 16; k++) {
28901       GemmMicrokernelTester()
28902         .mr(1)
28903         .nr(4)
28904         .kr(2)
28905         .sr(4)
28906         .m(1)
28907         .n(4)
28908         .k(k)
28909         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28910     }
28911   }
28912 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_gt_8_strided_a)28913   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_gt_8_strided_a) {
28914     TEST_REQUIRES_X86_AVX;
28915     for (size_t k = 9; k < 16; k++) {
28916       GemmMicrokernelTester()
28917         .mr(1)
28918         .nr(4)
28919         .kr(2)
28920         .sr(4)
28921         .m(1)
28922         .n(4)
28923         .k(k)
28924         .a_stride(19)
28925         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28926     }
28927   }
28928 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_gt_8_subtile)28929   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_gt_8_subtile) {
28930     TEST_REQUIRES_X86_AVX;
28931     for (size_t k = 9; k < 16; k++) {
28932       for (uint32_t n = 1; n <= 4; n++) {
28933         for (uint32_t m = 1; m <= 1; m++) {
28934           GemmMicrokernelTester()
28935             .mr(1)
28936             .nr(4)
28937             .kr(2)
28938             .sr(4)
28939             .m(m)
28940             .n(n)
28941             .k(k)
28942             .iterations(1)
28943             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28944         }
28945       }
28946     }
28947   }
28948 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_div_8)28949   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_div_8) {
28950     TEST_REQUIRES_X86_AVX;
28951     for (size_t k = 16; k <= 80; k += 8) {
28952       GemmMicrokernelTester()
28953         .mr(1)
28954         .nr(4)
28955         .kr(2)
28956         .sr(4)
28957         .m(1)
28958         .n(4)
28959         .k(k)
28960         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28961     }
28962   }
28963 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_div_8_strided_a)28964   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_div_8_strided_a) {
28965     TEST_REQUIRES_X86_AVX;
28966     for (size_t k = 16; k <= 80; k += 8) {
28967       GemmMicrokernelTester()
28968         .mr(1)
28969         .nr(4)
28970         .kr(2)
28971         .sr(4)
28972         .m(1)
28973         .n(4)
28974         .k(k)
28975         .a_stride(83)
28976         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28977     }
28978   }
28979 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,k_div_8_subtile)28980   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, k_div_8_subtile) {
28981     TEST_REQUIRES_X86_AVX;
28982     for (size_t k = 16; k <= 80; k += 8) {
28983       for (uint32_t n = 1; n <= 4; n++) {
28984         for (uint32_t m = 1; m <= 1; m++) {
28985           GemmMicrokernelTester()
28986             .mr(1)
28987             .nr(4)
28988             .kr(2)
28989             .sr(4)
28990             .m(m)
28991             .n(n)
28992             .k(k)
28993             .iterations(1)
28994             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
28995         }
28996       }
28997     }
28998   }
28999 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_gt_4)29000   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_gt_4) {
29001     TEST_REQUIRES_X86_AVX;
29002     for (uint32_t n = 5; n < 8; n++) {
29003       for (size_t k = 1; k <= 40; k += 9) {
29004         GemmMicrokernelTester()
29005           .mr(1)
29006           .nr(4)
29007           .kr(2)
29008           .sr(4)
29009           .m(1)
29010           .n(n)
29011           .k(k)
29012           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29013       }
29014     }
29015   }
29016 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_gt_4_strided_cn)29017   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_gt_4_strided_cn) {
29018     TEST_REQUIRES_X86_AVX;
29019     for (uint32_t n = 5; n < 8; n++) {
29020       for (size_t k = 1; k <= 40; k += 9) {
29021         GemmMicrokernelTester()
29022           .mr(1)
29023           .nr(4)
29024           .kr(2)
29025           .sr(4)
29026           .m(1)
29027           .n(n)
29028           .k(k)
29029           .cn_stride(7)
29030           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29031       }
29032     }
29033   }
29034 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_gt_4_strided_a)29035   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_gt_4_strided_a) {
29036     TEST_REQUIRES_X86_AVX;
29037     for (uint32_t n = 5; n < 8; n++) {
29038       for (size_t k = 1; k <= 40; k += 9) {
29039         GemmMicrokernelTester()
29040           .mr(1)
29041           .nr(4)
29042           .kr(2)
29043           .sr(4)
29044           .m(1)
29045           .n(n)
29046           .k(k)
29047           .a_stride(43)
29048           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29049       }
29050     }
29051   }
29052 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_gt_4_subtile)29053   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_gt_4_subtile) {
29054     TEST_REQUIRES_X86_AVX;
29055     for (uint32_t n = 5; n < 8; n++) {
29056       for (size_t k = 1; k <= 40; k += 9) {
29057         for (uint32_t m = 1; m <= 1; m++) {
29058           GemmMicrokernelTester()
29059             .mr(1)
29060             .nr(4)
29061             .kr(2)
29062             .sr(4)
29063             .m(m)
29064             .n(n)
29065             .k(k)
29066             .iterations(1)
29067             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29068         }
29069       }
29070     }
29071   }
29072 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_div_4)29073   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_div_4) {
29074     TEST_REQUIRES_X86_AVX;
29075     for (uint32_t n = 8; n <= 12; n += 4) {
29076       for (size_t k = 1; k <= 40; k += 9) {
29077         GemmMicrokernelTester()
29078           .mr(1)
29079           .nr(4)
29080           .kr(2)
29081           .sr(4)
29082           .m(1)
29083           .n(n)
29084           .k(k)
29085           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29086       }
29087     }
29088   }
29089 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_div_4_strided_cn)29090   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_div_4_strided_cn) {
29091     TEST_REQUIRES_X86_AVX;
29092     for (uint32_t n = 8; n <= 12; n += 4) {
29093       for (size_t k = 1; k <= 40; k += 9) {
29094         GemmMicrokernelTester()
29095           .mr(1)
29096           .nr(4)
29097           .kr(2)
29098           .sr(4)
29099           .m(1)
29100           .n(n)
29101           .k(k)
29102           .cn_stride(7)
29103           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29104       }
29105     }
29106   }
29107 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_div_4_strided_a)29108   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_div_4_strided_a) {
29109     TEST_REQUIRES_X86_AVX;
29110     for (uint32_t n = 8; n <= 12; n += 4) {
29111       for (size_t k = 1; k <= 40; k += 9) {
29112         GemmMicrokernelTester()
29113           .mr(1)
29114           .nr(4)
29115           .kr(2)
29116           .sr(4)
29117           .m(1)
29118           .n(n)
29119           .k(k)
29120           .a_stride(43)
29121           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29122       }
29123     }
29124   }
29125 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,n_div_4_subtile)29126   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, n_div_4_subtile) {
29127     TEST_REQUIRES_X86_AVX;
29128     for (uint32_t n = 8; n <= 12; n += 4) {
29129       for (size_t k = 1; k <= 40; k += 9) {
29130         for (uint32_t m = 1; m <= 1; m++) {
29131           GemmMicrokernelTester()
29132             .mr(1)
29133             .nr(4)
29134             .kr(2)
29135             .sr(4)
29136             .m(m)
29137             .n(n)
29138             .k(k)
29139             .iterations(1)
29140             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29141         }
29142       }
29143     }
29144   }
29145 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,strided_cm_subtile)29146   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, strided_cm_subtile) {
29147     TEST_REQUIRES_X86_AVX;
29148     for (size_t k = 1; k <= 40; k += 9) {
29149       for (uint32_t n = 1; n <= 4; n++) {
29150         for (uint32_t m = 1; m <= 1; m++) {
29151           GemmMicrokernelTester()
29152             .mr(1)
29153             .nr(4)
29154             .kr(2)
29155             .sr(4)
29156             .m(m)
29157             .n(n)
29158             .k(k)
29159             .cm_stride(7)
29160             .iterations(1)
29161             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29162         }
29163       }
29164     }
29165   }
29166 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,qmin)29167   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, qmin) {
29168     TEST_REQUIRES_X86_AVX;
29169     GemmMicrokernelTester()
29170       .mr(1)
29171       .nr(4)
29172       .kr(2)
29173       .sr(4)
29174       .m(1)
29175       .n(4)
29176       .k(8)
29177       .qmin(128)
29178       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29179   }
29180 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,qmax)29181   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, qmax) {
29182     TEST_REQUIRES_X86_AVX;
29183     GemmMicrokernelTester()
29184       .mr(1)
29185       .nr(4)
29186       .kr(2)
29187       .sr(4)
29188       .m(1)
29189       .n(4)
29190       .k(8)
29191       .qmax(128)
29192       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29193   }
29194 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128,strided_cm)29195   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__AVX_LD128, strided_cm) {
29196     TEST_REQUIRES_X86_AVX;
29197     GemmMicrokernelTester()
29198       .mr(1)
29199       .nr(4)
29200       .kr(2)
29201       .sr(4)
29202       .m(1)
29203       .n(4)
29204       .k(8)
29205       .cm_stride(7)
29206       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29207   }
29208 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
29209 
29210 
29211 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_eq_8)29212   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_eq_8) {
29213     TEST_REQUIRES_X86_AVX;
29214     GemmMicrokernelTester()
29215       .mr(2)
29216       .nr(4)
29217       .kr(2)
29218       .sr(4)
29219       .m(2)
29220       .n(4)
29221       .k(8)
29222       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29223   }
29224 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,strided_cn)29225   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, strided_cn) {
29226     TEST_REQUIRES_X86_AVX;
29227     GemmMicrokernelTester()
29228       .mr(2)
29229       .nr(4)
29230       .kr(2)
29231       .sr(4)
29232       .m(2)
29233       .n(4)
29234       .k(8)
29235       .cn_stride(7)
29236       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29237   }
29238 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_eq_8_strided_a)29239   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_eq_8_strided_a) {
29240     TEST_REQUIRES_X86_AVX;
29241     GemmMicrokernelTester()
29242       .mr(2)
29243       .nr(4)
29244       .kr(2)
29245       .sr(4)
29246       .m(2)
29247       .n(4)
29248       .k(8)
29249       .a_stride(11)
29250       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29251   }
29252 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_eq_8_subtile)29253   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_eq_8_subtile) {
29254     TEST_REQUIRES_X86_AVX;
29255     for (uint32_t n = 1; n <= 4; n++) {
29256       for (uint32_t m = 1; m <= 2; m++) {
29257         GemmMicrokernelTester()
29258           .mr(2)
29259           .nr(4)
29260           .kr(2)
29261           .sr(4)
29262           .m(m)
29263           .n(n)
29264           .k(8)
29265           .iterations(1)
29266           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29267       }
29268     }
29269   }
29270 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_eq_8_subtile_m)29271   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_eq_8_subtile_m) {
29272     TEST_REQUIRES_X86_AVX;
29273     for (uint32_t m = 1; m <= 2; m++) {
29274       GemmMicrokernelTester()
29275         .mr(2)
29276         .nr(4)
29277         .kr(2)
29278         .sr(4)
29279         .m(m)
29280         .n(4)
29281         .k(8)
29282         .iterations(1)
29283         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29284     }
29285   }
29286 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_eq_8_subtile_n)29287   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_eq_8_subtile_n) {
29288     TEST_REQUIRES_X86_AVX;
29289     for (uint32_t n = 1; n <= 4; n++) {
29290       GemmMicrokernelTester()
29291         .mr(2)
29292         .nr(4)
29293         .kr(2)
29294         .sr(4)
29295         .m(2)
29296         .n(n)
29297         .k(8)
29298         .iterations(1)
29299         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29300     }
29301   }
29302 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_lt_8)29303   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_lt_8) {
29304     TEST_REQUIRES_X86_AVX;
29305     for (size_t k = 1; k < 8; k++) {
29306       GemmMicrokernelTester()
29307         .mr(2)
29308         .nr(4)
29309         .kr(2)
29310         .sr(4)
29311         .m(2)
29312         .n(4)
29313         .k(k)
29314         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29315     }
29316   }
29317 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_lt_8_strided_a)29318   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_lt_8_strided_a) {
29319     TEST_REQUIRES_X86_AVX;
29320     for (size_t k = 1; k < 8; k++) {
29321       GemmMicrokernelTester()
29322         .mr(2)
29323         .nr(4)
29324         .kr(2)
29325         .sr(4)
29326         .m(2)
29327         .n(4)
29328         .k(k)
29329         .a_stride(11)
29330         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29331     }
29332   }
29333 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_lt_8_subtile)29334   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_lt_8_subtile) {
29335     TEST_REQUIRES_X86_AVX;
29336     for (size_t k = 1; k < 8; k++) {
29337       for (uint32_t n = 1; n <= 4; n++) {
29338         for (uint32_t m = 1; m <= 2; m++) {
29339           GemmMicrokernelTester()
29340             .mr(2)
29341             .nr(4)
29342             .kr(2)
29343             .sr(4)
29344             .m(m)
29345             .n(n)
29346             .k(k)
29347             .iterations(1)
29348             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29349         }
29350       }
29351     }
29352   }
29353 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_gt_8)29354   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_gt_8) {
29355     TEST_REQUIRES_X86_AVX;
29356     for (size_t k = 9; k < 16; k++) {
29357       GemmMicrokernelTester()
29358         .mr(2)
29359         .nr(4)
29360         .kr(2)
29361         .sr(4)
29362         .m(2)
29363         .n(4)
29364         .k(k)
29365         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29366     }
29367   }
29368 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_gt_8_strided_a)29369   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_gt_8_strided_a) {
29370     TEST_REQUIRES_X86_AVX;
29371     for (size_t k = 9; k < 16; k++) {
29372       GemmMicrokernelTester()
29373         .mr(2)
29374         .nr(4)
29375         .kr(2)
29376         .sr(4)
29377         .m(2)
29378         .n(4)
29379         .k(k)
29380         .a_stride(19)
29381         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29382     }
29383   }
29384 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_gt_8_subtile)29385   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_gt_8_subtile) {
29386     TEST_REQUIRES_X86_AVX;
29387     for (size_t k = 9; k < 16; k++) {
29388       for (uint32_t n = 1; n <= 4; n++) {
29389         for (uint32_t m = 1; m <= 2; m++) {
29390           GemmMicrokernelTester()
29391             .mr(2)
29392             .nr(4)
29393             .kr(2)
29394             .sr(4)
29395             .m(m)
29396             .n(n)
29397             .k(k)
29398             .iterations(1)
29399             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29400         }
29401       }
29402     }
29403   }
29404 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_div_8)29405   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_div_8) {
29406     TEST_REQUIRES_X86_AVX;
29407     for (size_t k = 16; k <= 80; k += 8) {
29408       GemmMicrokernelTester()
29409         .mr(2)
29410         .nr(4)
29411         .kr(2)
29412         .sr(4)
29413         .m(2)
29414         .n(4)
29415         .k(k)
29416         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29417     }
29418   }
29419 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_div_8_strided_a)29420   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_div_8_strided_a) {
29421     TEST_REQUIRES_X86_AVX;
29422     for (size_t k = 16; k <= 80; k += 8) {
29423       GemmMicrokernelTester()
29424         .mr(2)
29425         .nr(4)
29426         .kr(2)
29427         .sr(4)
29428         .m(2)
29429         .n(4)
29430         .k(k)
29431         .a_stride(83)
29432         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29433     }
29434   }
29435 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,k_div_8_subtile)29436   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, k_div_8_subtile) {
29437     TEST_REQUIRES_X86_AVX;
29438     for (size_t k = 16; k <= 80; k += 8) {
29439       for (uint32_t n = 1; n <= 4; n++) {
29440         for (uint32_t m = 1; m <= 2; m++) {
29441           GemmMicrokernelTester()
29442             .mr(2)
29443             .nr(4)
29444             .kr(2)
29445             .sr(4)
29446             .m(m)
29447             .n(n)
29448             .k(k)
29449             .iterations(1)
29450             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29451         }
29452       }
29453     }
29454   }
29455 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_gt_4)29456   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_gt_4) {
29457     TEST_REQUIRES_X86_AVX;
29458     for (uint32_t n = 5; n < 8; n++) {
29459       for (size_t k = 1; k <= 40; k += 9) {
29460         GemmMicrokernelTester()
29461           .mr(2)
29462           .nr(4)
29463           .kr(2)
29464           .sr(4)
29465           .m(2)
29466           .n(n)
29467           .k(k)
29468           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29469       }
29470     }
29471   }
29472 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_gt_4_strided_cn)29473   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_gt_4_strided_cn) {
29474     TEST_REQUIRES_X86_AVX;
29475     for (uint32_t n = 5; n < 8; n++) {
29476       for (size_t k = 1; k <= 40; k += 9) {
29477         GemmMicrokernelTester()
29478           .mr(2)
29479           .nr(4)
29480           .kr(2)
29481           .sr(4)
29482           .m(2)
29483           .n(n)
29484           .k(k)
29485           .cn_stride(7)
29486           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29487       }
29488     }
29489   }
29490 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_gt_4_strided_a)29491   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_gt_4_strided_a) {
29492     TEST_REQUIRES_X86_AVX;
29493     for (uint32_t n = 5; n < 8; n++) {
29494       for (size_t k = 1; k <= 40; k += 9) {
29495         GemmMicrokernelTester()
29496           .mr(2)
29497           .nr(4)
29498           .kr(2)
29499           .sr(4)
29500           .m(2)
29501           .n(n)
29502           .k(k)
29503           .a_stride(43)
29504           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29505       }
29506     }
29507   }
29508 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_gt_4_subtile)29509   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_gt_4_subtile) {
29510     TEST_REQUIRES_X86_AVX;
29511     for (uint32_t n = 5; n < 8; n++) {
29512       for (size_t k = 1; k <= 40; k += 9) {
29513         for (uint32_t m = 1; m <= 2; m++) {
29514           GemmMicrokernelTester()
29515             .mr(2)
29516             .nr(4)
29517             .kr(2)
29518             .sr(4)
29519             .m(m)
29520             .n(n)
29521             .k(k)
29522             .iterations(1)
29523             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29524         }
29525       }
29526     }
29527   }
29528 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_div_4)29529   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_div_4) {
29530     TEST_REQUIRES_X86_AVX;
29531     for (uint32_t n = 8; n <= 12; n += 4) {
29532       for (size_t k = 1; k <= 40; k += 9) {
29533         GemmMicrokernelTester()
29534           .mr(2)
29535           .nr(4)
29536           .kr(2)
29537           .sr(4)
29538           .m(2)
29539           .n(n)
29540           .k(k)
29541           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29542       }
29543     }
29544   }
29545 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_div_4_strided_cn)29546   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_div_4_strided_cn) {
29547     TEST_REQUIRES_X86_AVX;
29548     for (uint32_t n = 8; n <= 12; n += 4) {
29549       for (size_t k = 1; k <= 40; k += 9) {
29550         GemmMicrokernelTester()
29551           .mr(2)
29552           .nr(4)
29553           .kr(2)
29554           .sr(4)
29555           .m(2)
29556           .n(n)
29557           .k(k)
29558           .cn_stride(7)
29559           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29560       }
29561     }
29562   }
29563 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_div_4_strided_a)29564   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_div_4_strided_a) {
29565     TEST_REQUIRES_X86_AVX;
29566     for (uint32_t n = 8; n <= 12; n += 4) {
29567       for (size_t k = 1; k <= 40; k += 9) {
29568         GemmMicrokernelTester()
29569           .mr(2)
29570           .nr(4)
29571           .kr(2)
29572           .sr(4)
29573           .m(2)
29574           .n(n)
29575           .k(k)
29576           .a_stride(43)
29577           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29578       }
29579     }
29580   }
29581 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,n_div_4_subtile)29582   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, n_div_4_subtile) {
29583     TEST_REQUIRES_X86_AVX;
29584     for (uint32_t n = 8; n <= 12; n += 4) {
29585       for (size_t k = 1; k <= 40; k += 9) {
29586         for (uint32_t m = 1; m <= 2; m++) {
29587           GemmMicrokernelTester()
29588             .mr(2)
29589             .nr(4)
29590             .kr(2)
29591             .sr(4)
29592             .m(m)
29593             .n(n)
29594             .k(k)
29595             .iterations(1)
29596             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29597         }
29598       }
29599     }
29600   }
29601 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,strided_cm_subtile)29602   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, strided_cm_subtile) {
29603     TEST_REQUIRES_X86_AVX;
29604     for (size_t k = 1; k <= 40; k += 9) {
29605       for (uint32_t n = 1; n <= 4; n++) {
29606         for (uint32_t m = 1; m <= 2; m++) {
29607           GemmMicrokernelTester()
29608             .mr(2)
29609             .nr(4)
29610             .kr(2)
29611             .sr(4)
29612             .m(m)
29613             .n(n)
29614             .k(k)
29615             .cm_stride(7)
29616             .iterations(1)
29617             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29618         }
29619       }
29620     }
29621   }
29622 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,qmin)29623   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, qmin) {
29624     TEST_REQUIRES_X86_AVX;
29625     GemmMicrokernelTester()
29626       .mr(2)
29627       .nr(4)
29628       .kr(2)
29629       .sr(4)
29630       .m(2)
29631       .n(4)
29632       .k(8)
29633       .qmin(128)
29634       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29635   }
29636 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,qmax)29637   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, qmax) {
29638     TEST_REQUIRES_X86_AVX;
29639     GemmMicrokernelTester()
29640       .mr(2)
29641       .nr(4)
29642       .kr(2)
29643       .sr(4)
29644       .m(2)
29645       .n(4)
29646       .k(8)
29647       .qmax(128)
29648       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29649   }
29650 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128,strided_cm)29651   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__AVX_LD128, strided_cm) {
29652     TEST_REQUIRES_X86_AVX;
29653     GemmMicrokernelTester()
29654       .mr(2)
29655       .nr(4)
29656       .kr(2)
29657       .sr(4)
29658       .m(2)
29659       .n(4)
29660       .k(8)
29661       .cm_stride(7)
29662       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29663   }
29664 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
29665 
29666 
29667 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_eq_8)29668   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_eq_8) {
29669     TEST_REQUIRES_X86_XOP;
29670     GemmMicrokernelTester()
29671       .mr(3)
29672       .nr(4)
29673       .kr(2)
29674       .sr(4)
29675       .m(3)
29676       .n(4)
29677       .k(8)
29678       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29679   }
29680 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,strided_cn)29681   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, strided_cn) {
29682     TEST_REQUIRES_X86_XOP;
29683     GemmMicrokernelTester()
29684       .mr(3)
29685       .nr(4)
29686       .kr(2)
29687       .sr(4)
29688       .m(3)
29689       .n(4)
29690       .k(8)
29691       .cn_stride(7)
29692       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29693   }
29694 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_eq_8_strided_a)29695   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_eq_8_strided_a) {
29696     TEST_REQUIRES_X86_XOP;
29697     GemmMicrokernelTester()
29698       .mr(3)
29699       .nr(4)
29700       .kr(2)
29701       .sr(4)
29702       .m(3)
29703       .n(4)
29704       .k(8)
29705       .a_stride(11)
29706       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29707   }
29708 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_eq_8_subtile)29709   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_eq_8_subtile) {
29710     TEST_REQUIRES_X86_XOP;
29711     for (uint32_t n = 1; n <= 4; n++) {
29712       for (uint32_t m = 1; m <= 3; m++) {
29713         GemmMicrokernelTester()
29714           .mr(3)
29715           .nr(4)
29716           .kr(2)
29717           .sr(4)
29718           .m(m)
29719           .n(n)
29720           .k(8)
29721           .iterations(1)
29722           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29723       }
29724     }
29725   }
29726 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_eq_8_subtile_m)29727   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_eq_8_subtile_m) {
29728     TEST_REQUIRES_X86_XOP;
29729     for (uint32_t m = 1; m <= 3; m++) {
29730       GemmMicrokernelTester()
29731         .mr(3)
29732         .nr(4)
29733         .kr(2)
29734         .sr(4)
29735         .m(m)
29736         .n(4)
29737         .k(8)
29738         .iterations(1)
29739         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29740     }
29741   }
29742 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_eq_8_subtile_n)29743   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_eq_8_subtile_n) {
29744     TEST_REQUIRES_X86_XOP;
29745     for (uint32_t n = 1; n <= 4; n++) {
29746       GemmMicrokernelTester()
29747         .mr(3)
29748         .nr(4)
29749         .kr(2)
29750         .sr(4)
29751         .m(3)
29752         .n(n)
29753         .k(8)
29754         .iterations(1)
29755         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29756     }
29757   }
29758 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_lt_8)29759   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_lt_8) {
29760     TEST_REQUIRES_X86_XOP;
29761     for (size_t k = 1; k < 8; k++) {
29762       GemmMicrokernelTester()
29763         .mr(3)
29764         .nr(4)
29765         .kr(2)
29766         .sr(4)
29767         .m(3)
29768         .n(4)
29769         .k(k)
29770         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29771     }
29772   }
29773 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_lt_8_strided_a)29774   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_lt_8_strided_a) {
29775     TEST_REQUIRES_X86_XOP;
29776     for (size_t k = 1; k < 8; k++) {
29777       GemmMicrokernelTester()
29778         .mr(3)
29779         .nr(4)
29780         .kr(2)
29781         .sr(4)
29782         .m(3)
29783         .n(4)
29784         .k(k)
29785         .a_stride(11)
29786         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29787     }
29788   }
29789 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_lt_8_subtile)29790   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_lt_8_subtile) {
29791     TEST_REQUIRES_X86_XOP;
29792     for (size_t k = 1; k < 8; k++) {
29793       for (uint32_t n = 1; n <= 4; n++) {
29794         for (uint32_t m = 1; m <= 3; m++) {
29795           GemmMicrokernelTester()
29796             .mr(3)
29797             .nr(4)
29798             .kr(2)
29799             .sr(4)
29800             .m(m)
29801             .n(n)
29802             .k(k)
29803             .iterations(1)
29804             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29805         }
29806       }
29807     }
29808   }
29809 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_gt_8)29810   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_gt_8) {
29811     TEST_REQUIRES_X86_XOP;
29812     for (size_t k = 9; k < 16; k++) {
29813       GemmMicrokernelTester()
29814         .mr(3)
29815         .nr(4)
29816         .kr(2)
29817         .sr(4)
29818         .m(3)
29819         .n(4)
29820         .k(k)
29821         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29822     }
29823   }
29824 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_gt_8_strided_a)29825   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_gt_8_strided_a) {
29826     TEST_REQUIRES_X86_XOP;
29827     for (size_t k = 9; k < 16; k++) {
29828       GemmMicrokernelTester()
29829         .mr(3)
29830         .nr(4)
29831         .kr(2)
29832         .sr(4)
29833         .m(3)
29834         .n(4)
29835         .k(k)
29836         .a_stride(19)
29837         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29838     }
29839   }
29840 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_gt_8_subtile)29841   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_gt_8_subtile) {
29842     TEST_REQUIRES_X86_XOP;
29843     for (size_t k = 9; k < 16; k++) {
29844       for (uint32_t n = 1; n <= 4; n++) {
29845         for (uint32_t m = 1; m <= 3; m++) {
29846           GemmMicrokernelTester()
29847             .mr(3)
29848             .nr(4)
29849             .kr(2)
29850             .sr(4)
29851             .m(m)
29852             .n(n)
29853             .k(k)
29854             .iterations(1)
29855             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29856         }
29857       }
29858     }
29859   }
29860 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_div_8)29861   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_div_8) {
29862     TEST_REQUIRES_X86_XOP;
29863     for (size_t k = 16; k <= 80; k += 8) {
29864       GemmMicrokernelTester()
29865         .mr(3)
29866         .nr(4)
29867         .kr(2)
29868         .sr(4)
29869         .m(3)
29870         .n(4)
29871         .k(k)
29872         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29873     }
29874   }
29875 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_div_8_strided_a)29876   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_div_8_strided_a) {
29877     TEST_REQUIRES_X86_XOP;
29878     for (size_t k = 16; k <= 80; k += 8) {
29879       GemmMicrokernelTester()
29880         .mr(3)
29881         .nr(4)
29882         .kr(2)
29883         .sr(4)
29884         .m(3)
29885         .n(4)
29886         .k(k)
29887         .a_stride(83)
29888         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29889     }
29890   }
29891 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,k_div_8_subtile)29892   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, k_div_8_subtile) {
29893     TEST_REQUIRES_X86_XOP;
29894     for (size_t k = 16; k <= 80; k += 8) {
29895       for (uint32_t n = 1; n <= 4; n++) {
29896         for (uint32_t m = 1; m <= 3; m++) {
29897           GemmMicrokernelTester()
29898             .mr(3)
29899             .nr(4)
29900             .kr(2)
29901             .sr(4)
29902             .m(m)
29903             .n(n)
29904             .k(k)
29905             .iterations(1)
29906             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29907         }
29908       }
29909     }
29910   }
29911 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_gt_4)29912   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_gt_4) {
29913     TEST_REQUIRES_X86_XOP;
29914     for (uint32_t n = 5; n < 8; n++) {
29915       for (size_t k = 1; k <= 40; k += 9) {
29916         GemmMicrokernelTester()
29917           .mr(3)
29918           .nr(4)
29919           .kr(2)
29920           .sr(4)
29921           .m(3)
29922           .n(n)
29923           .k(k)
29924           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29925       }
29926     }
29927   }
29928 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_gt_4_strided_cn)29929   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_gt_4_strided_cn) {
29930     TEST_REQUIRES_X86_XOP;
29931     for (uint32_t n = 5; n < 8; n++) {
29932       for (size_t k = 1; k <= 40; k += 9) {
29933         GemmMicrokernelTester()
29934           .mr(3)
29935           .nr(4)
29936           .kr(2)
29937           .sr(4)
29938           .m(3)
29939           .n(n)
29940           .k(k)
29941           .cn_stride(7)
29942           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29943       }
29944     }
29945   }
29946 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_gt_4_strided_a)29947   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_gt_4_strided_a) {
29948     TEST_REQUIRES_X86_XOP;
29949     for (uint32_t n = 5; n < 8; n++) {
29950       for (size_t k = 1; k <= 40; k += 9) {
29951         GemmMicrokernelTester()
29952           .mr(3)
29953           .nr(4)
29954           .kr(2)
29955           .sr(4)
29956           .m(3)
29957           .n(n)
29958           .k(k)
29959           .a_stride(43)
29960           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29961       }
29962     }
29963   }
29964 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_gt_4_subtile)29965   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_gt_4_subtile) {
29966     TEST_REQUIRES_X86_XOP;
29967     for (uint32_t n = 5; n < 8; n++) {
29968       for (size_t k = 1; k <= 40; k += 9) {
29969         for (uint32_t m = 1; m <= 3; m++) {
29970           GemmMicrokernelTester()
29971             .mr(3)
29972             .nr(4)
29973             .kr(2)
29974             .sr(4)
29975             .m(m)
29976             .n(n)
29977             .k(k)
29978             .iterations(1)
29979             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29980         }
29981       }
29982     }
29983   }
29984 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_div_4)29985   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_div_4) {
29986     TEST_REQUIRES_X86_XOP;
29987     for (uint32_t n = 8; n <= 12; n += 4) {
29988       for (size_t k = 1; k <= 40; k += 9) {
29989         GemmMicrokernelTester()
29990           .mr(3)
29991           .nr(4)
29992           .kr(2)
29993           .sr(4)
29994           .m(3)
29995           .n(n)
29996           .k(k)
29997           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
29998       }
29999     }
30000   }
30001 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_div_4_strided_cn)30002   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_div_4_strided_cn) {
30003     TEST_REQUIRES_X86_XOP;
30004     for (uint32_t n = 8; n <= 12; n += 4) {
30005       for (size_t k = 1; k <= 40; k += 9) {
30006         GemmMicrokernelTester()
30007           .mr(3)
30008           .nr(4)
30009           .kr(2)
30010           .sr(4)
30011           .m(3)
30012           .n(n)
30013           .k(k)
30014           .cn_stride(7)
30015           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30016       }
30017     }
30018   }
30019 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_div_4_strided_a)30020   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_div_4_strided_a) {
30021     TEST_REQUIRES_X86_XOP;
30022     for (uint32_t n = 8; n <= 12; n += 4) {
30023       for (size_t k = 1; k <= 40; k += 9) {
30024         GemmMicrokernelTester()
30025           .mr(3)
30026           .nr(4)
30027           .kr(2)
30028           .sr(4)
30029           .m(3)
30030           .n(n)
30031           .k(k)
30032           .a_stride(43)
30033           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30034       }
30035     }
30036   }
30037 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,n_div_4_subtile)30038   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, n_div_4_subtile) {
30039     TEST_REQUIRES_X86_XOP;
30040     for (uint32_t n = 8; n <= 12; n += 4) {
30041       for (size_t k = 1; k <= 40; k += 9) {
30042         for (uint32_t m = 1; m <= 3; m++) {
30043           GemmMicrokernelTester()
30044             .mr(3)
30045             .nr(4)
30046             .kr(2)
30047             .sr(4)
30048             .m(m)
30049             .n(n)
30050             .k(k)
30051             .iterations(1)
30052             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30053         }
30054       }
30055     }
30056   }
30057 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,strided_cm_subtile)30058   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, strided_cm_subtile) {
30059     TEST_REQUIRES_X86_XOP;
30060     for (size_t k = 1; k <= 40; k += 9) {
30061       for (uint32_t n = 1; n <= 4; n++) {
30062         for (uint32_t m = 1; m <= 3; m++) {
30063           GemmMicrokernelTester()
30064             .mr(3)
30065             .nr(4)
30066             .kr(2)
30067             .sr(4)
30068             .m(m)
30069             .n(n)
30070             .k(k)
30071             .cm_stride(7)
30072             .iterations(1)
30073             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30074         }
30075       }
30076     }
30077   }
30078 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,qmin)30079   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, qmin) {
30080     TEST_REQUIRES_X86_XOP;
30081     GemmMicrokernelTester()
30082       .mr(3)
30083       .nr(4)
30084       .kr(2)
30085       .sr(4)
30086       .m(3)
30087       .n(4)
30088       .k(8)
30089       .qmin(128)
30090       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30091   }
30092 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,qmax)30093   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, qmax) {
30094     TEST_REQUIRES_X86_XOP;
30095     GemmMicrokernelTester()
30096       .mr(3)
30097       .nr(4)
30098       .kr(2)
30099       .sr(4)
30100       .m(3)
30101       .n(4)
30102       .k(8)
30103       .qmax(128)
30104       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30105   }
30106 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128,strided_cm)30107   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__XOP_LD128, strided_cm) {
30108     TEST_REQUIRES_X86_XOP;
30109     GemmMicrokernelTester()
30110       .mr(3)
30111       .nr(4)
30112       .kr(2)
30113       .sr(4)
30114       .m(3)
30115       .n(4)
30116       .k(8)
30117       .cm_stride(7)
30118       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30119   }
30120 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
30121 
30122 
30123 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_eq_8)30124   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_eq_8) {
30125     TEST_REQUIRES_X86_XOP;
30126     GemmMicrokernelTester()
30127       .mr(4)
30128       .nr(4)
30129       .kr(2)
30130       .sr(4)
30131       .m(4)
30132       .n(4)
30133       .k(8)
30134       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30135   }
30136 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,strided_cn)30137   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, strided_cn) {
30138     TEST_REQUIRES_X86_XOP;
30139     GemmMicrokernelTester()
30140       .mr(4)
30141       .nr(4)
30142       .kr(2)
30143       .sr(4)
30144       .m(4)
30145       .n(4)
30146       .k(8)
30147       .cn_stride(7)
30148       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30149   }
30150 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_eq_8_strided_a)30151   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_eq_8_strided_a) {
30152     TEST_REQUIRES_X86_XOP;
30153     GemmMicrokernelTester()
30154       .mr(4)
30155       .nr(4)
30156       .kr(2)
30157       .sr(4)
30158       .m(4)
30159       .n(4)
30160       .k(8)
30161       .a_stride(11)
30162       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30163   }
30164 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_eq_8_subtile)30165   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_eq_8_subtile) {
30166     TEST_REQUIRES_X86_XOP;
30167     for (uint32_t n = 1; n <= 4; n++) {
30168       for (uint32_t m = 1; m <= 4; m++) {
30169         GemmMicrokernelTester()
30170           .mr(4)
30171           .nr(4)
30172           .kr(2)
30173           .sr(4)
30174           .m(m)
30175           .n(n)
30176           .k(8)
30177           .iterations(1)
30178           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30179       }
30180     }
30181   }
30182 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_eq_8_subtile_m)30183   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_eq_8_subtile_m) {
30184     TEST_REQUIRES_X86_XOP;
30185     for (uint32_t m = 1; m <= 4; m++) {
30186       GemmMicrokernelTester()
30187         .mr(4)
30188         .nr(4)
30189         .kr(2)
30190         .sr(4)
30191         .m(m)
30192         .n(4)
30193         .k(8)
30194         .iterations(1)
30195         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30196     }
30197   }
30198 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_eq_8_subtile_n)30199   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_eq_8_subtile_n) {
30200     TEST_REQUIRES_X86_XOP;
30201     for (uint32_t n = 1; n <= 4; n++) {
30202       GemmMicrokernelTester()
30203         .mr(4)
30204         .nr(4)
30205         .kr(2)
30206         .sr(4)
30207         .m(4)
30208         .n(n)
30209         .k(8)
30210         .iterations(1)
30211         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30212     }
30213   }
30214 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_lt_8)30215   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_lt_8) {
30216     TEST_REQUIRES_X86_XOP;
30217     for (size_t k = 1; k < 8; k++) {
30218       GemmMicrokernelTester()
30219         .mr(4)
30220         .nr(4)
30221         .kr(2)
30222         .sr(4)
30223         .m(4)
30224         .n(4)
30225         .k(k)
30226         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30227     }
30228   }
30229 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_lt_8_strided_a)30230   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_lt_8_strided_a) {
30231     TEST_REQUIRES_X86_XOP;
30232     for (size_t k = 1; k < 8; k++) {
30233       GemmMicrokernelTester()
30234         .mr(4)
30235         .nr(4)
30236         .kr(2)
30237         .sr(4)
30238         .m(4)
30239         .n(4)
30240         .k(k)
30241         .a_stride(11)
30242         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30243     }
30244   }
30245 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_lt_8_subtile)30246   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_lt_8_subtile) {
30247     TEST_REQUIRES_X86_XOP;
30248     for (size_t k = 1; k < 8; k++) {
30249       for (uint32_t n = 1; n <= 4; n++) {
30250         for (uint32_t m = 1; m <= 4; m++) {
30251           GemmMicrokernelTester()
30252             .mr(4)
30253             .nr(4)
30254             .kr(2)
30255             .sr(4)
30256             .m(m)
30257             .n(n)
30258             .k(k)
30259             .iterations(1)
30260             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30261         }
30262       }
30263     }
30264   }
30265 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_gt_8)30266   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_gt_8) {
30267     TEST_REQUIRES_X86_XOP;
30268     for (size_t k = 9; k < 16; k++) {
30269       GemmMicrokernelTester()
30270         .mr(4)
30271         .nr(4)
30272         .kr(2)
30273         .sr(4)
30274         .m(4)
30275         .n(4)
30276         .k(k)
30277         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30278     }
30279   }
30280 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_gt_8_strided_a)30281   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_gt_8_strided_a) {
30282     TEST_REQUIRES_X86_XOP;
30283     for (size_t k = 9; k < 16; k++) {
30284       GemmMicrokernelTester()
30285         .mr(4)
30286         .nr(4)
30287         .kr(2)
30288         .sr(4)
30289         .m(4)
30290         .n(4)
30291         .k(k)
30292         .a_stride(19)
30293         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30294     }
30295   }
30296 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_gt_8_subtile)30297   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_gt_8_subtile) {
30298     TEST_REQUIRES_X86_XOP;
30299     for (size_t k = 9; k < 16; k++) {
30300       for (uint32_t n = 1; n <= 4; n++) {
30301         for (uint32_t m = 1; m <= 4; m++) {
30302           GemmMicrokernelTester()
30303             .mr(4)
30304             .nr(4)
30305             .kr(2)
30306             .sr(4)
30307             .m(m)
30308             .n(n)
30309             .k(k)
30310             .iterations(1)
30311             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30312         }
30313       }
30314     }
30315   }
30316 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_div_8)30317   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_div_8) {
30318     TEST_REQUIRES_X86_XOP;
30319     for (size_t k = 16; k <= 80; k += 8) {
30320       GemmMicrokernelTester()
30321         .mr(4)
30322         .nr(4)
30323         .kr(2)
30324         .sr(4)
30325         .m(4)
30326         .n(4)
30327         .k(k)
30328         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30329     }
30330   }
30331 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_div_8_strided_a)30332   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_div_8_strided_a) {
30333     TEST_REQUIRES_X86_XOP;
30334     for (size_t k = 16; k <= 80; k += 8) {
30335       GemmMicrokernelTester()
30336         .mr(4)
30337         .nr(4)
30338         .kr(2)
30339         .sr(4)
30340         .m(4)
30341         .n(4)
30342         .k(k)
30343         .a_stride(83)
30344         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30345     }
30346   }
30347 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,k_div_8_subtile)30348   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, k_div_8_subtile) {
30349     TEST_REQUIRES_X86_XOP;
30350     for (size_t k = 16; k <= 80; k += 8) {
30351       for (uint32_t n = 1; n <= 4; n++) {
30352         for (uint32_t m = 1; m <= 4; m++) {
30353           GemmMicrokernelTester()
30354             .mr(4)
30355             .nr(4)
30356             .kr(2)
30357             .sr(4)
30358             .m(m)
30359             .n(n)
30360             .k(k)
30361             .iterations(1)
30362             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30363         }
30364       }
30365     }
30366   }
30367 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_gt_4)30368   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_gt_4) {
30369     TEST_REQUIRES_X86_XOP;
30370     for (uint32_t n = 5; n < 8; n++) {
30371       for (size_t k = 1; k <= 40; k += 9) {
30372         GemmMicrokernelTester()
30373           .mr(4)
30374           .nr(4)
30375           .kr(2)
30376           .sr(4)
30377           .m(4)
30378           .n(n)
30379           .k(k)
30380           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30381       }
30382     }
30383   }
30384 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_gt_4_strided_cn)30385   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_gt_4_strided_cn) {
30386     TEST_REQUIRES_X86_XOP;
30387     for (uint32_t n = 5; n < 8; n++) {
30388       for (size_t k = 1; k <= 40; k += 9) {
30389         GemmMicrokernelTester()
30390           .mr(4)
30391           .nr(4)
30392           .kr(2)
30393           .sr(4)
30394           .m(4)
30395           .n(n)
30396           .k(k)
30397           .cn_stride(7)
30398           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30399       }
30400     }
30401   }
30402 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_gt_4_strided_a)30403   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_gt_4_strided_a) {
30404     TEST_REQUIRES_X86_XOP;
30405     for (uint32_t n = 5; n < 8; n++) {
30406       for (size_t k = 1; k <= 40; k += 9) {
30407         GemmMicrokernelTester()
30408           .mr(4)
30409           .nr(4)
30410           .kr(2)
30411           .sr(4)
30412           .m(4)
30413           .n(n)
30414           .k(k)
30415           .a_stride(43)
30416           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30417       }
30418     }
30419   }
30420 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_gt_4_subtile)30421   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_gt_4_subtile) {
30422     TEST_REQUIRES_X86_XOP;
30423     for (uint32_t n = 5; n < 8; n++) {
30424       for (size_t k = 1; k <= 40; k += 9) {
30425         for (uint32_t m = 1; m <= 4; m++) {
30426           GemmMicrokernelTester()
30427             .mr(4)
30428             .nr(4)
30429             .kr(2)
30430             .sr(4)
30431             .m(m)
30432             .n(n)
30433             .k(k)
30434             .iterations(1)
30435             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30436         }
30437       }
30438     }
30439   }
30440 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_div_4)30441   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_div_4) {
30442     TEST_REQUIRES_X86_XOP;
30443     for (uint32_t n = 8; n <= 12; n += 4) {
30444       for (size_t k = 1; k <= 40; k += 9) {
30445         GemmMicrokernelTester()
30446           .mr(4)
30447           .nr(4)
30448           .kr(2)
30449           .sr(4)
30450           .m(4)
30451           .n(n)
30452           .k(k)
30453           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30454       }
30455     }
30456   }
30457 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_div_4_strided_cn)30458   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_div_4_strided_cn) {
30459     TEST_REQUIRES_X86_XOP;
30460     for (uint32_t n = 8; n <= 12; n += 4) {
30461       for (size_t k = 1; k <= 40; k += 9) {
30462         GemmMicrokernelTester()
30463           .mr(4)
30464           .nr(4)
30465           .kr(2)
30466           .sr(4)
30467           .m(4)
30468           .n(n)
30469           .k(k)
30470           .cn_stride(7)
30471           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30472       }
30473     }
30474   }
30475 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_div_4_strided_a)30476   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_div_4_strided_a) {
30477     TEST_REQUIRES_X86_XOP;
30478     for (uint32_t n = 8; n <= 12; n += 4) {
30479       for (size_t k = 1; k <= 40; k += 9) {
30480         GemmMicrokernelTester()
30481           .mr(4)
30482           .nr(4)
30483           .kr(2)
30484           .sr(4)
30485           .m(4)
30486           .n(n)
30487           .k(k)
30488           .a_stride(43)
30489           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30490       }
30491     }
30492   }
30493 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,n_div_4_subtile)30494   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, n_div_4_subtile) {
30495     TEST_REQUIRES_X86_XOP;
30496     for (uint32_t n = 8; n <= 12; n += 4) {
30497       for (size_t k = 1; k <= 40; k += 9) {
30498         for (uint32_t m = 1; m <= 4; m++) {
30499           GemmMicrokernelTester()
30500             .mr(4)
30501             .nr(4)
30502             .kr(2)
30503             .sr(4)
30504             .m(m)
30505             .n(n)
30506             .k(k)
30507             .iterations(1)
30508             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30509         }
30510       }
30511     }
30512   }
30513 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,strided_cm_subtile)30514   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, strided_cm_subtile) {
30515     TEST_REQUIRES_X86_XOP;
30516     for (size_t k = 1; k <= 40; k += 9) {
30517       for (uint32_t n = 1; n <= 4; n++) {
30518         for (uint32_t m = 1; m <= 4; m++) {
30519           GemmMicrokernelTester()
30520             .mr(4)
30521             .nr(4)
30522             .kr(2)
30523             .sr(4)
30524             .m(m)
30525             .n(n)
30526             .k(k)
30527             .cm_stride(7)
30528             .iterations(1)
30529             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30530         }
30531       }
30532     }
30533   }
30534 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,qmin)30535   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, qmin) {
30536     TEST_REQUIRES_X86_XOP;
30537     GemmMicrokernelTester()
30538       .mr(4)
30539       .nr(4)
30540       .kr(2)
30541       .sr(4)
30542       .m(4)
30543       .n(4)
30544       .k(8)
30545       .qmin(128)
30546       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30547   }
30548 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,qmax)30549   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, qmax) {
30550     TEST_REQUIRES_X86_XOP;
30551     GemmMicrokernelTester()
30552       .mr(4)
30553       .nr(4)
30554       .kr(2)
30555       .sr(4)
30556       .m(4)
30557       .n(4)
30558       .k(8)
30559       .qmax(128)
30560       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30561   }
30562 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128,strided_cm)30563   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__XOP_LD128, strided_cm) {
30564     TEST_REQUIRES_X86_XOP;
30565     GemmMicrokernelTester()
30566       .mr(4)
30567       .nr(4)
30568       .kr(2)
30569       .sr(4)
30570       .m(4)
30571       .n(4)
30572       .k(8)
30573       .cm_stride(7)
30574       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
30575   }
30576 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
30577 
30578 
30579 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_eq_8)30580   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_eq_8) {
30581     TEST_REQUIRES_X86_SSE2;
30582     GemmMicrokernelTester()
30583       .mr(1)
30584       .nr(4)
30585       .kr(8)
30586       .sr(1)
30587       .m(1)
30588       .n(4)
30589       .k(8)
30590       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30591   }
30592 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,strided_cn)30593   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, strided_cn) {
30594     TEST_REQUIRES_X86_SSE2;
30595     GemmMicrokernelTester()
30596       .mr(1)
30597       .nr(4)
30598       .kr(8)
30599       .sr(1)
30600       .m(1)
30601       .n(4)
30602       .k(8)
30603       .cn_stride(7)
30604       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30605   }
30606 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_eq_8_strided_a)30607   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_eq_8_strided_a) {
30608     TEST_REQUIRES_X86_SSE2;
30609     GemmMicrokernelTester()
30610       .mr(1)
30611       .nr(4)
30612       .kr(8)
30613       .sr(1)
30614       .m(1)
30615       .n(4)
30616       .k(8)
30617       .a_stride(11)
30618       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30619   }
30620 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_eq_8_subtile)30621   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_eq_8_subtile) {
30622     TEST_REQUIRES_X86_SSE2;
30623     for (uint32_t n = 1; n <= 4; n++) {
30624       for (uint32_t m = 1; m <= 1; m++) {
30625         GemmMicrokernelTester()
30626           .mr(1)
30627           .nr(4)
30628           .kr(8)
30629           .sr(1)
30630           .m(m)
30631           .n(n)
30632           .k(8)
30633           .iterations(1)
30634           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30635       }
30636     }
30637   }
30638 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_eq_8_subtile_m)30639   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_eq_8_subtile_m) {
30640     TEST_REQUIRES_X86_SSE2;
30641     for (uint32_t m = 1; m <= 1; m++) {
30642       GemmMicrokernelTester()
30643         .mr(1)
30644         .nr(4)
30645         .kr(8)
30646         .sr(1)
30647         .m(m)
30648         .n(4)
30649         .k(8)
30650         .iterations(1)
30651         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30652     }
30653   }
30654 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_eq_8_subtile_n)30655   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_eq_8_subtile_n) {
30656     TEST_REQUIRES_X86_SSE2;
30657     for (uint32_t n = 1; n <= 4; n++) {
30658       GemmMicrokernelTester()
30659         .mr(1)
30660         .nr(4)
30661         .kr(8)
30662         .sr(1)
30663         .m(1)
30664         .n(n)
30665         .k(8)
30666         .iterations(1)
30667         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30668     }
30669   }
30670 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_lt_8)30671   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_lt_8) {
30672     TEST_REQUIRES_X86_SSE2;
30673     for (size_t k = 1; k < 8; k++) {
30674       GemmMicrokernelTester()
30675         .mr(1)
30676         .nr(4)
30677         .kr(8)
30678         .sr(1)
30679         .m(1)
30680         .n(4)
30681         .k(k)
30682         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30683     }
30684   }
30685 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_lt_8_strided_a)30686   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_lt_8_strided_a) {
30687     TEST_REQUIRES_X86_SSE2;
30688     for (size_t k = 1; k < 8; k++) {
30689       GemmMicrokernelTester()
30690         .mr(1)
30691         .nr(4)
30692         .kr(8)
30693         .sr(1)
30694         .m(1)
30695         .n(4)
30696         .k(k)
30697         .a_stride(11)
30698         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30699     }
30700   }
30701 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_lt_8_subtile)30702   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_lt_8_subtile) {
30703     TEST_REQUIRES_X86_SSE2;
30704     for (size_t k = 1; k < 8; k++) {
30705       for (uint32_t n = 1; n <= 4; n++) {
30706         for (uint32_t m = 1; m <= 1; m++) {
30707           GemmMicrokernelTester()
30708             .mr(1)
30709             .nr(4)
30710             .kr(8)
30711             .sr(1)
30712             .m(m)
30713             .n(n)
30714             .k(k)
30715             .iterations(1)
30716             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30717         }
30718       }
30719     }
30720   }
30721 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_gt_8)30722   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_gt_8) {
30723     TEST_REQUIRES_X86_SSE2;
30724     for (size_t k = 9; k < 16; k++) {
30725       GemmMicrokernelTester()
30726         .mr(1)
30727         .nr(4)
30728         .kr(8)
30729         .sr(1)
30730         .m(1)
30731         .n(4)
30732         .k(k)
30733         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30734     }
30735   }
30736 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_gt_8_strided_a)30737   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_gt_8_strided_a) {
30738     TEST_REQUIRES_X86_SSE2;
30739     for (size_t k = 9; k < 16; k++) {
30740       GemmMicrokernelTester()
30741         .mr(1)
30742         .nr(4)
30743         .kr(8)
30744         .sr(1)
30745         .m(1)
30746         .n(4)
30747         .k(k)
30748         .a_stride(19)
30749         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30750     }
30751   }
30752 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_gt_8_subtile)30753   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_gt_8_subtile) {
30754     TEST_REQUIRES_X86_SSE2;
30755     for (size_t k = 9; k < 16; k++) {
30756       for (uint32_t n = 1; n <= 4; n++) {
30757         for (uint32_t m = 1; m <= 1; m++) {
30758           GemmMicrokernelTester()
30759             .mr(1)
30760             .nr(4)
30761             .kr(8)
30762             .sr(1)
30763             .m(m)
30764             .n(n)
30765             .k(k)
30766             .iterations(1)
30767             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30768         }
30769       }
30770     }
30771   }
30772 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_div_8)30773   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_div_8) {
30774     TEST_REQUIRES_X86_SSE2;
30775     for (size_t k = 16; k <= 80; k += 8) {
30776       GemmMicrokernelTester()
30777         .mr(1)
30778         .nr(4)
30779         .kr(8)
30780         .sr(1)
30781         .m(1)
30782         .n(4)
30783         .k(k)
30784         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30785     }
30786   }
30787 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_div_8_strided_a)30788   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_div_8_strided_a) {
30789     TEST_REQUIRES_X86_SSE2;
30790     for (size_t k = 16; k <= 80; k += 8) {
30791       GemmMicrokernelTester()
30792         .mr(1)
30793         .nr(4)
30794         .kr(8)
30795         .sr(1)
30796         .m(1)
30797         .n(4)
30798         .k(k)
30799         .a_stride(83)
30800         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30801     }
30802   }
30803 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,k_div_8_subtile)30804   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, k_div_8_subtile) {
30805     TEST_REQUIRES_X86_SSE2;
30806     for (size_t k = 16; k <= 80; k += 8) {
30807       for (uint32_t n = 1; n <= 4; n++) {
30808         for (uint32_t m = 1; m <= 1; m++) {
30809           GemmMicrokernelTester()
30810             .mr(1)
30811             .nr(4)
30812             .kr(8)
30813             .sr(1)
30814             .m(m)
30815             .n(n)
30816             .k(k)
30817             .iterations(1)
30818             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30819         }
30820       }
30821     }
30822   }
30823 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_gt_4)30824   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_gt_4) {
30825     TEST_REQUIRES_X86_SSE2;
30826     for (uint32_t n = 5; n < 8; n++) {
30827       for (size_t k = 1; k <= 40; k += 9) {
30828         GemmMicrokernelTester()
30829           .mr(1)
30830           .nr(4)
30831           .kr(8)
30832           .sr(1)
30833           .m(1)
30834           .n(n)
30835           .k(k)
30836           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30837       }
30838     }
30839   }
30840 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_gt_4_strided_cn)30841   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_gt_4_strided_cn) {
30842     TEST_REQUIRES_X86_SSE2;
30843     for (uint32_t n = 5; n < 8; n++) {
30844       for (size_t k = 1; k <= 40; k += 9) {
30845         GemmMicrokernelTester()
30846           .mr(1)
30847           .nr(4)
30848           .kr(8)
30849           .sr(1)
30850           .m(1)
30851           .n(n)
30852           .k(k)
30853           .cn_stride(7)
30854           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30855       }
30856     }
30857   }
30858 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_gt_4_strided_a)30859   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_gt_4_strided_a) {
30860     TEST_REQUIRES_X86_SSE2;
30861     for (uint32_t n = 5; n < 8; n++) {
30862       for (size_t k = 1; k <= 40; k += 9) {
30863         GemmMicrokernelTester()
30864           .mr(1)
30865           .nr(4)
30866           .kr(8)
30867           .sr(1)
30868           .m(1)
30869           .n(n)
30870           .k(k)
30871           .a_stride(43)
30872           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30873       }
30874     }
30875   }
30876 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_gt_4_subtile)30877   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_gt_4_subtile) {
30878     TEST_REQUIRES_X86_SSE2;
30879     for (uint32_t n = 5; n < 8; n++) {
30880       for (size_t k = 1; k <= 40; k += 9) {
30881         for (uint32_t m = 1; m <= 1; m++) {
30882           GemmMicrokernelTester()
30883             .mr(1)
30884             .nr(4)
30885             .kr(8)
30886             .sr(1)
30887             .m(m)
30888             .n(n)
30889             .k(k)
30890             .iterations(1)
30891             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30892         }
30893       }
30894     }
30895   }
30896 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_div_4)30897   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_div_4) {
30898     TEST_REQUIRES_X86_SSE2;
30899     for (uint32_t n = 8; n <= 12; n += 4) {
30900       for (size_t k = 1; k <= 40; k += 9) {
30901         GemmMicrokernelTester()
30902           .mr(1)
30903           .nr(4)
30904           .kr(8)
30905           .sr(1)
30906           .m(1)
30907           .n(n)
30908           .k(k)
30909           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30910       }
30911     }
30912   }
30913 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_div_4_strided_cn)30914   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_div_4_strided_cn) {
30915     TEST_REQUIRES_X86_SSE2;
30916     for (uint32_t n = 8; n <= 12; n += 4) {
30917       for (size_t k = 1; k <= 40; k += 9) {
30918         GemmMicrokernelTester()
30919           .mr(1)
30920           .nr(4)
30921           .kr(8)
30922           .sr(1)
30923           .m(1)
30924           .n(n)
30925           .k(k)
30926           .cn_stride(7)
30927           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30928       }
30929     }
30930   }
30931 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_div_4_strided_a)30932   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_div_4_strided_a) {
30933     TEST_REQUIRES_X86_SSE2;
30934     for (uint32_t n = 8; n <= 12; n += 4) {
30935       for (size_t k = 1; k <= 40; k += 9) {
30936         GemmMicrokernelTester()
30937           .mr(1)
30938           .nr(4)
30939           .kr(8)
30940           .sr(1)
30941           .m(1)
30942           .n(n)
30943           .k(k)
30944           .a_stride(43)
30945           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30946       }
30947     }
30948   }
30949 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,n_div_4_subtile)30950   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, n_div_4_subtile) {
30951     TEST_REQUIRES_X86_SSE2;
30952     for (uint32_t n = 8; n <= 12; n += 4) {
30953       for (size_t k = 1; k <= 40; k += 9) {
30954         for (uint32_t m = 1; m <= 1; m++) {
30955           GemmMicrokernelTester()
30956             .mr(1)
30957             .nr(4)
30958             .kr(8)
30959             .sr(1)
30960             .m(m)
30961             .n(n)
30962             .k(k)
30963             .iterations(1)
30964             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30965         }
30966       }
30967     }
30968   }
30969 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,strided_cm_subtile)30970   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, strided_cm_subtile) {
30971     TEST_REQUIRES_X86_SSE2;
30972     for (size_t k = 1; k <= 40; k += 9) {
30973       for (uint32_t n = 1; n <= 4; n++) {
30974         for (uint32_t m = 1; m <= 1; m++) {
30975           GemmMicrokernelTester()
30976             .mr(1)
30977             .nr(4)
30978             .kr(8)
30979             .sr(1)
30980             .m(m)
30981             .n(n)
30982             .k(k)
30983             .cm_stride(7)
30984             .iterations(1)
30985             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
30986         }
30987       }
30988     }
30989   }
30990 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,qmin)30991   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, qmin) {
30992     TEST_REQUIRES_X86_SSE2;
30993     GemmMicrokernelTester()
30994       .mr(1)
30995       .nr(4)
30996       .kr(8)
30997       .sr(1)
30998       .m(1)
30999       .n(4)
31000       .k(8)
31001       .qmin(128)
31002       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31003   }
31004 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,qmax)31005   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, qmax) {
31006     TEST_REQUIRES_X86_SSE2;
31007     GemmMicrokernelTester()
31008       .mr(1)
31009       .nr(4)
31010       .kr(8)
31011       .sr(1)
31012       .m(1)
31013       .n(4)
31014       .k(8)
31015       .qmax(128)
31016       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31017   }
31018 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64,strided_cm)31019   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD64, strided_cm) {
31020     TEST_REQUIRES_X86_SSE2;
31021     GemmMicrokernelTester()
31022       .mr(1)
31023       .nr(4)
31024       .kr(8)
31025       .sr(1)
31026       .m(1)
31027       .n(4)
31028       .k(8)
31029       .cm_stride(7)
31030       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31031   }
31032 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
31033 
31034 
31035 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_eq_8)31036   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_eq_8) {
31037     TEST_REQUIRES_X86_SSE2;
31038     GemmMicrokernelTester()
31039       .mr(2)
31040       .nr(4)
31041       .kr(8)
31042       .sr(1)
31043       .m(2)
31044       .n(4)
31045       .k(8)
31046       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31047   }
31048 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,strided_cn)31049   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, strided_cn) {
31050     TEST_REQUIRES_X86_SSE2;
31051     GemmMicrokernelTester()
31052       .mr(2)
31053       .nr(4)
31054       .kr(8)
31055       .sr(1)
31056       .m(2)
31057       .n(4)
31058       .k(8)
31059       .cn_stride(7)
31060       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31061   }
31062 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_eq_8_strided_a)31063   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_eq_8_strided_a) {
31064     TEST_REQUIRES_X86_SSE2;
31065     GemmMicrokernelTester()
31066       .mr(2)
31067       .nr(4)
31068       .kr(8)
31069       .sr(1)
31070       .m(2)
31071       .n(4)
31072       .k(8)
31073       .a_stride(11)
31074       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31075   }
31076 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_eq_8_subtile)31077   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_eq_8_subtile) {
31078     TEST_REQUIRES_X86_SSE2;
31079     for (uint32_t n = 1; n <= 4; n++) {
31080       for (uint32_t m = 1; m <= 2; m++) {
31081         GemmMicrokernelTester()
31082           .mr(2)
31083           .nr(4)
31084           .kr(8)
31085           .sr(1)
31086           .m(m)
31087           .n(n)
31088           .k(8)
31089           .iterations(1)
31090           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31091       }
31092     }
31093   }
31094 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_eq_8_subtile_m)31095   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_eq_8_subtile_m) {
31096     TEST_REQUIRES_X86_SSE2;
31097     for (uint32_t m = 1; m <= 2; m++) {
31098       GemmMicrokernelTester()
31099         .mr(2)
31100         .nr(4)
31101         .kr(8)
31102         .sr(1)
31103         .m(m)
31104         .n(4)
31105         .k(8)
31106         .iterations(1)
31107         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31108     }
31109   }
31110 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_eq_8_subtile_n)31111   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_eq_8_subtile_n) {
31112     TEST_REQUIRES_X86_SSE2;
31113     for (uint32_t n = 1; n <= 4; n++) {
31114       GemmMicrokernelTester()
31115         .mr(2)
31116         .nr(4)
31117         .kr(8)
31118         .sr(1)
31119         .m(2)
31120         .n(n)
31121         .k(8)
31122         .iterations(1)
31123         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31124     }
31125   }
31126 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_lt_8)31127   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_lt_8) {
31128     TEST_REQUIRES_X86_SSE2;
31129     for (size_t k = 1; k < 8; k++) {
31130       GemmMicrokernelTester()
31131         .mr(2)
31132         .nr(4)
31133         .kr(8)
31134         .sr(1)
31135         .m(2)
31136         .n(4)
31137         .k(k)
31138         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31139     }
31140   }
31141 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_lt_8_strided_a)31142   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_lt_8_strided_a) {
31143     TEST_REQUIRES_X86_SSE2;
31144     for (size_t k = 1; k < 8; k++) {
31145       GemmMicrokernelTester()
31146         .mr(2)
31147         .nr(4)
31148         .kr(8)
31149         .sr(1)
31150         .m(2)
31151         .n(4)
31152         .k(k)
31153         .a_stride(11)
31154         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31155     }
31156   }
31157 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_lt_8_subtile)31158   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_lt_8_subtile) {
31159     TEST_REQUIRES_X86_SSE2;
31160     for (size_t k = 1; k < 8; k++) {
31161       for (uint32_t n = 1; n <= 4; n++) {
31162         for (uint32_t m = 1; m <= 2; m++) {
31163           GemmMicrokernelTester()
31164             .mr(2)
31165             .nr(4)
31166             .kr(8)
31167             .sr(1)
31168             .m(m)
31169             .n(n)
31170             .k(k)
31171             .iterations(1)
31172             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31173         }
31174       }
31175     }
31176   }
31177 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_gt_8)31178   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_gt_8) {
31179     TEST_REQUIRES_X86_SSE2;
31180     for (size_t k = 9; k < 16; k++) {
31181       GemmMicrokernelTester()
31182         .mr(2)
31183         .nr(4)
31184         .kr(8)
31185         .sr(1)
31186         .m(2)
31187         .n(4)
31188         .k(k)
31189         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31190     }
31191   }
31192 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_gt_8_strided_a)31193   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_gt_8_strided_a) {
31194     TEST_REQUIRES_X86_SSE2;
31195     for (size_t k = 9; k < 16; k++) {
31196       GemmMicrokernelTester()
31197         .mr(2)
31198         .nr(4)
31199         .kr(8)
31200         .sr(1)
31201         .m(2)
31202         .n(4)
31203         .k(k)
31204         .a_stride(19)
31205         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31206     }
31207   }
31208 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_gt_8_subtile)31209   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_gt_8_subtile) {
31210     TEST_REQUIRES_X86_SSE2;
31211     for (size_t k = 9; k < 16; k++) {
31212       for (uint32_t n = 1; n <= 4; n++) {
31213         for (uint32_t m = 1; m <= 2; m++) {
31214           GemmMicrokernelTester()
31215             .mr(2)
31216             .nr(4)
31217             .kr(8)
31218             .sr(1)
31219             .m(m)
31220             .n(n)
31221             .k(k)
31222             .iterations(1)
31223             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31224         }
31225       }
31226     }
31227   }
31228 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_div_8)31229   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_div_8) {
31230     TEST_REQUIRES_X86_SSE2;
31231     for (size_t k = 16; k <= 80; k += 8) {
31232       GemmMicrokernelTester()
31233         .mr(2)
31234         .nr(4)
31235         .kr(8)
31236         .sr(1)
31237         .m(2)
31238         .n(4)
31239         .k(k)
31240         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31241     }
31242   }
31243 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_div_8_strided_a)31244   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_div_8_strided_a) {
31245     TEST_REQUIRES_X86_SSE2;
31246     for (size_t k = 16; k <= 80; k += 8) {
31247       GemmMicrokernelTester()
31248         .mr(2)
31249         .nr(4)
31250         .kr(8)
31251         .sr(1)
31252         .m(2)
31253         .n(4)
31254         .k(k)
31255         .a_stride(83)
31256         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31257     }
31258   }
31259 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,k_div_8_subtile)31260   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, k_div_8_subtile) {
31261     TEST_REQUIRES_X86_SSE2;
31262     for (size_t k = 16; k <= 80; k += 8) {
31263       for (uint32_t n = 1; n <= 4; n++) {
31264         for (uint32_t m = 1; m <= 2; m++) {
31265           GemmMicrokernelTester()
31266             .mr(2)
31267             .nr(4)
31268             .kr(8)
31269             .sr(1)
31270             .m(m)
31271             .n(n)
31272             .k(k)
31273             .iterations(1)
31274             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31275         }
31276       }
31277     }
31278   }
31279 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_gt_4)31280   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_gt_4) {
31281     TEST_REQUIRES_X86_SSE2;
31282     for (uint32_t n = 5; n < 8; n++) {
31283       for (size_t k = 1; k <= 40; k += 9) {
31284         GemmMicrokernelTester()
31285           .mr(2)
31286           .nr(4)
31287           .kr(8)
31288           .sr(1)
31289           .m(2)
31290           .n(n)
31291           .k(k)
31292           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31293       }
31294     }
31295   }
31296 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_gt_4_strided_cn)31297   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_gt_4_strided_cn) {
31298     TEST_REQUIRES_X86_SSE2;
31299     for (uint32_t n = 5; n < 8; n++) {
31300       for (size_t k = 1; k <= 40; k += 9) {
31301         GemmMicrokernelTester()
31302           .mr(2)
31303           .nr(4)
31304           .kr(8)
31305           .sr(1)
31306           .m(2)
31307           .n(n)
31308           .k(k)
31309           .cn_stride(7)
31310           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31311       }
31312     }
31313   }
31314 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_gt_4_strided_a)31315   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_gt_4_strided_a) {
31316     TEST_REQUIRES_X86_SSE2;
31317     for (uint32_t n = 5; n < 8; n++) {
31318       for (size_t k = 1; k <= 40; k += 9) {
31319         GemmMicrokernelTester()
31320           .mr(2)
31321           .nr(4)
31322           .kr(8)
31323           .sr(1)
31324           .m(2)
31325           .n(n)
31326           .k(k)
31327           .a_stride(43)
31328           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31329       }
31330     }
31331   }
31332 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_gt_4_subtile)31333   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_gt_4_subtile) {
31334     TEST_REQUIRES_X86_SSE2;
31335     for (uint32_t n = 5; n < 8; n++) {
31336       for (size_t k = 1; k <= 40; k += 9) {
31337         for (uint32_t m = 1; m <= 2; m++) {
31338           GemmMicrokernelTester()
31339             .mr(2)
31340             .nr(4)
31341             .kr(8)
31342             .sr(1)
31343             .m(m)
31344             .n(n)
31345             .k(k)
31346             .iterations(1)
31347             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31348         }
31349       }
31350     }
31351   }
31352 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_div_4)31353   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_div_4) {
31354     TEST_REQUIRES_X86_SSE2;
31355     for (uint32_t n = 8; n <= 12; n += 4) {
31356       for (size_t k = 1; k <= 40; k += 9) {
31357         GemmMicrokernelTester()
31358           .mr(2)
31359           .nr(4)
31360           .kr(8)
31361           .sr(1)
31362           .m(2)
31363           .n(n)
31364           .k(k)
31365           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31366       }
31367     }
31368   }
31369 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_div_4_strided_cn)31370   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_div_4_strided_cn) {
31371     TEST_REQUIRES_X86_SSE2;
31372     for (uint32_t n = 8; n <= 12; n += 4) {
31373       for (size_t k = 1; k <= 40; k += 9) {
31374         GemmMicrokernelTester()
31375           .mr(2)
31376           .nr(4)
31377           .kr(8)
31378           .sr(1)
31379           .m(2)
31380           .n(n)
31381           .k(k)
31382           .cn_stride(7)
31383           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31384       }
31385     }
31386   }
31387 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_div_4_strided_a)31388   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_div_4_strided_a) {
31389     TEST_REQUIRES_X86_SSE2;
31390     for (uint32_t n = 8; n <= 12; n += 4) {
31391       for (size_t k = 1; k <= 40; k += 9) {
31392         GemmMicrokernelTester()
31393           .mr(2)
31394           .nr(4)
31395           .kr(8)
31396           .sr(1)
31397           .m(2)
31398           .n(n)
31399           .k(k)
31400           .a_stride(43)
31401           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31402       }
31403     }
31404   }
31405 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,n_div_4_subtile)31406   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, n_div_4_subtile) {
31407     TEST_REQUIRES_X86_SSE2;
31408     for (uint32_t n = 8; n <= 12; n += 4) {
31409       for (size_t k = 1; k <= 40; k += 9) {
31410         for (uint32_t m = 1; m <= 2; m++) {
31411           GemmMicrokernelTester()
31412             .mr(2)
31413             .nr(4)
31414             .kr(8)
31415             .sr(1)
31416             .m(m)
31417             .n(n)
31418             .k(k)
31419             .iterations(1)
31420             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31421         }
31422       }
31423     }
31424   }
31425 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,strided_cm_subtile)31426   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, strided_cm_subtile) {
31427     TEST_REQUIRES_X86_SSE2;
31428     for (size_t k = 1; k <= 40; k += 9) {
31429       for (uint32_t n = 1; n <= 4; n++) {
31430         for (uint32_t m = 1; m <= 2; m++) {
31431           GemmMicrokernelTester()
31432             .mr(2)
31433             .nr(4)
31434             .kr(8)
31435             .sr(1)
31436             .m(m)
31437             .n(n)
31438             .k(k)
31439             .cm_stride(7)
31440             .iterations(1)
31441             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31442         }
31443       }
31444     }
31445   }
31446 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,qmin)31447   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, qmin) {
31448     TEST_REQUIRES_X86_SSE2;
31449     GemmMicrokernelTester()
31450       .mr(2)
31451       .nr(4)
31452       .kr(8)
31453       .sr(1)
31454       .m(2)
31455       .n(4)
31456       .k(8)
31457       .qmin(128)
31458       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31459   }
31460 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,qmax)31461   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, qmax) {
31462     TEST_REQUIRES_X86_SSE2;
31463     GemmMicrokernelTester()
31464       .mr(2)
31465       .nr(4)
31466       .kr(8)
31467       .sr(1)
31468       .m(2)
31469       .n(4)
31470       .k(8)
31471       .qmax(128)
31472       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31473   }
31474 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64,strided_cm)31475   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD64, strided_cm) {
31476     TEST_REQUIRES_X86_SSE2;
31477     GemmMicrokernelTester()
31478       .mr(2)
31479       .nr(4)
31480       .kr(8)
31481       .sr(1)
31482       .m(2)
31483       .n(4)
31484       .k(8)
31485       .cm_stride(7)
31486       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31487   }
31488 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
31489 
31490 
31491 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_eq_8)31492   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_eq_8) {
31493     TEST_REQUIRES_X86_SSSE3;
31494     GemmMicrokernelTester()
31495       .mr(3)
31496       .nr(4)
31497       .kr(8)
31498       .sr(1)
31499       .m(3)
31500       .n(4)
31501       .k(8)
31502       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31503   }
31504 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,strided_cn)31505   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, strided_cn) {
31506     TEST_REQUIRES_X86_SSSE3;
31507     GemmMicrokernelTester()
31508       .mr(3)
31509       .nr(4)
31510       .kr(8)
31511       .sr(1)
31512       .m(3)
31513       .n(4)
31514       .k(8)
31515       .cn_stride(7)
31516       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31517   }
31518 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_eq_8_strided_a)31519   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_eq_8_strided_a) {
31520     TEST_REQUIRES_X86_SSSE3;
31521     GemmMicrokernelTester()
31522       .mr(3)
31523       .nr(4)
31524       .kr(8)
31525       .sr(1)
31526       .m(3)
31527       .n(4)
31528       .k(8)
31529       .a_stride(11)
31530       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31531   }
31532 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_eq_8_subtile)31533   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_eq_8_subtile) {
31534     TEST_REQUIRES_X86_SSSE3;
31535     for (uint32_t n = 1; n <= 4; n++) {
31536       for (uint32_t m = 1; m <= 3; m++) {
31537         GemmMicrokernelTester()
31538           .mr(3)
31539           .nr(4)
31540           .kr(8)
31541           .sr(1)
31542           .m(m)
31543           .n(n)
31544           .k(8)
31545           .iterations(1)
31546           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31547       }
31548     }
31549   }
31550 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_eq_8_subtile_m)31551   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_eq_8_subtile_m) {
31552     TEST_REQUIRES_X86_SSSE3;
31553     for (uint32_t m = 1; m <= 3; m++) {
31554       GemmMicrokernelTester()
31555         .mr(3)
31556         .nr(4)
31557         .kr(8)
31558         .sr(1)
31559         .m(m)
31560         .n(4)
31561         .k(8)
31562         .iterations(1)
31563         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31564     }
31565   }
31566 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_eq_8_subtile_n)31567   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_eq_8_subtile_n) {
31568     TEST_REQUIRES_X86_SSSE3;
31569     for (uint32_t n = 1; n <= 4; n++) {
31570       GemmMicrokernelTester()
31571         .mr(3)
31572         .nr(4)
31573         .kr(8)
31574         .sr(1)
31575         .m(3)
31576         .n(n)
31577         .k(8)
31578         .iterations(1)
31579         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31580     }
31581   }
31582 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_lt_8)31583   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_lt_8) {
31584     TEST_REQUIRES_X86_SSSE3;
31585     for (size_t k = 1; k < 8; k++) {
31586       GemmMicrokernelTester()
31587         .mr(3)
31588         .nr(4)
31589         .kr(8)
31590         .sr(1)
31591         .m(3)
31592         .n(4)
31593         .k(k)
31594         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31595     }
31596   }
31597 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_lt_8_strided_a)31598   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_lt_8_strided_a) {
31599     TEST_REQUIRES_X86_SSSE3;
31600     for (size_t k = 1; k < 8; k++) {
31601       GemmMicrokernelTester()
31602         .mr(3)
31603         .nr(4)
31604         .kr(8)
31605         .sr(1)
31606         .m(3)
31607         .n(4)
31608         .k(k)
31609         .a_stride(11)
31610         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31611     }
31612   }
31613 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_lt_8_subtile)31614   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_lt_8_subtile) {
31615     TEST_REQUIRES_X86_SSSE3;
31616     for (size_t k = 1; k < 8; k++) {
31617       for (uint32_t n = 1; n <= 4; n++) {
31618         for (uint32_t m = 1; m <= 3; m++) {
31619           GemmMicrokernelTester()
31620             .mr(3)
31621             .nr(4)
31622             .kr(8)
31623             .sr(1)
31624             .m(m)
31625             .n(n)
31626             .k(k)
31627             .iterations(1)
31628             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31629         }
31630       }
31631     }
31632   }
31633 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_gt_8)31634   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_gt_8) {
31635     TEST_REQUIRES_X86_SSSE3;
31636     for (size_t k = 9; k < 16; k++) {
31637       GemmMicrokernelTester()
31638         .mr(3)
31639         .nr(4)
31640         .kr(8)
31641         .sr(1)
31642         .m(3)
31643         .n(4)
31644         .k(k)
31645         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31646     }
31647   }
31648 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_gt_8_strided_a)31649   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_gt_8_strided_a) {
31650     TEST_REQUIRES_X86_SSSE3;
31651     for (size_t k = 9; k < 16; k++) {
31652       GemmMicrokernelTester()
31653         .mr(3)
31654         .nr(4)
31655         .kr(8)
31656         .sr(1)
31657         .m(3)
31658         .n(4)
31659         .k(k)
31660         .a_stride(19)
31661         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31662     }
31663   }
31664 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_gt_8_subtile)31665   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_gt_8_subtile) {
31666     TEST_REQUIRES_X86_SSSE3;
31667     for (size_t k = 9; k < 16; k++) {
31668       for (uint32_t n = 1; n <= 4; n++) {
31669         for (uint32_t m = 1; m <= 3; m++) {
31670           GemmMicrokernelTester()
31671             .mr(3)
31672             .nr(4)
31673             .kr(8)
31674             .sr(1)
31675             .m(m)
31676             .n(n)
31677             .k(k)
31678             .iterations(1)
31679             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31680         }
31681       }
31682     }
31683   }
31684 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_div_8)31685   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_div_8) {
31686     TEST_REQUIRES_X86_SSSE3;
31687     for (size_t k = 16; k <= 80; k += 8) {
31688       GemmMicrokernelTester()
31689         .mr(3)
31690         .nr(4)
31691         .kr(8)
31692         .sr(1)
31693         .m(3)
31694         .n(4)
31695         .k(k)
31696         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31697     }
31698   }
31699 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_div_8_strided_a)31700   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_div_8_strided_a) {
31701     TEST_REQUIRES_X86_SSSE3;
31702     for (size_t k = 16; k <= 80; k += 8) {
31703       GemmMicrokernelTester()
31704         .mr(3)
31705         .nr(4)
31706         .kr(8)
31707         .sr(1)
31708         .m(3)
31709         .n(4)
31710         .k(k)
31711         .a_stride(83)
31712         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31713     }
31714   }
31715 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,k_div_8_subtile)31716   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, k_div_8_subtile) {
31717     TEST_REQUIRES_X86_SSSE3;
31718     for (size_t k = 16; k <= 80; k += 8) {
31719       for (uint32_t n = 1; n <= 4; n++) {
31720         for (uint32_t m = 1; m <= 3; m++) {
31721           GemmMicrokernelTester()
31722             .mr(3)
31723             .nr(4)
31724             .kr(8)
31725             .sr(1)
31726             .m(m)
31727             .n(n)
31728             .k(k)
31729             .iterations(1)
31730             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31731         }
31732       }
31733     }
31734   }
31735 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_gt_4)31736   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_gt_4) {
31737     TEST_REQUIRES_X86_SSSE3;
31738     for (uint32_t n = 5; n < 8; n++) {
31739       for (size_t k = 1; k <= 40; k += 9) {
31740         GemmMicrokernelTester()
31741           .mr(3)
31742           .nr(4)
31743           .kr(8)
31744           .sr(1)
31745           .m(3)
31746           .n(n)
31747           .k(k)
31748           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31749       }
31750     }
31751   }
31752 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_gt_4_strided_cn)31753   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_gt_4_strided_cn) {
31754     TEST_REQUIRES_X86_SSSE3;
31755     for (uint32_t n = 5; n < 8; n++) {
31756       for (size_t k = 1; k <= 40; k += 9) {
31757         GemmMicrokernelTester()
31758           .mr(3)
31759           .nr(4)
31760           .kr(8)
31761           .sr(1)
31762           .m(3)
31763           .n(n)
31764           .k(k)
31765           .cn_stride(7)
31766           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31767       }
31768     }
31769   }
31770 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_gt_4_strided_a)31771   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_gt_4_strided_a) {
31772     TEST_REQUIRES_X86_SSSE3;
31773     for (uint32_t n = 5; n < 8; n++) {
31774       for (size_t k = 1; k <= 40; k += 9) {
31775         GemmMicrokernelTester()
31776           .mr(3)
31777           .nr(4)
31778           .kr(8)
31779           .sr(1)
31780           .m(3)
31781           .n(n)
31782           .k(k)
31783           .a_stride(43)
31784           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31785       }
31786     }
31787   }
31788 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_gt_4_subtile)31789   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_gt_4_subtile) {
31790     TEST_REQUIRES_X86_SSSE3;
31791     for (uint32_t n = 5; n < 8; n++) {
31792       for (size_t k = 1; k <= 40; k += 9) {
31793         for (uint32_t m = 1; m <= 3; m++) {
31794           GemmMicrokernelTester()
31795             .mr(3)
31796             .nr(4)
31797             .kr(8)
31798             .sr(1)
31799             .m(m)
31800             .n(n)
31801             .k(k)
31802             .iterations(1)
31803             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31804         }
31805       }
31806     }
31807   }
31808 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_div_4)31809   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_div_4) {
31810     TEST_REQUIRES_X86_SSSE3;
31811     for (uint32_t n = 8; n <= 12; n += 4) {
31812       for (size_t k = 1; k <= 40; k += 9) {
31813         GemmMicrokernelTester()
31814           .mr(3)
31815           .nr(4)
31816           .kr(8)
31817           .sr(1)
31818           .m(3)
31819           .n(n)
31820           .k(k)
31821           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31822       }
31823     }
31824   }
31825 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_div_4_strided_cn)31826   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_div_4_strided_cn) {
31827     TEST_REQUIRES_X86_SSSE3;
31828     for (uint32_t n = 8; n <= 12; n += 4) {
31829       for (size_t k = 1; k <= 40; k += 9) {
31830         GemmMicrokernelTester()
31831           .mr(3)
31832           .nr(4)
31833           .kr(8)
31834           .sr(1)
31835           .m(3)
31836           .n(n)
31837           .k(k)
31838           .cn_stride(7)
31839           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31840       }
31841     }
31842   }
31843 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_div_4_strided_a)31844   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_div_4_strided_a) {
31845     TEST_REQUIRES_X86_SSSE3;
31846     for (uint32_t n = 8; n <= 12; n += 4) {
31847       for (size_t k = 1; k <= 40; k += 9) {
31848         GemmMicrokernelTester()
31849           .mr(3)
31850           .nr(4)
31851           .kr(8)
31852           .sr(1)
31853           .m(3)
31854           .n(n)
31855           .k(k)
31856           .a_stride(43)
31857           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31858       }
31859     }
31860   }
31861 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,n_div_4_subtile)31862   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, n_div_4_subtile) {
31863     TEST_REQUIRES_X86_SSSE3;
31864     for (uint32_t n = 8; n <= 12; n += 4) {
31865       for (size_t k = 1; k <= 40; k += 9) {
31866         for (uint32_t m = 1; m <= 3; m++) {
31867           GemmMicrokernelTester()
31868             .mr(3)
31869             .nr(4)
31870             .kr(8)
31871             .sr(1)
31872             .m(m)
31873             .n(n)
31874             .k(k)
31875             .iterations(1)
31876             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31877         }
31878       }
31879     }
31880   }
31881 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,strided_cm_subtile)31882   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, strided_cm_subtile) {
31883     TEST_REQUIRES_X86_SSSE3;
31884     for (size_t k = 1; k <= 40; k += 9) {
31885       for (uint32_t n = 1; n <= 4; n++) {
31886         for (uint32_t m = 1; m <= 3; m++) {
31887           GemmMicrokernelTester()
31888             .mr(3)
31889             .nr(4)
31890             .kr(8)
31891             .sr(1)
31892             .m(m)
31893             .n(n)
31894             .k(k)
31895             .cm_stride(7)
31896             .iterations(1)
31897             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31898         }
31899       }
31900     }
31901   }
31902 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,qmin)31903   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, qmin) {
31904     TEST_REQUIRES_X86_SSSE3;
31905     GemmMicrokernelTester()
31906       .mr(3)
31907       .nr(4)
31908       .kr(8)
31909       .sr(1)
31910       .m(3)
31911       .n(4)
31912       .k(8)
31913       .qmin(128)
31914       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31915   }
31916 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,qmax)31917   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, qmax) {
31918     TEST_REQUIRES_X86_SSSE3;
31919     GemmMicrokernelTester()
31920       .mr(3)
31921       .nr(4)
31922       .kr(8)
31923       .sr(1)
31924       .m(3)
31925       .n(4)
31926       .k(8)
31927       .qmax(128)
31928       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31929   }
31930 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64,strided_cm)31931   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD64, strided_cm) {
31932     TEST_REQUIRES_X86_SSSE3;
31933     GemmMicrokernelTester()
31934       .mr(3)
31935       .nr(4)
31936       .kr(8)
31937       .sr(1)
31938       .m(3)
31939       .n(4)
31940       .k(8)
31941       .cm_stride(7)
31942       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld64, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
31943   }
31944 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
31945 
31946 
31947 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_eq_8)31948   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_eq_8) {
31949     TEST_REQUIRES_X86_SSE41;
31950     GemmMicrokernelTester()
31951       .mr(3)
31952       .nr(4)
31953       .kr(8)
31954       .sr(1)
31955       .m(3)
31956       .n(4)
31957       .k(8)
31958       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
31959   }
31960 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,strided_cn)31961   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, strided_cn) {
31962     TEST_REQUIRES_X86_SSE41;
31963     GemmMicrokernelTester()
31964       .mr(3)
31965       .nr(4)
31966       .kr(8)
31967       .sr(1)
31968       .m(3)
31969       .n(4)
31970       .k(8)
31971       .cn_stride(7)
31972       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
31973   }
31974 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_eq_8_strided_a)31975   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_eq_8_strided_a) {
31976     TEST_REQUIRES_X86_SSE41;
31977     GemmMicrokernelTester()
31978       .mr(3)
31979       .nr(4)
31980       .kr(8)
31981       .sr(1)
31982       .m(3)
31983       .n(4)
31984       .k(8)
31985       .a_stride(11)
31986       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
31987   }
31988 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_eq_8_subtile)31989   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_eq_8_subtile) {
31990     TEST_REQUIRES_X86_SSE41;
31991     for (uint32_t n = 1; n <= 4; n++) {
31992       for (uint32_t m = 1; m <= 3; m++) {
31993         GemmMicrokernelTester()
31994           .mr(3)
31995           .nr(4)
31996           .kr(8)
31997           .sr(1)
31998           .m(m)
31999           .n(n)
32000           .k(8)
32001           .iterations(1)
32002           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32003       }
32004     }
32005   }
32006 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_eq_8_subtile_m)32007   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_eq_8_subtile_m) {
32008     TEST_REQUIRES_X86_SSE41;
32009     for (uint32_t m = 1; m <= 3; m++) {
32010       GemmMicrokernelTester()
32011         .mr(3)
32012         .nr(4)
32013         .kr(8)
32014         .sr(1)
32015         .m(m)
32016         .n(4)
32017         .k(8)
32018         .iterations(1)
32019         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32020     }
32021   }
32022 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_eq_8_subtile_n)32023   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_eq_8_subtile_n) {
32024     TEST_REQUIRES_X86_SSE41;
32025     for (uint32_t n = 1; n <= 4; n++) {
32026       GemmMicrokernelTester()
32027         .mr(3)
32028         .nr(4)
32029         .kr(8)
32030         .sr(1)
32031         .m(3)
32032         .n(n)
32033         .k(8)
32034         .iterations(1)
32035         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32036     }
32037   }
32038 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_lt_8)32039   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_lt_8) {
32040     TEST_REQUIRES_X86_SSE41;
32041     for (size_t k = 1; k < 8; k++) {
32042       GemmMicrokernelTester()
32043         .mr(3)
32044         .nr(4)
32045         .kr(8)
32046         .sr(1)
32047         .m(3)
32048         .n(4)
32049         .k(k)
32050         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32051     }
32052   }
32053 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_lt_8_strided_a)32054   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_lt_8_strided_a) {
32055     TEST_REQUIRES_X86_SSE41;
32056     for (size_t k = 1; k < 8; k++) {
32057       GemmMicrokernelTester()
32058         .mr(3)
32059         .nr(4)
32060         .kr(8)
32061         .sr(1)
32062         .m(3)
32063         .n(4)
32064         .k(k)
32065         .a_stride(11)
32066         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32067     }
32068   }
32069 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_lt_8_subtile)32070   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_lt_8_subtile) {
32071     TEST_REQUIRES_X86_SSE41;
32072     for (size_t k = 1; k < 8; k++) {
32073       for (uint32_t n = 1; n <= 4; n++) {
32074         for (uint32_t m = 1; m <= 3; m++) {
32075           GemmMicrokernelTester()
32076             .mr(3)
32077             .nr(4)
32078             .kr(8)
32079             .sr(1)
32080             .m(m)
32081             .n(n)
32082             .k(k)
32083             .iterations(1)
32084             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32085         }
32086       }
32087     }
32088   }
32089 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_gt_8)32090   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_gt_8) {
32091     TEST_REQUIRES_X86_SSE41;
32092     for (size_t k = 9; k < 16; k++) {
32093       GemmMicrokernelTester()
32094         .mr(3)
32095         .nr(4)
32096         .kr(8)
32097         .sr(1)
32098         .m(3)
32099         .n(4)
32100         .k(k)
32101         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32102     }
32103   }
32104 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_gt_8_strided_a)32105   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_gt_8_strided_a) {
32106     TEST_REQUIRES_X86_SSE41;
32107     for (size_t k = 9; k < 16; k++) {
32108       GemmMicrokernelTester()
32109         .mr(3)
32110         .nr(4)
32111         .kr(8)
32112         .sr(1)
32113         .m(3)
32114         .n(4)
32115         .k(k)
32116         .a_stride(19)
32117         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32118     }
32119   }
32120 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_gt_8_subtile)32121   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_gt_8_subtile) {
32122     TEST_REQUIRES_X86_SSE41;
32123     for (size_t k = 9; k < 16; k++) {
32124       for (uint32_t n = 1; n <= 4; n++) {
32125         for (uint32_t m = 1; m <= 3; m++) {
32126           GemmMicrokernelTester()
32127             .mr(3)
32128             .nr(4)
32129             .kr(8)
32130             .sr(1)
32131             .m(m)
32132             .n(n)
32133             .k(k)
32134             .iterations(1)
32135             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32136         }
32137       }
32138     }
32139   }
32140 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_div_8)32141   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_div_8) {
32142     TEST_REQUIRES_X86_SSE41;
32143     for (size_t k = 16; k <= 80; k += 8) {
32144       GemmMicrokernelTester()
32145         .mr(3)
32146         .nr(4)
32147         .kr(8)
32148         .sr(1)
32149         .m(3)
32150         .n(4)
32151         .k(k)
32152         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32153     }
32154   }
32155 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_div_8_strided_a)32156   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_div_8_strided_a) {
32157     TEST_REQUIRES_X86_SSE41;
32158     for (size_t k = 16; k <= 80; k += 8) {
32159       GemmMicrokernelTester()
32160         .mr(3)
32161         .nr(4)
32162         .kr(8)
32163         .sr(1)
32164         .m(3)
32165         .n(4)
32166         .k(k)
32167         .a_stride(83)
32168         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32169     }
32170   }
32171 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,k_div_8_subtile)32172   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, k_div_8_subtile) {
32173     TEST_REQUIRES_X86_SSE41;
32174     for (size_t k = 16; k <= 80; k += 8) {
32175       for (uint32_t n = 1; n <= 4; n++) {
32176         for (uint32_t m = 1; m <= 3; m++) {
32177           GemmMicrokernelTester()
32178             .mr(3)
32179             .nr(4)
32180             .kr(8)
32181             .sr(1)
32182             .m(m)
32183             .n(n)
32184             .k(k)
32185             .iterations(1)
32186             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32187         }
32188       }
32189     }
32190   }
32191 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_gt_4)32192   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_gt_4) {
32193     TEST_REQUIRES_X86_SSE41;
32194     for (uint32_t n = 5; n < 8; n++) {
32195       for (size_t k = 1; k <= 40; k += 9) {
32196         GemmMicrokernelTester()
32197           .mr(3)
32198           .nr(4)
32199           .kr(8)
32200           .sr(1)
32201           .m(3)
32202           .n(n)
32203           .k(k)
32204           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32205       }
32206     }
32207   }
32208 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_gt_4_strided_cn)32209   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_gt_4_strided_cn) {
32210     TEST_REQUIRES_X86_SSE41;
32211     for (uint32_t n = 5; n < 8; n++) {
32212       for (size_t k = 1; k <= 40; k += 9) {
32213         GemmMicrokernelTester()
32214           .mr(3)
32215           .nr(4)
32216           .kr(8)
32217           .sr(1)
32218           .m(3)
32219           .n(n)
32220           .k(k)
32221           .cn_stride(7)
32222           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32223       }
32224     }
32225   }
32226 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_gt_4_strided_a)32227   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_gt_4_strided_a) {
32228     TEST_REQUIRES_X86_SSE41;
32229     for (uint32_t n = 5; n < 8; n++) {
32230       for (size_t k = 1; k <= 40; k += 9) {
32231         GemmMicrokernelTester()
32232           .mr(3)
32233           .nr(4)
32234           .kr(8)
32235           .sr(1)
32236           .m(3)
32237           .n(n)
32238           .k(k)
32239           .a_stride(43)
32240           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32241       }
32242     }
32243   }
32244 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_gt_4_subtile)32245   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_gt_4_subtile) {
32246     TEST_REQUIRES_X86_SSE41;
32247     for (uint32_t n = 5; n < 8; n++) {
32248       for (size_t k = 1; k <= 40; k += 9) {
32249         for (uint32_t m = 1; m <= 3; m++) {
32250           GemmMicrokernelTester()
32251             .mr(3)
32252             .nr(4)
32253             .kr(8)
32254             .sr(1)
32255             .m(m)
32256             .n(n)
32257             .k(k)
32258             .iterations(1)
32259             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32260         }
32261       }
32262     }
32263   }
32264 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_div_4)32265   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_div_4) {
32266     TEST_REQUIRES_X86_SSE41;
32267     for (uint32_t n = 8; n <= 12; n += 4) {
32268       for (size_t k = 1; k <= 40; k += 9) {
32269         GemmMicrokernelTester()
32270           .mr(3)
32271           .nr(4)
32272           .kr(8)
32273           .sr(1)
32274           .m(3)
32275           .n(n)
32276           .k(k)
32277           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32278       }
32279     }
32280   }
32281 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_div_4_strided_cn)32282   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_div_4_strided_cn) {
32283     TEST_REQUIRES_X86_SSE41;
32284     for (uint32_t n = 8; n <= 12; n += 4) {
32285       for (size_t k = 1; k <= 40; k += 9) {
32286         GemmMicrokernelTester()
32287           .mr(3)
32288           .nr(4)
32289           .kr(8)
32290           .sr(1)
32291           .m(3)
32292           .n(n)
32293           .k(k)
32294           .cn_stride(7)
32295           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32296       }
32297     }
32298   }
32299 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_div_4_strided_a)32300   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_div_4_strided_a) {
32301     TEST_REQUIRES_X86_SSE41;
32302     for (uint32_t n = 8; n <= 12; n += 4) {
32303       for (size_t k = 1; k <= 40; k += 9) {
32304         GemmMicrokernelTester()
32305           .mr(3)
32306           .nr(4)
32307           .kr(8)
32308           .sr(1)
32309           .m(3)
32310           .n(n)
32311           .k(k)
32312           .a_stride(43)
32313           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32314       }
32315     }
32316   }
32317 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,n_div_4_subtile)32318   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, n_div_4_subtile) {
32319     TEST_REQUIRES_X86_SSE41;
32320     for (uint32_t n = 8; n <= 12; n += 4) {
32321       for (size_t k = 1; k <= 40; k += 9) {
32322         for (uint32_t m = 1; m <= 3; m++) {
32323           GemmMicrokernelTester()
32324             .mr(3)
32325             .nr(4)
32326             .kr(8)
32327             .sr(1)
32328             .m(m)
32329             .n(n)
32330             .k(k)
32331             .iterations(1)
32332             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32333         }
32334       }
32335     }
32336   }
32337 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,strided_cm_subtile)32338   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, strided_cm_subtile) {
32339     TEST_REQUIRES_X86_SSE41;
32340     for (size_t k = 1; k <= 40; k += 9) {
32341       for (uint32_t n = 1; n <= 4; n++) {
32342         for (uint32_t m = 1; m <= 3; m++) {
32343           GemmMicrokernelTester()
32344             .mr(3)
32345             .nr(4)
32346             .kr(8)
32347             .sr(1)
32348             .m(m)
32349             .n(n)
32350             .k(k)
32351             .cm_stride(7)
32352             .iterations(1)
32353             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32354         }
32355       }
32356     }
32357   }
32358 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,qmin)32359   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, qmin) {
32360     TEST_REQUIRES_X86_SSE41;
32361     GemmMicrokernelTester()
32362       .mr(3)
32363       .nr(4)
32364       .kr(8)
32365       .sr(1)
32366       .m(3)
32367       .n(4)
32368       .k(8)
32369       .qmin(128)
32370       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32371   }
32372 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,qmax)32373   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, qmax) {
32374     TEST_REQUIRES_X86_SSE41;
32375     GemmMicrokernelTester()
32376       .mr(3)
32377       .nr(4)
32378       .kr(8)
32379       .sr(1)
32380       .m(3)
32381       .n(4)
32382       .k(8)
32383       .qmax(128)
32384       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32385   }
32386 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64,strided_cm)32387   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD64, strided_cm) {
32388     TEST_REQUIRES_X86_SSE41;
32389     GemmMicrokernelTester()
32390       .mr(3)
32391       .nr(4)
32392       .kr(8)
32393       .sr(1)
32394       .m(3)
32395       .n(4)
32396       .k(8)
32397       .cm_stride(7)
32398       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32399   }
32400 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
32401 
32402 
32403 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_eq_8)32404   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_eq_8) {
32405     TEST_REQUIRES_X86_AVX;
32406     GemmMicrokernelTester()
32407       .mr(1)
32408       .nr(4)
32409       .kr(8)
32410       .sr(1)
32411       .m(1)
32412       .n(4)
32413       .k(8)
32414       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32415   }
32416 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,strided_cn)32417   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, strided_cn) {
32418     TEST_REQUIRES_X86_AVX;
32419     GemmMicrokernelTester()
32420       .mr(1)
32421       .nr(4)
32422       .kr(8)
32423       .sr(1)
32424       .m(1)
32425       .n(4)
32426       .k(8)
32427       .cn_stride(7)
32428       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32429   }
32430 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_eq_8_strided_a)32431   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_eq_8_strided_a) {
32432     TEST_REQUIRES_X86_AVX;
32433     GemmMicrokernelTester()
32434       .mr(1)
32435       .nr(4)
32436       .kr(8)
32437       .sr(1)
32438       .m(1)
32439       .n(4)
32440       .k(8)
32441       .a_stride(11)
32442       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32443   }
32444 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_eq_8_subtile)32445   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_eq_8_subtile) {
32446     TEST_REQUIRES_X86_AVX;
32447     for (uint32_t n = 1; n <= 4; n++) {
32448       for (uint32_t m = 1; m <= 1; m++) {
32449         GemmMicrokernelTester()
32450           .mr(1)
32451           .nr(4)
32452           .kr(8)
32453           .sr(1)
32454           .m(m)
32455           .n(n)
32456           .k(8)
32457           .iterations(1)
32458           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32459       }
32460     }
32461   }
32462 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_eq_8_subtile_m)32463   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_eq_8_subtile_m) {
32464     TEST_REQUIRES_X86_AVX;
32465     for (uint32_t m = 1; m <= 1; m++) {
32466       GemmMicrokernelTester()
32467         .mr(1)
32468         .nr(4)
32469         .kr(8)
32470         .sr(1)
32471         .m(m)
32472         .n(4)
32473         .k(8)
32474         .iterations(1)
32475         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32476     }
32477   }
32478 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_eq_8_subtile_n)32479   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_eq_8_subtile_n) {
32480     TEST_REQUIRES_X86_AVX;
32481     for (uint32_t n = 1; n <= 4; n++) {
32482       GemmMicrokernelTester()
32483         .mr(1)
32484         .nr(4)
32485         .kr(8)
32486         .sr(1)
32487         .m(1)
32488         .n(n)
32489         .k(8)
32490         .iterations(1)
32491         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32492     }
32493   }
32494 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_lt_8)32495   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_lt_8) {
32496     TEST_REQUIRES_X86_AVX;
32497     for (size_t k = 1; k < 8; k++) {
32498       GemmMicrokernelTester()
32499         .mr(1)
32500         .nr(4)
32501         .kr(8)
32502         .sr(1)
32503         .m(1)
32504         .n(4)
32505         .k(k)
32506         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32507     }
32508   }
32509 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_lt_8_strided_a)32510   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_lt_8_strided_a) {
32511     TEST_REQUIRES_X86_AVX;
32512     for (size_t k = 1; k < 8; k++) {
32513       GemmMicrokernelTester()
32514         .mr(1)
32515         .nr(4)
32516         .kr(8)
32517         .sr(1)
32518         .m(1)
32519         .n(4)
32520         .k(k)
32521         .a_stride(11)
32522         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32523     }
32524   }
32525 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_lt_8_subtile)32526   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_lt_8_subtile) {
32527     TEST_REQUIRES_X86_AVX;
32528     for (size_t k = 1; k < 8; k++) {
32529       for (uint32_t n = 1; n <= 4; n++) {
32530         for (uint32_t m = 1; m <= 1; m++) {
32531           GemmMicrokernelTester()
32532             .mr(1)
32533             .nr(4)
32534             .kr(8)
32535             .sr(1)
32536             .m(m)
32537             .n(n)
32538             .k(k)
32539             .iterations(1)
32540             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32541         }
32542       }
32543     }
32544   }
32545 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_gt_8)32546   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_gt_8) {
32547     TEST_REQUIRES_X86_AVX;
32548     for (size_t k = 9; k < 16; k++) {
32549       GemmMicrokernelTester()
32550         .mr(1)
32551         .nr(4)
32552         .kr(8)
32553         .sr(1)
32554         .m(1)
32555         .n(4)
32556         .k(k)
32557         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32558     }
32559   }
32560 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_gt_8_strided_a)32561   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_gt_8_strided_a) {
32562     TEST_REQUIRES_X86_AVX;
32563     for (size_t k = 9; k < 16; k++) {
32564       GemmMicrokernelTester()
32565         .mr(1)
32566         .nr(4)
32567         .kr(8)
32568         .sr(1)
32569         .m(1)
32570         .n(4)
32571         .k(k)
32572         .a_stride(19)
32573         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32574     }
32575   }
32576 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_gt_8_subtile)32577   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_gt_8_subtile) {
32578     TEST_REQUIRES_X86_AVX;
32579     for (size_t k = 9; k < 16; k++) {
32580       for (uint32_t n = 1; n <= 4; n++) {
32581         for (uint32_t m = 1; m <= 1; m++) {
32582           GemmMicrokernelTester()
32583             .mr(1)
32584             .nr(4)
32585             .kr(8)
32586             .sr(1)
32587             .m(m)
32588             .n(n)
32589             .k(k)
32590             .iterations(1)
32591             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32592         }
32593       }
32594     }
32595   }
32596 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_div_8)32597   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_div_8) {
32598     TEST_REQUIRES_X86_AVX;
32599     for (size_t k = 16; k <= 80; k += 8) {
32600       GemmMicrokernelTester()
32601         .mr(1)
32602         .nr(4)
32603         .kr(8)
32604         .sr(1)
32605         .m(1)
32606         .n(4)
32607         .k(k)
32608         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32609     }
32610   }
32611 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_div_8_strided_a)32612   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_div_8_strided_a) {
32613     TEST_REQUIRES_X86_AVX;
32614     for (size_t k = 16; k <= 80; k += 8) {
32615       GemmMicrokernelTester()
32616         .mr(1)
32617         .nr(4)
32618         .kr(8)
32619         .sr(1)
32620         .m(1)
32621         .n(4)
32622         .k(k)
32623         .a_stride(83)
32624         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32625     }
32626   }
32627 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,k_div_8_subtile)32628   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, k_div_8_subtile) {
32629     TEST_REQUIRES_X86_AVX;
32630     for (size_t k = 16; k <= 80; k += 8) {
32631       for (uint32_t n = 1; n <= 4; n++) {
32632         for (uint32_t m = 1; m <= 1; m++) {
32633           GemmMicrokernelTester()
32634             .mr(1)
32635             .nr(4)
32636             .kr(8)
32637             .sr(1)
32638             .m(m)
32639             .n(n)
32640             .k(k)
32641             .iterations(1)
32642             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32643         }
32644       }
32645     }
32646   }
32647 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_gt_4)32648   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_gt_4) {
32649     TEST_REQUIRES_X86_AVX;
32650     for (uint32_t n = 5; n < 8; n++) {
32651       for (size_t k = 1; k <= 40; k += 9) {
32652         GemmMicrokernelTester()
32653           .mr(1)
32654           .nr(4)
32655           .kr(8)
32656           .sr(1)
32657           .m(1)
32658           .n(n)
32659           .k(k)
32660           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32661       }
32662     }
32663   }
32664 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_gt_4_strided_cn)32665   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_gt_4_strided_cn) {
32666     TEST_REQUIRES_X86_AVX;
32667     for (uint32_t n = 5; n < 8; n++) {
32668       for (size_t k = 1; k <= 40; k += 9) {
32669         GemmMicrokernelTester()
32670           .mr(1)
32671           .nr(4)
32672           .kr(8)
32673           .sr(1)
32674           .m(1)
32675           .n(n)
32676           .k(k)
32677           .cn_stride(7)
32678           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32679       }
32680     }
32681   }
32682 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_gt_4_strided_a)32683   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_gt_4_strided_a) {
32684     TEST_REQUIRES_X86_AVX;
32685     for (uint32_t n = 5; n < 8; n++) {
32686       for (size_t k = 1; k <= 40; k += 9) {
32687         GemmMicrokernelTester()
32688           .mr(1)
32689           .nr(4)
32690           .kr(8)
32691           .sr(1)
32692           .m(1)
32693           .n(n)
32694           .k(k)
32695           .a_stride(43)
32696           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32697       }
32698     }
32699   }
32700 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_gt_4_subtile)32701   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_gt_4_subtile) {
32702     TEST_REQUIRES_X86_AVX;
32703     for (uint32_t n = 5; n < 8; n++) {
32704       for (size_t k = 1; k <= 40; k += 9) {
32705         for (uint32_t m = 1; m <= 1; m++) {
32706           GemmMicrokernelTester()
32707             .mr(1)
32708             .nr(4)
32709             .kr(8)
32710             .sr(1)
32711             .m(m)
32712             .n(n)
32713             .k(k)
32714             .iterations(1)
32715             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32716         }
32717       }
32718     }
32719   }
32720 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_div_4)32721   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_div_4) {
32722     TEST_REQUIRES_X86_AVX;
32723     for (uint32_t n = 8; n <= 12; n += 4) {
32724       for (size_t k = 1; k <= 40; k += 9) {
32725         GemmMicrokernelTester()
32726           .mr(1)
32727           .nr(4)
32728           .kr(8)
32729           .sr(1)
32730           .m(1)
32731           .n(n)
32732           .k(k)
32733           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32734       }
32735     }
32736   }
32737 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_div_4_strided_cn)32738   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_div_4_strided_cn) {
32739     TEST_REQUIRES_X86_AVX;
32740     for (uint32_t n = 8; n <= 12; n += 4) {
32741       for (size_t k = 1; k <= 40; k += 9) {
32742         GemmMicrokernelTester()
32743           .mr(1)
32744           .nr(4)
32745           .kr(8)
32746           .sr(1)
32747           .m(1)
32748           .n(n)
32749           .k(k)
32750           .cn_stride(7)
32751           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32752       }
32753     }
32754   }
32755 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_div_4_strided_a)32756   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_div_4_strided_a) {
32757     TEST_REQUIRES_X86_AVX;
32758     for (uint32_t n = 8; n <= 12; n += 4) {
32759       for (size_t k = 1; k <= 40; k += 9) {
32760         GemmMicrokernelTester()
32761           .mr(1)
32762           .nr(4)
32763           .kr(8)
32764           .sr(1)
32765           .m(1)
32766           .n(n)
32767           .k(k)
32768           .a_stride(43)
32769           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32770       }
32771     }
32772   }
32773 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,n_div_4_subtile)32774   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, n_div_4_subtile) {
32775     TEST_REQUIRES_X86_AVX;
32776     for (uint32_t n = 8; n <= 12; n += 4) {
32777       for (size_t k = 1; k <= 40; k += 9) {
32778         for (uint32_t m = 1; m <= 1; m++) {
32779           GemmMicrokernelTester()
32780             .mr(1)
32781             .nr(4)
32782             .kr(8)
32783             .sr(1)
32784             .m(m)
32785             .n(n)
32786             .k(k)
32787             .iterations(1)
32788             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32789         }
32790       }
32791     }
32792   }
32793 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,strided_cm_subtile)32794   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, strided_cm_subtile) {
32795     TEST_REQUIRES_X86_AVX;
32796     for (size_t k = 1; k <= 40; k += 9) {
32797       for (uint32_t n = 1; n <= 4; n++) {
32798         for (uint32_t m = 1; m <= 1; m++) {
32799           GemmMicrokernelTester()
32800             .mr(1)
32801             .nr(4)
32802             .kr(8)
32803             .sr(1)
32804             .m(m)
32805             .n(n)
32806             .k(k)
32807             .cm_stride(7)
32808             .iterations(1)
32809             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32810         }
32811       }
32812     }
32813   }
32814 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,qmin)32815   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, qmin) {
32816     TEST_REQUIRES_X86_AVX;
32817     GemmMicrokernelTester()
32818       .mr(1)
32819       .nr(4)
32820       .kr(8)
32821       .sr(1)
32822       .m(1)
32823       .n(4)
32824       .k(8)
32825       .qmin(128)
32826       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32827   }
32828 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,qmax)32829   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, qmax) {
32830     TEST_REQUIRES_X86_AVX;
32831     GemmMicrokernelTester()
32832       .mr(1)
32833       .nr(4)
32834       .kr(8)
32835       .sr(1)
32836       .m(1)
32837       .n(4)
32838       .k(8)
32839       .qmax(128)
32840       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32841   }
32842 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64,strided_cm)32843   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD64, strided_cm) {
32844     TEST_REQUIRES_X86_AVX;
32845     GemmMicrokernelTester()
32846       .mr(1)
32847       .nr(4)
32848       .kr(8)
32849       .sr(1)
32850       .m(1)
32851       .n(4)
32852       .k(8)
32853       .cm_stride(7)
32854       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32855   }
32856 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
32857 
32858 
32859 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_eq_8)32860   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_eq_8) {
32861     TEST_REQUIRES_X86_XOP;
32862     GemmMicrokernelTester()
32863       .mr(1)
32864       .nr(4)
32865       .kr(8)
32866       .sr(1)
32867       .m(1)
32868       .n(4)
32869       .k(8)
32870       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32871   }
32872 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,strided_cn)32873   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, strided_cn) {
32874     TEST_REQUIRES_X86_XOP;
32875     GemmMicrokernelTester()
32876       .mr(1)
32877       .nr(4)
32878       .kr(8)
32879       .sr(1)
32880       .m(1)
32881       .n(4)
32882       .k(8)
32883       .cn_stride(7)
32884       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32885   }
32886 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_eq_8_strided_a)32887   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_eq_8_strided_a) {
32888     TEST_REQUIRES_X86_XOP;
32889     GemmMicrokernelTester()
32890       .mr(1)
32891       .nr(4)
32892       .kr(8)
32893       .sr(1)
32894       .m(1)
32895       .n(4)
32896       .k(8)
32897       .a_stride(11)
32898       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32899   }
32900 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_eq_8_subtile)32901   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_eq_8_subtile) {
32902     TEST_REQUIRES_X86_XOP;
32903     for (uint32_t n = 1; n <= 4; n++) {
32904       for (uint32_t m = 1; m <= 1; m++) {
32905         GemmMicrokernelTester()
32906           .mr(1)
32907           .nr(4)
32908           .kr(8)
32909           .sr(1)
32910           .m(m)
32911           .n(n)
32912           .k(8)
32913           .iterations(1)
32914           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32915       }
32916     }
32917   }
32918 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_eq_8_subtile_m)32919   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_eq_8_subtile_m) {
32920     TEST_REQUIRES_X86_XOP;
32921     for (uint32_t m = 1; m <= 1; m++) {
32922       GemmMicrokernelTester()
32923         .mr(1)
32924         .nr(4)
32925         .kr(8)
32926         .sr(1)
32927         .m(m)
32928         .n(4)
32929         .k(8)
32930         .iterations(1)
32931         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32932     }
32933   }
32934 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_eq_8_subtile_n)32935   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_eq_8_subtile_n) {
32936     TEST_REQUIRES_X86_XOP;
32937     for (uint32_t n = 1; n <= 4; n++) {
32938       GemmMicrokernelTester()
32939         .mr(1)
32940         .nr(4)
32941         .kr(8)
32942         .sr(1)
32943         .m(1)
32944         .n(n)
32945         .k(8)
32946         .iterations(1)
32947         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32948     }
32949   }
32950 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_lt_8)32951   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_lt_8) {
32952     TEST_REQUIRES_X86_XOP;
32953     for (size_t k = 1; k < 8; k++) {
32954       GemmMicrokernelTester()
32955         .mr(1)
32956         .nr(4)
32957         .kr(8)
32958         .sr(1)
32959         .m(1)
32960         .n(4)
32961         .k(k)
32962         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32963     }
32964   }
32965 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_lt_8_strided_a)32966   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_lt_8_strided_a) {
32967     TEST_REQUIRES_X86_XOP;
32968     for (size_t k = 1; k < 8; k++) {
32969       GemmMicrokernelTester()
32970         .mr(1)
32971         .nr(4)
32972         .kr(8)
32973         .sr(1)
32974         .m(1)
32975         .n(4)
32976         .k(k)
32977         .a_stride(11)
32978         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32979     }
32980   }
32981 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_lt_8_subtile)32982   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_lt_8_subtile) {
32983     TEST_REQUIRES_X86_XOP;
32984     for (size_t k = 1; k < 8; k++) {
32985       for (uint32_t n = 1; n <= 4; n++) {
32986         for (uint32_t m = 1; m <= 1; m++) {
32987           GemmMicrokernelTester()
32988             .mr(1)
32989             .nr(4)
32990             .kr(8)
32991             .sr(1)
32992             .m(m)
32993             .n(n)
32994             .k(k)
32995             .iterations(1)
32996             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
32997         }
32998       }
32999     }
33000   }
33001 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_gt_8)33002   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_gt_8) {
33003     TEST_REQUIRES_X86_XOP;
33004     for (size_t k = 9; k < 16; k++) {
33005       GemmMicrokernelTester()
33006         .mr(1)
33007         .nr(4)
33008         .kr(8)
33009         .sr(1)
33010         .m(1)
33011         .n(4)
33012         .k(k)
33013         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33014     }
33015   }
33016 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_gt_8_strided_a)33017   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_gt_8_strided_a) {
33018     TEST_REQUIRES_X86_XOP;
33019     for (size_t k = 9; k < 16; k++) {
33020       GemmMicrokernelTester()
33021         .mr(1)
33022         .nr(4)
33023         .kr(8)
33024         .sr(1)
33025         .m(1)
33026         .n(4)
33027         .k(k)
33028         .a_stride(19)
33029         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33030     }
33031   }
33032 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_gt_8_subtile)33033   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_gt_8_subtile) {
33034     TEST_REQUIRES_X86_XOP;
33035     for (size_t k = 9; k < 16; k++) {
33036       for (uint32_t n = 1; n <= 4; n++) {
33037         for (uint32_t m = 1; m <= 1; m++) {
33038           GemmMicrokernelTester()
33039             .mr(1)
33040             .nr(4)
33041             .kr(8)
33042             .sr(1)
33043             .m(m)
33044             .n(n)
33045             .k(k)
33046             .iterations(1)
33047             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33048         }
33049       }
33050     }
33051   }
33052 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_div_8)33053   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_div_8) {
33054     TEST_REQUIRES_X86_XOP;
33055     for (size_t k = 16; k <= 80; k += 8) {
33056       GemmMicrokernelTester()
33057         .mr(1)
33058         .nr(4)
33059         .kr(8)
33060         .sr(1)
33061         .m(1)
33062         .n(4)
33063         .k(k)
33064         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33065     }
33066   }
33067 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_div_8_strided_a)33068   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_div_8_strided_a) {
33069     TEST_REQUIRES_X86_XOP;
33070     for (size_t k = 16; k <= 80; k += 8) {
33071       GemmMicrokernelTester()
33072         .mr(1)
33073         .nr(4)
33074         .kr(8)
33075         .sr(1)
33076         .m(1)
33077         .n(4)
33078         .k(k)
33079         .a_stride(83)
33080         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33081     }
33082   }
33083 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,k_div_8_subtile)33084   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, k_div_8_subtile) {
33085     TEST_REQUIRES_X86_XOP;
33086     for (size_t k = 16; k <= 80; k += 8) {
33087       for (uint32_t n = 1; n <= 4; n++) {
33088         for (uint32_t m = 1; m <= 1; m++) {
33089           GemmMicrokernelTester()
33090             .mr(1)
33091             .nr(4)
33092             .kr(8)
33093             .sr(1)
33094             .m(m)
33095             .n(n)
33096             .k(k)
33097             .iterations(1)
33098             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33099         }
33100       }
33101     }
33102   }
33103 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_gt_4)33104   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_gt_4) {
33105     TEST_REQUIRES_X86_XOP;
33106     for (uint32_t n = 5; n < 8; n++) {
33107       for (size_t k = 1; k <= 40; k += 9) {
33108         GemmMicrokernelTester()
33109           .mr(1)
33110           .nr(4)
33111           .kr(8)
33112           .sr(1)
33113           .m(1)
33114           .n(n)
33115           .k(k)
33116           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33117       }
33118     }
33119   }
33120 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_gt_4_strided_cn)33121   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_gt_4_strided_cn) {
33122     TEST_REQUIRES_X86_XOP;
33123     for (uint32_t n = 5; n < 8; n++) {
33124       for (size_t k = 1; k <= 40; k += 9) {
33125         GemmMicrokernelTester()
33126           .mr(1)
33127           .nr(4)
33128           .kr(8)
33129           .sr(1)
33130           .m(1)
33131           .n(n)
33132           .k(k)
33133           .cn_stride(7)
33134           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33135       }
33136     }
33137   }
33138 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_gt_4_strided_a)33139   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_gt_4_strided_a) {
33140     TEST_REQUIRES_X86_XOP;
33141     for (uint32_t n = 5; n < 8; n++) {
33142       for (size_t k = 1; k <= 40; k += 9) {
33143         GemmMicrokernelTester()
33144           .mr(1)
33145           .nr(4)
33146           .kr(8)
33147           .sr(1)
33148           .m(1)
33149           .n(n)
33150           .k(k)
33151           .a_stride(43)
33152           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33153       }
33154     }
33155   }
33156 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_gt_4_subtile)33157   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_gt_4_subtile) {
33158     TEST_REQUIRES_X86_XOP;
33159     for (uint32_t n = 5; n < 8; n++) {
33160       for (size_t k = 1; k <= 40; k += 9) {
33161         for (uint32_t m = 1; m <= 1; m++) {
33162           GemmMicrokernelTester()
33163             .mr(1)
33164             .nr(4)
33165             .kr(8)
33166             .sr(1)
33167             .m(m)
33168             .n(n)
33169             .k(k)
33170             .iterations(1)
33171             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33172         }
33173       }
33174     }
33175   }
33176 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_div_4)33177   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_div_4) {
33178     TEST_REQUIRES_X86_XOP;
33179     for (uint32_t n = 8; n <= 12; n += 4) {
33180       for (size_t k = 1; k <= 40; k += 9) {
33181         GemmMicrokernelTester()
33182           .mr(1)
33183           .nr(4)
33184           .kr(8)
33185           .sr(1)
33186           .m(1)
33187           .n(n)
33188           .k(k)
33189           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33190       }
33191     }
33192   }
33193 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_div_4_strided_cn)33194   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_div_4_strided_cn) {
33195     TEST_REQUIRES_X86_XOP;
33196     for (uint32_t n = 8; n <= 12; n += 4) {
33197       for (size_t k = 1; k <= 40; k += 9) {
33198         GemmMicrokernelTester()
33199           .mr(1)
33200           .nr(4)
33201           .kr(8)
33202           .sr(1)
33203           .m(1)
33204           .n(n)
33205           .k(k)
33206           .cn_stride(7)
33207           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33208       }
33209     }
33210   }
33211 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_div_4_strided_a)33212   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_div_4_strided_a) {
33213     TEST_REQUIRES_X86_XOP;
33214     for (uint32_t n = 8; n <= 12; n += 4) {
33215       for (size_t k = 1; k <= 40; k += 9) {
33216         GemmMicrokernelTester()
33217           .mr(1)
33218           .nr(4)
33219           .kr(8)
33220           .sr(1)
33221           .m(1)
33222           .n(n)
33223           .k(k)
33224           .a_stride(43)
33225           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33226       }
33227     }
33228   }
33229 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,n_div_4_subtile)33230   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, n_div_4_subtile) {
33231     TEST_REQUIRES_X86_XOP;
33232     for (uint32_t n = 8; n <= 12; n += 4) {
33233       for (size_t k = 1; k <= 40; k += 9) {
33234         for (uint32_t m = 1; m <= 1; m++) {
33235           GemmMicrokernelTester()
33236             .mr(1)
33237             .nr(4)
33238             .kr(8)
33239             .sr(1)
33240             .m(m)
33241             .n(n)
33242             .k(k)
33243             .iterations(1)
33244             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33245         }
33246       }
33247     }
33248   }
33249 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,strided_cm_subtile)33250   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, strided_cm_subtile) {
33251     TEST_REQUIRES_X86_XOP;
33252     for (size_t k = 1; k <= 40; k += 9) {
33253       for (uint32_t n = 1; n <= 4; n++) {
33254         for (uint32_t m = 1; m <= 1; m++) {
33255           GemmMicrokernelTester()
33256             .mr(1)
33257             .nr(4)
33258             .kr(8)
33259             .sr(1)
33260             .m(m)
33261             .n(n)
33262             .k(k)
33263             .cm_stride(7)
33264             .iterations(1)
33265             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33266         }
33267       }
33268     }
33269   }
33270 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,qmin)33271   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, qmin) {
33272     TEST_REQUIRES_X86_XOP;
33273     GemmMicrokernelTester()
33274       .mr(1)
33275       .nr(4)
33276       .kr(8)
33277       .sr(1)
33278       .m(1)
33279       .n(4)
33280       .k(8)
33281       .qmin(128)
33282       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33283   }
33284 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,qmax)33285   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, qmax) {
33286     TEST_REQUIRES_X86_XOP;
33287     GemmMicrokernelTester()
33288       .mr(1)
33289       .nr(4)
33290       .kr(8)
33291       .sr(1)
33292       .m(1)
33293       .n(4)
33294       .k(8)
33295       .qmax(128)
33296       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33297   }
33298 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64,strided_cm)33299   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__XOP_LD64, strided_cm) {
33300     TEST_REQUIRES_X86_XOP;
33301     GemmMicrokernelTester()
33302       .mr(1)
33303       .nr(4)
33304       .kr(8)
33305       .sr(1)
33306       .m(1)
33307       .n(4)
33308       .k(8)
33309       .cm_stride(7)
33310       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__xop_ld64, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
33311   }
33312 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
33313 
33314 
33315 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_eq_8)33316   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_eq_8) {
33317     TEST_REQUIRES_X86_SSE2;
33318     GemmMicrokernelTester()
33319       .mr(1)
33320       .nr(4)
33321       .kr(8)
33322       .sr(1)
33323       .m(1)
33324       .n(4)
33325       .k(8)
33326       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33327   }
33328 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,strided_cn)33329   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, strided_cn) {
33330     TEST_REQUIRES_X86_SSE2;
33331     GemmMicrokernelTester()
33332       .mr(1)
33333       .nr(4)
33334       .kr(8)
33335       .sr(1)
33336       .m(1)
33337       .n(4)
33338       .k(8)
33339       .cn_stride(7)
33340       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33341   }
33342 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_eq_8_strided_a)33343   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_eq_8_strided_a) {
33344     TEST_REQUIRES_X86_SSE2;
33345     GemmMicrokernelTester()
33346       .mr(1)
33347       .nr(4)
33348       .kr(8)
33349       .sr(1)
33350       .m(1)
33351       .n(4)
33352       .k(8)
33353       .a_stride(11)
33354       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33355   }
33356 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_eq_8_subtile)33357   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_eq_8_subtile) {
33358     TEST_REQUIRES_X86_SSE2;
33359     for (uint32_t n = 1; n <= 4; n++) {
33360       for (uint32_t m = 1; m <= 1; m++) {
33361         GemmMicrokernelTester()
33362           .mr(1)
33363           .nr(4)
33364           .kr(8)
33365           .sr(1)
33366           .m(m)
33367           .n(n)
33368           .k(8)
33369           .iterations(1)
33370           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33371       }
33372     }
33373   }
33374 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_eq_8_subtile_m)33375   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_eq_8_subtile_m) {
33376     TEST_REQUIRES_X86_SSE2;
33377     for (uint32_t m = 1; m <= 1; m++) {
33378       GemmMicrokernelTester()
33379         .mr(1)
33380         .nr(4)
33381         .kr(8)
33382         .sr(1)
33383         .m(m)
33384         .n(4)
33385         .k(8)
33386         .iterations(1)
33387         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33388     }
33389   }
33390 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_eq_8_subtile_n)33391   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_eq_8_subtile_n) {
33392     TEST_REQUIRES_X86_SSE2;
33393     for (uint32_t n = 1; n <= 4; n++) {
33394       GemmMicrokernelTester()
33395         .mr(1)
33396         .nr(4)
33397         .kr(8)
33398         .sr(1)
33399         .m(1)
33400         .n(n)
33401         .k(8)
33402         .iterations(1)
33403         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33404     }
33405   }
33406 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_lt_8)33407   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_lt_8) {
33408     TEST_REQUIRES_X86_SSE2;
33409     for (size_t k = 1; k < 8; k++) {
33410       GemmMicrokernelTester()
33411         .mr(1)
33412         .nr(4)
33413         .kr(8)
33414         .sr(1)
33415         .m(1)
33416         .n(4)
33417         .k(k)
33418         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33419     }
33420   }
33421 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_lt_8_strided_a)33422   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_lt_8_strided_a) {
33423     TEST_REQUIRES_X86_SSE2;
33424     for (size_t k = 1; k < 8; k++) {
33425       GemmMicrokernelTester()
33426         .mr(1)
33427         .nr(4)
33428         .kr(8)
33429         .sr(1)
33430         .m(1)
33431         .n(4)
33432         .k(k)
33433         .a_stride(11)
33434         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33435     }
33436   }
33437 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_lt_8_subtile)33438   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_lt_8_subtile) {
33439     TEST_REQUIRES_X86_SSE2;
33440     for (size_t k = 1; k < 8; k++) {
33441       for (uint32_t n = 1; n <= 4; n++) {
33442         for (uint32_t m = 1; m <= 1; m++) {
33443           GemmMicrokernelTester()
33444             .mr(1)
33445             .nr(4)
33446             .kr(8)
33447             .sr(1)
33448             .m(m)
33449             .n(n)
33450             .k(k)
33451             .iterations(1)
33452             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33453         }
33454       }
33455     }
33456   }
33457 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_gt_8)33458   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_gt_8) {
33459     TEST_REQUIRES_X86_SSE2;
33460     for (size_t k = 9; k < 16; k++) {
33461       GemmMicrokernelTester()
33462         .mr(1)
33463         .nr(4)
33464         .kr(8)
33465         .sr(1)
33466         .m(1)
33467         .n(4)
33468         .k(k)
33469         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33470     }
33471   }
33472 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_gt_8_strided_a)33473   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_gt_8_strided_a) {
33474     TEST_REQUIRES_X86_SSE2;
33475     for (size_t k = 9; k < 16; k++) {
33476       GemmMicrokernelTester()
33477         .mr(1)
33478         .nr(4)
33479         .kr(8)
33480         .sr(1)
33481         .m(1)
33482         .n(4)
33483         .k(k)
33484         .a_stride(19)
33485         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33486     }
33487   }
33488 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_gt_8_subtile)33489   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_gt_8_subtile) {
33490     TEST_REQUIRES_X86_SSE2;
33491     for (size_t k = 9; k < 16; k++) {
33492       for (uint32_t n = 1; n <= 4; n++) {
33493         for (uint32_t m = 1; m <= 1; m++) {
33494           GemmMicrokernelTester()
33495             .mr(1)
33496             .nr(4)
33497             .kr(8)
33498             .sr(1)
33499             .m(m)
33500             .n(n)
33501             .k(k)
33502             .iterations(1)
33503             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33504         }
33505       }
33506     }
33507   }
33508 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_div_8)33509   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_div_8) {
33510     TEST_REQUIRES_X86_SSE2;
33511     for (size_t k = 16; k <= 80; k += 8) {
33512       GemmMicrokernelTester()
33513         .mr(1)
33514         .nr(4)
33515         .kr(8)
33516         .sr(1)
33517         .m(1)
33518         .n(4)
33519         .k(k)
33520         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33521     }
33522   }
33523 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_div_8_strided_a)33524   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_div_8_strided_a) {
33525     TEST_REQUIRES_X86_SSE2;
33526     for (size_t k = 16; k <= 80; k += 8) {
33527       GemmMicrokernelTester()
33528         .mr(1)
33529         .nr(4)
33530         .kr(8)
33531         .sr(1)
33532         .m(1)
33533         .n(4)
33534         .k(k)
33535         .a_stride(83)
33536         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33537     }
33538   }
33539 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,k_div_8_subtile)33540   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, k_div_8_subtile) {
33541     TEST_REQUIRES_X86_SSE2;
33542     for (size_t k = 16; k <= 80; k += 8) {
33543       for (uint32_t n = 1; n <= 4; n++) {
33544         for (uint32_t m = 1; m <= 1; m++) {
33545           GemmMicrokernelTester()
33546             .mr(1)
33547             .nr(4)
33548             .kr(8)
33549             .sr(1)
33550             .m(m)
33551             .n(n)
33552             .k(k)
33553             .iterations(1)
33554             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33555         }
33556       }
33557     }
33558   }
33559 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_gt_4)33560   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_gt_4) {
33561     TEST_REQUIRES_X86_SSE2;
33562     for (uint32_t n = 5; n < 8; n++) {
33563       for (size_t k = 1; k <= 40; k += 9) {
33564         GemmMicrokernelTester()
33565           .mr(1)
33566           .nr(4)
33567           .kr(8)
33568           .sr(1)
33569           .m(1)
33570           .n(n)
33571           .k(k)
33572           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33573       }
33574     }
33575   }
33576 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_gt_4_strided_cn)33577   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_gt_4_strided_cn) {
33578     TEST_REQUIRES_X86_SSE2;
33579     for (uint32_t n = 5; n < 8; n++) {
33580       for (size_t k = 1; k <= 40; k += 9) {
33581         GemmMicrokernelTester()
33582           .mr(1)
33583           .nr(4)
33584           .kr(8)
33585           .sr(1)
33586           .m(1)
33587           .n(n)
33588           .k(k)
33589           .cn_stride(7)
33590           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33591       }
33592     }
33593   }
33594 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_gt_4_strided_a)33595   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_gt_4_strided_a) {
33596     TEST_REQUIRES_X86_SSE2;
33597     for (uint32_t n = 5; n < 8; n++) {
33598       for (size_t k = 1; k <= 40; k += 9) {
33599         GemmMicrokernelTester()
33600           .mr(1)
33601           .nr(4)
33602           .kr(8)
33603           .sr(1)
33604           .m(1)
33605           .n(n)
33606           .k(k)
33607           .a_stride(43)
33608           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33609       }
33610     }
33611   }
33612 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_gt_4_subtile)33613   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_gt_4_subtile) {
33614     TEST_REQUIRES_X86_SSE2;
33615     for (uint32_t n = 5; n < 8; n++) {
33616       for (size_t k = 1; k <= 40; k += 9) {
33617         for (uint32_t m = 1; m <= 1; m++) {
33618           GemmMicrokernelTester()
33619             .mr(1)
33620             .nr(4)
33621             .kr(8)
33622             .sr(1)
33623             .m(m)
33624             .n(n)
33625             .k(k)
33626             .iterations(1)
33627             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33628         }
33629       }
33630     }
33631   }
33632 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_div_4)33633   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_div_4) {
33634     TEST_REQUIRES_X86_SSE2;
33635     for (uint32_t n = 8; n <= 12; n += 4) {
33636       for (size_t k = 1; k <= 40; k += 9) {
33637         GemmMicrokernelTester()
33638           .mr(1)
33639           .nr(4)
33640           .kr(8)
33641           .sr(1)
33642           .m(1)
33643           .n(n)
33644           .k(k)
33645           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33646       }
33647     }
33648   }
33649 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_div_4_strided_cn)33650   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_div_4_strided_cn) {
33651     TEST_REQUIRES_X86_SSE2;
33652     for (uint32_t n = 8; n <= 12; n += 4) {
33653       for (size_t k = 1; k <= 40; k += 9) {
33654         GemmMicrokernelTester()
33655           .mr(1)
33656           .nr(4)
33657           .kr(8)
33658           .sr(1)
33659           .m(1)
33660           .n(n)
33661           .k(k)
33662           .cn_stride(7)
33663           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33664       }
33665     }
33666   }
33667 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_div_4_strided_a)33668   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_div_4_strided_a) {
33669     TEST_REQUIRES_X86_SSE2;
33670     for (uint32_t n = 8; n <= 12; n += 4) {
33671       for (size_t k = 1; k <= 40; k += 9) {
33672         GemmMicrokernelTester()
33673           .mr(1)
33674           .nr(4)
33675           .kr(8)
33676           .sr(1)
33677           .m(1)
33678           .n(n)
33679           .k(k)
33680           .a_stride(43)
33681           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33682       }
33683     }
33684   }
33685 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,n_div_4_subtile)33686   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, n_div_4_subtile) {
33687     TEST_REQUIRES_X86_SSE2;
33688     for (uint32_t n = 8; n <= 12; n += 4) {
33689       for (size_t k = 1; k <= 40; k += 9) {
33690         for (uint32_t m = 1; m <= 1; m++) {
33691           GemmMicrokernelTester()
33692             .mr(1)
33693             .nr(4)
33694             .kr(8)
33695             .sr(1)
33696             .m(m)
33697             .n(n)
33698             .k(k)
33699             .iterations(1)
33700             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33701         }
33702       }
33703     }
33704   }
33705 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,strided_cm_subtile)33706   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, strided_cm_subtile) {
33707     TEST_REQUIRES_X86_SSE2;
33708     for (size_t k = 1; k <= 40; k += 9) {
33709       for (uint32_t n = 1; n <= 4; n++) {
33710         for (uint32_t m = 1; m <= 1; m++) {
33711           GemmMicrokernelTester()
33712             .mr(1)
33713             .nr(4)
33714             .kr(8)
33715             .sr(1)
33716             .m(m)
33717             .n(n)
33718             .k(k)
33719             .cm_stride(7)
33720             .iterations(1)
33721             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33722         }
33723       }
33724     }
33725   }
33726 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,qmin)33727   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, qmin) {
33728     TEST_REQUIRES_X86_SSE2;
33729     GemmMicrokernelTester()
33730       .mr(1)
33731       .nr(4)
33732       .kr(8)
33733       .sr(1)
33734       .m(1)
33735       .n(4)
33736       .k(8)
33737       .qmin(128)
33738       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33739   }
33740 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,qmax)33741   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, qmax) {
33742     TEST_REQUIRES_X86_SSE2;
33743     GemmMicrokernelTester()
33744       .mr(1)
33745       .nr(4)
33746       .kr(8)
33747       .sr(1)
33748       .m(1)
33749       .n(4)
33750       .k(8)
33751       .qmax(128)
33752       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33753   }
33754 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128,strided_cm)33755   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__SSE2_LD128, strided_cm) {
33756     TEST_REQUIRES_X86_SSE2;
33757     GemmMicrokernelTester()
33758       .mr(1)
33759       .nr(4)
33760       .kr(8)
33761       .sr(1)
33762       .m(1)
33763       .n(4)
33764       .k(8)
33765       .cm_stride(7)
33766       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33767   }
33768 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
33769 
33770 
33771 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_eq_8)33772   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_eq_8) {
33773     TEST_REQUIRES_X86_SSE2;
33774     GemmMicrokernelTester()
33775       .mr(2)
33776       .nr(4)
33777       .kr(8)
33778       .sr(1)
33779       .m(2)
33780       .n(4)
33781       .k(8)
33782       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33783   }
33784 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,strided_cn)33785   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, strided_cn) {
33786     TEST_REQUIRES_X86_SSE2;
33787     GemmMicrokernelTester()
33788       .mr(2)
33789       .nr(4)
33790       .kr(8)
33791       .sr(1)
33792       .m(2)
33793       .n(4)
33794       .k(8)
33795       .cn_stride(7)
33796       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33797   }
33798 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_eq_8_strided_a)33799   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_eq_8_strided_a) {
33800     TEST_REQUIRES_X86_SSE2;
33801     GemmMicrokernelTester()
33802       .mr(2)
33803       .nr(4)
33804       .kr(8)
33805       .sr(1)
33806       .m(2)
33807       .n(4)
33808       .k(8)
33809       .a_stride(11)
33810       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33811   }
33812 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_eq_8_subtile)33813   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_eq_8_subtile) {
33814     TEST_REQUIRES_X86_SSE2;
33815     for (uint32_t n = 1; n <= 4; n++) {
33816       for (uint32_t m = 1; m <= 2; m++) {
33817         GemmMicrokernelTester()
33818           .mr(2)
33819           .nr(4)
33820           .kr(8)
33821           .sr(1)
33822           .m(m)
33823           .n(n)
33824           .k(8)
33825           .iterations(1)
33826           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33827       }
33828     }
33829   }
33830 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_eq_8_subtile_m)33831   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_eq_8_subtile_m) {
33832     TEST_REQUIRES_X86_SSE2;
33833     for (uint32_t m = 1; m <= 2; m++) {
33834       GemmMicrokernelTester()
33835         .mr(2)
33836         .nr(4)
33837         .kr(8)
33838         .sr(1)
33839         .m(m)
33840         .n(4)
33841         .k(8)
33842         .iterations(1)
33843         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33844     }
33845   }
33846 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_eq_8_subtile_n)33847   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_eq_8_subtile_n) {
33848     TEST_REQUIRES_X86_SSE2;
33849     for (uint32_t n = 1; n <= 4; n++) {
33850       GemmMicrokernelTester()
33851         .mr(2)
33852         .nr(4)
33853         .kr(8)
33854         .sr(1)
33855         .m(2)
33856         .n(n)
33857         .k(8)
33858         .iterations(1)
33859         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33860     }
33861   }
33862 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_lt_8)33863   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_lt_8) {
33864     TEST_REQUIRES_X86_SSE2;
33865     for (size_t k = 1; k < 8; k++) {
33866       GemmMicrokernelTester()
33867         .mr(2)
33868         .nr(4)
33869         .kr(8)
33870         .sr(1)
33871         .m(2)
33872         .n(4)
33873         .k(k)
33874         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33875     }
33876   }
33877 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_lt_8_strided_a)33878   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_lt_8_strided_a) {
33879     TEST_REQUIRES_X86_SSE2;
33880     for (size_t k = 1; k < 8; k++) {
33881       GemmMicrokernelTester()
33882         .mr(2)
33883         .nr(4)
33884         .kr(8)
33885         .sr(1)
33886         .m(2)
33887         .n(4)
33888         .k(k)
33889         .a_stride(11)
33890         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33891     }
33892   }
33893 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_lt_8_subtile)33894   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_lt_8_subtile) {
33895     TEST_REQUIRES_X86_SSE2;
33896     for (size_t k = 1; k < 8; k++) {
33897       for (uint32_t n = 1; n <= 4; n++) {
33898         for (uint32_t m = 1; m <= 2; m++) {
33899           GemmMicrokernelTester()
33900             .mr(2)
33901             .nr(4)
33902             .kr(8)
33903             .sr(1)
33904             .m(m)
33905             .n(n)
33906             .k(k)
33907             .iterations(1)
33908             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33909         }
33910       }
33911     }
33912   }
33913 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_gt_8)33914   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_gt_8) {
33915     TEST_REQUIRES_X86_SSE2;
33916     for (size_t k = 9; k < 16; k++) {
33917       GemmMicrokernelTester()
33918         .mr(2)
33919         .nr(4)
33920         .kr(8)
33921         .sr(1)
33922         .m(2)
33923         .n(4)
33924         .k(k)
33925         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33926     }
33927   }
33928 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_gt_8_strided_a)33929   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_gt_8_strided_a) {
33930     TEST_REQUIRES_X86_SSE2;
33931     for (size_t k = 9; k < 16; k++) {
33932       GemmMicrokernelTester()
33933         .mr(2)
33934         .nr(4)
33935         .kr(8)
33936         .sr(1)
33937         .m(2)
33938         .n(4)
33939         .k(k)
33940         .a_stride(19)
33941         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33942     }
33943   }
33944 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_gt_8_subtile)33945   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_gt_8_subtile) {
33946     TEST_REQUIRES_X86_SSE2;
33947     for (size_t k = 9; k < 16; k++) {
33948       for (uint32_t n = 1; n <= 4; n++) {
33949         for (uint32_t m = 1; m <= 2; m++) {
33950           GemmMicrokernelTester()
33951             .mr(2)
33952             .nr(4)
33953             .kr(8)
33954             .sr(1)
33955             .m(m)
33956             .n(n)
33957             .k(k)
33958             .iterations(1)
33959             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33960         }
33961       }
33962     }
33963   }
33964 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_div_8)33965   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_div_8) {
33966     TEST_REQUIRES_X86_SSE2;
33967     for (size_t k = 16; k <= 80; k += 8) {
33968       GemmMicrokernelTester()
33969         .mr(2)
33970         .nr(4)
33971         .kr(8)
33972         .sr(1)
33973         .m(2)
33974         .n(4)
33975         .k(k)
33976         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33977     }
33978   }
33979 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_div_8_strided_a)33980   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_div_8_strided_a) {
33981     TEST_REQUIRES_X86_SSE2;
33982     for (size_t k = 16; k <= 80; k += 8) {
33983       GemmMicrokernelTester()
33984         .mr(2)
33985         .nr(4)
33986         .kr(8)
33987         .sr(1)
33988         .m(2)
33989         .n(4)
33990         .k(k)
33991         .a_stride(83)
33992         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
33993     }
33994   }
33995 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,k_div_8_subtile)33996   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, k_div_8_subtile) {
33997     TEST_REQUIRES_X86_SSE2;
33998     for (size_t k = 16; k <= 80; k += 8) {
33999       for (uint32_t n = 1; n <= 4; n++) {
34000         for (uint32_t m = 1; m <= 2; m++) {
34001           GemmMicrokernelTester()
34002             .mr(2)
34003             .nr(4)
34004             .kr(8)
34005             .sr(1)
34006             .m(m)
34007             .n(n)
34008             .k(k)
34009             .iterations(1)
34010             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34011         }
34012       }
34013     }
34014   }
34015 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_gt_4)34016   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_gt_4) {
34017     TEST_REQUIRES_X86_SSE2;
34018     for (uint32_t n = 5; n < 8; n++) {
34019       for (size_t k = 1; k <= 40; k += 9) {
34020         GemmMicrokernelTester()
34021           .mr(2)
34022           .nr(4)
34023           .kr(8)
34024           .sr(1)
34025           .m(2)
34026           .n(n)
34027           .k(k)
34028           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34029       }
34030     }
34031   }
34032 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_gt_4_strided_cn)34033   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_gt_4_strided_cn) {
34034     TEST_REQUIRES_X86_SSE2;
34035     for (uint32_t n = 5; n < 8; n++) {
34036       for (size_t k = 1; k <= 40; k += 9) {
34037         GemmMicrokernelTester()
34038           .mr(2)
34039           .nr(4)
34040           .kr(8)
34041           .sr(1)
34042           .m(2)
34043           .n(n)
34044           .k(k)
34045           .cn_stride(7)
34046           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34047       }
34048     }
34049   }
34050 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_gt_4_strided_a)34051   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_gt_4_strided_a) {
34052     TEST_REQUIRES_X86_SSE2;
34053     for (uint32_t n = 5; n < 8; n++) {
34054       for (size_t k = 1; k <= 40; k += 9) {
34055         GemmMicrokernelTester()
34056           .mr(2)
34057           .nr(4)
34058           .kr(8)
34059           .sr(1)
34060           .m(2)
34061           .n(n)
34062           .k(k)
34063           .a_stride(43)
34064           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34065       }
34066     }
34067   }
34068 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_gt_4_subtile)34069   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_gt_4_subtile) {
34070     TEST_REQUIRES_X86_SSE2;
34071     for (uint32_t n = 5; n < 8; n++) {
34072       for (size_t k = 1; k <= 40; k += 9) {
34073         for (uint32_t m = 1; m <= 2; m++) {
34074           GemmMicrokernelTester()
34075             .mr(2)
34076             .nr(4)
34077             .kr(8)
34078             .sr(1)
34079             .m(m)
34080             .n(n)
34081             .k(k)
34082             .iterations(1)
34083             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34084         }
34085       }
34086     }
34087   }
34088 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_div_4)34089   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_div_4) {
34090     TEST_REQUIRES_X86_SSE2;
34091     for (uint32_t n = 8; n <= 12; n += 4) {
34092       for (size_t k = 1; k <= 40; k += 9) {
34093         GemmMicrokernelTester()
34094           .mr(2)
34095           .nr(4)
34096           .kr(8)
34097           .sr(1)
34098           .m(2)
34099           .n(n)
34100           .k(k)
34101           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34102       }
34103     }
34104   }
34105 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_div_4_strided_cn)34106   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_div_4_strided_cn) {
34107     TEST_REQUIRES_X86_SSE2;
34108     for (uint32_t n = 8; n <= 12; n += 4) {
34109       for (size_t k = 1; k <= 40; k += 9) {
34110         GemmMicrokernelTester()
34111           .mr(2)
34112           .nr(4)
34113           .kr(8)
34114           .sr(1)
34115           .m(2)
34116           .n(n)
34117           .k(k)
34118           .cn_stride(7)
34119           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34120       }
34121     }
34122   }
34123 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_div_4_strided_a)34124   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_div_4_strided_a) {
34125     TEST_REQUIRES_X86_SSE2;
34126     for (uint32_t n = 8; n <= 12; n += 4) {
34127       for (size_t k = 1; k <= 40; k += 9) {
34128         GemmMicrokernelTester()
34129           .mr(2)
34130           .nr(4)
34131           .kr(8)
34132           .sr(1)
34133           .m(2)
34134           .n(n)
34135           .k(k)
34136           .a_stride(43)
34137           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34138       }
34139     }
34140   }
34141 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,n_div_4_subtile)34142   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, n_div_4_subtile) {
34143     TEST_REQUIRES_X86_SSE2;
34144     for (uint32_t n = 8; n <= 12; n += 4) {
34145       for (size_t k = 1; k <= 40; k += 9) {
34146         for (uint32_t m = 1; m <= 2; m++) {
34147           GemmMicrokernelTester()
34148             .mr(2)
34149             .nr(4)
34150             .kr(8)
34151             .sr(1)
34152             .m(m)
34153             .n(n)
34154             .k(k)
34155             .iterations(1)
34156             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34157         }
34158       }
34159     }
34160   }
34161 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,strided_cm_subtile)34162   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, strided_cm_subtile) {
34163     TEST_REQUIRES_X86_SSE2;
34164     for (size_t k = 1; k <= 40; k += 9) {
34165       for (uint32_t n = 1; n <= 4; n++) {
34166         for (uint32_t m = 1; m <= 2; m++) {
34167           GemmMicrokernelTester()
34168             .mr(2)
34169             .nr(4)
34170             .kr(8)
34171             .sr(1)
34172             .m(m)
34173             .n(n)
34174             .k(k)
34175             .cm_stride(7)
34176             .iterations(1)
34177             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34178         }
34179       }
34180     }
34181   }
34182 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,qmin)34183   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, qmin) {
34184     TEST_REQUIRES_X86_SSE2;
34185     GemmMicrokernelTester()
34186       .mr(2)
34187       .nr(4)
34188       .kr(8)
34189       .sr(1)
34190       .m(2)
34191       .n(4)
34192       .k(8)
34193       .qmin(128)
34194       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34195   }
34196 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,qmax)34197   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, qmax) {
34198     TEST_REQUIRES_X86_SSE2;
34199     GemmMicrokernelTester()
34200       .mr(2)
34201       .nr(4)
34202       .kr(8)
34203       .sr(1)
34204       .m(2)
34205       .n(4)
34206       .k(8)
34207       .qmax(128)
34208       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34209   }
34210 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128,strided_cm)34211   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__SSE2_LD128, strided_cm) {
34212     TEST_REQUIRES_X86_SSE2;
34213     GemmMicrokernelTester()
34214       .mr(2)
34215       .nr(4)
34216       .kr(8)
34217       .sr(1)
34218       .m(2)
34219       .n(4)
34220       .k(8)
34221       .cm_stride(7)
34222       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__sse2_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34223   }
34224 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
34225 
34226 
34227 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_eq_8)34228   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_eq_8) {
34229     TEST_REQUIRES_X86_SSSE3;
34230     GemmMicrokernelTester()
34231       .mr(3)
34232       .nr(4)
34233       .kr(8)
34234       .sr(1)
34235       .m(3)
34236       .n(4)
34237       .k(8)
34238       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34239   }
34240 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,strided_cn)34241   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, strided_cn) {
34242     TEST_REQUIRES_X86_SSSE3;
34243     GemmMicrokernelTester()
34244       .mr(3)
34245       .nr(4)
34246       .kr(8)
34247       .sr(1)
34248       .m(3)
34249       .n(4)
34250       .k(8)
34251       .cn_stride(7)
34252       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34253   }
34254 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_eq_8_strided_a)34255   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_eq_8_strided_a) {
34256     TEST_REQUIRES_X86_SSSE3;
34257     GemmMicrokernelTester()
34258       .mr(3)
34259       .nr(4)
34260       .kr(8)
34261       .sr(1)
34262       .m(3)
34263       .n(4)
34264       .k(8)
34265       .a_stride(11)
34266       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34267   }
34268 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_eq_8_subtile)34269   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_eq_8_subtile) {
34270     TEST_REQUIRES_X86_SSSE3;
34271     for (uint32_t n = 1; n <= 4; n++) {
34272       for (uint32_t m = 1; m <= 3; m++) {
34273         GemmMicrokernelTester()
34274           .mr(3)
34275           .nr(4)
34276           .kr(8)
34277           .sr(1)
34278           .m(m)
34279           .n(n)
34280           .k(8)
34281           .iterations(1)
34282           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34283       }
34284     }
34285   }
34286 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_eq_8_subtile_m)34287   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_eq_8_subtile_m) {
34288     TEST_REQUIRES_X86_SSSE3;
34289     for (uint32_t m = 1; m <= 3; m++) {
34290       GemmMicrokernelTester()
34291         .mr(3)
34292         .nr(4)
34293         .kr(8)
34294         .sr(1)
34295         .m(m)
34296         .n(4)
34297         .k(8)
34298         .iterations(1)
34299         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34300     }
34301   }
34302 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_eq_8_subtile_n)34303   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_eq_8_subtile_n) {
34304     TEST_REQUIRES_X86_SSSE3;
34305     for (uint32_t n = 1; n <= 4; n++) {
34306       GemmMicrokernelTester()
34307         .mr(3)
34308         .nr(4)
34309         .kr(8)
34310         .sr(1)
34311         .m(3)
34312         .n(n)
34313         .k(8)
34314         .iterations(1)
34315         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34316     }
34317   }
34318 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_lt_8)34319   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_lt_8) {
34320     TEST_REQUIRES_X86_SSSE3;
34321     for (size_t k = 1; k < 8; k++) {
34322       GemmMicrokernelTester()
34323         .mr(3)
34324         .nr(4)
34325         .kr(8)
34326         .sr(1)
34327         .m(3)
34328         .n(4)
34329         .k(k)
34330         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34331     }
34332   }
34333 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_lt_8_strided_a)34334   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_lt_8_strided_a) {
34335     TEST_REQUIRES_X86_SSSE3;
34336     for (size_t k = 1; k < 8; k++) {
34337       GemmMicrokernelTester()
34338         .mr(3)
34339         .nr(4)
34340         .kr(8)
34341         .sr(1)
34342         .m(3)
34343         .n(4)
34344         .k(k)
34345         .a_stride(11)
34346         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34347     }
34348   }
34349 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_lt_8_subtile)34350   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_lt_8_subtile) {
34351     TEST_REQUIRES_X86_SSSE3;
34352     for (size_t k = 1; k < 8; k++) {
34353       for (uint32_t n = 1; n <= 4; n++) {
34354         for (uint32_t m = 1; m <= 3; m++) {
34355           GemmMicrokernelTester()
34356             .mr(3)
34357             .nr(4)
34358             .kr(8)
34359             .sr(1)
34360             .m(m)
34361             .n(n)
34362             .k(k)
34363             .iterations(1)
34364             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34365         }
34366       }
34367     }
34368   }
34369 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_gt_8)34370   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_gt_8) {
34371     TEST_REQUIRES_X86_SSSE3;
34372     for (size_t k = 9; k < 16; k++) {
34373       GemmMicrokernelTester()
34374         .mr(3)
34375         .nr(4)
34376         .kr(8)
34377         .sr(1)
34378         .m(3)
34379         .n(4)
34380         .k(k)
34381         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34382     }
34383   }
34384 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_gt_8_strided_a)34385   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_gt_8_strided_a) {
34386     TEST_REQUIRES_X86_SSSE3;
34387     for (size_t k = 9; k < 16; k++) {
34388       GemmMicrokernelTester()
34389         .mr(3)
34390         .nr(4)
34391         .kr(8)
34392         .sr(1)
34393         .m(3)
34394         .n(4)
34395         .k(k)
34396         .a_stride(19)
34397         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34398     }
34399   }
34400 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_gt_8_subtile)34401   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_gt_8_subtile) {
34402     TEST_REQUIRES_X86_SSSE3;
34403     for (size_t k = 9; k < 16; k++) {
34404       for (uint32_t n = 1; n <= 4; n++) {
34405         for (uint32_t m = 1; m <= 3; m++) {
34406           GemmMicrokernelTester()
34407             .mr(3)
34408             .nr(4)
34409             .kr(8)
34410             .sr(1)
34411             .m(m)
34412             .n(n)
34413             .k(k)
34414             .iterations(1)
34415             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34416         }
34417       }
34418     }
34419   }
34420 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_div_8)34421   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_div_8) {
34422     TEST_REQUIRES_X86_SSSE3;
34423     for (size_t k = 16; k <= 80; k += 8) {
34424       GemmMicrokernelTester()
34425         .mr(3)
34426         .nr(4)
34427         .kr(8)
34428         .sr(1)
34429         .m(3)
34430         .n(4)
34431         .k(k)
34432         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34433     }
34434   }
34435 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_div_8_strided_a)34436   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_div_8_strided_a) {
34437     TEST_REQUIRES_X86_SSSE3;
34438     for (size_t k = 16; k <= 80; k += 8) {
34439       GemmMicrokernelTester()
34440         .mr(3)
34441         .nr(4)
34442         .kr(8)
34443         .sr(1)
34444         .m(3)
34445         .n(4)
34446         .k(k)
34447         .a_stride(83)
34448         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34449     }
34450   }
34451 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,k_div_8_subtile)34452   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, k_div_8_subtile) {
34453     TEST_REQUIRES_X86_SSSE3;
34454     for (size_t k = 16; k <= 80; k += 8) {
34455       for (uint32_t n = 1; n <= 4; n++) {
34456         for (uint32_t m = 1; m <= 3; m++) {
34457           GemmMicrokernelTester()
34458             .mr(3)
34459             .nr(4)
34460             .kr(8)
34461             .sr(1)
34462             .m(m)
34463             .n(n)
34464             .k(k)
34465             .iterations(1)
34466             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34467         }
34468       }
34469     }
34470   }
34471 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_gt_4)34472   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_gt_4) {
34473     TEST_REQUIRES_X86_SSSE3;
34474     for (uint32_t n = 5; n < 8; n++) {
34475       for (size_t k = 1; k <= 40; k += 9) {
34476         GemmMicrokernelTester()
34477           .mr(3)
34478           .nr(4)
34479           .kr(8)
34480           .sr(1)
34481           .m(3)
34482           .n(n)
34483           .k(k)
34484           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34485       }
34486     }
34487   }
34488 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_gt_4_strided_cn)34489   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_gt_4_strided_cn) {
34490     TEST_REQUIRES_X86_SSSE3;
34491     for (uint32_t n = 5; n < 8; n++) {
34492       for (size_t k = 1; k <= 40; k += 9) {
34493         GemmMicrokernelTester()
34494           .mr(3)
34495           .nr(4)
34496           .kr(8)
34497           .sr(1)
34498           .m(3)
34499           .n(n)
34500           .k(k)
34501           .cn_stride(7)
34502           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34503       }
34504     }
34505   }
34506 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_gt_4_strided_a)34507   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_gt_4_strided_a) {
34508     TEST_REQUIRES_X86_SSSE3;
34509     for (uint32_t n = 5; n < 8; n++) {
34510       for (size_t k = 1; k <= 40; k += 9) {
34511         GemmMicrokernelTester()
34512           .mr(3)
34513           .nr(4)
34514           .kr(8)
34515           .sr(1)
34516           .m(3)
34517           .n(n)
34518           .k(k)
34519           .a_stride(43)
34520           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34521       }
34522     }
34523   }
34524 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_gt_4_subtile)34525   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_gt_4_subtile) {
34526     TEST_REQUIRES_X86_SSSE3;
34527     for (uint32_t n = 5; n < 8; n++) {
34528       for (size_t k = 1; k <= 40; k += 9) {
34529         for (uint32_t m = 1; m <= 3; m++) {
34530           GemmMicrokernelTester()
34531             .mr(3)
34532             .nr(4)
34533             .kr(8)
34534             .sr(1)
34535             .m(m)
34536             .n(n)
34537             .k(k)
34538             .iterations(1)
34539             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34540         }
34541       }
34542     }
34543   }
34544 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_div_4)34545   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_div_4) {
34546     TEST_REQUIRES_X86_SSSE3;
34547     for (uint32_t n = 8; n <= 12; n += 4) {
34548       for (size_t k = 1; k <= 40; k += 9) {
34549         GemmMicrokernelTester()
34550           .mr(3)
34551           .nr(4)
34552           .kr(8)
34553           .sr(1)
34554           .m(3)
34555           .n(n)
34556           .k(k)
34557           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34558       }
34559     }
34560   }
34561 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_div_4_strided_cn)34562   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_div_4_strided_cn) {
34563     TEST_REQUIRES_X86_SSSE3;
34564     for (uint32_t n = 8; n <= 12; n += 4) {
34565       for (size_t k = 1; k <= 40; k += 9) {
34566         GemmMicrokernelTester()
34567           .mr(3)
34568           .nr(4)
34569           .kr(8)
34570           .sr(1)
34571           .m(3)
34572           .n(n)
34573           .k(k)
34574           .cn_stride(7)
34575           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34576       }
34577     }
34578   }
34579 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_div_4_strided_a)34580   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_div_4_strided_a) {
34581     TEST_REQUIRES_X86_SSSE3;
34582     for (uint32_t n = 8; n <= 12; n += 4) {
34583       for (size_t k = 1; k <= 40; k += 9) {
34584         GemmMicrokernelTester()
34585           .mr(3)
34586           .nr(4)
34587           .kr(8)
34588           .sr(1)
34589           .m(3)
34590           .n(n)
34591           .k(k)
34592           .a_stride(43)
34593           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34594       }
34595     }
34596   }
34597 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,n_div_4_subtile)34598   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, n_div_4_subtile) {
34599     TEST_REQUIRES_X86_SSSE3;
34600     for (uint32_t n = 8; n <= 12; n += 4) {
34601       for (size_t k = 1; k <= 40; k += 9) {
34602         for (uint32_t m = 1; m <= 3; m++) {
34603           GemmMicrokernelTester()
34604             .mr(3)
34605             .nr(4)
34606             .kr(8)
34607             .sr(1)
34608             .m(m)
34609             .n(n)
34610             .k(k)
34611             .iterations(1)
34612             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34613         }
34614       }
34615     }
34616   }
34617 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,strided_cm_subtile)34618   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, strided_cm_subtile) {
34619     TEST_REQUIRES_X86_SSSE3;
34620     for (size_t k = 1; k <= 40; k += 9) {
34621       for (uint32_t n = 1; n <= 4; n++) {
34622         for (uint32_t m = 1; m <= 3; m++) {
34623           GemmMicrokernelTester()
34624             .mr(3)
34625             .nr(4)
34626             .kr(8)
34627             .sr(1)
34628             .m(m)
34629             .n(n)
34630             .k(k)
34631             .cm_stride(7)
34632             .iterations(1)
34633             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34634         }
34635       }
34636     }
34637   }
34638 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,qmin)34639   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, qmin) {
34640     TEST_REQUIRES_X86_SSSE3;
34641     GemmMicrokernelTester()
34642       .mr(3)
34643       .nr(4)
34644       .kr(8)
34645       .sr(1)
34646       .m(3)
34647       .n(4)
34648       .k(8)
34649       .qmin(128)
34650       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34651   }
34652 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,qmax)34653   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, qmax) {
34654     TEST_REQUIRES_X86_SSSE3;
34655     GemmMicrokernelTester()
34656       .mr(3)
34657       .nr(4)
34658       .kr(8)
34659       .sr(1)
34660       .m(3)
34661       .n(4)
34662       .k(8)
34663       .qmax(128)
34664       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34665   }
34666 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128,strided_cm)34667   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSSE3_LD128, strided_cm) {
34668     TEST_REQUIRES_X86_SSSE3;
34669     GemmMicrokernelTester()
34670       .mr(3)
34671       .nr(4)
34672       .kr(8)
34673       .sr(1)
34674       .m(3)
34675       .n(4)
34676       .k(8)
34677       .cm_stride(7)
34678       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__ssse3_ld128, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
34679   }
34680 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
34681 
34682 
34683 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_eq_8)34684   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_eq_8) {
34685     TEST_REQUIRES_X86_SSE41;
34686     GemmMicrokernelTester()
34687       .mr(3)
34688       .nr(4)
34689       .kr(8)
34690       .sr(1)
34691       .m(3)
34692       .n(4)
34693       .k(8)
34694       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34695   }
34696 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,strided_cn)34697   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, strided_cn) {
34698     TEST_REQUIRES_X86_SSE41;
34699     GemmMicrokernelTester()
34700       .mr(3)
34701       .nr(4)
34702       .kr(8)
34703       .sr(1)
34704       .m(3)
34705       .n(4)
34706       .k(8)
34707       .cn_stride(7)
34708       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34709   }
34710 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_eq_8_strided_a)34711   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_eq_8_strided_a) {
34712     TEST_REQUIRES_X86_SSE41;
34713     GemmMicrokernelTester()
34714       .mr(3)
34715       .nr(4)
34716       .kr(8)
34717       .sr(1)
34718       .m(3)
34719       .n(4)
34720       .k(8)
34721       .a_stride(11)
34722       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34723   }
34724 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_eq_8_subtile)34725   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_eq_8_subtile) {
34726     TEST_REQUIRES_X86_SSE41;
34727     for (uint32_t n = 1; n <= 4; n++) {
34728       for (uint32_t m = 1; m <= 3; m++) {
34729         GemmMicrokernelTester()
34730           .mr(3)
34731           .nr(4)
34732           .kr(8)
34733           .sr(1)
34734           .m(m)
34735           .n(n)
34736           .k(8)
34737           .iterations(1)
34738           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34739       }
34740     }
34741   }
34742 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_eq_8_subtile_m)34743   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_eq_8_subtile_m) {
34744     TEST_REQUIRES_X86_SSE41;
34745     for (uint32_t m = 1; m <= 3; m++) {
34746       GemmMicrokernelTester()
34747         .mr(3)
34748         .nr(4)
34749         .kr(8)
34750         .sr(1)
34751         .m(m)
34752         .n(4)
34753         .k(8)
34754         .iterations(1)
34755         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34756     }
34757   }
34758 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_eq_8_subtile_n)34759   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_eq_8_subtile_n) {
34760     TEST_REQUIRES_X86_SSE41;
34761     for (uint32_t n = 1; n <= 4; n++) {
34762       GemmMicrokernelTester()
34763         .mr(3)
34764         .nr(4)
34765         .kr(8)
34766         .sr(1)
34767         .m(3)
34768         .n(n)
34769         .k(8)
34770         .iterations(1)
34771         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34772     }
34773   }
34774 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_lt_8)34775   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_lt_8) {
34776     TEST_REQUIRES_X86_SSE41;
34777     for (size_t k = 1; k < 8; k++) {
34778       GemmMicrokernelTester()
34779         .mr(3)
34780         .nr(4)
34781         .kr(8)
34782         .sr(1)
34783         .m(3)
34784         .n(4)
34785         .k(k)
34786         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34787     }
34788   }
34789 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_lt_8_strided_a)34790   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_lt_8_strided_a) {
34791     TEST_REQUIRES_X86_SSE41;
34792     for (size_t k = 1; k < 8; k++) {
34793       GemmMicrokernelTester()
34794         .mr(3)
34795         .nr(4)
34796         .kr(8)
34797         .sr(1)
34798         .m(3)
34799         .n(4)
34800         .k(k)
34801         .a_stride(11)
34802         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34803     }
34804   }
34805 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_lt_8_subtile)34806   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_lt_8_subtile) {
34807     TEST_REQUIRES_X86_SSE41;
34808     for (size_t k = 1; k < 8; k++) {
34809       for (uint32_t n = 1; n <= 4; n++) {
34810         for (uint32_t m = 1; m <= 3; m++) {
34811           GemmMicrokernelTester()
34812             .mr(3)
34813             .nr(4)
34814             .kr(8)
34815             .sr(1)
34816             .m(m)
34817             .n(n)
34818             .k(k)
34819             .iterations(1)
34820             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34821         }
34822       }
34823     }
34824   }
34825 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_gt_8)34826   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_gt_8) {
34827     TEST_REQUIRES_X86_SSE41;
34828     for (size_t k = 9; k < 16; k++) {
34829       GemmMicrokernelTester()
34830         .mr(3)
34831         .nr(4)
34832         .kr(8)
34833         .sr(1)
34834         .m(3)
34835         .n(4)
34836         .k(k)
34837         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34838     }
34839   }
34840 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_gt_8_strided_a)34841   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_gt_8_strided_a) {
34842     TEST_REQUIRES_X86_SSE41;
34843     for (size_t k = 9; k < 16; k++) {
34844       GemmMicrokernelTester()
34845         .mr(3)
34846         .nr(4)
34847         .kr(8)
34848         .sr(1)
34849         .m(3)
34850         .n(4)
34851         .k(k)
34852         .a_stride(19)
34853         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34854     }
34855   }
34856 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_gt_8_subtile)34857   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_gt_8_subtile) {
34858     TEST_REQUIRES_X86_SSE41;
34859     for (size_t k = 9; k < 16; k++) {
34860       for (uint32_t n = 1; n <= 4; n++) {
34861         for (uint32_t m = 1; m <= 3; m++) {
34862           GemmMicrokernelTester()
34863             .mr(3)
34864             .nr(4)
34865             .kr(8)
34866             .sr(1)
34867             .m(m)
34868             .n(n)
34869             .k(k)
34870             .iterations(1)
34871             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34872         }
34873       }
34874     }
34875   }
34876 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_div_8)34877   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_div_8) {
34878     TEST_REQUIRES_X86_SSE41;
34879     for (size_t k = 16; k <= 80; k += 8) {
34880       GemmMicrokernelTester()
34881         .mr(3)
34882         .nr(4)
34883         .kr(8)
34884         .sr(1)
34885         .m(3)
34886         .n(4)
34887         .k(k)
34888         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34889     }
34890   }
34891 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_div_8_strided_a)34892   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_div_8_strided_a) {
34893     TEST_REQUIRES_X86_SSE41;
34894     for (size_t k = 16; k <= 80; k += 8) {
34895       GemmMicrokernelTester()
34896         .mr(3)
34897         .nr(4)
34898         .kr(8)
34899         .sr(1)
34900         .m(3)
34901         .n(4)
34902         .k(k)
34903         .a_stride(83)
34904         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34905     }
34906   }
34907 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,k_div_8_subtile)34908   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, k_div_8_subtile) {
34909     TEST_REQUIRES_X86_SSE41;
34910     for (size_t k = 16; k <= 80; k += 8) {
34911       for (uint32_t n = 1; n <= 4; n++) {
34912         for (uint32_t m = 1; m <= 3; m++) {
34913           GemmMicrokernelTester()
34914             .mr(3)
34915             .nr(4)
34916             .kr(8)
34917             .sr(1)
34918             .m(m)
34919             .n(n)
34920             .k(k)
34921             .iterations(1)
34922             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34923         }
34924       }
34925     }
34926   }
34927 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_gt_4)34928   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_gt_4) {
34929     TEST_REQUIRES_X86_SSE41;
34930     for (uint32_t n = 5; n < 8; n++) {
34931       for (size_t k = 1; k <= 40; k += 9) {
34932         GemmMicrokernelTester()
34933           .mr(3)
34934           .nr(4)
34935           .kr(8)
34936           .sr(1)
34937           .m(3)
34938           .n(n)
34939           .k(k)
34940           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34941       }
34942     }
34943   }
34944 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_gt_4_strided_cn)34945   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_gt_4_strided_cn) {
34946     TEST_REQUIRES_X86_SSE41;
34947     for (uint32_t n = 5; n < 8; n++) {
34948       for (size_t k = 1; k <= 40; k += 9) {
34949         GemmMicrokernelTester()
34950           .mr(3)
34951           .nr(4)
34952           .kr(8)
34953           .sr(1)
34954           .m(3)
34955           .n(n)
34956           .k(k)
34957           .cn_stride(7)
34958           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34959       }
34960     }
34961   }
34962 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_gt_4_strided_a)34963   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_gt_4_strided_a) {
34964     TEST_REQUIRES_X86_SSE41;
34965     for (uint32_t n = 5; n < 8; n++) {
34966       for (size_t k = 1; k <= 40; k += 9) {
34967         GemmMicrokernelTester()
34968           .mr(3)
34969           .nr(4)
34970           .kr(8)
34971           .sr(1)
34972           .m(3)
34973           .n(n)
34974           .k(k)
34975           .a_stride(43)
34976           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34977       }
34978     }
34979   }
34980 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_gt_4_subtile)34981   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_gt_4_subtile) {
34982     TEST_REQUIRES_X86_SSE41;
34983     for (uint32_t n = 5; n < 8; n++) {
34984       for (size_t k = 1; k <= 40; k += 9) {
34985         for (uint32_t m = 1; m <= 3; m++) {
34986           GemmMicrokernelTester()
34987             .mr(3)
34988             .nr(4)
34989             .kr(8)
34990             .sr(1)
34991             .m(m)
34992             .n(n)
34993             .k(k)
34994             .iterations(1)
34995             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
34996         }
34997       }
34998     }
34999   }
35000 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_div_4)35001   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_div_4) {
35002     TEST_REQUIRES_X86_SSE41;
35003     for (uint32_t n = 8; n <= 12; n += 4) {
35004       for (size_t k = 1; k <= 40; k += 9) {
35005         GemmMicrokernelTester()
35006           .mr(3)
35007           .nr(4)
35008           .kr(8)
35009           .sr(1)
35010           .m(3)
35011           .n(n)
35012           .k(k)
35013           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35014       }
35015     }
35016   }
35017 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_div_4_strided_cn)35018   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_div_4_strided_cn) {
35019     TEST_REQUIRES_X86_SSE41;
35020     for (uint32_t n = 8; n <= 12; n += 4) {
35021       for (size_t k = 1; k <= 40; k += 9) {
35022         GemmMicrokernelTester()
35023           .mr(3)
35024           .nr(4)
35025           .kr(8)
35026           .sr(1)
35027           .m(3)
35028           .n(n)
35029           .k(k)
35030           .cn_stride(7)
35031           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35032       }
35033     }
35034   }
35035 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_div_4_strided_a)35036   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_div_4_strided_a) {
35037     TEST_REQUIRES_X86_SSE41;
35038     for (uint32_t n = 8; n <= 12; n += 4) {
35039       for (size_t k = 1; k <= 40; k += 9) {
35040         GemmMicrokernelTester()
35041           .mr(3)
35042           .nr(4)
35043           .kr(8)
35044           .sr(1)
35045           .m(3)
35046           .n(n)
35047           .k(k)
35048           .a_stride(43)
35049           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35050       }
35051     }
35052   }
35053 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,n_div_4_subtile)35054   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, n_div_4_subtile) {
35055     TEST_REQUIRES_X86_SSE41;
35056     for (uint32_t n = 8; n <= 12; n += 4) {
35057       for (size_t k = 1; k <= 40; k += 9) {
35058         for (uint32_t m = 1; m <= 3; m++) {
35059           GemmMicrokernelTester()
35060             .mr(3)
35061             .nr(4)
35062             .kr(8)
35063             .sr(1)
35064             .m(m)
35065             .n(n)
35066             .k(k)
35067             .iterations(1)
35068             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35069         }
35070       }
35071     }
35072   }
35073 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,strided_cm_subtile)35074   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, strided_cm_subtile) {
35075     TEST_REQUIRES_X86_SSE41;
35076     for (size_t k = 1; k <= 40; k += 9) {
35077       for (uint32_t n = 1; n <= 4; n++) {
35078         for (uint32_t m = 1; m <= 3; m++) {
35079           GemmMicrokernelTester()
35080             .mr(3)
35081             .nr(4)
35082             .kr(8)
35083             .sr(1)
35084             .m(m)
35085             .n(n)
35086             .k(k)
35087             .cm_stride(7)
35088             .iterations(1)
35089             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35090         }
35091       }
35092     }
35093   }
35094 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,qmin)35095   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, qmin) {
35096     TEST_REQUIRES_X86_SSE41;
35097     GemmMicrokernelTester()
35098       .mr(3)
35099       .nr(4)
35100       .kr(8)
35101       .sr(1)
35102       .m(3)
35103       .n(4)
35104       .k(8)
35105       .qmin(128)
35106       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35107   }
35108 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,qmax)35109   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, qmax) {
35110     TEST_REQUIRES_X86_SSE41;
35111     GemmMicrokernelTester()
35112       .mr(3)
35113       .nr(4)
35114       .kr(8)
35115       .sr(1)
35116       .m(3)
35117       .n(4)
35118       .k(8)
35119       .qmax(128)
35120       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35121   }
35122 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128,strided_cm)35123   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__SSE41_LD128, strided_cm) {
35124     TEST_REQUIRES_X86_SSE41;
35125     GemmMicrokernelTester()
35126       .mr(3)
35127       .nr(4)
35128       .kr(8)
35129       .sr(1)
35130       .m(3)
35131       .n(4)
35132       .k(8)
35133       .cm_stride(7)
35134       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__sse41_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35135   }
35136 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
35137 
35138 
35139 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_eq_8)35140   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_eq_8) {
35141     TEST_REQUIRES_X86_AVX;
35142     GemmMicrokernelTester()
35143       .mr(1)
35144       .nr(4)
35145       .kr(8)
35146       .sr(1)
35147       .m(1)
35148       .n(4)
35149       .k(8)
35150       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35151   }
35152 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,strided_cn)35153   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, strided_cn) {
35154     TEST_REQUIRES_X86_AVX;
35155     GemmMicrokernelTester()
35156       .mr(1)
35157       .nr(4)
35158       .kr(8)
35159       .sr(1)
35160       .m(1)
35161       .n(4)
35162       .k(8)
35163       .cn_stride(7)
35164       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35165   }
35166 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_eq_8_strided_a)35167   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_eq_8_strided_a) {
35168     TEST_REQUIRES_X86_AVX;
35169     GemmMicrokernelTester()
35170       .mr(1)
35171       .nr(4)
35172       .kr(8)
35173       .sr(1)
35174       .m(1)
35175       .n(4)
35176       .k(8)
35177       .a_stride(11)
35178       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35179   }
35180 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_eq_8_subtile)35181   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_eq_8_subtile) {
35182     TEST_REQUIRES_X86_AVX;
35183     for (uint32_t n = 1; n <= 4; n++) {
35184       for (uint32_t m = 1; m <= 1; m++) {
35185         GemmMicrokernelTester()
35186           .mr(1)
35187           .nr(4)
35188           .kr(8)
35189           .sr(1)
35190           .m(m)
35191           .n(n)
35192           .k(8)
35193           .iterations(1)
35194           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35195       }
35196     }
35197   }
35198 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_eq_8_subtile_m)35199   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_eq_8_subtile_m) {
35200     TEST_REQUIRES_X86_AVX;
35201     for (uint32_t m = 1; m <= 1; m++) {
35202       GemmMicrokernelTester()
35203         .mr(1)
35204         .nr(4)
35205         .kr(8)
35206         .sr(1)
35207         .m(m)
35208         .n(4)
35209         .k(8)
35210         .iterations(1)
35211         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35212     }
35213   }
35214 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_eq_8_subtile_n)35215   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_eq_8_subtile_n) {
35216     TEST_REQUIRES_X86_AVX;
35217     for (uint32_t n = 1; n <= 4; n++) {
35218       GemmMicrokernelTester()
35219         .mr(1)
35220         .nr(4)
35221         .kr(8)
35222         .sr(1)
35223         .m(1)
35224         .n(n)
35225         .k(8)
35226         .iterations(1)
35227         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35228     }
35229   }
35230 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_lt_8)35231   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_lt_8) {
35232     TEST_REQUIRES_X86_AVX;
35233     for (size_t k = 1; k < 8; k++) {
35234       GemmMicrokernelTester()
35235         .mr(1)
35236         .nr(4)
35237         .kr(8)
35238         .sr(1)
35239         .m(1)
35240         .n(4)
35241         .k(k)
35242         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35243     }
35244   }
35245 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_lt_8_strided_a)35246   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_lt_8_strided_a) {
35247     TEST_REQUIRES_X86_AVX;
35248     for (size_t k = 1; k < 8; k++) {
35249       GemmMicrokernelTester()
35250         .mr(1)
35251         .nr(4)
35252         .kr(8)
35253         .sr(1)
35254         .m(1)
35255         .n(4)
35256         .k(k)
35257         .a_stride(11)
35258         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35259     }
35260   }
35261 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_lt_8_subtile)35262   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_lt_8_subtile) {
35263     TEST_REQUIRES_X86_AVX;
35264     for (size_t k = 1; k < 8; k++) {
35265       for (uint32_t n = 1; n <= 4; n++) {
35266         for (uint32_t m = 1; m <= 1; m++) {
35267           GemmMicrokernelTester()
35268             .mr(1)
35269             .nr(4)
35270             .kr(8)
35271             .sr(1)
35272             .m(m)
35273             .n(n)
35274             .k(k)
35275             .iterations(1)
35276             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35277         }
35278       }
35279     }
35280   }
35281 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_gt_8)35282   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_gt_8) {
35283     TEST_REQUIRES_X86_AVX;
35284     for (size_t k = 9; k < 16; k++) {
35285       GemmMicrokernelTester()
35286         .mr(1)
35287         .nr(4)
35288         .kr(8)
35289         .sr(1)
35290         .m(1)
35291         .n(4)
35292         .k(k)
35293         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35294     }
35295   }
35296 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_gt_8_strided_a)35297   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_gt_8_strided_a) {
35298     TEST_REQUIRES_X86_AVX;
35299     for (size_t k = 9; k < 16; k++) {
35300       GemmMicrokernelTester()
35301         .mr(1)
35302         .nr(4)
35303         .kr(8)
35304         .sr(1)
35305         .m(1)
35306         .n(4)
35307         .k(k)
35308         .a_stride(19)
35309         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35310     }
35311   }
35312 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_gt_8_subtile)35313   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_gt_8_subtile) {
35314     TEST_REQUIRES_X86_AVX;
35315     for (size_t k = 9; k < 16; k++) {
35316       for (uint32_t n = 1; n <= 4; n++) {
35317         for (uint32_t m = 1; m <= 1; m++) {
35318           GemmMicrokernelTester()
35319             .mr(1)
35320             .nr(4)
35321             .kr(8)
35322             .sr(1)
35323             .m(m)
35324             .n(n)
35325             .k(k)
35326             .iterations(1)
35327             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35328         }
35329       }
35330     }
35331   }
35332 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_div_8)35333   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_div_8) {
35334     TEST_REQUIRES_X86_AVX;
35335     for (size_t k = 16; k <= 80; k += 8) {
35336       GemmMicrokernelTester()
35337         .mr(1)
35338         .nr(4)
35339         .kr(8)
35340         .sr(1)
35341         .m(1)
35342         .n(4)
35343         .k(k)
35344         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35345     }
35346   }
35347 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_div_8_strided_a)35348   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_div_8_strided_a) {
35349     TEST_REQUIRES_X86_AVX;
35350     for (size_t k = 16; k <= 80; k += 8) {
35351       GemmMicrokernelTester()
35352         .mr(1)
35353         .nr(4)
35354         .kr(8)
35355         .sr(1)
35356         .m(1)
35357         .n(4)
35358         .k(k)
35359         .a_stride(83)
35360         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35361     }
35362   }
35363 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,k_div_8_subtile)35364   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, k_div_8_subtile) {
35365     TEST_REQUIRES_X86_AVX;
35366     for (size_t k = 16; k <= 80; k += 8) {
35367       for (uint32_t n = 1; n <= 4; n++) {
35368         for (uint32_t m = 1; m <= 1; m++) {
35369           GemmMicrokernelTester()
35370             .mr(1)
35371             .nr(4)
35372             .kr(8)
35373             .sr(1)
35374             .m(m)
35375             .n(n)
35376             .k(k)
35377             .iterations(1)
35378             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35379         }
35380       }
35381     }
35382   }
35383 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_gt_4)35384   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_gt_4) {
35385     TEST_REQUIRES_X86_AVX;
35386     for (uint32_t n = 5; n < 8; n++) {
35387       for (size_t k = 1; k <= 40; k += 9) {
35388         GemmMicrokernelTester()
35389           .mr(1)
35390           .nr(4)
35391           .kr(8)
35392           .sr(1)
35393           .m(1)
35394           .n(n)
35395           .k(k)
35396           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35397       }
35398     }
35399   }
35400 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_gt_4_strided_cn)35401   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_gt_4_strided_cn) {
35402     TEST_REQUIRES_X86_AVX;
35403     for (uint32_t n = 5; n < 8; n++) {
35404       for (size_t k = 1; k <= 40; k += 9) {
35405         GemmMicrokernelTester()
35406           .mr(1)
35407           .nr(4)
35408           .kr(8)
35409           .sr(1)
35410           .m(1)
35411           .n(n)
35412           .k(k)
35413           .cn_stride(7)
35414           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35415       }
35416     }
35417   }
35418 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_gt_4_strided_a)35419   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_gt_4_strided_a) {
35420     TEST_REQUIRES_X86_AVX;
35421     for (uint32_t n = 5; n < 8; n++) {
35422       for (size_t k = 1; k <= 40; k += 9) {
35423         GemmMicrokernelTester()
35424           .mr(1)
35425           .nr(4)
35426           .kr(8)
35427           .sr(1)
35428           .m(1)
35429           .n(n)
35430           .k(k)
35431           .a_stride(43)
35432           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35433       }
35434     }
35435   }
35436 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_gt_4_subtile)35437   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_gt_4_subtile) {
35438     TEST_REQUIRES_X86_AVX;
35439     for (uint32_t n = 5; n < 8; n++) {
35440       for (size_t k = 1; k <= 40; k += 9) {
35441         for (uint32_t m = 1; m <= 1; m++) {
35442           GemmMicrokernelTester()
35443             .mr(1)
35444             .nr(4)
35445             .kr(8)
35446             .sr(1)
35447             .m(m)
35448             .n(n)
35449             .k(k)
35450             .iterations(1)
35451             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35452         }
35453       }
35454     }
35455   }
35456 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_div_4)35457   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_div_4) {
35458     TEST_REQUIRES_X86_AVX;
35459     for (uint32_t n = 8; n <= 12; n += 4) {
35460       for (size_t k = 1; k <= 40; k += 9) {
35461         GemmMicrokernelTester()
35462           .mr(1)
35463           .nr(4)
35464           .kr(8)
35465           .sr(1)
35466           .m(1)
35467           .n(n)
35468           .k(k)
35469           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35470       }
35471     }
35472   }
35473 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_div_4_strided_cn)35474   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_div_4_strided_cn) {
35475     TEST_REQUIRES_X86_AVX;
35476     for (uint32_t n = 8; n <= 12; n += 4) {
35477       for (size_t k = 1; k <= 40; k += 9) {
35478         GemmMicrokernelTester()
35479           .mr(1)
35480           .nr(4)
35481           .kr(8)
35482           .sr(1)
35483           .m(1)
35484           .n(n)
35485           .k(k)
35486           .cn_stride(7)
35487           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35488       }
35489     }
35490   }
35491 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_div_4_strided_a)35492   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_div_4_strided_a) {
35493     TEST_REQUIRES_X86_AVX;
35494     for (uint32_t n = 8; n <= 12; n += 4) {
35495       for (size_t k = 1; k <= 40; k += 9) {
35496         GemmMicrokernelTester()
35497           .mr(1)
35498           .nr(4)
35499           .kr(8)
35500           .sr(1)
35501           .m(1)
35502           .n(n)
35503           .k(k)
35504           .a_stride(43)
35505           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35506       }
35507     }
35508   }
35509 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,n_div_4_subtile)35510   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, n_div_4_subtile) {
35511     TEST_REQUIRES_X86_AVX;
35512     for (uint32_t n = 8; n <= 12; n += 4) {
35513       for (size_t k = 1; k <= 40; k += 9) {
35514         for (uint32_t m = 1; m <= 1; m++) {
35515           GemmMicrokernelTester()
35516             .mr(1)
35517             .nr(4)
35518             .kr(8)
35519             .sr(1)
35520             .m(m)
35521             .n(n)
35522             .k(k)
35523             .iterations(1)
35524             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35525         }
35526       }
35527     }
35528   }
35529 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,strided_cm_subtile)35530   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, strided_cm_subtile) {
35531     TEST_REQUIRES_X86_AVX;
35532     for (size_t k = 1; k <= 40; k += 9) {
35533       for (uint32_t n = 1; n <= 4; n++) {
35534         for (uint32_t m = 1; m <= 1; m++) {
35535           GemmMicrokernelTester()
35536             .mr(1)
35537             .nr(4)
35538             .kr(8)
35539             .sr(1)
35540             .m(m)
35541             .n(n)
35542             .k(k)
35543             .cm_stride(7)
35544             .iterations(1)
35545             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35546         }
35547       }
35548     }
35549   }
35550 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,qmin)35551   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, qmin) {
35552     TEST_REQUIRES_X86_AVX;
35553     GemmMicrokernelTester()
35554       .mr(1)
35555       .nr(4)
35556       .kr(8)
35557       .sr(1)
35558       .m(1)
35559       .n(4)
35560       .k(8)
35561       .qmin(128)
35562       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35563   }
35564 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,qmax)35565   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, qmax) {
35566     TEST_REQUIRES_X86_AVX;
35567     GemmMicrokernelTester()
35568       .mr(1)
35569       .nr(4)
35570       .kr(8)
35571       .sr(1)
35572       .m(1)
35573       .n(4)
35574       .k(8)
35575       .qmax(128)
35576       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35577   }
35578 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128,strided_cm)35579   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__AVX_LD128, strided_cm) {
35580     TEST_REQUIRES_X86_AVX;
35581     GemmMicrokernelTester()
35582       .mr(1)
35583       .nr(4)
35584       .kr(8)
35585       .sr(1)
35586       .m(1)
35587       .n(4)
35588       .k(8)
35589       .cm_stride(7)
35590       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35591   }
35592 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
35593 
35594 
35595 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_eq_8)35596   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_eq_8) {
35597     TEST_REQUIRES_X86_AVX;
35598     GemmMicrokernelTester()
35599       .mr(2)
35600       .nr(4)
35601       .kr(8)
35602       .sr(1)
35603       .m(2)
35604       .n(4)
35605       .k(8)
35606       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35607   }
35608 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,strided_cn)35609   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, strided_cn) {
35610     TEST_REQUIRES_X86_AVX;
35611     GemmMicrokernelTester()
35612       .mr(2)
35613       .nr(4)
35614       .kr(8)
35615       .sr(1)
35616       .m(2)
35617       .n(4)
35618       .k(8)
35619       .cn_stride(7)
35620       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35621   }
35622 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_eq_8_strided_a)35623   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_eq_8_strided_a) {
35624     TEST_REQUIRES_X86_AVX;
35625     GemmMicrokernelTester()
35626       .mr(2)
35627       .nr(4)
35628       .kr(8)
35629       .sr(1)
35630       .m(2)
35631       .n(4)
35632       .k(8)
35633       .a_stride(11)
35634       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35635   }
35636 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_eq_8_subtile)35637   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_eq_8_subtile) {
35638     TEST_REQUIRES_X86_AVX;
35639     for (uint32_t n = 1; n <= 4; n++) {
35640       for (uint32_t m = 1; m <= 2; m++) {
35641         GemmMicrokernelTester()
35642           .mr(2)
35643           .nr(4)
35644           .kr(8)
35645           .sr(1)
35646           .m(m)
35647           .n(n)
35648           .k(8)
35649           .iterations(1)
35650           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35651       }
35652     }
35653   }
35654 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_eq_8_subtile_m)35655   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_eq_8_subtile_m) {
35656     TEST_REQUIRES_X86_AVX;
35657     for (uint32_t m = 1; m <= 2; m++) {
35658       GemmMicrokernelTester()
35659         .mr(2)
35660         .nr(4)
35661         .kr(8)
35662         .sr(1)
35663         .m(m)
35664         .n(4)
35665         .k(8)
35666         .iterations(1)
35667         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35668     }
35669   }
35670 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_eq_8_subtile_n)35671   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_eq_8_subtile_n) {
35672     TEST_REQUIRES_X86_AVX;
35673     for (uint32_t n = 1; n <= 4; n++) {
35674       GemmMicrokernelTester()
35675         .mr(2)
35676         .nr(4)
35677         .kr(8)
35678         .sr(1)
35679         .m(2)
35680         .n(n)
35681         .k(8)
35682         .iterations(1)
35683         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35684     }
35685   }
35686 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_lt_8)35687   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_lt_8) {
35688     TEST_REQUIRES_X86_AVX;
35689     for (size_t k = 1; k < 8; k++) {
35690       GemmMicrokernelTester()
35691         .mr(2)
35692         .nr(4)
35693         .kr(8)
35694         .sr(1)
35695         .m(2)
35696         .n(4)
35697         .k(k)
35698         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35699     }
35700   }
35701 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_lt_8_strided_a)35702   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_lt_8_strided_a) {
35703     TEST_REQUIRES_X86_AVX;
35704     for (size_t k = 1; k < 8; k++) {
35705       GemmMicrokernelTester()
35706         .mr(2)
35707         .nr(4)
35708         .kr(8)
35709         .sr(1)
35710         .m(2)
35711         .n(4)
35712         .k(k)
35713         .a_stride(11)
35714         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35715     }
35716   }
35717 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_lt_8_subtile)35718   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_lt_8_subtile) {
35719     TEST_REQUIRES_X86_AVX;
35720     for (size_t k = 1; k < 8; k++) {
35721       for (uint32_t n = 1; n <= 4; n++) {
35722         for (uint32_t m = 1; m <= 2; m++) {
35723           GemmMicrokernelTester()
35724             .mr(2)
35725             .nr(4)
35726             .kr(8)
35727             .sr(1)
35728             .m(m)
35729             .n(n)
35730             .k(k)
35731             .iterations(1)
35732             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35733         }
35734       }
35735     }
35736   }
35737 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_gt_8)35738   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_gt_8) {
35739     TEST_REQUIRES_X86_AVX;
35740     for (size_t k = 9; k < 16; k++) {
35741       GemmMicrokernelTester()
35742         .mr(2)
35743         .nr(4)
35744         .kr(8)
35745         .sr(1)
35746         .m(2)
35747         .n(4)
35748         .k(k)
35749         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35750     }
35751   }
35752 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_gt_8_strided_a)35753   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_gt_8_strided_a) {
35754     TEST_REQUIRES_X86_AVX;
35755     for (size_t k = 9; k < 16; k++) {
35756       GemmMicrokernelTester()
35757         .mr(2)
35758         .nr(4)
35759         .kr(8)
35760         .sr(1)
35761         .m(2)
35762         .n(4)
35763         .k(k)
35764         .a_stride(19)
35765         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35766     }
35767   }
35768 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_gt_8_subtile)35769   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_gt_8_subtile) {
35770     TEST_REQUIRES_X86_AVX;
35771     for (size_t k = 9; k < 16; k++) {
35772       for (uint32_t n = 1; n <= 4; n++) {
35773         for (uint32_t m = 1; m <= 2; m++) {
35774           GemmMicrokernelTester()
35775             .mr(2)
35776             .nr(4)
35777             .kr(8)
35778             .sr(1)
35779             .m(m)
35780             .n(n)
35781             .k(k)
35782             .iterations(1)
35783             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35784         }
35785       }
35786     }
35787   }
35788 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_div_8)35789   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_div_8) {
35790     TEST_REQUIRES_X86_AVX;
35791     for (size_t k = 16; k <= 80; k += 8) {
35792       GemmMicrokernelTester()
35793         .mr(2)
35794         .nr(4)
35795         .kr(8)
35796         .sr(1)
35797         .m(2)
35798         .n(4)
35799         .k(k)
35800         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35801     }
35802   }
35803 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_div_8_strided_a)35804   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_div_8_strided_a) {
35805     TEST_REQUIRES_X86_AVX;
35806     for (size_t k = 16; k <= 80; k += 8) {
35807       GemmMicrokernelTester()
35808         .mr(2)
35809         .nr(4)
35810         .kr(8)
35811         .sr(1)
35812         .m(2)
35813         .n(4)
35814         .k(k)
35815         .a_stride(83)
35816         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35817     }
35818   }
35819 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,k_div_8_subtile)35820   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, k_div_8_subtile) {
35821     TEST_REQUIRES_X86_AVX;
35822     for (size_t k = 16; k <= 80; k += 8) {
35823       for (uint32_t n = 1; n <= 4; n++) {
35824         for (uint32_t m = 1; m <= 2; m++) {
35825           GemmMicrokernelTester()
35826             .mr(2)
35827             .nr(4)
35828             .kr(8)
35829             .sr(1)
35830             .m(m)
35831             .n(n)
35832             .k(k)
35833             .iterations(1)
35834             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35835         }
35836       }
35837     }
35838   }
35839 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_gt_4)35840   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_gt_4) {
35841     TEST_REQUIRES_X86_AVX;
35842     for (uint32_t n = 5; n < 8; n++) {
35843       for (size_t k = 1; k <= 40; k += 9) {
35844         GemmMicrokernelTester()
35845           .mr(2)
35846           .nr(4)
35847           .kr(8)
35848           .sr(1)
35849           .m(2)
35850           .n(n)
35851           .k(k)
35852           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35853       }
35854     }
35855   }
35856 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_gt_4_strided_cn)35857   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_gt_4_strided_cn) {
35858     TEST_REQUIRES_X86_AVX;
35859     for (uint32_t n = 5; n < 8; n++) {
35860       for (size_t k = 1; k <= 40; k += 9) {
35861         GemmMicrokernelTester()
35862           .mr(2)
35863           .nr(4)
35864           .kr(8)
35865           .sr(1)
35866           .m(2)
35867           .n(n)
35868           .k(k)
35869           .cn_stride(7)
35870           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35871       }
35872     }
35873   }
35874 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_gt_4_strided_a)35875   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_gt_4_strided_a) {
35876     TEST_REQUIRES_X86_AVX;
35877     for (uint32_t n = 5; n < 8; n++) {
35878       for (size_t k = 1; k <= 40; k += 9) {
35879         GemmMicrokernelTester()
35880           .mr(2)
35881           .nr(4)
35882           .kr(8)
35883           .sr(1)
35884           .m(2)
35885           .n(n)
35886           .k(k)
35887           .a_stride(43)
35888           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35889       }
35890     }
35891   }
35892 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_gt_4_subtile)35893   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_gt_4_subtile) {
35894     TEST_REQUIRES_X86_AVX;
35895     for (uint32_t n = 5; n < 8; n++) {
35896       for (size_t k = 1; k <= 40; k += 9) {
35897         for (uint32_t m = 1; m <= 2; m++) {
35898           GemmMicrokernelTester()
35899             .mr(2)
35900             .nr(4)
35901             .kr(8)
35902             .sr(1)
35903             .m(m)
35904             .n(n)
35905             .k(k)
35906             .iterations(1)
35907             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35908         }
35909       }
35910     }
35911   }
35912 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_div_4)35913   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_div_4) {
35914     TEST_REQUIRES_X86_AVX;
35915     for (uint32_t n = 8; n <= 12; n += 4) {
35916       for (size_t k = 1; k <= 40; k += 9) {
35917         GemmMicrokernelTester()
35918           .mr(2)
35919           .nr(4)
35920           .kr(8)
35921           .sr(1)
35922           .m(2)
35923           .n(n)
35924           .k(k)
35925           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35926       }
35927     }
35928   }
35929 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_div_4_strided_cn)35930   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_div_4_strided_cn) {
35931     TEST_REQUIRES_X86_AVX;
35932     for (uint32_t n = 8; n <= 12; n += 4) {
35933       for (size_t k = 1; k <= 40; k += 9) {
35934         GemmMicrokernelTester()
35935           .mr(2)
35936           .nr(4)
35937           .kr(8)
35938           .sr(1)
35939           .m(2)
35940           .n(n)
35941           .k(k)
35942           .cn_stride(7)
35943           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35944       }
35945     }
35946   }
35947 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_div_4_strided_a)35948   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_div_4_strided_a) {
35949     TEST_REQUIRES_X86_AVX;
35950     for (uint32_t n = 8; n <= 12; n += 4) {
35951       for (size_t k = 1; k <= 40; k += 9) {
35952         GemmMicrokernelTester()
35953           .mr(2)
35954           .nr(4)
35955           .kr(8)
35956           .sr(1)
35957           .m(2)
35958           .n(n)
35959           .k(k)
35960           .a_stride(43)
35961           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35962       }
35963     }
35964   }
35965 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,n_div_4_subtile)35966   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, n_div_4_subtile) {
35967     TEST_REQUIRES_X86_AVX;
35968     for (uint32_t n = 8; n <= 12; n += 4) {
35969       for (size_t k = 1; k <= 40; k += 9) {
35970         for (uint32_t m = 1; m <= 2; m++) {
35971           GemmMicrokernelTester()
35972             .mr(2)
35973             .nr(4)
35974             .kr(8)
35975             .sr(1)
35976             .m(m)
35977             .n(n)
35978             .k(k)
35979             .iterations(1)
35980             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
35981         }
35982       }
35983     }
35984   }
35985 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,strided_cm_subtile)35986   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, strided_cm_subtile) {
35987     TEST_REQUIRES_X86_AVX;
35988     for (size_t k = 1; k <= 40; k += 9) {
35989       for (uint32_t n = 1; n <= 4; n++) {
35990         for (uint32_t m = 1; m <= 2; m++) {
35991           GemmMicrokernelTester()
35992             .mr(2)
35993             .nr(4)
35994             .kr(8)
35995             .sr(1)
35996             .m(m)
35997             .n(n)
35998             .k(k)
35999             .cm_stride(7)
36000             .iterations(1)
36001             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36002         }
36003       }
36004     }
36005   }
36006 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,qmin)36007   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, qmin) {
36008     TEST_REQUIRES_X86_AVX;
36009     GemmMicrokernelTester()
36010       .mr(2)
36011       .nr(4)
36012       .kr(8)
36013       .sr(1)
36014       .m(2)
36015       .n(4)
36016       .k(8)
36017       .qmin(128)
36018       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36019   }
36020 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,qmax)36021   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, qmax) {
36022     TEST_REQUIRES_X86_AVX;
36023     GemmMicrokernelTester()
36024       .mr(2)
36025       .nr(4)
36026       .kr(8)
36027       .sr(1)
36028       .m(2)
36029       .n(4)
36030       .k(8)
36031       .qmax(128)
36032       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36033   }
36034 
TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128,strided_cm)36035   TEST(QS8_GEMM_MINMAX_FP32_2X4C8__AVX_LD128, strided_cm) {
36036     TEST_REQUIRES_X86_AVX;
36037     GemmMicrokernelTester()
36038       .mr(2)
36039       .nr(4)
36040       .kr(8)
36041       .sr(1)
36042       .m(2)
36043       .n(4)
36044       .k(8)
36045       .cm_stride(7)
36046       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c8__avx_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36047   }
36048 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
36049 
36050 
36051 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_eq_8)36052   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_eq_8) {
36053     TEST_REQUIRES_X86_XOP;
36054     GemmMicrokernelTester()
36055       .mr(3)
36056       .nr(4)
36057       .kr(8)
36058       .sr(1)
36059       .m(3)
36060       .n(4)
36061       .k(8)
36062       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36063   }
36064 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,strided_cn)36065   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, strided_cn) {
36066     TEST_REQUIRES_X86_XOP;
36067     GemmMicrokernelTester()
36068       .mr(3)
36069       .nr(4)
36070       .kr(8)
36071       .sr(1)
36072       .m(3)
36073       .n(4)
36074       .k(8)
36075       .cn_stride(7)
36076       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36077   }
36078 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_eq_8_strided_a)36079   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_eq_8_strided_a) {
36080     TEST_REQUIRES_X86_XOP;
36081     GemmMicrokernelTester()
36082       .mr(3)
36083       .nr(4)
36084       .kr(8)
36085       .sr(1)
36086       .m(3)
36087       .n(4)
36088       .k(8)
36089       .a_stride(11)
36090       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36091   }
36092 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_eq_8_subtile)36093   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_eq_8_subtile) {
36094     TEST_REQUIRES_X86_XOP;
36095     for (uint32_t n = 1; n <= 4; n++) {
36096       for (uint32_t m = 1; m <= 3; m++) {
36097         GemmMicrokernelTester()
36098           .mr(3)
36099           .nr(4)
36100           .kr(8)
36101           .sr(1)
36102           .m(m)
36103           .n(n)
36104           .k(8)
36105           .iterations(1)
36106           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36107       }
36108     }
36109   }
36110 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_eq_8_subtile_m)36111   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_eq_8_subtile_m) {
36112     TEST_REQUIRES_X86_XOP;
36113     for (uint32_t m = 1; m <= 3; m++) {
36114       GemmMicrokernelTester()
36115         .mr(3)
36116         .nr(4)
36117         .kr(8)
36118         .sr(1)
36119         .m(m)
36120         .n(4)
36121         .k(8)
36122         .iterations(1)
36123         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36124     }
36125   }
36126 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_eq_8_subtile_n)36127   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_eq_8_subtile_n) {
36128     TEST_REQUIRES_X86_XOP;
36129     for (uint32_t n = 1; n <= 4; n++) {
36130       GemmMicrokernelTester()
36131         .mr(3)
36132         .nr(4)
36133         .kr(8)
36134         .sr(1)
36135         .m(3)
36136         .n(n)
36137         .k(8)
36138         .iterations(1)
36139         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36140     }
36141   }
36142 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_lt_8)36143   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_lt_8) {
36144     TEST_REQUIRES_X86_XOP;
36145     for (size_t k = 1; k < 8; k++) {
36146       GemmMicrokernelTester()
36147         .mr(3)
36148         .nr(4)
36149         .kr(8)
36150         .sr(1)
36151         .m(3)
36152         .n(4)
36153         .k(k)
36154         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36155     }
36156   }
36157 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_lt_8_strided_a)36158   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_lt_8_strided_a) {
36159     TEST_REQUIRES_X86_XOP;
36160     for (size_t k = 1; k < 8; k++) {
36161       GemmMicrokernelTester()
36162         .mr(3)
36163         .nr(4)
36164         .kr(8)
36165         .sr(1)
36166         .m(3)
36167         .n(4)
36168         .k(k)
36169         .a_stride(11)
36170         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36171     }
36172   }
36173 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_lt_8_subtile)36174   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_lt_8_subtile) {
36175     TEST_REQUIRES_X86_XOP;
36176     for (size_t k = 1; k < 8; k++) {
36177       for (uint32_t n = 1; n <= 4; n++) {
36178         for (uint32_t m = 1; m <= 3; m++) {
36179           GemmMicrokernelTester()
36180             .mr(3)
36181             .nr(4)
36182             .kr(8)
36183             .sr(1)
36184             .m(m)
36185             .n(n)
36186             .k(k)
36187             .iterations(1)
36188             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36189         }
36190       }
36191     }
36192   }
36193 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_gt_8)36194   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_gt_8) {
36195     TEST_REQUIRES_X86_XOP;
36196     for (size_t k = 9; k < 16; k++) {
36197       GemmMicrokernelTester()
36198         .mr(3)
36199         .nr(4)
36200         .kr(8)
36201         .sr(1)
36202         .m(3)
36203         .n(4)
36204         .k(k)
36205         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36206     }
36207   }
36208 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_gt_8_strided_a)36209   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_gt_8_strided_a) {
36210     TEST_REQUIRES_X86_XOP;
36211     for (size_t k = 9; k < 16; k++) {
36212       GemmMicrokernelTester()
36213         .mr(3)
36214         .nr(4)
36215         .kr(8)
36216         .sr(1)
36217         .m(3)
36218         .n(4)
36219         .k(k)
36220         .a_stride(19)
36221         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36222     }
36223   }
36224 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_gt_8_subtile)36225   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_gt_8_subtile) {
36226     TEST_REQUIRES_X86_XOP;
36227     for (size_t k = 9; k < 16; k++) {
36228       for (uint32_t n = 1; n <= 4; n++) {
36229         for (uint32_t m = 1; m <= 3; m++) {
36230           GemmMicrokernelTester()
36231             .mr(3)
36232             .nr(4)
36233             .kr(8)
36234             .sr(1)
36235             .m(m)
36236             .n(n)
36237             .k(k)
36238             .iterations(1)
36239             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36240         }
36241       }
36242     }
36243   }
36244 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_div_8)36245   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_div_8) {
36246     TEST_REQUIRES_X86_XOP;
36247     for (size_t k = 16; k <= 80; k += 8) {
36248       GemmMicrokernelTester()
36249         .mr(3)
36250         .nr(4)
36251         .kr(8)
36252         .sr(1)
36253         .m(3)
36254         .n(4)
36255         .k(k)
36256         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36257     }
36258   }
36259 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_div_8_strided_a)36260   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_div_8_strided_a) {
36261     TEST_REQUIRES_X86_XOP;
36262     for (size_t k = 16; k <= 80; k += 8) {
36263       GemmMicrokernelTester()
36264         .mr(3)
36265         .nr(4)
36266         .kr(8)
36267         .sr(1)
36268         .m(3)
36269         .n(4)
36270         .k(k)
36271         .a_stride(83)
36272         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36273     }
36274   }
36275 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,k_div_8_subtile)36276   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, k_div_8_subtile) {
36277     TEST_REQUIRES_X86_XOP;
36278     for (size_t k = 16; k <= 80; k += 8) {
36279       for (uint32_t n = 1; n <= 4; n++) {
36280         for (uint32_t m = 1; m <= 3; m++) {
36281           GemmMicrokernelTester()
36282             .mr(3)
36283             .nr(4)
36284             .kr(8)
36285             .sr(1)
36286             .m(m)
36287             .n(n)
36288             .k(k)
36289             .iterations(1)
36290             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36291         }
36292       }
36293     }
36294   }
36295 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_gt_4)36296   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_gt_4) {
36297     TEST_REQUIRES_X86_XOP;
36298     for (uint32_t n = 5; n < 8; n++) {
36299       for (size_t k = 1; k <= 40; k += 9) {
36300         GemmMicrokernelTester()
36301           .mr(3)
36302           .nr(4)
36303           .kr(8)
36304           .sr(1)
36305           .m(3)
36306           .n(n)
36307           .k(k)
36308           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36309       }
36310     }
36311   }
36312 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_gt_4_strided_cn)36313   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_gt_4_strided_cn) {
36314     TEST_REQUIRES_X86_XOP;
36315     for (uint32_t n = 5; n < 8; n++) {
36316       for (size_t k = 1; k <= 40; k += 9) {
36317         GemmMicrokernelTester()
36318           .mr(3)
36319           .nr(4)
36320           .kr(8)
36321           .sr(1)
36322           .m(3)
36323           .n(n)
36324           .k(k)
36325           .cn_stride(7)
36326           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36327       }
36328     }
36329   }
36330 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_gt_4_strided_a)36331   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_gt_4_strided_a) {
36332     TEST_REQUIRES_X86_XOP;
36333     for (uint32_t n = 5; n < 8; n++) {
36334       for (size_t k = 1; k <= 40; k += 9) {
36335         GemmMicrokernelTester()
36336           .mr(3)
36337           .nr(4)
36338           .kr(8)
36339           .sr(1)
36340           .m(3)
36341           .n(n)
36342           .k(k)
36343           .a_stride(43)
36344           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36345       }
36346     }
36347   }
36348 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_gt_4_subtile)36349   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_gt_4_subtile) {
36350     TEST_REQUIRES_X86_XOP;
36351     for (uint32_t n = 5; n < 8; n++) {
36352       for (size_t k = 1; k <= 40; k += 9) {
36353         for (uint32_t m = 1; m <= 3; m++) {
36354           GemmMicrokernelTester()
36355             .mr(3)
36356             .nr(4)
36357             .kr(8)
36358             .sr(1)
36359             .m(m)
36360             .n(n)
36361             .k(k)
36362             .iterations(1)
36363             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36364         }
36365       }
36366     }
36367   }
36368 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_div_4)36369   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_div_4) {
36370     TEST_REQUIRES_X86_XOP;
36371     for (uint32_t n = 8; n <= 12; n += 4) {
36372       for (size_t k = 1; k <= 40; k += 9) {
36373         GemmMicrokernelTester()
36374           .mr(3)
36375           .nr(4)
36376           .kr(8)
36377           .sr(1)
36378           .m(3)
36379           .n(n)
36380           .k(k)
36381           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36382       }
36383     }
36384   }
36385 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_div_4_strided_cn)36386   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_div_4_strided_cn) {
36387     TEST_REQUIRES_X86_XOP;
36388     for (uint32_t n = 8; n <= 12; n += 4) {
36389       for (size_t k = 1; k <= 40; k += 9) {
36390         GemmMicrokernelTester()
36391           .mr(3)
36392           .nr(4)
36393           .kr(8)
36394           .sr(1)
36395           .m(3)
36396           .n(n)
36397           .k(k)
36398           .cn_stride(7)
36399           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36400       }
36401     }
36402   }
36403 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_div_4_strided_a)36404   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_div_4_strided_a) {
36405     TEST_REQUIRES_X86_XOP;
36406     for (uint32_t n = 8; n <= 12; n += 4) {
36407       for (size_t k = 1; k <= 40; k += 9) {
36408         GemmMicrokernelTester()
36409           .mr(3)
36410           .nr(4)
36411           .kr(8)
36412           .sr(1)
36413           .m(3)
36414           .n(n)
36415           .k(k)
36416           .a_stride(43)
36417           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36418       }
36419     }
36420   }
36421 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,n_div_4_subtile)36422   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, n_div_4_subtile) {
36423     TEST_REQUIRES_X86_XOP;
36424     for (uint32_t n = 8; n <= 12; n += 4) {
36425       for (size_t k = 1; k <= 40; k += 9) {
36426         for (uint32_t m = 1; m <= 3; m++) {
36427           GemmMicrokernelTester()
36428             .mr(3)
36429             .nr(4)
36430             .kr(8)
36431             .sr(1)
36432             .m(m)
36433             .n(n)
36434             .k(k)
36435             .iterations(1)
36436             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36437         }
36438       }
36439     }
36440   }
36441 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,strided_cm_subtile)36442   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, strided_cm_subtile) {
36443     TEST_REQUIRES_X86_XOP;
36444     for (size_t k = 1; k <= 40; k += 9) {
36445       for (uint32_t n = 1; n <= 4; n++) {
36446         for (uint32_t m = 1; m <= 3; m++) {
36447           GemmMicrokernelTester()
36448             .mr(3)
36449             .nr(4)
36450             .kr(8)
36451             .sr(1)
36452             .m(m)
36453             .n(n)
36454             .k(k)
36455             .cm_stride(7)
36456             .iterations(1)
36457             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36458         }
36459       }
36460     }
36461   }
36462 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,qmin)36463   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, qmin) {
36464     TEST_REQUIRES_X86_XOP;
36465     GemmMicrokernelTester()
36466       .mr(3)
36467       .nr(4)
36468       .kr(8)
36469       .sr(1)
36470       .m(3)
36471       .n(4)
36472       .k(8)
36473       .qmin(128)
36474       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36475   }
36476 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,qmax)36477   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, qmax) {
36478     TEST_REQUIRES_X86_XOP;
36479     GemmMicrokernelTester()
36480       .mr(3)
36481       .nr(4)
36482       .kr(8)
36483       .sr(1)
36484       .m(3)
36485       .n(4)
36486       .k(8)
36487       .qmax(128)
36488       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36489   }
36490 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128,strided_cm)36491   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__XOP_LD128, strided_cm) {
36492     TEST_REQUIRES_X86_XOP;
36493     GemmMicrokernelTester()
36494       .mr(3)
36495       .nr(4)
36496       .kr(8)
36497       .sr(1)
36498       .m(3)
36499       .n(4)
36500       .k(8)
36501       .cm_stride(7)
36502       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__xop_ld128, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36503   }
36504 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
36505 
36506 
36507 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_eq_8)36508   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_eq_8) {
36509     TEST_REQUIRES_X86_SSE2;
36510     GemmMicrokernelTester()
36511       .extended_weights(true)
36512       .mr(1)
36513       .nr(4)
36514       .kr(2)
36515       .sr(1)
36516       .m(1)
36517       .n(4)
36518       .k(8)
36519       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36520   }
36521 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,strided_cn)36522   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, strided_cn) {
36523     TEST_REQUIRES_X86_SSE2;
36524     GemmMicrokernelTester()
36525       .extended_weights(true)
36526       .mr(1)
36527       .nr(4)
36528       .kr(2)
36529       .sr(1)
36530       .m(1)
36531       .n(4)
36532       .k(8)
36533       .cn_stride(7)
36534       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36535   }
36536 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_eq_8_strided_a)36537   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_eq_8_strided_a) {
36538     TEST_REQUIRES_X86_SSE2;
36539     GemmMicrokernelTester()
36540       .extended_weights(true)
36541       .mr(1)
36542       .nr(4)
36543       .kr(2)
36544       .sr(1)
36545       .m(1)
36546       .n(4)
36547       .k(8)
36548       .a_stride(11)
36549       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36550   }
36551 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_eq_8_subtile)36552   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_eq_8_subtile) {
36553     TEST_REQUIRES_X86_SSE2;
36554     for (uint32_t n = 1; n <= 4; n++) {
36555       for (uint32_t m = 1; m <= 1; m++) {
36556         GemmMicrokernelTester()
36557           .extended_weights(true)
36558           .mr(1)
36559           .nr(4)
36560           .kr(2)
36561           .sr(1)
36562           .m(m)
36563           .n(n)
36564           .k(8)
36565           .iterations(1)
36566           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36567       }
36568     }
36569   }
36570 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_eq_8_subtile_m)36571   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_eq_8_subtile_m) {
36572     TEST_REQUIRES_X86_SSE2;
36573     for (uint32_t m = 1; m <= 1; m++) {
36574       GemmMicrokernelTester()
36575         .extended_weights(true)
36576         .mr(1)
36577         .nr(4)
36578         .kr(2)
36579         .sr(1)
36580         .m(m)
36581         .n(4)
36582         .k(8)
36583         .iterations(1)
36584         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36585     }
36586   }
36587 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_eq_8_subtile_n)36588   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_eq_8_subtile_n) {
36589     TEST_REQUIRES_X86_SSE2;
36590     for (uint32_t n = 1; n <= 4; n++) {
36591       GemmMicrokernelTester()
36592         .extended_weights(true)
36593         .mr(1)
36594         .nr(4)
36595         .kr(2)
36596         .sr(1)
36597         .m(1)
36598         .n(n)
36599         .k(8)
36600         .iterations(1)
36601         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36602     }
36603   }
36604 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_lt_8)36605   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_lt_8) {
36606     TEST_REQUIRES_X86_SSE2;
36607     for (size_t k = 1; k < 8; k++) {
36608       GemmMicrokernelTester()
36609         .extended_weights(true)
36610         .mr(1)
36611         .nr(4)
36612         .kr(2)
36613         .sr(1)
36614         .m(1)
36615         .n(4)
36616         .k(k)
36617         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36618     }
36619   }
36620 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_lt_8_strided_a)36621   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_lt_8_strided_a) {
36622     TEST_REQUIRES_X86_SSE2;
36623     for (size_t k = 1; k < 8; k++) {
36624       GemmMicrokernelTester()
36625         .extended_weights(true)
36626         .mr(1)
36627         .nr(4)
36628         .kr(2)
36629         .sr(1)
36630         .m(1)
36631         .n(4)
36632         .k(k)
36633         .a_stride(11)
36634         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36635     }
36636   }
36637 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_lt_8_subtile)36638   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_lt_8_subtile) {
36639     TEST_REQUIRES_X86_SSE2;
36640     for (size_t k = 1; k < 8; k++) {
36641       for (uint32_t n = 1; n <= 4; n++) {
36642         for (uint32_t m = 1; m <= 1; m++) {
36643           GemmMicrokernelTester()
36644             .extended_weights(true)
36645             .mr(1)
36646             .nr(4)
36647             .kr(2)
36648             .sr(1)
36649             .m(m)
36650             .n(n)
36651             .k(k)
36652             .iterations(1)
36653             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36654         }
36655       }
36656     }
36657   }
36658 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_gt_8)36659   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_gt_8) {
36660     TEST_REQUIRES_X86_SSE2;
36661     for (size_t k = 9; k < 16; k++) {
36662       GemmMicrokernelTester()
36663         .extended_weights(true)
36664         .mr(1)
36665         .nr(4)
36666         .kr(2)
36667         .sr(1)
36668         .m(1)
36669         .n(4)
36670         .k(k)
36671         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36672     }
36673   }
36674 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_gt_8_strided_a)36675   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_gt_8_strided_a) {
36676     TEST_REQUIRES_X86_SSE2;
36677     for (size_t k = 9; k < 16; k++) {
36678       GemmMicrokernelTester()
36679         .extended_weights(true)
36680         .mr(1)
36681         .nr(4)
36682         .kr(2)
36683         .sr(1)
36684         .m(1)
36685         .n(4)
36686         .k(k)
36687         .a_stride(19)
36688         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36689     }
36690   }
36691 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_gt_8_subtile)36692   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_gt_8_subtile) {
36693     TEST_REQUIRES_X86_SSE2;
36694     for (size_t k = 9; k < 16; k++) {
36695       for (uint32_t n = 1; n <= 4; n++) {
36696         for (uint32_t m = 1; m <= 1; m++) {
36697           GemmMicrokernelTester()
36698             .extended_weights(true)
36699             .mr(1)
36700             .nr(4)
36701             .kr(2)
36702             .sr(1)
36703             .m(m)
36704             .n(n)
36705             .k(k)
36706             .iterations(1)
36707             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36708         }
36709       }
36710     }
36711   }
36712 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_div_8)36713   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_div_8) {
36714     TEST_REQUIRES_X86_SSE2;
36715     for (size_t k = 16; k <= 80; k += 8) {
36716       GemmMicrokernelTester()
36717         .extended_weights(true)
36718         .mr(1)
36719         .nr(4)
36720         .kr(2)
36721         .sr(1)
36722         .m(1)
36723         .n(4)
36724         .k(k)
36725         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36726     }
36727   }
36728 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_div_8_strided_a)36729   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_div_8_strided_a) {
36730     TEST_REQUIRES_X86_SSE2;
36731     for (size_t k = 16; k <= 80; k += 8) {
36732       GemmMicrokernelTester()
36733         .extended_weights(true)
36734         .mr(1)
36735         .nr(4)
36736         .kr(2)
36737         .sr(1)
36738         .m(1)
36739         .n(4)
36740         .k(k)
36741         .a_stride(83)
36742         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36743     }
36744   }
36745 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,k_div_8_subtile)36746   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, k_div_8_subtile) {
36747     TEST_REQUIRES_X86_SSE2;
36748     for (size_t k = 16; k <= 80; k += 8) {
36749       for (uint32_t n = 1; n <= 4; n++) {
36750         for (uint32_t m = 1; m <= 1; m++) {
36751           GemmMicrokernelTester()
36752             .extended_weights(true)
36753             .mr(1)
36754             .nr(4)
36755             .kr(2)
36756             .sr(1)
36757             .m(m)
36758             .n(n)
36759             .k(k)
36760             .iterations(1)
36761             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36762         }
36763       }
36764     }
36765   }
36766 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_gt_4)36767   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_gt_4) {
36768     TEST_REQUIRES_X86_SSE2;
36769     for (uint32_t n = 5; n < 8; n++) {
36770       for (size_t k = 1; k <= 40; k += 9) {
36771         GemmMicrokernelTester()
36772           .extended_weights(true)
36773           .mr(1)
36774           .nr(4)
36775           .kr(2)
36776           .sr(1)
36777           .m(1)
36778           .n(n)
36779           .k(k)
36780           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36781       }
36782     }
36783   }
36784 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_gt_4_strided_cn)36785   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_gt_4_strided_cn) {
36786     TEST_REQUIRES_X86_SSE2;
36787     for (uint32_t n = 5; n < 8; n++) {
36788       for (size_t k = 1; k <= 40; k += 9) {
36789         GemmMicrokernelTester()
36790           .extended_weights(true)
36791           .mr(1)
36792           .nr(4)
36793           .kr(2)
36794           .sr(1)
36795           .m(1)
36796           .n(n)
36797           .k(k)
36798           .cn_stride(7)
36799           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36800       }
36801     }
36802   }
36803 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_gt_4_strided_a)36804   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_gt_4_strided_a) {
36805     TEST_REQUIRES_X86_SSE2;
36806     for (uint32_t n = 5; n < 8; n++) {
36807       for (size_t k = 1; k <= 40; k += 9) {
36808         GemmMicrokernelTester()
36809           .extended_weights(true)
36810           .mr(1)
36811           .nr(4)
36812           .kr(2)
36813           .sr(1)
36814           .m(1)
36815           .n(n)
36816           .k(k)
36817           .a_stride(43)
36818           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36819       }
36820     }
36821   }
36822 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_gt_4_subtile)36823   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_gt_4_subtile) {
36824     TEST_REQUIRES_X86_SSE2;
36825     for (uint32_t n = 5; n < 8; n++) {
36826       for (size_t k = 1; k <= 40; k += 9) {
36827         for (uint32_t m = 1; m <= 1; m++) {
36828           GemmMicrokernelTester()
36829             .extended_weights(true)
36830             .mr(1)
36831             .nr(4)
36832             .kr(2)
36833             .sr(1)
36834             .m(m)
36835             .n(n)
36836             .k(k)
36837             .iterations(1)
36838             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36839         }
36840       }
36841     }
36842   }
36843 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_div_4)36844   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_div_4) {
36845     TEST_REQUIRES_X86_SSE2;
36846     for (uint32_t n = 8; n <= 12; n += 4) {
36847       for (size_t k = 1; k <= 40; k += 9) {
36848         GemmMicrokernelTester()
36849           .extended_weights(true)
36850           .mr(1)
36851           .nr(4)
36852           .kr(2)
36853           .sr(1)
36854           .m(1)
36855           .n(n)
36856           .k(k)
36857           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36858       }
36859     }
36860   }
36861 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_div_4_strided_cn)36862   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_div_4_strided_cn) {
36863     TEST_REQUIRES_X86_SSE2;
36864     for (uint32_t n = 8; n <= 12; n += 4) {
36865       for (size_t k = 1; k <= 40; k += 9) {
36866         GemmMicrokernelTester()
36867           .extended_weights(true)
36868           .mr(1)
36869           .nr(4)
36870           .kr(2)
36871           .sr(1)
36872           .m(1)
36873           .n(n)
36874           .k(k)
36875           .cn_stride(7)
36876           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36877       }
36878     }
36879   }
36880 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_div_4_strided_a)36881   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_div_4_strided_a) {
36882     TEST_REQUIRES_X86_SSE2;
36883     for (uint32_t n = 8; n <= 12; n += 4) {
36884       for (size_t k = 1; k <= 40; k += 9) {
36885         GemmMicrokernelTester()
36886           .extended_weights(true)
36887           .mr(1)
36888           .nr(4)
36889           .kr(2)
36890           .sr(1)
36891           .m(1)
36892           .n(n)
36893           .k(k)
36894           .a_stride(43)
36895           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36896       }
36897     }
36898   }
36899 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,n_div_4_subtile)36900   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, n_div_4_subtile) {
36901     TEST_REQUIRES_X86_SSE2;
36902     for (uint32_t n = 8; n <= 12; n += 4) {
36903       for (size_t k = 1; k <= 40; k += 9) {
36904         for (uint32_t m = 1; m <= 1; m++) {
36905           GemmMicrokernelTester()
36906             .extended_weights(true)
36907             .mr(1)
36908             .nr(4)
36909             .kr(2)
36910             .sr(1)
36911             .m(m)
36912             .n(n)
36913             .k(k)
36914             .iterations(1)
36915             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36916         }
36917       }
36918     }
36919   }
36920 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,strided_cm_subtile)36921   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, strided_cm_subtile) {
36922     TEST_REQUIRES_X86_SSE2;
36923     for (size_t k = 1; k <= 40; k += 9) {
36924       for (uint32_t n = 1; n <= 4; n++) {
36925         for (uint32_t m = 1; m <= 1; m++) {
36926           GemmMicrokernelTester()
36927             .extended_weights(true)
36928             .mr(1)
36929             .nr(4)
36930             .kr(2)
36931             .sr(1)
36932             .m(m)
36933             .n(n)
36934             .k(k)
36935             .cm_stride(7)
36936             .iterations(1)
36937             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36938         }
36939       }
36940     }
36941   }
36942 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2,strided_cm)36943   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE2, strided_cm) {
36944     TEST_REQUIRES_X86_SSE2;
36945     GemmMicrokernelTester()
36946       .extended_weights(true)
36947       .mr(1)
36948       .nr(4)
36949       .kr(2)
36950       .sr(1)
36951       .m(1)
36952       .n(4)
36953       .k(8)
36954       .cm_stride(7)
36955       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
36956   }
36957 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
36958 
36959 
36960 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_eq_8)36961   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_eq_8) {
36962     TEST_REQUIRES_X86_SSE41;
36963     GemmMicrokernelTester()
36964       .extended_weights(true)
36965       .mr(1)
36966       .nr(4)
36967       .kr(2)
36968       .sr(1)
36969       .m(1)
36970       .n(4)
36971       .k(8)
36972       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36973   }
36974 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,strided_cn)36975   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, strided_cn) {
36976     TEST_REQUIRES_X86_SSE41;
36977     GemmMicrokernelTester()
36978       .extended_weights(true)
36979       .mr(1)
36980       .nr(4)
36981       .kr(2)
36982       .sr(1)
36983       .m(1)
36984       .n(4)
36985       .k(8)
36986       .cn_stride(7)
36987       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
36988   }
36989 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_eq_8_strided_a)36990   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_eq_8_strided_a) {
36991     TEST_REQUIRES_X86_SSE41;
36992     GemmMicrokernelTester()
36993       .extended_weights(true)
36994       .mr(1)
36995       .nr(4)
36996       .kr(2)
36997       .sr(1)
36998       .m(1)
36999       .n(4)
37000       .k(8)
37001       .a_stride(11)
37002       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37003   }
37004 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_eq_8_subtile)37005   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_eq_8_subtile) {
37006     TEST_REQUIRES_X86_SSE41;
37007     for (uint32_t n = 1; n <= 4; n++) {
37008       for (uint32_t m = 1; m <= 1; m++) {
37009         GemmMicrokernelTester()
37010           .extended_weights(true)
37011           .mr(1)
37012           .nr(4)
37013           .kr(2)
37014           .sr(1)
37015           .m(m)
37016           .n(n)
37017           .k(8)
37018           .iterations(1)
37019           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37020       }
37021     }
37022   }
37023 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_eq_8_subtile_m)37024   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_eq_8_subtile_m) {
37025     TEST_REQUIRES_X86_SSE41;
37026     for (uint32_t m = 1; m <= 1; m++) {
37027       GemmMicrokernelTester()
37028         .extended_weights(true)
37029         .mr(1)
37030         .nr(4)
37031         .kr(2)
37032         .sr(1)
37033         .m(m)
37034         .n(4)
37035         .k(8)
37036         .iterations(1)
37037         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37038     }
37039   }
37040 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_eq_8_subtile_n)37041   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_eq_8_subtile_n) {
37042     TEST_REQUIRES_X86_SSE41;
37043     for (uint32_t n = 1; n <= 4; n++) {
37044       GemmMicrokernelTester()
37045         .extended_weights(true)
37046         .mr(1)
37047         .nr(4)
37048         .kr(2)
37049         .sr(1)
37050         .m(1)
37051         .n(n)
37052         .k(8)
37053         .iterations(1)
37054         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37055     }
37056   }
37057 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_lt_8)37058   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_lt_8) {
37059     TEST_REQUIRES_X86_SSE41;
37060     for (size_t k = 1; k < 8; k++) {
37061       GemmMicrokernelTester()
37062         .extended_weights(true)
37063         .mr(1)
37064         .nr(4)
37065         .kr(2)
37066         .sr(1)
37067         .m(1)
37068         .n(4)
37069         .k(k)
37070         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37071     }
37072   }
37073 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_lt_8_strided_a)37074   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_lt_8_strided_a) {
37075     TEST_REQUIRES_X86_SSE41;
37076     for (size_t k = 1; k < 8; k++) {
37077       GemmMicrokernelTester()
37078         .extended_weights(true)
37079         .mr(1)
37080         .nr(4)
37081         .kr(2)
37082         .sr(1)
37083         .m(1)
37084         .n(4)
37085         .k(k)
37086         .a_stride(11)
37087         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37088     }
37089   }
37090 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_lt_8_subtile)37091   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_lt_8_subtile) {
37092     TEST_REQUIRES_X86_SSE41;
37093     for (size_t k = 1; k < 8; k++) {
37094       for (uint32_t n = 1; n <= 4; n++) {
37095         for (uint32_t m = 1; m <= 1; m++) {
37096           GemmMicrokernelTester()
37097             .extended_weights(true)
37098             .mr(1)
37099             .nr(4)
37100             .kr(2)
37101             .sr(1)
37102             .m(m)
37103             .n(n)
37104             .k(k)
37105             .iterations(1)
37106             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37107         }
37108       }
37109     }
37110   }
37111 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_gt_8)37112   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_gt_8) {
37113     TEST_REQUIRES_X86_SSE41;
37114     for (size_t k = 9; k < 16; k++) {
37115       GemmMicrokernelTester()
37116         .extended_weights(true)
37117         .mr(1)
37118         .nr(4)
37119         .kr(2)
37120         .sr(1)
37121         .m(1)
37122         .n(4)
37123         .k(k)
37124         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37125     }
37126   }
37127 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_gt_8_strided_a)37128   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_gt_8_strided_a) {
37129     TEST_REQUIRES_X86_SSE41;
37130     for (size_t k = 9; k < 16; k++) {
37131       GemmMicrokernelTester()
37132         .extended_weights(true)
37133         .mr(1)
37134         .nr(4)
37135         .kr(2)
37136         .sr(1)
37137         .m(1)
37138         .n(4)
37139         .k(k)
37140         .a_stride(19)
37141         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37142     }
37143   }
37144 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_gt_8_subtile)37145   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_gt_8_subtile) {
37146     TEST_REQUIRES_X86_SSE41;
37147     for (size_t k = 9; k < 16; k++) {
37148       for (uint32_t n = 1; n <= 4; n++) {
37149         for (uint32_t m = 1; m <= 1; m++) {
37150           GemmMicrokernelTester()
37151             .extended_weights(true)
37152             .mr(1)
37153             .nr(4)
37154             .kr(2)
37155             .sr(1)
37156             .m(m)
37157             .n(n)
37158             .k(k)
37159             .iterations(1)
37160             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37161         }
37162       }
37163     }
37164   }
37165 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_div_8)37166   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_div_8) {
37167     TEST_REQUIRES_X86_SSE41;
37168     for (size_t k = 16; k <= 80; k += 8) {
37169       GemmMicrokernelTester()
37170         .extended_weights(true)
37171         .mr(1)
37172         .nr(4)
37173         .kr(2)
37174         .sr(1)
37175         .m(1)
37176         .n(4)
37177         .k(k)
37178         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37179     }
37180   }
37181 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_div_8_strided_a)37182   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_div_8_strided_a) {
37183     TEST_REQUIRES_X86_SSE41;
37184     for (size_t k = 16; k <= 80; k += 8) {
37185       GemmMicrokernelTester()
37186         .extended_weights(true)
37187         .mr(1)
37188         .nr(4)
37189         .kr(2)
37190         .sr(1)
37191         .m(1)
37192         .n(4)
37193         .k(k)
37194         .a_stride(83)
37195         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37196     }
37197   }
37198 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,k_div_8_subtile)37199   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, k_div_8_subtile) {
37200     TEST_REQUIRES_X86_SSE41;
37201     for (size_t k = 16; k <= 80; k += 8) {
37202       for (uint32_t n = 1; n <= 4; n++) {
37203         for (uint32_t m = 1; m <= 1; m++) {
37204           GemmMicrokernelTester()
37205             .extended_weights(true)
37206             .mr(1)
37207             .nr(4)
37208             .kr(2)
37209             .sr(1)
37210             .m(m)
37211             .n(n)
37212             .k(k)
37213             .iterations(1)
37214             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37215         }
37216       }
37217     }
37218   }
37219 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_gt_4)37220   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_gt_4) {
37221     TEST_REQUIRES_X86_SSE41;
37222     for (uint32_t n = 5; n < 8; n++) {
37223       for (size_t k = 1; k <= 40; k += 9) {
37224         GemmMicrokernelTester()
37225           .extended_weights(true)
37226           .mr(1)
37227           .nr(4)
37228           .kr(2)
37229           .sr(1)
37230           .m(1)
37231           .n(n)
37232           .k(k)
37233           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37234       }
37235     }
37236   }
37237 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_gt_4_strided_cn)37238   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_gt_4_strided_cn) {
37239     TEST_REQUIRES_X86_SSE41;
37240     for (uint32_t n = 5; n < 8; n++) {
37241       for (size_t k = 1; k <= 40; k += 9) {
37242         GemmMicrokernelTester()
37243           .extended_weights(true)
37244           .mr(1)
37245           .nr(4)
37246           .kr(2)
37247           .sr(1)
37248           .m(1)
37249           .n(n)
37250           .k(k)
37251           .cn_stride(7)
37252           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37253       }
37254     }
37255   }
37256 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_gt_4_strided_a)37257   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_gt_4_strided_a) {
37258     TEST_REQUIRES_X86_SSE41;
37259     for (uint32_t n = 5; n < 8; n++) {
37260       for (size_t k = 1; k <= 40; k += 9) {
37261         GemmMicrokernelTester()
37262           .extended_weights(true)
37263           .mr(1)
37264           .nr(4)
37265           .kr(2)
37266           .sr(1)
37267           .m(1)
37268           .n(n)
37269           .k(k)
37270           .a_stride(43)
37271           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37272       }
37273     }
37274   }
37275 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_gt_4_subtile)37276   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_gt_4_subtile) {
37277     TEST_REQUIRES_X86_SSE41;
37278     for (uint32_t n = 5; n < 8; n++) {
37279       for (size_t k = 1; k <= 40; k += 9) {
37280         for (uint32_t m = 1; m <= 1; m++) {
37281           GemmMicrokernelTester()
37282             .extended_weights(true)
37283             .mr(1)
37284             .nr(4)
37285             .kr(2)
37286             .sr(1)
37287             .m(m)
37288             .n(n)
37289             .k(k)
37290             .iterations(1)
37291             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37292         }
37293       }
37294     }
37295   }
37296 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_div_4)37297   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_div_4) {
37298     TEST_REQUIRES_X86_SSE41;
37299     for (uint32_t n = 8; n <= 12; n += 4) {
37300       for (size_t k = 1; k <= 40; k += 9) {
37301         GemmMicrokernelTester()
37302           .extended_weights(true)
37303           .mr(1)
37304           .nr(4)
37305           .kr(2)
37306           .sr(1)
37307           .m(1)
37308           .n(n)
37309           .k(k)
37310           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37311       }
37312     }
37313   }
37314 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_div_4_strided_cn)37315   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_div_4_strided_cn) {
37316     TEST_REQUIRES_X86_SSE41;
37317     for (uint32_t n = 8; n <= 12; n += 4) {
37318       for (size_t k = 1; k <= 40; k += 9) {
37319         GemmMicrokernelTester()
37320           .extended_weights(true)
37321           .mr(1)
37322           .nr(4)
37323           .kr(2)
37324           .sr(1)
37325           .m(1)
37326           .n(n)
37327           .k(k)
37328           .cn_stride(7)
37329           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37330       }
37331     }
37332   }
37333 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_div_4_strided_a)37334   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_div_4_strided_a) {
37335     TEST_REQUIRES_X86_SSE41;
37336     for (uint32_t n = 8; n <= 12; n += 4) {
37337       for (size_t k = 1; k <= 40; k += 9) {
37338         GemmMicrokernelTester()
37339           .extended_weights(true)
37340           .mr(1)
37341           .nr(4)
37342           .kr(2)
37343           .sr(1)
37344           .m(1)
37345           .n(n)
37346           .k(k)
37347           .a_stride(43)
37348           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37349       }
37350     }
37351   }
37352 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,n_div_4_subtile)37353   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, n_div_4_subtile) {
37354     TEST_REQUIRES_X86_SSE41;
37355     for (uint32_t n = 8; n <= 12; n += 4) {
37356       for (size_t k = 1; k <= 40; k += 9) {
37357         for (uint32_t m = 1; m <= 1; m++) {
37358           GemmMicrokernelTester()
37359             .extended_weights(true)
37360             .mr(1)
37361             .nr(4)
37362             .kr(2)
37363             .sr(1)
37364             .m(m)
37365             .n(n)
37366             .k(k)
37367             .iterations(1)
37368             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37369         }
37370       }
37371     }
37372   }
37373 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,strided_cm_subtile)37374   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, strided_cm_subtile) {
37375     TEST_REQUIRES_X86_SSE41;
37376     for (size_t k = 1; k <= 40; k += 9) {
37377       for (uint32_t n = 1; n <= 4; n++) {
37378         for (uint32_t m = 1; m <= 1; m++) {
37379           GemmMicrokernelTester()
37380             .extended_weights(true)
37381             .mr(1)
37382             .nr(4)
37383             .kr(2)
37384             .sr(1)
37385             .m(m)
37386             .n(n)
37387             .k(k)
37388             .cm_stride(7)
37389             .iterations(1)
37390             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37391         }
37392       }
37393     }
37394   }
37395 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41,strided_cm)37396   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__SSE41, strided_cm) {
37397     TEST_REQUIRES_X86_SSE41;
37398     GemmMicrokernelTester()
37399       .extended_weights(true)
37400       .mr(1)
37401       .nr(4)
37402       .kr(2)
37403       .sr(1)
37404       .m(1)
37405       .n(4)
37406       .k(8)
37407       .cm_stride(7)
37408       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37409   }
37410 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
37411 
37412 
37413 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_eq_8)37414   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_eq_8) {
37415     TEST_REQUIRES_X86_SSE41;
37416     GemmMicrokernelTester()
37417       .extended_weights(true)
37418       .mr(2)
37419       .nr(4)
37420       .kr(2)
37421       .sr(1)
37422       .m(2)
37423       .n(4)
37424       .k(8)
37425       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37426   }
37427 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,strided_cn)37428   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, strided_cn) {
37429     TEST_REQUIRES_X86_SSE41;
37430     GemmMicrokernelTester()
37431       .extended_weights(true)
37432       .mr(2)
37433       .nr(4)
37434       .kr(2)
37435       .sr(1)
37436       .m(2)
37437       .n(4)
37438       .k(8)
37439       .cn_stride(7)
37440       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37441   }
37442 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_eq_8_strided_a)37443   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_eq_8_strided_a) {
37444     TEST_REQUIRES_X86_SSE41;
37445     GemmMicrokernelTester()
37446       .extended_weights(true)
37447       .mr(2)
37448       .nr(4)
37449       .kr(2)
37450       .sr(1)
37451       .m(2)
37452       .n(4)
37453       .k(8)
37454       .a_stride(11)
37455       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37456   }
37457 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_eq_8_subtile)37458   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_eq_8_subtile) {
37459     TEST_REQUIRES_X86_SSE41;
37460     for (uint32_t n = 1; n <= 4; n++) {
37461       for (uint32_t m = 1; m <= 2; m++) {
37462         GemmMicrokernelTester()
37463           .extended_weights(true)
37464           .mr(2)
37465           .nr(4)
37466           .kr(2)
37467           .sr(1)
37468           .m(m)
37469           .n(n)
37470           .k(8)
37471           .iterations(1)
37472           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37473       }
37474     }
37475   }
37476 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_eq_8_subtile_m)37477   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_eq_8_subtile_m) {
37478     TEST_REQUIRES_X86_SSE41;
37479     for (uint32_t m = 1; m <= 2; m++) {
37480       GemmMicrokernelTester()
37481         .extended_weights(true)
37482         .mr(2)
37483         .nr(4)
37484         .kr(2)
37485         .sr(1)
37486         .m(m)
37487         .n(4)
37488         .k(8)
37489         .iterations(1)
37490         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37491     }
37492   }
37493 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_eq_8_subtile_n)37494   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_eq_8_subtile_n) {
37495     TEST_REQUIRES_X86_SSE41;
37496     for (uint32_t n = 1; n <= 4; n++) {
37497       GemmMicrokernelTester()
37498         .extended_weights(true)
37499         .mr(2)
37500         .nr(4)
37501         .kr(2)
37502         .sr(1)
37503         .m(2)
37504         .n(n)
37505         .k(8)
37506         .iterations(1)
37507         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37508     }
37509   }
37510 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_lt_8)37511   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_lt_8) {
37512     TEST_REQUIRES_X86_SSE41;
37513     for (size_t k = 1; k < 8; k++) {
37514       GemmMicrokernelTester()
37515         .extended_weights(true)
37516         .mr(2)
37517         .nr(4)
37518         .kr(2)
37519         .sr(1)
37520         .m(2)
37521         .n(4)
37522         .k(k)
37523         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37524     }
37525   }
37526 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_lt_8_strided_a)37527   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_lt_8_strided_a) {
37528     TEST_REQUIRES_X86_SSE41;
37529     for (size_t k = 1; k < 8; k++) {
37530       GemmMicrokernelTester()
37531         .extended_weights(true)
37532         .mr(2)
37533         .nr(4)
37534         .kr(2)
37535         .sr(1)
37536         .m(2)
37537         .n(4)
37538         .k(k)
37539         .a_stride(11)
37540         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37541     }
37542   }
37543 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_lt_8_subtile)37544   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_lt_8_subtile) {
37545     TEST_REQUIRES_X86_SSE41;
37546     for (size_t k = 1; k < 8; k++) {
37547       for (uint32_t n = 1; n <= 4; n++) {
37548         for (uint32_t m = 1; m <= 2; m++) {
37549           GemmMicrokernelTester()
37550             .extended_weights(true)
37551             .mr(2)
37552             .nr(4)
37553             .kr(2)
37554             .sr(1)
37555             .m(m)
37556             .n(n)
37557             .k(k)
37558             .iterations(1)
37559             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37560         }
37561       }
37562     }
37563   }
37564 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_gt_8)37565   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_gt_8) {
37566     TEST_REQUIRES_X86_SSE41;
37567     for (size_t k = 9; k < 16; k++) {
37568       GemmMicrokernelTester()
37569         .extended_weights(true)
37570         .mr(2)
37571         .nr(4)
37572         .kr(2)
37573         .sr(1)
37574         .m(2)
37575         .n(4)
37576         .k(k)
37577         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37578     }
37579   }
37580 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_gt_8_strided_a)37581   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_gt_8_strided_a) {
37582     TEST_REQUIRES_X86_SSE41;
37583     for (size_t k = 9; k < 16; k++) {
37584       GemmMicrokernelTester()
37585         .extended_weights(true)
37586         .mr(2)
37587         .nr(4)
37588         .kr(2)
37589         .sr(1)
37590         .m(2)
37591         .n(4)
37592         .k(k)
37593         .a_stride(19)
37594         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37595     }
37596   }
37597 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_gt_8_subtile)37598   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_gt_8_subtile) {
37599     TEST_REQUIRES_X86_SSE41;
37600     for (size_t k = 9; k < 16; k++) {
37601       for (uint32_t n = 1; n <= 4; n++) {
37602         for (uint32_t m = 1; m <= 2; m++) {
37603           GemmMicrokernelTester()
37604             .extended_weights(true)
37605             .mr(2)
37606             .nr(4)
37607             .kr(2)
37608             .sr(1)
37609             .m(m)
37610             .n(n)
37611             .k(k)
37612             .iterations(1)
37613             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37614         }
37615       }
37616     }
37617   }
37618 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_div_8)37619   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_div_8) {
37620     TEST_REQUIRES_X86_SSE41;
37621     for (size_t k = 16; k <= 80; k += 8) {
37622       GemmMicrokernelTester()
37623         .extended_weights(true)
37624         .mr(2)
37625         .nr(4)
37626         .kr(2)
37627         .sr(1)
37628         .m(2)
37629         .n(4)
37630         .k(k)
37631         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37632     }
37633   }
37634 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_div_8_strided_a)37635   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_div_8_strided_a) {
37636     TEST_REQUIRES_X86_SSE41;
37637     for (size_t k = 16; k <= 80; k += 8) {
37638       GemmMicrokernelTester()
37639         .extended_weights(true)
37640         .mr(2)
37641         .nr(4)
37642         .kr(2)
37643         .sr(1)
37644         .m(2)
37645         .n(4)
37646         .k(k)
37647         .a_stride(83)
37648         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37649     }
37650   }
37651 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,k_div_8_subtile)37652   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, k_div_8_subtile) {
37653     TEST_REQUIRES_X86_SSE41;
37654     for (size_t k = 16; k <= 80; k += 8) {
37655       for (uint32_t n = 1; n <= 4; n++) {
37656         for (uint32_t m = 1; m <= 2; m++) {
37657           GemmMicrokernelTester()
37658             .extended_weights(true)
37659             .mr(2)
37660             .nr(4)
37661             .kr(2)
37662             .sr(1)
37663             .m(m)
37664             .n(n)
37665             .k(k)
37666             .iterations(1)
37667             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37668         }
37669       }
37670     }
37671   }
37672 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_gt_4)37673   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_gt_4) {
37674     TEST_REQUIRES_X86_SSE41;
37675     for (uint32_t n = 5; n < 8; n++) {
37676       for (size_t k = 1; k <= 40; k += 9) {
37677         GemmMicrokernelTester()
37678           .extended_weights(true)
37679           .mr(2)
37680           .nr(4)
37681           .kr(2)
37682           .sr(1)
37683           .m(2)
37684           .n(n)
37685           .k(k)
37686           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37687       }
37688     }
37689   }
37690 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_gt_4_strided_cn)37691   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_gt_4_strided_cn) {
37692     TEST_REQUIRES_X86_SSE41;
37693     for (uint32_t n = 5; n < 8; n++) {
37694       for (size_t k = 1; k <= 40; k += 9) {
37695         GemmMicrokernelTester()
37696           .extended_weights(true)
37697           .mr(2)
37698           .nr(4)
37699           .kr(2)
37700           .sr(1)
37701           .m(2)
37702           .n(n)
37703           .k(k)
37704           .cn_stride(7)
37705           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37706       }
37707     }
37708   }
37709 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_gt_4_strided_a)37710   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_gt_4_strided_a) {
37711     TEST_REQUIRES_X86_SSE41;
37712     for (uint32_t n = 5; n < 8; n++) {
37713       for (size_t k = 1; k <= 40; k += 9) {
37714         GemmMicrokernelTester()
37715           .extended_weights(true)
37716           .mr(2)
37717           .nr(4)
37718           .kr(2)
37719           .sr(1)
37720           .m(2)
37721           .n(n)
37722           .k(k)
37723           .a_stride(43)
37724           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37725       }
37726     }
37727   }
37728 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_gt_4_subtile)37729   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_gt_4_subtile) {
37730     TEST_REQUIRES_X86_SSE41;
37731     for (uint32_t n = 5; n < 8; n++) {
37732       for (size_t k = 1; k <= 40; k += 9) {
37733         for (uint32_t m = 1; m <= 2; m++) {
37734           GemmMicrokernelTester()
37735             .extended_weights(true)
37736             .mr(2)
37737             .nr(4)
37738             .kr(2)
37739             .sr(1)
37740             .m(m)
37741             .n(n)
37742             .k(k)
37743             .iterations(1)
37744             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37745         }
37746       }
37747     }
37748   }
37749 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_div_4)37750   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_div_4) {
37751     TEST_REQUIRES_X86_SSE41;
37752     for (uint32_t n = 8; n <= 12; n += 4) {
37753       for (size_t k = 1; k <= 40; k += 9) {
37754         GemmMicrokernelTester()
37755           .extended_weights(true)
37756           .mr(2)
37757           .nr(4)
37758           .kr(2)
37759           .sr(1)
37760           .m(2)
37761           .n(n)
37762           .k(k)
37763           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37764       }
37765     }
37766   }
37767 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_div_4_strided_cn)37768   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_div_4_strided_cn) {
37769     TEST_REQUIRES_X86_SSE41;
37770     for (uint32_t n = 8; n <= 12; n += 4) {
37771       for (size_t k = 1; k <= 40; k += 9) {
37772         GemmMicrokernelTester()
37773           .extended_weights(true)
37774           .mr(2)
37775           .nr(4)
37776           .kr(2)
37777           .sr(1)
37778           .m(2)
37779           .n(n)
37780           .k(k)
37781           .cn_stride(7)
37782           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37783       }
37784     }
37785   }
37786 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_div_4_strided_a)37787   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_div_4_strided_a) {
37788     TEST_REQUIRES_X86_SSE41;
37789     for (uint32_t n = 8; n <= 12; n += 4) {
37790       for (size_t k = 1; k <= 40; k += 9) {
37791         GemmMicrokernelTester()
37792           .extended_weights(true)
37793           .mr(2)
37794           .nr(4)
37795           .kr(2)
37796           .sr(1)
37797           .m(2)
37798           .n(n)
37799           .k(k)
37800           .a_stride(43)
37801           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37802       }
37803     }
37804   }
37805 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,n_div_4_subtile)37806   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, n_div_4_subtile) {
37807     TEST_REQUIRES_X86_SSE41;
37808     for (uint32_t n = 8; n <= 12; n += 4) {
37809       for (size_t k = 1; k <= 40; k += 9) {
37810         for (uint32_t m = 1; m <= 2; m++) {
37811           GemmMicrokernelTester()
37812             .extended_weights(true)
37813             .mr(2)
37814             .nr(4)
37815             .kr(2)
37816             .sr(1)
37817             .m(m)
37818             .n(n)
37819             .k(k)
37820             .iterations(1)
37821             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37822         }
37823       }
37824     }
37825   }
37826 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,strided_cm_subtile)37827   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, strided_cm_subtile) {
37828     TEST_REQUIRES_X86_SSE41;
37829     for (size_t k = 1; k <= 40; k += 9) {
37830       for (uint32_t n = 1; n <= 4; n++) {
37831         for (uint32_t m = 1; m <= 2; m++) {
37832           GemmMicrokernelTester()
37833             .extended_weights(true)
37834             .mr(2)
37835             .nr(4)
37836             .kr(2)
37837             .sr(1)
37838             .m(m)
37839             .n(n)
37840             .k(k)
37841             .cm_stride(7)
37842             .iterations(1)
37843             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37844         }
37845       }
37846     }
37847   }
37848 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41,strided_cm)37849   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__SSE41, strided_cm) {
37850     TEST_REQUIRES_X86_SSE41;
37851     GemmMicrokernelTester()
37852       .extended_weights(true)
37853       .mr(2)
37854       .nr(4)
37855       .kr(2)
37856       .sr(1)
37857       .m(2)
37858       .n(4)
37859       .k(8)
37860       .cm_stride(7)
37861       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
37862   }
37863 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
37864 
37865 
37866 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_eq_8)37867   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_eq_8) {
37868     TEST_REQUIRES_X86_SSE2;
37869     GemmMicrokernelTester()
37870       .extended_weights(true)
37871       .mr(4)
37872       .nr(4)
37873       .kr(2)
37874       .sr(1)
37875       .m(4)
37876       .n(4)
37877       .k(8)
37878       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37879   }
37880 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,strided_cn)37881   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, strided_cn) {
37882     TEST_REQUIRES_X86_SSE2;
37883     GemmMicrokernelTester()
37884       .extended_weights(true)
37885       .mr(4)
37886       .nr(4)
37887       .kr(2)
37888       .sr(1)
37889       .m(4)
37890       .n(4)
37891       .k(8)
37892       .cn_stride(7)
37893       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37894   }
37895 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_eq_8_strided_a)37896   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_eq_8_strided_a) {
37897     TEST_REQUIRES_X86_SSE2;
37898     GemmMicrokernelTester()
37899       .extended_weights(true)
37900       .mr(4)
37901       .nr(4)
37902       .kr(2)
37903       .sr(1)
37904       .m(4)
37905       .n(4)
37906       .k(8)
37907       .a_stride(11)
37908       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37909   }
37910 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_eq_8_subtile)37911   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_eq_8_subtile) {
37912     TEST_REQUIRES_X86_SSE2;
37913     for (uint32_t n = 1; n <= 4; n++) {
37914       for (uint32_t m = 1; m <= 4; m++) {
37915         GemmMicrokernelTester()
37916           .extended_weights(true)
37917           .mr(4)
37918           .nr(4)
37919           .kr(2)
37920           .sr(1)
37921           .m(m)
37922           .n(n)
37923           .k(8)
37924           .iterations(1)
37925           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37926       }
37927     }
37928   }
37929 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_eq_8_subtile_m)37930   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_eq_8_subtile_m) {
37931     TEST_REQUIRES_X86_SSE2;
37932     for (uint32_t m = 1; m <= 4; m++) {
37933       GemmMicrokernelTester()
37934         .extended_weights(true)
37935         .mr(4)
37936         .nr(4)
37937         .kr(2)
37938         .sr(1)
37939         .m(m)
37940         .n(4)
37941         .k(8)
37942         .iterations(1)
37943         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37944     }
37945   }
37946 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_eq_8_subtile_n)37947   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_eq_8_subtile_n) {
37948     TEST_REQUIRES_X86_SSE2;
37949     for (uint32_t n = 1; n <= 4; n++) {
37950       GemmMicrokernelTester()
37951         .extended_weights(true)
37952         .mr(4)
37953         .nr(4)
37954         .kr(2)
37955         .sr(1)
37956         .m(4)
37957         .n(n)
37958         .k(8)
37959         .iterations(1)
37960         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37961     }
37962   }
37963 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_lt_8)37964   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_lt_8) {
37965     TEST_REQUIRES_X86_SSE2;
37966     for (size_t k = 1; k < 8; k++) {
37967       GemmMicrokernelTester()
37968         .extended_weights(true)
37969         .mr(4)
37970         .nr(4)
37971         .kr(2)
37972         .sr(1)
37973         .m(4)
37974         .n(4)
37975         .k(k)
37976         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37977     }
37978   }
37979 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_lt_8_strided_a)37980   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_lt_8_strided_a) {
37981     TEST_REQUIRES_X86_SSE2;
37982     for (size_t k = 1; k < 8; k++) {
37983       GemmMicrokernelTester()
37984         .extended_weights(true)
37985         .mr(4)
37986         .nr(4)
37987         .kr(2)
37988         .sr(1)
37989         .m(4)
37990         .n(4)
37991         .k(k)
37992         .a_stride(11)
37993         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
37994     }
37995   }
37996 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_lt_8_subtile)37997   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_lt_8_subtile) {
37998     TEST_REQUIRES_X86_SSE2;
37999     for (size_t k = 1; k < 8; k++) {
38000       for (uint32_t n = 1; n <= 4; n++) {
38001         for (uint32_t m = 1; m <= 4; m++) {
38002           GemmMicrokernelTester()
38003             .extended_weights(true)
38004             .mr(4)
38005             .nr(4)
38006             .kr(2)
38007             .sr(1)
38008             .m(m)
38009             .n(n)
38010             .k(k)
38011             .iterations(1)
38012             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38013         }
38014       }
38015     }
38016   }
38017 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_gt_8)38018   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_gt_8) {
38019     TEST_REQUIRES_X86_SSE2;
38020     for (size_t k = 9; k < 16; k++) {
38021       GemmMicrokernelTester()
38022         .extended_weights(true)
38023         .mr(4)
38024         .nr(4)
38025         .kr(2)
38026         .sr(1)
38027         .m(4)
38028         .n(4)
38029         .k(k)
38030         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38031     }
38032   }
38033 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_gt_8_strided_a)38034   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_gt_8_strided_a) {
38035     TEST_REQUIRES_X86_SSE2;
38036     for (size_t k = 9; k < 16; k++) {
38037       GemmMicrokernelTester()
38038         .extended_weights(true)
38039         .mr(4)
38040         .nr(4)
38041         .kr(2)
38042         .sr(1)
38043         .m(4)
38044         .n(4)
38045         .k(k)
38046         .a_stride(19)
38047         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38048     }
38049   }
38050 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_gt_8_subtile)38051   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_gt_8_subtile) {
38052     TEST_REQUIRES_X86_SSE2;
38053     for (size_t k = 9; k < 16; k++) {
38054       for (uint32_t n = 1; n <= 4; n++) {
38055         for (uint32_t m = 1; m <= 4; m++) {
38056           GemmMicrokernelTester()
38057             .extended_weights(true)
38058             .mr(4)
38059             .nr(4)
38060             .kr(2)
38061             .sr(1)
38062             .m(m)
38063             .n(n)
38064             .k(k)
38065             .iterations(1)
38066             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38067         }
38068       }
38069     }
38070   }
38071 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_div_8)38072   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_div_8) {
38073     TEST_REQUIRES_X86_SSE2;
38074     for (size_t k = 16; k <= 80; k += 8) {
38075       GemmMicrokernelTester()
38076         .extended_weights(true)
38077         .mr(4)
38078         .nr(4)
38079         .kr(2)
38080         .sr(1)
38081         .m(4)
38082         .n(4)
38083         .k(k)
38084         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38085     }
38086   }
38087 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_div_8_strided_a)38088   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_div_8_strided_a) {
38089     TEST_REQUIRES_X86_SSE2;
38090     for (size_t k = 16; k <= 80; k += 8) {
38091       GemmMicrokernelTester()
38092         .extended_weights(true)
38093         .mr(4)
38094         .nr(4)
38095         .kr(2)
38096         .sr(1)
38097         .m(4)
38098         .n(4)
38099         .k(k)
38100         .a_stride(83)
38101         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38102     }
38103   }
38104 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,k_div_8_subtile)38105   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, k_div_8_subtile) {
38106     TEST_REQUIRES_X86_SSE2;
38107     for (size_t k = 16; k <= 80; k += 8) {
38108       for (uint32_t n = 1; n <= 4; n++) {
38109         for (uint32_t m = 1; m <= 4; m++) {
38110           GemmMicrokernelTester()
38111             .extended_weights(true)
38112             .mr(4)
38113             .nr(4)
38114             .kr(2)
38115             .sr(1)
38116             .m(m)
38117             .n(n)
38118             .k(k)
38119             .iterations(1)
38120             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38121         }
38122       }
38123     }
38124   }
38125 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_gt_4)38126   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_gt_4) {
38127     TEST_REQUIRES_X86_SSE2;
38128     for (uint32_t n = 5; n < 8; n++) {
38129       for (size_t k = 1; k <= 40; k += 9) {
38130         GemmMicrokernelTester()
38131           .extended_weights(true)
38132           .mr(4)
38133           .nr(4)
38134           .kr(2)
38135           .sr(1)
38136           .m(4)
38137           .n(n)
38138           .k(k)
38139           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38140       }
38141     }
38142   }
38143 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_gt_4_strided_cn)38144   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_gt_4_strided_cn) {
38145     TEST_REQUIRES_X86_SSE2;
38146     for (uint32_t n = 5; n < 8; n++) {
38147       for (size_t k = 1; k <= 40; k += 9) {
38148         GemmMicrokernelTester()
38149           .extended_weights(true)
38150           .mr(4)
38151           .nr(4)
38152           .kr(2)
38153           .sr(1)
38154           .m(4)
38155           .n(n)
38156           .k(k)
38157           .cn_stride(7)
38158           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38159       }
38160     }
38161   }
38162 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_gt_4_strided_a)38163   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_gt_4_strided_a) {
38164     TEST_REQUIRES_X86_SSE2;
38165     for (uint32_t n = 5; n < 8; n++) {
38166       for (size_t k = 1; k <= 40; k += 9) {
38167         GemmMicrokernelTester()
38168           .extended_weights(true)
38169           .mr(4)
38170           .nr(4)
38171           .kr(2)
38172           .sr(1)
38173           .m(4)
38174           .n(n)
38175           .k(k)
38176           .a_stride(43)
38177           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38178       }
38179     }
38180   }
38181 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_gt_4_subtile)38182   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_gt_4_subtile) {
38183     TEST_REQUIRES_X86_SSE2;
38184     for (uint32_t n = 5; n < 8; n++) {
38185       for (size_t k = 1; k <= 40; k += 9) {
38186         for (uint32_t m = 1; m <= 4; m++) {
38187           GemmMicrokernelTester()
38188             .extended_weights(true)
38189             .mr(4)
38190             .nr(4)
38191             .kr(2)
38192             .sr(1)
38193             .m(m)
38194             .n(n)
38195             .k(k)
38196             .iterations(1)
38197             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38198         }
38199       }
38200     }
38201   }
38202 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_div_4)38203   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_div_4) {
38204     TEST_REQUIRES_X86_SSE2;
38205     for (uint32_t n = 8; n <= 12; n += 4) {
38206       for (size_t k = 1; k <= 40; k += 9) {
38207         GemmMicrokernelTester()
38208           .extended_weights(true)
38209           .mr(4)
38210           .nr(4)
38211           .kr(2)
38212           .sr(1)
38213           .m(4)
38214           .n(n)
38215           .k(k)
38216           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38217       }
38218     }
38219   }
38220 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_div_4_strided_cn)38221   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_div_4_strided_cn) {
38222     TEST_REQUIRES_X86_SSE2;
38223     for (uint32_t n = 8; n <= 12; n += 4) {
38224       for (size_t k = 1; k <= 40; k += 9) {
38225         GemmMicrokernelTester()
38226           .extended_weights(true)
38227           .mr(4)
38228           .nr(4)
38229           .kr(2)
38230           .sr(1)
38231           .m(4)
38232           .n(n)
38233           .k(k)
38234           .cn_stride(7)
38235           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38236       }
38237     }
38238   }
38239 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_div_4_strided_a)38240   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_div_4_strided_a) {
38241     TEST_REQUIRES_X86_SSE2;
38242     for (uint32_t n = 8; n <= 12; n += 4) {
38243       for (size_t k = 1; k <= 40; k += 9) {
38244         GemmMicrokernelTester()
38245           .extended_weights(true)
38246           .mr(4)
38247           .nr(4)
38248           .kr(2)
38249           .sr(1)
38250           .m(4)
38251           .n(n)
38252           .k(k)
38253           .a_stride(43)
38254           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38255       }
38256     }
38257   }
38258 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,n_div_4_subtile)38259   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, n_div_4_subtile) {
38260     TEST_REQUIRES_X86_SSE2;
38261     for (uint32_t n = 8; n <= 12; n += 4) {
38262       for (size_t k = 1; k <= 40; k += 9) {
38263         for (uint32_t m = 1; m <= 4; m++) {
38264           GemmMicrokernelTester()
38265             .extended_weights(true)
38266             .mr(4)
38267             .nr(4)
38268             .kr(2)
38269             .sr(1)
38270             .m(m)
38271             .n(n)
38272             .k(k)
38273             .iterations(1)
38274             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38275         }
38276       }
38277     }
38278   }
38279 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,strided_cm_subtile)38280   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, strided_cm_subtile) {
38281     TEST_REQUIRES_X86_SSE2;
38282     for (size_t k = 1; k <= 40; k += 9) {
38283       for (uint32_t n = 1; n <= 4; n++) {
38284         for (uint32_t m = 1; m <= 4; m++) {
38285           GemmMicrokernelTester()
38286             .extended_weights(true)
38287             .mr(4)
38288             .nr(4)
38289             .kr(2)
38290             .sr(1)
38291             .m(m)
38292             .n(n)
38293             .k(k)
38294             .cm_stride(7)
38295             .iterations(1)
38296             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38297         }
38298       }
38299     }
38300   }
38301 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2,strided_cm)38302   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE2, strided_cm) {
38303     TEST_REQUIRES_X86_SSE2;
38304     GemmMicrokernelTester()
38305       .extended_weights(true)
38306       .mr(4)
38307       .nr(4)
38308       .kr(2)
38309       .sr(1)
38310       .m(4)
38311       .n(4)
38312       .k(8)
38313       .cm_stride(7)
38314       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
38315   }
38316 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
38317 
38318 
38319 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_eq_8)38320   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_eq_8) {
38321     TEST_REQUIRES_X86_SSE41;
38322     GemmMicrokernelTester()
38323       .extended_weights(true)
38324       .mr(4)
38325       .nr(4)
38326       .kr(2)
38327       .sr(1)
38328       .m(4)
38329       .n(4)
38330       .k(8)
38331       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38332   }
38333 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,strided_cn)38334   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, strided_cn) {
38335     TEST_REQUIRES_X86_SSE41;
38336     GemmMicrokernelTester()
38337       .extended_weights(true)
38338       .mr(4)
38339       .nr(4)
38340       .kr(2)
38341       .sr(1)
38342       .m(4)
38343       .n(4)
38344       .k(8)
38345       .cn_stride(7)
38346       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38347   }
38348 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_eq_8_strided_a)38349   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_eq_8_strided_a) {
38350     TEST_REQUIRES_X86_SSE41;
38351     GemmMicrokernelTester()
38352       .extended_weights(true)
38353       .mr(4)
38354       .nr(4)
38355       .kr(2)
38356       .sr(1)
38357       .m(4)
38358       .n(4)
38359       .k(8)
38360       .a_stride(11)
38361       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38362   }
38363 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_eq_8_subtile)38364   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_eq_8_subtile) {
38365     TEST_REQUIRES_X86_SSE41;
38366     for (uint32_t n = 1; n <= 4; n++) {
38367       for (uint32_t m = 1; m <= 4; m++) {
38368         GemmMicrokernelTester()
38369           .extended_weights(true)
38370           .mr(4)
38371           .nr(4)
38372           .kr(2)
38373           .sr(1)
38374           .m(m)
38375           .n(n)
38376           .k(8)
38377           .iterations(1)
38378           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38379       }
38380     }
38381   }
38382 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_eq_8_subtile_m)38383   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_eq_8_subtile_m) {
38384     TEST_REQUIRES_X86_SSE41;
38385     for (uint32_t m = 1; m <= 4; m++) {
38386       GemmMicrokernelTester()
38387         .extended_weights(true)
38388         .mr(4)
38389         .nr(4)
38390         .kr(2)
38391         .sr(1)
38392         .m(m)
38393         .n(4)
38394         .k(8)
38395         .iterations(1)
38396         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38397     }
38398   }
38399 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_eq_8_subtile_n)38400   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_eq_8_subtile_n) {
38401     TEST_REQUIRES_X86_SSE41;
38402     for (uint32_t n = 1; n <= 4; n++) {
38403       GemmMicrokernelTester()
38404         .extended_weights(true)
38405         .mr(4)
38406         .nr(4)
38407         .kr(2)
38408         .sr(1)
38409         .m(4)
38410         .n(n)
38411         .k(8)
38412         .iterations(1)
38413         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38414     }
38415   }
38416 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_lt_8)38417   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_lt_8) {
38418     TEST_REQUIRES_X86_SSE41;
38419     for (size_t k = 1; k < 8; k++) {
38420       GemmMicrokernelTester()
38421         .extended_weights(true)
38422         .mr(4)
38423         .nr(4)
38424         .kr(2)
38425         .sr(1)
38426         .m(4)
38427         .n(4)
38428         .k(k)
38429         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38430     }
38431   }
38432 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_lt_8_strided_a)38433   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_lt_8_strided_a) {
38434     TEST_REQUIRES_X86_SSE41;
38435     for (size_t k = 1; k < 8; k++) {
38436       GemmMicrokernelTester()
38437         .extended_weights(true)
38438         .mr(4)
38439         .nr(4)
38440         .kr(2)
38441         .sr(1)
38442         .m(4)
38443         .n(4)
38444         .k(k)
38445         .a_stride(11)
38446         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38447     }
38448   }
38449 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_lt_8_subtile)38450   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_lt_8_subtile) {
38451     TEST_REQUIRES_X86_SSE41;
38452     for (size_t k = 1; k < 8; k++) {
38453       for (uint32_t n = 1; n <= 4; n++) {
38454         for (uint32_t m = 1; m <= 4; m++) {
38455           GemmMicrokernelTester()
38456             .extended_weights(true)
38457             .mr(4)
38458             .nr(4)
38459             .kr(2)
38460             .sr(1)
38461             .m(m)
38462             .n(n)
38463             .k(k)
38464             .iterations(1)
38465             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38466         }
38467       }
38468     }
38469   }
38470 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_gt_8)38471   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_gt_8) {
38472     TEST_REQUIRES_X86_SSE41;
38473     for (size_t k = 9; k < 16; k++) {
38474       GemmMicrokernelTester()
38475         .extended_weights(true)
38476         .mr(4)
38477         .nr(4)
38478         .kr(2)
38479         .sr(1)
38480         .m(4)
38481         .n(4)
38482         .k(k)
38483         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38484     }
38485   }
38486 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_gt_8_strided_a)38487   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_gt_8_strided_a) {
38488     TEST_REQUIRES_X86_SSE41;
38489     for (size_t k = 9; k < 16; k++) {
38490       GemmMicrokernelTester()
38491         .extended_weights(true)
38492         .mr(4)
38493         .nr(4)
38494         .kr(2)
38495         .sr(1)
38496         .m(4)
38497         .n(4)
38498         .k(k)
38499         .a_stride(19)
38500         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38501     }
38502   }
38503 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_gt_8_subtile)38504   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_gt_8_subtile) {
38505     TEST_REQUIRES_X86_SSE41;
38506     for (size_t k = 9; k < 16; k++) {
38507       for (uint32_t n = 1; n <= 4; n++) {
38508         for (uint32_t m = 1; m <= 4; m++) {
38509           GemmMicrokernelTester()
38510             .extended_weights(true)
38511             .mr(4)
38512             .nr(4)
38513             .kr(2)
38514             .sr(1)
38515             .m(m)
38516             .n(n)
38517             .k(k)
38518             .iterations(1)
38519             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38520         }
38521       }
38522     }
38523   }
38524 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_div_8)38525   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_div_8) {
38526     TEST_REQUIRES_X86_SSE41;
38527     for (size_t k = 16; k <= 80; k += 8) {
38528       GemmMicrokernelTester()
38529         .extended_weights(true)
38530         .mr(4)
38531         .nr(4)
38532         .kr(2)
38533         .sr(1)
38534         .m(4)
38535         .n(4)
38536         .k(k)
38537         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38538     }
38539   }
38540 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_div_8_strided_a)38541   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_div_8_strided_a) {
38542     TEST_REQUIRES_X86_SSE41;
38543     for (size_t k = 16; k <= 80; k += 8) {
38544       GemmMicrokernelTester()
38545         .extended_weights(true)
38546         .mr(4)
38547         .nr(4)
38548         .kr(2)
38549         .sr(1)
38550         .m(4)
38551         .n(4)
38552         .k(k)
38553         .a_stride(83)
38554         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38555     }
38556   }
38557 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,k_div_8_subtile)38558   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, k_div_8_subtile) {
38559     TEST_REQUIRES_X86_SSE41;
38560     for (size_t k = 16; k <= 80; k += 8) {
38561       for (uint32_t n = 1; n <= 4; n++) {
38562         for (uint32_t m = 1; m <= 4; m++) {
38563           GemmMicrokernelTester()
38564             .extended_weights(true)
38565             .mr(4)
38566             .nr(4)
38567             .kr(2)
38568             .sr(1)
38569             .m(m)
38570             .n(n)
38571             .k(k)
38572             .iterations(1)
38573             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38574         }
38575       }
38576     }
38577   }
38578 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_gt_4)38579   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_gt_4) {
38580     TEST_REQUIRES_X86_SSE41;
38581     for (uint32_t n = 5; n < 8; n++) {
38582       for (size_t k = 1; k <= 40; k += 9) {
38583         GemmMicrokernelTester()
38584           .extended_weights(true)
38585           .mr(4)
38586           .nr(4)
38587           .kr(2)
38588           .sr(1)
38589           .m(4)
38590           .n(n)
38591           .k(k)
38592           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38593       }
38594     }
38595   }
38596 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_gt_4_strided_cn)38597   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_gt_4_strided_cn) {
38598     TEST_REQUIRES_X86_SSE41;
38599     for (uint32_t n = 5; n < 8; n++) {
38600       for (size_t k = 1; k <= 40; k += 9) {
38601         GemmMicrokernelTester()
38602           .extended_weights(true)
38603           .mr(4)
38604           .nr(4)
38605           .kr(2)
38606           .sr(1)
38607           .m(4)
38608           .n(n)
38609           .k(k)
38610           .cn_stride(7)
38611           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38612       }
38613     }
38614   }
38615 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_gt_4_strided_a)38616   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_gt_4_strided_a) {
38617     TEST_REQUIRES_X86_SSE41;
38618     for (uint32_t n = 5; n < 8; n++) {
38619       for (size_t k = 1; k <= 40; k += 9) {
38620         GemmMicrokernelTester()
38621           .extended_weights(true)
38622           .mr(4)
38623           .nr(4)
38624           .kr(2)
38625           .sr(1)
38626           .m(4)
38627           .n(n)
38628           .k(k)
38629           .a_stride(43)
38630           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38631       }
38632     }
38633   }
38634 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_gt_4_subtile)38635   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_gt_4_subtile) {
38636     TEST_REQUIRES_X86_SSE41;
38637     for (uint32_t n = 5; n < 8; n++) {
38638       for (size_t k = 1; k <= 40; k += 9) {
38639         for (uint32_t m = 1; m <= 4; m++) {
38640           GemmMicrokernelTester()
38641             .extended_weights(true)
38642             .mr(4)
38643             .nr(4)
38644             .kr(2)
38645             .sr(1)
38646             .m(m)
38647             .n(n)
38648             .k(k)
38649             .iterations(1)
38650             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38651         }
38652       }
38653     }
38654   }
38655 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_div_4)38656   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_div_4) {
38657     TEST_REQUIRES_X86_SSE41;
38658     for (uint32_t n = 8; n <= 12; n += 4) {
38659       for (size_t k = 1; k <= 40; k += 9) {
38660         GemmMicrokernelTester()
38661           .extended_weights(true)
38662           .mr(4)
38663           .nr(4)
38664           .kr(2)
38665           .sr(1)
38666           .m(4)
38667           .n(n)
38668           .k(k)
38669           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38670       }
38671     }
38672   }
38673 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_div_4_strided_cn)38674   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_div_4_strided_cn) {
38675     TEST_REQUIRES_X86_SSE41;
38676     for (uint32_t n = 8; n <= 12; n += 4) {
38677       for (size_t k = 1; k <= 40; k += 9) {
38678         GemmMicrokernelTester()
38679           .extended_weights(true)
38680           .mr(4)
38681           .nr(4)
38682           .kr(2)
38683           .sr(1)
38684           .m(4)
38685           .n(n)
38686           .k(k)
38687           .cn_stride(7)
38688           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38689       }
38690     }
38691   }
38692 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_div_4_strided_a)38693   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_div_4_strided_a) {
38694     TEST_REQUIRES_X86_SSE41;
38695     for (uint32_t n = 8; n <= 12; n += 4) {
38696       for (size_t k = 1; k <= 40; k += 9) {
38697         GemmMicrokernelTester()
38698           .extended_weights(true)
38699           .mr(4)
38700           .nr(4)
38701           .kr(2)
38702           .sr(1)
38703           .m(4)
38704           .n(n)
38705           .k(k)
38706           .a_stride(43)
38707           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38708       }
38709     }
38710   }
38711 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,n_div_4_subtile)38712   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, n_div_4_subtile) {
38713     TEST_REQUIRES_X86_SSE41;
38714     for (uint32_t n = 8; n <= 12; n += 4) {
38715       for (size_t k = 1; k <= 40; k += 9) {
38716         for (uint32_t m = 1; m <= 4; m++) {
38717           GemmMicrokernelTester()
38718             .extended_weights(true)
38719             .mr(4)
38720             .nr(4)
38721             .kr(2)
38722             .sr(1)
38723             .m(m)
38724             .n(n)
38725             .k(k)
38726             .iterations(1)
38727             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38728         }
38729       }
38730     }
38731   }
38732 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,strided_cm_subtile)38733   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, strided_cm_subtile) {
38734     TEST_REQUIRES_X86_SSE41;
38735     for (size_t k = 1; k <= 40; k += 9) {
38736       for (uint32_t n = 1; n <= 4; n++) {
38737         for (uint32_t m = 1; m <= 4; m++) {
38738           GemmMicrokernelTester()
38739             .extended_weights(true)
38740             .mr(4)
38741             .nr(4)
38742             .kr(2)
38743             .sr(1)
38744             .m(m)
38745             .n(n)
38746             .k(k)
38747             .cm_stride(7)
38748             .iterations(1)
38749             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38750         }
38751       }
38752     }
38753   }
38754 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41,strided_cm)38755   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__SSE41, strided_cm) {
38756     TEST_REQUIRES_X86_SSE41;
38757     GemmMicrokernelTester()
38758       .extended_weights(true)
38759       .mr(4)
38760       .nr(4)
38761       .kr(2)
38762       .sr(1)
38763       .m(4)
38764       .n(4)
38765       .k(8)
38766       .cm_stride(7)
38767       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38768   }
38769 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
38770 
38771 
38772 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_eq_8)38773   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_eq_8) {
38774     TEST_REQUIRES_X86_AVX;
38775     GemmMicrokernelTester()
38776       .extended_weights(true)
38777       .mr(1)
38778       .nr(4)
38779       .kr(2)
38780       .sr(1)
38781       .m(1)
38782       .n(4)
38783       .k(8)
38784       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38785   }
38786 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,strided_cn)38787   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, strided_cn) {
38788     TEST_REQUIRES_X86_AVX;
38789     GemmMicrokernelTester()
38790       .extended_weights(true)
38791       .mr(1)
38792       .nr(4)
38793       .kr(2)
38794       .sr(1)
38795       .m(1)
38796       .n(4)
38797       .k(8)
38798       .cn_stride(7)
38799       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38800   }
38801 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_eq_8_strided_a)38802   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_eq_8_strided_a) {
38803     TEST_REQUIRES_X86_AVX;
38804     GemmMicrokernelTester()
38805       .extended_weights(true)
38806       .mr(1)
38807       .nr(4)
38808       .kr(2)
38809       .sr(1)
38810       .m(1)
38811       .n(4)
38812       .k(8)
38813       .a_stride(11)
38814       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38815   }
38816 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_eq_8_subtile)38817   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_eq_8_subtile) {
38818     TEST_REQUIRES_X86_AVX;
38819     for (uint32_t n = 1; n <= 4; n++) {
38820       for (uint32_t m = 1; m <= 1; m++) {
38821         GemmMicrokernelTester()
38822           .extended_weights(true)
38823           .mr(1)
38824           .nr(4)
38825           .kr(2)
38826           .sr(1)
38827           .m(m)
38828           .n(n)
38829           .k(8)
38830           .iterations(1)
38831           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38832       }
38833     }
38834   }
38835 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_eq_8_subtile_m)38836   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_eq_8_subtile_m) {
38837     TEST_REQUIRES_X86_AVX;
38838     for (uint32_t m = 1; m <= 1; m++) {
38839       GemmMicrokernelTester()
38840         .extended_weights(true)
38841         .mr(1)
38842         .nr(4)
38843         .kr(2)
38844         .sr(1)
38845         .m(m)
38846         .n(4)
38847         .k(8)
38848         .iterations(1)
38849         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38850     }
38851   }
38852 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_eq_8_subtile_n)38853   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_eq_8_subtile_n) {
38854     TEST_REQUIRES_X86_AVX;
38855     for (uint32_t n = 1; n <= 4; n++) {
38856       GemmMicrokernelTester()
38857         .extended_weights(true)
38858         .mr(1)
38859         .nr(4)
38860         .kr(2)
38861         .sr(1)
38862         .m(1)
38863         .n(n)
38864         .k(8)
38865         .iterations(1)
38866         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38867     }
38868   }
38869 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_lt_8)38870   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_lt_8) {
38871     TEST_REQUIRES_X86_AVX;
38872     for (size_t k = 1; k < 8; k++) {
38873       GemmMicrokernelTester()
38874         .extended_weights(true)
38875         .mr(1)
38876         .nr(4)
38877         .kr(2)
38878         .sr(1)
38879         .m(1)
38880         .n(4)
38881         .k(k)
38882         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38883     }
38884   }
38885 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_lt_8_strided_a)38886   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_lt_8_strided_a) {
38887     TEST_REQUIRES_X86_AVX;
38888     for (size_t k = 1; k < 8; k++) {
38889       GemmMicrokernelTester()
38890         .extended_weights(true)
38891         .mr(1)
38892         .nr(4)
38893         .kr(2)
38894         .sr(1)
38895         .m(1)
38896         .n(4)
38897         .k(k)
38898         .a_stride(11)
38899         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38900     }
38901   }
38902 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_lt_8_subtile)38903   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_lt_8_subtile) {
38904     TEST_REQUIRES_X86_AVX;
38905     for (size_t k = 1; k < 8; k++) {
38906       for (uint32_t n = 1; n <= 4; n++) {
38907         for (uint32_t m = 1; m <= 1; m++) {
38908           GemmMicrokernelTester()
38909             .extended_weights(true)
38910             .mr(1)
38911             .nr(4)
38912             .kr(2)
38913             .sr(1)
38914             .m(m)
38915             .n(n)
38916             .k(k)
38917             .iterations(1)
38918             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38919         }
38920       }
38921     }
38922   }
38923 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_gt_8)38924   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_gt_8) {
38925     TEST_REQUIRES_X86_AVX;
38926     for (size_t k = 9; k < 16; k++) {
38927       GemmMicrokernelTester()
38928         .extended_weights(true)
38929         .mr(1)
38930         .nr(4)
38931         .kr(2)
38932         .sr(1)
38933         .m(1)
38934         .n(4)
38935         .k(k)
38936         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38937     }
38938   }
38939 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_gt_8_strided_a)38940   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_gt_8_strided_a) {
38941     TEST_REQUIRES_X86_AVX;
38942     for (size_t k = 9; k < 16; k++) {
38943       GemmMicrokernelTester()
38944         .extended_weights(true)
38945         .mr(1)
38946         .nr(4)
38947         .kr(2)
38948         .sr(1)
38949         .m(1)
38950         .n(4)
38951         .k(k)
38952         .a_stride(19)
38953         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38954     }
38955   }
38956 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_gt_8_subtile)38957   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_gt_8_subtile) {
38958     TEST_REQUIRES_X86_AVX;
38959     for (size_t k = 9; k < 16; k++) {
38960       for (uint32_t n = 1; n <= 4; n++) {
38961         for (uint32_t m = 1; m <= 1; m++) {
38962           GemmMicrokernelTester()
38963             .extended_weights(true)
38964             .mr(1)
38965             .nr(4)
38966             .kr(2)
38967             .sr(1)
38968             .m(m)
38969             .n(n)
38970             .k(k)
38971             .iterations(1)
38972             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38973         }
38974       }
38975     }
38976   }
38977 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_div_8)38978   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_div_8) {
38979     TEST_REQUIRES_X86_AVX;
38980     for (size_t k = 16; k <= 80; k += 8) {
38981       GemmMicrokernelTester()
38982         .extended_weights(true)
38983         .mr(1)
38984         .nr(4)
38985         .kr(2)
38986         .sr(1)
38987         .m(1)
38988         .n(4)
38989         .k(k)
38990         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
38991     }
38992   }
38993 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_div_8_strided_a)38994   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_div_8_strided_a) {
38995     TEST_REQUIRES_X86_AVX;
38996     for (size_t k = 16; k <= 80; k += 8) {
38997       GemmMicrokernelTester()
38998         .extended_weights(true)
38999         .mr(1)
39000         .nr(4)
39001         .kr(2)
39002         .sr(1)
39003         .m(1)
39004         .n(4)
39005         .k(k)
39006         .a_stride(83)
39007         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39008     }
39009   }
39010 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,k_div_8_subtile)39011   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, k_div_8_subtile) {
39012     TEST_REQUIRES_X86_AVX;
39013     for (size_t k = 16; k <= 80; k += 8) {
39014       for (uint32_t n = 1; n <= 4; n++) {
39015         for (uint32_t m = 1; m <= 1; m++) {
39016           GemmMicrokernelTester()
39017             .extended_weights(true)
39018             .mr(1)
39019             .nr(4)
39020             .kr(2)
39021             .sr(1)
39022             .m(m)
39023             .n(n)
39024             .k(k)
39025             .iterations(1)
39026             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39027         }
39028       }
39029     }
39030   }
39031 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_gt_4)39032   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_gt_4) {
39033     TEST_REQUIRES_X86_AVX;
39034     for (uint32_t n = 5; n < 8; n++) {
39035       for (size_t k = 1; k <= 40; k += 9) {
39036         GemmMicrokernelTester()
39037           .extended_weights(true)
39038           .mr(1)
39039           .nr(4)
39040           .kr(2)
39041           .sr(1)
39042           .m(1)
39043           .n(n)
39044           .k(k)
39045           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39046       }
39047     }
39048   }
39049 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_gt_4_strided_cn)39050   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_gt_4_strided_cn) {
39051     TEST_REQUIRES_X86_AVX;
39052     for (uint32_t n = 5; n < 8; n++) {
39053       for (size_t k = 1; k <= 40; k += 9) {
39054         GemmMicrokernelTester()
39055           .extended_weights(true)
39056           .mr(1)
39057           .nr(4)
39058           .kr(2)
39059           .sr(1)
39060           .m(1)
39061           .n(n)
39062           .k(k)
39063           .cn_stride(7)
39064           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39065       }
39066     }
39067   }
39068 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_gt_4_strided_a)39069   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_gt_4_strided_a) {
39070     TEST_REQUIRES_X86_AVX;
39071     for (uint32_t n = 5; n < 8; n++) {
39072       for (size_t k = 1; k <= 40; k += 9) {
39073         GemmMicrokernelTester()
39074           .extended_weights(true)
39075           .mr(1)
39076           .nr(4)
39077           .kr(2)
39078           .sr(1)
39079           .m(1)
39080           .n(n)
39081           .k(k)
39082           .a_stride(43)
39083           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39084       }
39085     }
39086   }
39087 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_gt_4_subtile)39088   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_gt_4_subtile) {
39089     TEST_REQUIRES_X86_AVX;
39090     for (uint32_t n = 5; n < 8; n++) {
39091       for (size_t k = 1; k <= 40; k += 9) {
39092         for (uint32_t m = 1; m <= 1; m++) {
39093           GemmMicrokernelTester()
39094             .extended_weights(true)
39095             .mr(1)
39096             .nr(4)
39097             .kr(2)
39098             .sr(1)
39099             .m(m)
39100             .n(n)
39101             .k(k)
39102             .iterations(1)
39103             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39104         }
39105       }
39106     }
39107   }
39108 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_div_4)39109   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_div_4) {
39110     TEST_REQUIRES_X86_AVX;
39111     for (uint32_t n = 8; n <= 12; n += 4) {
39112       for (size_t k = 1; k <= 40; k += 9) {
39113         GemmMicrokernelTester()
39114           .extended_weights(true)
39115           .mr(1)
39116           .nr(4)
39117           .kr(2)
39118           .sr(1)
39119           .m(1)
39120           .n(n)
39121           .k(k)
39122           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39123       }
39124     }
39125   }
39126 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_div_4_strided_cn)39127   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_div_4_strided_cn) {
39128     TEST_REQUIRES_X86_AVX;
39129     for (uint32_t n = 8; n <= 12; n += 4) {
39130       for (size_t k = 1; k <= 40; k += 9) {
39131         GemmMicrokernelTester()
39132           .extended_weights(true)
39133           .mr(1)
39134           .nr(4)
39135           .kr(2)
39136           .sr(1)
39137           .m(1)
39138           .n(n)
39139           .k(k)
39140           .cn_stride(7)
39141           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39142       }
39143     }
39144   }
39145 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_div_4_strided_a)39146   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_div_4_strided_a) {
39147     TEST_REQUIRES_X86_AVX;
39148     for (uint32_t n = 8; n <= 12; n += 4) {
39149       for (size_t k = 1; k <= 40; k += 9) {
39150         GemmMicrokernelTester()
39151           .extended_weights(true)
39152           .mr(1)
39153           .nr(4)
39154           .kr(2)
39155           .sr(1)
39156           .m(1)
39157           .n(n)
39158           .k(k)
39159           .a_stride(43)
39160           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39161       }
39162     }
39163   }
39164 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,n_div_4_subtile)39165   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, n_div_4_subtile) {
39166     TEST_REQUIRES_X86_AVX;
39167     for (uint32_t n = 8; n <= 12; n += 4) {
39168       for (size_t k = 1; k <= 40; k += 9) {
39169         for (uint32_t m = 1; m <= 1; m++) {
39170           GemmMicrokernelTester()
39171             .extended_weights(true)
39172             .mr(1)
39173             .nr(4)
39174             .kr(2)
39175             .sr(1)
39176             .m(m)
39177             .n(n)
39178             .k(k)
39179             .iterations(1)
39180             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39181         }
39182       }
39183     }
39184   }
39185 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,strided_cm_subtile)39186   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, strided_cm_subtile) {
39187     TEST_REQUIRES_X86_AVX;
39188     for (size_t k = 1; k <= 40; k += 9) {
39189       for (uint32_t n = 1; n <= 4; n++) {
39190         for (uint32_t m = 1; m <= 1; m++) {
39191           GemmMicrokernelTester()
39192             .extended_weights(true)
39193             .mr(1)
39194             .nr(4)
39195             .kr(2)
39196             .sr(1)
39197             .m(m)
39198             .n(n)
39199             .k(k)
39200             .cm_stride(7)
39201             .iterations(1)
39202             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39203         }
39204       }
39205     }
39206   }
39207 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX,strided_cm)39208   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2__AVX, strided_cm) {
39209     TEST_REQUIRES_X86_AVX;
39210     GemmMicrokernelTester()
39211       .extended_weights(true)
39212       .mr(1)
39213       .nr(4)
39214       .kr(2)
39215       .sr(1)
39216       .m(1)
39217       .n(4)
39218       .k(8)
39219       .cm_stride(7)
39220       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39221   }
39222 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
39223 
39224 
39225 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_eq_8)39226   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_eq_8) {
39227     TEST_REQUIRES_X86_XOP;
39228     GemmMicrokernelTester()
39229       .extended_weights(true)
39230       .mr(2)
39231       .nr(4)
39232       .kr(2)
39233       .sr(1)
39234       .m(2)
39235       .n(4)
39236       .k(8)
39237       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39238   }
39239 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,strided_cn)39240   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, strided_cn) {
39241     TEST_REQUIRES_X86_XOP;
39242     GemmMicrokernelTester()
39243       .extended_weights(true)
39244       .mr(2)
39245       .nr(4)
39246       .kr(2)
39247       .sr(1)
39248       .m(2)
39249       .n(4)
39250       .k(8)
39251       .cn_stride(7)
39252       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39253   }
39254 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_eq_8_strided_a)39255   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_eq_8_strided_a) {
39256     TEST_REQUIRES_X86_XOP;
39257     GemmMicrokernelTester()
39258       .extended_weights(true)
39259       .mr(2)
39260       .nr(4)
39261       .kr(2)
39262       .sr(1)
39263       .m(2)
39264       .n(4)
39265       .k(8)
39266       .a_stride(11)
39267       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39268   }
39269 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_eq_8_subtile)39270   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_eq_8_subtile) {
39271     TEST_REQUIRES_X86_XOP;
39272     for (uint32_t n = 1; n <= 4; n++) {
39273       for (uint32_t m = 1; m <= 2; m++) {
39274         GemmMicrokernelTester()
39275           .extended_weights(true)
39276           .mr(2)
39277           .nr(4)
39278           .kr(2)
39279           .sr(1)
39280           .m(m)
39281           .n(n)
39282           .k(8)
39283           .iterations(1)
39284           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39285       }
39286     }
39287   }
39288 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_eq_8_subtile_m)39289   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_eq_8_subtile_m) {
39290     TEST_REQUIRES_X86_XOP;
39291     for (uint32_t m = 1; m <= 2; m++) {
39292       GemmMicrokernelTester()
39293         .extended_weights(true)
39294         .mr(2)
39295         .nr(4)
39296         .kr(2)
39297         .sr(1)
39298         .m(m)
39299         .n(4)
39300         .k(8)
39301         .iterations(1)
39302         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39303     }
39304   }
39305 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_eq_8_subtile_n)39306   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_eq_8_subtile_n) {
39307     TEST_REQUIRES_X86_XOP;
39308     for (uint32_t n = 1; n <= 4; n++) {
39309       GemmMicrokernelTester()
39310         .extended_weights(true)
39311         .mr(2)
39312         .nr(4)
39313         .kr(2)
39314         .sr(1)
39315         .m(2)
39316         .n(n)
39317         .k(8)
39318         .iterations(1)
39319         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39320     }
39321   }
39322 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_lt_8)39323   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_lt_8) {
39324     TEST_REQUIRES_X86_XOP;
39325     for (size_t k = 1; k < 8; k++) {
39326       GemmMicrokernelTester()
39327         .extended_weights(true)
39328         .mr(2)
39329         .nr(4)
39330         .kr(2)
39331         .sr(1)
39332         .m(2)
39333         .n(4)
39334         .k(k)
39335         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39336     }
39337   }
39338 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_lt_8_strided_a)39339   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_lt_8_strided_a) {
39340     TEST_REQUIRES_X86_XOP;
39341     for (size_t k = 1; k < 8; k++) {
39342       GemmMicrokernelTester()
39343         .extended_weights(true)
39344         .mr(2)
39345         .nr(4)
39346         .kr(2)
39347         .sr(1)
39348         .m(2)
39349         .n(4)
39350         .k(k)
39351         .a_stride(11)
39352         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39353     }
39354   }
39355 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_lt_8_subtile)39356   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_lt_8_subtile) {
39357     TEST_REQUIRES_X86_XOP;
39358     for (size_t k = 1; k < 8; k++) {
39359       for (uint32_t n = 1; n <= 4; n++) {
39360         for (uint32_t m = 1; m <= 2; m++) {
39361           GemmMicrokernelTester()
39362             .extended_weights(true)
39363             .mr(2)
39364             .nr(4)
39365             .kr(2)
39366             .sr(1)
39367             .m(m)
39368             .n(n)
39369             .k(k)
39370             .iterations(1)
39371             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39372         }
39373       }
39374     }
39375   }
39376 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_gt_8)39377   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_gt_8) {
39378     TEST_REQUIRES_X86_XOP;
39379     for (size_t k = 9; k < 16; k++) {
39380       GemmMicrokernelTester()
39381         .extended_weights(true)
39382         .mr(2)
39383         .nr(4)
39384         .kr(2)
39385         .sr(1)
39386         .m(2)
39387         .n(4)
39388         .k(k)
39389         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39390     }
39391   }
39392 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_gt_8_strided_a)39393   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_gt_8_strided_a) {
39394     TEST_REQUIRES_X86_XOP;
39395     for (size_t k = 9; k < 16; k++) {
39396       GemmMicrokernelTester()
39397         .extended_weights(true)
39398         .mr(2)
39399         .nr(4)
39400         .kr(2)
39401         .sr(1)
39402         .m(2)
39403         .n(4)
39404         .k(k)
39405         .a_stride(19)
39406         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39407     }
39408   }
39409 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_gt_8_subtile)39410   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_gt_8_subtile) {
39411     TEST_REQUIRES_X86_XOP;
39412     for (size_t k = 9; k < 16; k++) {
39413       for (uint32_t n = 1; n <= 4; n++) {
39414         for (uint32_t m = 1; m <= 2; m++) {
39415           GemmMicrokernelTester()
39416             .extended_weights(true)
39417             .mr(2)
39418             .nr(4)
39419             .kr(2)
39420             .sr(1)
39421             .m(m)
39422             .n(n)
39423             .k(k)
39424             .iterations(1)
39425             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39426         }
39427       }
39428     }
39429   }
39430 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_div_8)39431   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_div_8) {
39432     TEST_REQUIRES_X86_XOP;
39433     for (size_t k = 16; k <= 80; k += 8) {
39434       GemmMicrokernelTester()
39435         .extended_weights(true)
39436         .mr(2)
39437         .nr(4)
39438         .kr(2)
39439         .sr(1)
39440         .m(2)
39441         .n(4)
39442         .k(k)
39443         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39444     }
39445   }
39446 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_div_8_strided_a)39447   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_div_8_strided_a) {
39448     TEST_REQUIRES_X86_XOP;
39449     for (size_t k = 16; k <= 80; k += 8) {
39450       GemmMicrokernelTester()
39451         .extended_weights(true)
39452         .mr(2)
39453         .nr(4)
39454         .kr(2)
39455         .sr(1)
39456         .m(2)
39457         .n(4)
39458         .k(k)
39459         .a_stride(83)
39460         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39461     }
39462   }
39463 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,k_div_8_subtile)39464   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, k_div_8_subtile) {
39465     TEST_REQUIRES_X86_XOP;
39466     for (size_t k = 16; k <= 80; k += 8) {
39467       for (uint32_t n = 1; n <= 4; n++) {
39468         for (uint32_t m = 1; m <= 2; m++) {
39469           GemmMicrokernelTester()
39470             .extended_weights(true)
39471             .mr(2)
39472             .nr(4)
39473             .kr(2)
39474             .sr(1)
39475             .m(m)
39476             .n(n)
39477             .k(k)
39478             .iterations(1)
39479             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39480         }
39481       }
39482     }
39483   }
39484 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_gt_4)39485   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_gt_4) {
39486     TEST_REQUIRES_X86_XOP;
39487     for (uint32_t n = 5; n < 8; n++) {
39488       for (size_t k = 1; k <= 40; k += 9) {
39489         GemmMicrokernelTester()
39490           .extended_weights(true)
39491           .mr(2)
39492           .nr(4)
39493           .kr(2)
39494           .sr(1)
39495           .m(2)
39496           .n(n)
39497           .k(k)
39498           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39499       }
39500     }
39501   }
39502 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_gt_4_strided_cn)39503   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_gt_4_strided_cn) {
39504     TEST_REQUIRES_X86_XOP;
39505     for (uint32_t n = 5; n < 8; n++) {
39506       for (size_t k = 1; k <= 40; k += 9) {
39507         GemmMicrokernelTester()
39508           .extended_weights(true)
39509           .mr(2)
39510           .nr(4)
39511           .kr(2)
39512           .sr(1)
39513           .m(2)
39514           .n(n)
39515           .k(k)
39516           .cn_stride(7)
39517           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39518       }
39519     }
39520   }
39521 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_gt_4_strided_a)39522   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_gt_4_strided_a) {
39523     TEST_REQUIRES_X86_XOP;
39524     for (uint32_t n = 5; n < 8; n++) {
39525       for (size_t k = 1; k <= 40; k += 9) {
39526         GemmMicrokernelTester()
39527           .extended_weights(true)
39528           .mr(2)
39529           .nr(4)
39530           .kr(2)
39531           .sr(1)
39532           .m(2)
39533           .n(n)
39534           .k(k)
39535           .a_stride(43)
39536           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39537       }
39538     }
39539   }
39540 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_gt_4_subtile)39541   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_gt_4_subtile) {
39542     TEST_REQUIRES_X86_XOP;
39543     for (uint32_t n = 5; n < 8; n++) {
39544       for (size_t k = 1; k <= 40; k += 9) {
39545         for (uint32_t m = 1; m <= 2; m++) {
39546           GemmMicrokernelTester()
39547             .extended_weights(true)
39548             .mr(2)
39549             .nr(4)
39550             .kr(2)
39551             .sr(1)
39552             .m(m)
39553             .n(n)
39554             .k(k)
39555             .iterations(1)
39556             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39557         }
39558       }
39559     }
39560   }
39561 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_div_4)39562   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_div_4) {
39563     TEST_REQUIRES_X86_XOP;
39564     for (uint32_t n = 8; n <= 12; n += 4) {
39565       for (size_t k = 1; k <= 40; k += 9) {
39566         GemmMicrokernelTester()
39567           .extended_weights(true)
39568           .mr(2)
39569           .nr(4)
39570           .kr(2)
39571           .sr(1)
39572           .m(2)
39573           .n(n)
39574           .k(k)
39575           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39576       }
39577     }
39578   }
39579 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_div_4_strided_cn)39580   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_div_4_strided_cn) {
39581     TEST_REQUIRES_X86_XOP;
39582     for (uint32_t n = 8; n <= 12; n += 4) {
39583       for (size_t k = 1; k <= 40; k += 9) {
39584         GemmMicrokernelTester()
39585           .extended_weights(true)
39586           .mr(2)
39587           .nr(4)
39588           .kr(2)
39589           .sr(1)
39590           .m(2)
39591           .n(n)
39592           .k(k)
39593           .cn_stride(7)
39594           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39595       }
39596     }
39597   }
39598 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_div_4_strided_a)39599   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_div_4_strided_a) {
39600     TEST_REQUIRES_X86_XOP;
39601     for (uint32_t n = 8; n <= 12; n += 4) {
39602       for (size_t k = 1; k <= 40; k += 9) {
39603         GemmMicrokernelTester()
39604           .extended_weights(true)
39605           .mr(2)
39606           .nr(4)
39607           .kr(2)
39608           .sr(1)
39609           .m(2)
39610           .n(n)
39611           .k(k)
39612           .a_stride(43)
39613           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39614       }
39615     }
39616   }
39617 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,n_div_4_subtile)39618   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, n_div_4_subtile) {
39619     TEST_REQUIRES_X86_XOP;
39620     for (uint32_t n = 8; n <= 12; n += 4) {
39621       for (size_t k = 1; k <= 40; k += 9) {
39622         for (uint32_t m = 1; m <= 2; m++) {
39623           GemmMicrokernelTester()
39624             .extended_weights(true)
39625             .mr(2)
39626             .nr(4)
39627             .kr(2)
39628             .sr(1)
39629             .m(m)
39630             .n(n)
39631             .k(k)
39632             .iterations(1)
39633             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39634         }
39635       }
39636     }
39637   }
39638 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,strided_cm_subtile)39639   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, strided_cm_subtile) {
39640     TEST_REQUIRES_X86_XOP;
39641     for (size_t k = 1; k <= 40; k += 9) {
39642       for (uint32_t n = 1; n <= 4; n++) {
39643         for (uint32_t m = 1; m <= 2; m++) {
39644           GemmMicrokernelTester()
39645             .extended_weights(true)
39646             .mr(2)
39647             .nr(4)
39648             .kr(2)
39649             .sr(1)
39650             .m(m)
39651             .n(n)
39652             .k(k)
39653             .cm_stride(7)
39654             .iterations(1)
39655             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39656         }
39657       }
39658     }
39659   }
39660 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP,strided_cm)39661   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__XOP, strided_cm) {
39662     TEST_REQUIRES_X86_XOP;
39663     GemmMicrokernelTester()
39664       .extended_weights(true)
39665       .mr(2)
39666       .nr(4)
39667       .kr(2)
39668       .sr(1)
39669       .m(2)
39670       .n(4)
39671       .k(8)
39672       .cm_stride(7)
39673       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39674   }
39675 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
39676 
39677 
39678 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_eq_8)39679   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_eq_8) {
39680     TEST_REQUIRES_X86_XOP;
39681     GemmMicrokernelTester()
39682       .extended_weights(true)
39683       .mr(3)
39684       .nr(4)
39685       .kr(2)
39686       .sr(1)
39687       .m(3)
39688       .n(4)
39689       .k(8)
39690       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39691   }
39692 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,strided_cn)39693   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, strided_cn) {
39694     TEST_REQUIRES_X86_XOP;
39695     GemmMicrokernelTester()
39696       .extended_weights(true)
39697       .mr(3)
39698       .nr(4)
39699       .kr(2)
39700       .sr(1)
39701       .m(3)
39702       .n(4)
39703       .k(8)
39704       .cn_stride(7)
39705       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39706   }
39707 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_eq_8_strided_a)39708   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_eq_8_strided_a) {
39709     TEST_REQUIRES_X86_XOP;
39710     GemmMicrokernelTester()
39711       .extended_weights(true)
39712       .mr(3)
39713       .nr(4)
39714       .kr(2)
39715       .sr(1)
39716       .m(3)
39717       .n(4)
39718       .k(8)
39719       .a_stride(11)
39720       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39721   }
39722 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_eq_8_subtile)39723   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_eq_8_subtile) {
39724     TEST_REQUIRES_X86_XOP;
39725     for (uint32_t n = 1; n <= 4; n++) {
39726       for (uint32_t m = 1; m <= 3; m++) {
39727         GemmMicrokernelTester()
39728           .extended_weights(true)
39729           .mr(3)
39730           .nr(4)
39731           .kr(2)
39732           .sr(1)
39733           .m(m)
39734           .n(n)
39735           .k(8)
39736           .iterations(1)
39737           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39738       }
39739     }
39740   }
39741 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_eq_8_subtile_m)39742   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_eq_8_subtile_m) {
39743     TEST_REQUIRES_X86_XOP;
39744     for (uint32_t m = 1; m <= 3; m++) {
39745       GemmMicrokernelTester()
39746         .extended_weights(true)
39747         .mr(3)
39748         .nr(4)
39749         .kr(2)
39750         .sr(1)
39751         .m(m)
39752         .n(4)
39753         .k(8)
39754         .iterations(1)
39755         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39756     }
39757   }
39758 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_eq_8_subtile_n)39759   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_eq_8_subtile_n) {
39760     TEST_REQUIRES_X86_XOP;
39761     for (uint32_t n = 1; n <= 4; n++) {
39762       GemmMicrokernelTester()
39763         .extended_weights(true)
39764         .mr(3)
39765         .nr(4)
39766         .kr(2)
39767         .sr(1)
39768         .m(3)
39769         .n(n)
39770         .k(8)
39771         .iterations(1)
39772         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39773     }
39774   }
39775 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_lt_8)39776   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_lt_8) {
39777     TEST_REQUIRES_X86_XOP;
39778     for (size_t k = 1; k < 8; k++) {
39779       GemmMicrokernelTester()
39780         .extended_weights(true)
39781         .mr(3)
39782         .nr(4)
39783         .kr(2)
39784         .sr(1)
39785         .m(3)
39786         .n(4)
39787         .k(k)
39788         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39789     }
39790   }
39791 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_lt_8_strided_a)39792   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_lt_8_strided_a) {
39793     TEST_REQUIRES_X86_XOP;
39794     for (size_t k = 1; k < 8; k++) {
39795       GemmMicrokernelTester()
39796         .extended_weights(true)
39797         .mr(3)
39798         .nr(4)
39799         .kr(2)
39800         .sr(1)
39801         .m(3)
39802         .n(4)
39803         .k(k)
39804         .a_stride(11)
39805         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39806     }
39807   }
39808 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_lt_8_subtile)39809   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_lt_8_subtile) {
39810     TEST_REQUIRES_X86_XOP;
39811     for (size_t k = 1; k < 8; k++) {
39812       for (uint32_t n = 1; n <= 4; n++) {
39813         for (uint32_t m = 1; m <= 3; m++) {
39814           GemmMicrokernelTester()
39815             .extended_weights(true)
39816             .mr(3)
39817             .nr(4)
39818             .kr(2)
39819             .sr(1)
39820             .m(m)
39821             .n(n)
39822             .k(k)
39823             .iterations(1)
39824             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39825         }
39826       }
39827     }
39828   }
39829 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_gt_8)39830   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_gt_8) {
39831     TEST_REQUIRES_X86_XOP;
39832     for (size_t k = 9; k < 16; k++) {
39833       GemmMicrokernelTester()
39834         .extended_weights(true)
39835         .mr(3)
39836         .nr(4)
39837         .kr(2)
39838         .sr(1)
39839         .m(3)
39840         .n(4)
39841         .k(k)
39842         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39843     }
39844   }
39845 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_gt_8_strided_a)39846   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_gt_8_strided_a) {
39847     TEST_REQUIRES_X86_XOP;
39848     for (size_t k = 9; k < 16; k++) {
39849       GemmMicrokernelTester()
39850         .extended_weights(true)
39851         .mr(3)
39852         .nr(4)
39853         .kr(2)
39854         .sr(1)
39855         .m(3)
39856         .n(4)
39857         .k(k)
39858         .a_stride(19)
39859         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39860     }
39861   }
39862 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_gt_8_subtile)39863   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_gt_8_subtile) {
39864     TEST_REQUIRES_X86_XOP;
39865     for (size_t k = 9; k < 16; k++) {
39866       for (uint32_t n = 1; n <= 4; n++) {
39867         for (uint32_t m = 1; m <= 3; m++) {
39868           GemmMicrokernelTester()
39869             .extended_weights(true)
39870             .mr(3)
39871             .nr(4)
39872             .kr(2)
39873             .sr(1)
39874             .m(m)
39875             .n(n)
39876             .k(k)
39877             .iterations(1)
39878             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39879         }
39880       }
39881     }
39882   }
39883 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_div_8)39884   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_div_8) {
39885     TEST_REQUIRES_X86_XOP;
39886     for (size_t k = 16; k <= 80; k += 8) {
39887       GemmMicrokernelTester()
39888         .extended_weights(true)
39889         .mr(3)
39890         .nr(4)
39891         .kr(2)
39892         .sr(1)
39893         .m(3)
39894         .n(4)
39895         .k(k)
39896         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39897     }
39898   }
39899 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_div_8_strided_a)39900   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_div_8_strided_a) {
39901     TEST_REQUIRES_X86_XOP;
39902     for (size_t k = 16; k <= 80; k += 8) {
39903       GemmMicrokernelTester()
39904         .extended_weights(true)
39905         .mr(3)
39906         .nr(4)
39907         .kr(2)
39908         .sr(1)
39909         .m(3)
39910         .n(4)
39911         .k(k)
39912         .a_stride(83)
39913         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39914     }
39915   }
39916 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,k_div_8_subtile)39917   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, k_div_8_subtile) {
39918     TEST_REQUIRES_X86_XOP;
39919     for (size_t k = 16; k <= 80; k += 8) {
39920       for (uint32_t n = 1; n <= 4; n++) {
39921         for (uint32_t m = 1; m <= 3; m++) {
39922           GemmMicrokernelTester()
39923             .extended_weights(true)
39924             .mr(3)
39925             .nr(4)
39926             .kr(2)
39927             .sr(1)
39928             .m(m)
39929             .n(n)
39930             .k(k)
39931             .iterations(1)
39932             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39933         }
39934       }
39935     }
39936   }
39937 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_gt_4)39938   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_gt_4) {
39939     TEST_REQUIRES_X86_XOP;
39940     for (uint32_t n = 5; n < 8; n++) {
39941       for (size_t k = 1; k <= 40; k += 9) {
39942         GemmMicrokernelTester()
39943           .extended_weights(true)
39944           .mr(3)
39945           .nr(4)
39946           .kr(2)
39947           .sr(1)
39948           .m(3)
39949           .n(n)
39950           .k(k)
39951           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39952       }
39953     }
39954   }
39955 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_gt_4_strided_cn)39956   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_gt_4_strided_cn) {
39957     TEST_REQUIRES_X86_XOP;
39958     for (uint32_t n = 5; n < 8; n++) {
39959       for (size_t k = 1; k <= 40; k += 9) {
39960         GemmMicrokernelTester()
39961           .extended_weights(true)
39962           .mr(3)
39963           .nr(4)
39964           .kr(2)
39965           .sr(1)
39966           .m(3)
39967           .n(n)
39968           .k(k)
39969           .cn_stride(7)
39970           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39971       }
39972     }
39973   }
39974 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_gt_4_strided_a)39975   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_gt_4_strided_a) {
39976     TEST_REQUIRES_X86_XOP;
39977     for (uint32_t n = 5; n < 8; n++) {
39978       for (size_t k = 1; k <= 40; k += 9) {
39979         GemmMicrokernelTester()
39980           .extended_weights(true)
39981           .mr(3)
39982           .nr(4)
39983           .kr(2)
39984           .sr(1)
39985           .m(3)
39986           .n(n)
39987           .k(k)
39988           .a_stride(43)
39989           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
39990       }
39991     }
39992   }
39993 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_gt_4_subtile)39994   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_gt_4_subtile) {
39995     TEST_REQUIRES_X86_XOP;
39996     for (uint32_t n = 5; n < 8; n++) {
39997       for (size_t k = 1; k <= 40; k += 9) {
39998         for (uint32_t m = 1; m <= 3; m++) {
39999           GemmMicrokernelTester()
40000             .extended_weights(true)
40001             .mr(3)
40002             .nr(4)
40003             .kr(2)
40004             .sr(1)
40005             .m(m)
40006             .n(n)
40007             .k(k)
40008             .iterations(1)
40009             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40010         }
40011       }
40012     }
40013   }
40014 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_div_4)40015   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_div_4) {
40016     TEST_REQUIRES_X86_XOP;
40017     for (uint32_t n = 8; n <= 12; n += 4) {
40018       for (size_t k = 1; k <= 40; k += 9) {
40019         GemmMicrokernelTester()
40020           .extended_weights(true)
40021           .mr(3)
40022           .nr(4)
40023           .kr(2)
40024           .sr(1)
40025           .m(3)
40026           .n(n)
40027           .k(k)
40028           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40029       }
40030     }
40031   }
40032 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_div_4_strided_cn)40033   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_div_4_strided_cn) {
40034     TEST_REQUIRES_X86_XOP;
40035     for (uint32_t n = 8; n <= 12; n += 4) {
40036       for (size_t k = 1; k <= 40; k += 9) {
40037         GemmMicrokernelTester()
40038           .extended_weights(true)
40039           .mr(3)
40040           .nr(4)
40041           .kr(2)
40042           .sr(1)
40043           .m(3)
40044           .n(n)
40045           .k(k)
40046           .cn_stride(7)
40047           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40048       }
40049     }
40050   }
40051 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_div_4_strided_a)40052   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_div_4_strided_a) {
40053     TEST_REQUIRES_X86_XOP;
40054     for (uint32_t n = 8; n <= 12; n += 4) {
40055       for (size_t k = 1; k <= 40; k += 9) {
40056         GemmMicrokernelTester()
40057           .extended_weights(true)
40058           .mr(3)
40059           .nr(4)
40060           .kr(2)
40061           .sr(1)
40062           .m(3)
40063           .n(n)
40064           .k(k)
40065           .a_stride(43)
40066           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40067       }
40068     }
40069   }
40070 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,n_div_4_subtile)40071   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, n_div_4_subtile) {
40072     TEST_REQUIRES_X86_XOP;
40073     for (uint32_t n = 8; n <= 12; n += 4) {
40074       for (size_t k = 1; k <= 40; k += 9) {
40075         for (uint32_t m = 1; m <= 3; m++) {
40076           GemmMicrokernelTester()
40077             .extended_weights(true)
40078             .mr(3)
40079             .nr(4)
40080             .kr(2)
40081             .sr(1)
40082             .m(m)
40083             .n(n)
40084             .k(k)
40085             .iterations(1)
40086             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40087         }
40088       }
40089     }
40090   }
40091 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,strided_cm_subtile)40092   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, strided_cm_subtile) {
40093     TEST_REQUIRES_X86_XOP;
40094     for (size_t k = 1; k <= 40; k += 9) {
40095       for (uint32_t n = 1; n <= 4; n++) {
40096         for (uint32_t m = 1; m <= 3; m++) {
40097           GemmMicrokernelTester()
40098             .extended_weights(true)
40099             .mr(3)
40100             .nr(4)
40101             .kr(2)
40102             .sr(1)
40103             .m(m)
40104             .n(n)
40105             .k(k)
40106             .cm_stride(7)
40107             .iterations(1)
40108             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40109         }
40110       }
40111     }
40112   }
40113 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP,strided_cm)40114   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__XOP, strided_cm) {
40115     TEST_REQUIRES_X86_XOP;
40116     GemmMicrokernelTester()
40117       .extended_weights(true)
40118       .mr(3)
40119       .nr(4)
40120       .kr(2)
40121       .sr(1)
40122       .m(3)
40123       .n(4)
40124       .k(8)
40125       .cm_stride(7)
40126       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40127   }
40128 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
40129 
40130 
40131 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_eq_8)40132   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_eq_8) {
40133     TEST_REQUIRES_X86_AVX;
40134     GemmMicrokernelTester()
40135       .extended_weights(true)
40136       .mr(4)
40137       .nr(4)
40138       .kr(2)
40139       .sr(1)
40140       .m(4)
40141       .n(4)
40142       .k(8)
40143       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40144   }
40145 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,strided_cn)40146   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, strided_cn) {
40147     TEST_REQUIRES_X86_AVX;
40148     GemmMicrokernelTester()
40149       .extended_weights(true)
40150       .mr(4)
40151       .nr(4)
40152       .kr(2)
40153       .sr(1)
40154       .m(4)
40155       .n(4)
40156       .k(8)
40157       .cn_stride(7)
40158       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40159   }
40160 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_eq_8_strided_a)40161   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_eq_8_strided_a) {
40162     TEST_REQUIRES_X86_AVX;
40163     GemmMicrokernelTester()
40164       .extended_weights(true)
40165       .mr(4)
40166       .nr(4)
40167       .kr(2)
40168       .sr(1)
40169       .m(4)
40170       .n(4)
40171       .k(8)
40172       .a_stride(11)
40173       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40174   }
40175 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_eq_8_subtile)40176   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_eq_8_subtile) {
40177     TEST_REQUIRES_X86_AVX;
40178     for (uint32_t n = 1; n <= 4; n++) {
40179       for (uint32_t m = 1; m <= 4; m++) {
40180         GemmMicrokernelTester()
40181           .extended_weights(true)
40182           .mr(4)
40183           .nr(4)
40184           .kr(2)
40185           .sr(1)
40186           .m(m)
40187           .n(n)
40188           .k(8)
40189           .iterations(1)
40190           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40191       }
40192     }
40193   }
40194 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_eq_8_subtile_m)40195   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_eq_8_subtile_m) {
40196     TEST_REQUIRES_X86_AVX;
40197     for (uint32_t m = 1; m <= 4; m++) {
40198       GemmMicrokernelTester()
40199         .extended_weights(true)
40200         .mr(4)
40201         .nr(4)
40202         .kr(2)
40203         .sr(1)
40204         .m(m)
40205         .n(4)
40206         .k(8)
40207         .iterations(1)
40208         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40209     }
40210   }
40211 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_eq_8_subtile_n)40212   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_eq_8_subtile_n) {
40213     TEST_REQUIRES_X86_AVX;
40214     for (uint32_t n = 1; n <= 4; n++) {
40215       GemmMicrokernelTester()
40216         .extended_weights(true)
40217         .mr(4)
40218         .nr(4)
40219         .kr(2)
40220         .sr(1)
40221         .m(4)
40222         .n(n)
40223         .k(8)
40224         .iterations(1)
40225         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40226     }
40227   }
40228 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_lt_8)40229   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_lt_8) {
40230     TEST_REQUIRES_X86_AVX;
40231     for (size_t k = 1; k < 8; k++) {
40232       GemmMicrokernelTester()
40233         .extended_weights(true)
40234         .mr(4)
40235         .nr(4)
40236         .kr(2)
40237         .sr(1)
40238         .m(4)
40239         .n(4)
40240         .k(k)
40241         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40242     }
40243   }
40244 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_lt_8_strided_a)40245   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_lt_8_strided_a) {
40246     TEST_REQUIRES_X86_AVX;
40247     for (size_t k = 1; k < 8; k++) {
40248       GemmMicrokernelTester()
40249         .extended_weights(true)
40250         .mr(4)
40251         .nr(4)
40252         .kr(2)
40253         .sr(1)
40254         .m(4)
40255         .n(4)
40256         .k(k)
40257         .a_stride(11)
40258         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40259     }
40260   }
40261 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_lt_8_subtile)40262   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_lt_8_subtile) {
40263     TEST_REQUIRES_X86_AVX;
40264     for (size_t k = 1; k < 8; k++) {
40265       for (uint32_t n = 1; n <= 4; n++) {
40266         for (uint32_t m = 1; m <= 4; m++) {
40267           GemmMicrokernelTester()
40268             .extended_weights(true)
40269             .mr(4)
40270             .nr(4)
40271             .kr(2)
40272             .sr(1)
40273             .m(m)
40274             .n(n)
40275             .k(k)
40276             .iterations(1)
40277             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40278         }
40279       }
40280     }
40281   }
40282 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_gt_8)40283   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_gt_8) {
40284     TEST_REQUIRES_X86_AVX;
40285     for (size_t k = 9; k < 16; k++) {
40286       GemmMicrokernelTester()
40287         .extended_weights(true)
40288         .mr(4)
40289         .nr(4)
40290         .kr(2)
40291         .sr(1)
40292         .m(4)
40293         .n(4)
40294         .k(k)
40295         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40296     }
40297   }
40298 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_gt_8_strided_a)40299   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_gt_8_strided_a) {
40300     TEST_REQUIRES_X86_AVX;
40301     for (size_t k = 9; k < 16; k++) {
40302       GemmMicrokernelTester()
40303         .extended_weights(true)
40304         .mr(4)
40305         .nr(4)
40306         .kr(2)
40307         .sr(1)
40308         .m(4)
40309         .n(4)
40310         .k(k)
40311         .a_stride(19)
40312         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40313     }
40314   }
40315 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_gt_8_subtile)40316   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_gt_8_subtile) {
40317     TEST_REQUIRES_X86_AVX;
40318     for (size_t k = 9; k < 16; k++) {
40319       for (uint32_t n = 1; n <= 4; n++) {
40320         for (uint32_t m = 1; m <= 4; m++) {
40321           GemmMicrokernelTester()
40322             .extended_weights(true)
40323             .mr(4)
40324             .nr(4)
40325             .kr(2)
40326             .sr(1)
40327             .m(m)
40328             .n(n)
40329             .k(k)
40330             .iterations(1)
40331             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40332         }
40333       }
40334     }
40335   }
40336 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_div_8)40337   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_div_8) {
40338     TEST_REQUIRES_X86_AVX;
40339     for (size_t k = 16; k <= 80; k += 8) {
40340       GemmMicrokernelTester()
40341         .extended_weights(true)
40342         .mr(4)
40343         .nr(4)
40344         .kr(2)
40345         .sr(1)
40346         .m(4)
40347         .n(4)
40348         .k(k)
40349         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40350     }
40351   }
40352 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_div_8_strided_a)40353   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_div_8_strided_a) {
40354     TEST_REQUIRES_X86_AVX;
40355     for (size_t k = 16; k <= 80; k += 8) {
40356       GemmMicrokernelTester()
40357         .extended_weights(true)
40358         .mr(4)
40359         .nr(4)
40360         .kr(2)
40361         .sr(1)
40362         .m(4)
40363         .n(4)
40364         .k(k)
40365         .a_stride(83)
40366         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40367     }
40368   }
40369 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,k_div_8_subtile)40370   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, k_div_8_subtile) {
40371     TEST_REQUIRES_X86_AVX;
40372     for (size_t k = 16; k <= 80; k += 8) {
40373       for (uint32_t n = 1; n <= 4; n++) {
40374         for (uint32_t m = 1; m <= 4; m++) {
40375           GemmMicrokernelTester()
40376             .extended_weights(true)
40377             .mr(4)
40378             .nr(4)
40379             .kr(2)
40380             .sr(1)
40381             .m(m)
40382             .n(n)
40383             .k(k)
40384             .iterations(1)
40385             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40386         }
40387       }
40388     }
40389   }
40390 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_gt_4)40391   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_gt_4) {
40392     TEST_REQUIRES_X86_AVX;
40393     for (uint32_t n = 5; n < 8; n++) {
40394       for (size_t k = 1; k <= 40; k += 9) {
40395         GemmMicrokernelTester()
40396           .extended_weights(true)
40397           .mr(4)
40398           .nr(4)
40399           .kr(2)
40400           .sr(1)
40401           .m(4)
40402           .n(n)
40403           .k(k)
40404           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40405       }
40406     }
40407   }
40408 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_gt_4_strided_cn)40409   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_gt_4_strided_cn) {
40410     TEST_REQUIRES_X86_AVX;
40411     for (uint32_t n = 5; n < 8; n++) {
40412       for (size_t k = 1; k <= 40; k += 9) {
40413         GemmMicrokernelTester()
40414           .extended_weights(true)
40415           .mr(4)
40416           .nr(4)
40417           .kr(2)
40418           .sr(1)
40419           .m(4)
40420           .n(n)
40421           .k(k)
40422           .cn_stride(7)
40423           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40424       }
40425     }
40426   }
40427 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_gt_4_strided_a)40428   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_gt_4_strided_a) {
40429     TEST_REQUIRES_X86_AVX;
40430     for (uint32_t n = 5; n < 8; n++) {
40431       for (size_t k = 1; k <= 40; k += 9) {
40432         GemmMicrokernelTester()
40433           .extended_weights(true)
40434           .mr(4)
40435           .nr(4)
40436           .kr(2)
40437           .sr(1)
40438           .m(4)
40439           .n(n)
40440           .k(k)
40441           .a_stride(43)
40442           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40443       }
40444     }
40445   }
40446 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_gt_4_subtile)40447   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_gt_4_subtile) {
40448     TEST_REQUIRES_X86_AVX;
40449     for (uint32_t n = 5; n < 8; n++) {
40450       for (size_t k = 1; k <= 40; k += 9) {
40451         for (uint32_t m = 1; m <= 4; m++) {
40452           GemmMicrokernelTester()
40453             .extended_weights(true)
40454             .mr(4)
40455             .nr(4)
40456             .kr(2)
40457             .sr(1)
40458             .m(m)
40459             .n(n)
40460             .k(k)
40461             .iterations(1)
40462             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40463         }
40464       }
40465     }
40466   }
40467 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_div_4)40468   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_div_4) {
40469     TEST_REQUIRES_X86_AVX;
40470     for (uint32_t n = 8; n <= 12; n += 4) {
40471       for (size_t k = 1; k <= 40; k += 9) {
40472         GemmMicrokernelTester()
40473           .extended_weights(true)
40474           .mr(4)
40475           .nr(4)
40476           .kr(2)
40477           .sr(1)
40478           .m(4)
40479           .n(n)
40480           .k(k)
40481           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40482       }
40483     }
40484   }
40485 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_div_4_strided_cn)40486   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_div_4_strided_cn) {
40487     TEST_REQUIRES_X86_AVX;
40488     for (uint32_t n = 8; n <= 12; n += 4) {
40489       for (size_t k = 1; k <= 40; k += 9) {
40490         GemmMicrokernelTester()
40491           .extended_weights(true)
40492           .mr(4)
40493           .nr(4)
40494           .kr(2)
40495           .sr(1)
40496           .m(4)
40497           .n(n)
40498           .k(k)
40499           .cn_stride(7)
40500           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40501       }
40502     }
40503   }
40504 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_div_4_strided_a)40505   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_div_4_strided_a) {
40506     TEST_REQUIRES_X86_AVX;
40507     for (uint32_t n = 8; n <= 12; n += 4) {
40508       for (size_t k = 1; k <= 40; k += 9) {
40509         GemmMicrokernelTester()
40510           .extended_weights(true)
40511           .mr(4)
40512           .nr(4)
40513           .kr(2)
40514           .sr(1)
40515           .m(4)
40516           .n(n)
40517           .k(k)
40518           .a_stride(43)
40519           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40520       }
40521     }
40522   }
40523 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,n_div_4_subtile)40524   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, n_div_4_subtile) {
40525     TEST_REQUIRES_X86_AVX;
40526     for (uint32_t n = 8; n <= 12; n += 4) {
40527       for (size_t k = 1; k <= 40; k += 9) {
40528         for (uint32_t m = 1; m <= 4; m++) {
40529           GemmMicrokernelTester()
40530             .extended_weights(true)
40531             .mr(4)
40532             .nr(4)
40533             .kr(2)
40534             .sr(1)
40535             .m(m)
40536             .n(n)
40537             .k(k)
40538             .iterations(1)
40539             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40540         }
40541       }
40542     }
40543   }
40544 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,strided_cm_subtile)40545   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, strided_cm_subtile) {
40546     TEST_REQUIRES_X86_AVX;
40547     for (size_t k = 1; k <= 40; k += 9) {
40548       for (uint32_t n = 1; n <= 4; n++) {
40549         for (uint32_t m = 1; m <= 4; m++) {
40550           GemmMicrokernelTester()
40551             .extended_weights(true)
40552             .mr(4)
40553             .nr(4)
40554             .kr(2)
40555             .sr(1)
40556             .m(m)
40557             .n(n)
40558             .k(k)
40559             .cm_stride(7)
40560             .iterations(1)
40561             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40562         }
40563       }
40564     }
40565   }
40566 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX,strided_cm)40567   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__AVX, strided_cm) {
40568     TEST_REQUIRES_X86_AVX;
40569     GemmMicrokernelTester()
40570       .extended_weights(true)
40571       .mr(4)
40572       .nr(4)
40573       .kr(2)
40574       .sr(1)
40575       .m(4)
40576       .n(4)
40577       .k(8)
40578       .cm_stride(7)
40579       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
40580   }
40581 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
40582 
40583 
40584 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_eq_8)40585   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_eq_8) {
40586     TEST_REQUIRES_X86_SSE2;
40587     GemmMicrokernelTester()
40588       .extended_weights(true)
40589       .mr(1)
40590       .nr(4)
40591       .kr(2)
40592       .sr(4)
40593       .m(1)
40594       .n(4)
40595       .k(8)
40596       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40597   }
40598 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,strided_cn)40599   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, strided_cn) {
40600     TEST_REQUIRES_X86_SSE2;
40601     GemmMicrokernelTester()
40602       .extended_weights(true)
40603       .mr(1)
40604       .nr(4)
40605       .kr(2)
40606       .sr(4)
40607       .m(1)
40608       .n(4)
40609       .k(8)
40610       .cn_stride(7)
40611       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40612   }
40613 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_eq_8_strided_a)40614   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_eq_8_strided_a) {
40615     TEST_REQUIRES_X86_SSE2;
40616     GemmMicrokernelTester()
40617       .extended_weights(true)
40618       .mr(1)
40619       .nr(4)
40620       .kr(2)
40621       .sr(4)
40622       .m(1)
40623       .n(4)
40624       .k(8)
40625       .a_stride(11)
40626       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40627   }
40628 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_eq_8_subtile)40629   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_eq_8_subtile) {
40630     TEST_REQUIRES_X86_SSE2;
40631     for (uint32_t n = 1; n <= 4; n++) {
40632       for (uint32_t m = 1; m <= 1; m++) {
40633         GemmMicrokernelTester()
40634           .extended_weights(true)
40635           .mr(1)
40636           .nr(4)
40637           .kr(2)
40638           .sr(4)
40639           .m(m)
40640           .n(n)
40641           .k(8)
40642           .iterations(1)
40643           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40644       }
40645     }
40646   }
40647 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_eq_8_subtile_m)40648   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_eq_8_subtile_m) {
40649     TEST_REQUIRES_X86_SSE2;
40650     for (uint32_t m = 1; m <= 1; m++) {
40651       GemmMicrokernelTester()
40652         .extended_weights(true)
40653         .mr(1)
40654         .nr(4)
40655         .kr(2)
40656         .sr(4)
40657         .m(m)
40658         .n(4)
40659         .k(8)
40660         .iterations(1)
40661         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40662     }
40663   }
40664 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_eq_8_subtile_n)40665   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_eq_8_subtile_n) {
40666     TEST_REQUIRES_X86_SSE2;
40667     for (uint32_t n = 1; n <= 4; n++) {
40668       GemmMicrokernelTester()
40669         .extended_weights(true)
40670         .mr(1)
40671         .nr(4)
40672         .kr(2)
40673         .sr(4)
40674         .m(1)
40675         .n(n)
40676         .k(8)
40677         .iterations(1)
40678         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40679     }
40680   }
40681 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_lt_8)40682   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_lt_8) {
40683     TEST_REQUIRES_X86_SSE2;
40684     for (size_t k = 1; k < 8; k++) {
40685       GemmMicrokernelTester()
40686         .extended_weights(true)
40687         .mr(1)
40688         .nr(4)
40689         .kr(2)
40690         .sr(4)
40691         .m(1)
40692         .n(4)
40693         .k(k)
40694         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40695     }
40696   }
40697 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_lt_8_strided_a)40698   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_lt_8_strided_a) {
40699     TEST_REQUIRES_X86_SSE2;
40700     for (size_t k = 1; k < 8; k++) {
40701       GemmMicrokernelTester()
40702         .extended_weights(true)
40703         .mr(1)
40704         .nr(4)
40705         .kr(2)
40706         .sr(4)
40707         .m(1)
40708         .n(4)
40709         .k(k)
40710         .a_stride(11)
40711         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40712     }
40713   }
40714 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_lt_8_subtile)40715   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_lt_8_subtile) {
40716     TEST_REQUIRES_X86_SSE2;
40717     for (size_t k = 1; k < 8; k++) {
40718       for (uint32_t n = 1; n <= 4; n++) {
40719         for (uint32_t m = 1; m <= 1; m++) {
40720           GemmMicrokernelTester()
40721             .extended_weights(true)
40722             .mr(1)
40723             .nr(4)
40724             .kr(2)
40725             .sr(4)
40726             .m(m)
40727             .n(n)
40728             .k(k)
40729             .iterations(1)
40730             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40731         }
40732       }
40733     }
40734   }
40735 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_gt_8)40736   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_gt_8) {
40737     TEST_REQUIRES_X86_SSE2;
40738     for (size_t k = 9; k < 16; k++) {
40739       GemmMicrokernelTester()
40740         .extended_weights(true)
40741         .mr(1)
40742         .nr(4)
40743         .kr(2)
40744         .sr(4)
40745         .m(1)
40746         .n(4)
40747         .k(k)
40748         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40749     }
40750   }
40751 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_gt_8_strided_a)40752   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_gt_8_strided_a) {
40753     TEST_REQUIRES_X86_SSE2;
40754     for (size_t k = 9; k < 16; k++) {
40755       GemmMicrokernelTester()
40756         .extended_weights(true)
40757         .mr(1)
40758         .nr(4)
40759         .kr(2)
40760         .sr(4)
40761         .m(1)
40762         .n(4)
40763         .k(k)
40764         .a_stride(19)
40765         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40766     }
40767   }
40768 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_gt_8_subtile)40769   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_gt_8_subtile) {
40770     TEST_REQUIRES_X86_SSE2;
40771     for (size_t k = 9; k < 16; k++) {
40772       for (uint32_t n = 1; n <= 4; n++) {
40773         for (uint32_t m = 1; m <= 1; m++) {
40774           GemmMicrokernelTester()
40775             .extended_weights(true)
40776             .mr(1)
40777             .nr(4)
40778             .kr(2)
40779             .sr(4)
40780             .m(m)
40781             .n(n)
40782             .k(k)
40783             .iterations(1)
40784             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40785         }
40786       }
40787     }
40788   }
40789 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_div_8)40790   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_div_8) {
40791     TEST_REQUIRES_X86_SSE2;
40792     for (size_t k = 16; k <= 80; k += 8) {
40793       GemmMicrokernelTester()
40794         .extended_weights(true)
40795         .mr(1)
40796         .nr(4)
40797         .kr(2)
40798         .sr(4)
40799         .m(1)
40800         .n(4)
40801         .k(k)
40802         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40803     }
40804   }
40805 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_div_8_strided_a)40806   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_div_8_strided_a) {
40807     TEST_REQUIRES_X86_SSE2;
40808     for (size_t k = 16; k <= 80; k += 8) {
40809       GemmMicrokernelTester()
40810         .extended_weights(true)
40811         .mr(1)
40812         .nr(4)
40813         .kr(2)
40814         .sr(4)
40815         .m(1)
40816         .n(4)
40817         .k(k)
40818         .a_stride(83)
40819         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40820     }
40821   }
40822 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,k_div_8_subtile)40823   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, k_div_8_subtile) {
40824     TEST_REQUIRES_X86_SSE2;
40825     for (size_t k = 16; k <= 80; k += 8) {
40826       for (uint32_t n = 1; n <= 4; n++) {
40827         for (uint32_t m = 1; m <= 1; m++) {
40828           GemmMicrokernelTester()
40829             .extended_weights(true)
40830             .mr(1)
40831             .nr(4)
40832             .kr(2)
40833             .sr(4)
40834             .m(m)
40835             .n(n)
40836             .k(k)
40837             .iterations(1)
40838             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40839         }
40840       }
40841     }
40842   }
40843 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_gt_4)40844   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_gt_4) {
40845     TEST_REQUIRES_X86_SSE2;
40846     for (uint32_t n = 5; n < 8; n++) {
40847       for (size_t k = 1; k <= 40; k += 9) {
40848         GemmMicrokernelTester()
40849           .extended_weights(true)
40850           .mr(1)
40851           .nr(4)
40852           .kr(2)
40853           .sr(4)
40854           .m(1)
40855           .n(n)
40856           .k(k)
40857           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40858       }
40859     }
40860   }
40861 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_gt_4_strided_cn)40862   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_gt_4_strided_cn) {
40863     TEST_REQUIRES_X86_SSE2;
40864     for (uint32_t n = 5; n < 8; n++) {
40865       for (size_t k = 1; k <= 40; k += 9) {
40866         GemmMicrokernelTester()
40867           .extended_weights(true)
40868           .mr(1)
40869           .nr(4)
40870           .kr(2)
40871           .sr(4)
40872           .m(1)
40873           .n(n)
40874           .k(k)
40875           .cn_stride(7)
40876           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40877       }
40878     }
40879   }
40880 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_gt_4_strided_a)40881   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_gt_4_strided_a) {
40882     TEST_REQUIRES_X86_SSE2;
40883     for (uint32_t n = 5; n < 8; n++) {
40884       for (size_t k = 1; k <= 40; k += 9) {
40885         GemmMicrokernelTester()
40886           .extended_weights(true)
40887           .mr(1)
40888           .nr(4)
40889           .kr(2)
40890           .sr(4)
40891           .m(1)
40892           .n(n)
40893           .k(k)
40894           .a_stride(43)
40895           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40896       }
40897     }
40898   }
40899 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_gt_4_subtile)40900   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_gt_4_subtile) {
40901     TEST_REQUIRES_X86_SSE2;
40902     for (uint32_t n = 5; n < 8; n++) {
40903       for (size_t k = 1; k <= 40; k += 9) {
40904         for (uint32_t m = 1; m <= 1; m++) {
40905           GemmMicrokernelTester()
40906             .extended_weights(true)
40907             .mr(1)
40908             .nr(4)
40909             .kr(2)
40910             .sr(4)
40911             .m(m)
40912             .n(n)
40913             .k(k)
40914             .iterations(1)
40915             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40916         }
40917       }
40918     }
40919   }
40920 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_div_4)40921   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_div_4) {
40922     TEST_REQUIRES_X86_SSE2;
40923     for (uint32_t n = 8; n <= 12; n += 4) {
40924       for (size_t k = 1; k <= 40; k += 9) {
40925         GemmMicrokernelTester()
40926           .extended_weights(true)
40927           .mr(1)
40928           .nr(4)
40929           .kr(2)
40930           .sr(4)
40931           .m(1)
40932           .n(n)
40933           .k(k)
40934           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40935       }
40936     }
40937   }
40938 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_div_4_strided_cn)40939   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_div_4_strided_cn) {
40940     TEST_REQUIRES_X86_SSE2;
40941     for (uint32_t n = 8; n <= 12; n += 4) {
40942       for (size_t k = 1; k <= 40; k += 9) {
40943         GemmMicrokernelTester()
40944           .extended_weights(true)
40945           .mr(1)
40946           .nr(4)
40947           .kr(2)
40948           .sr(4)
40949           .m(1)
40950           .n(n)
40951           .k(k)
40952           .cn_stride(7)
40953           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40954       }
40955     }
40956   }
40957 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_div_4_strided_a)40958   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_div_4_strided_a) {
40959     TEST_REQUIRES_X86_SSE2;
40960     for (uint32_t n = 8; n <= 12; n += 4) {
40961       for (size_t k = 1; k <= 40; k += 9) {
40962         GemmMicrokernelTester()
40963           .extended_weights(true)
40964           .mr(1)
40965           .nr(4)
40966           .kr(2)
40967           .sr(4)
40968           .m(1)
40969           .n(n)
40970           .k(k)
40971           .a_stride(43)
40972           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40973       }
40974     }
40975   }
40976 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,n_div_4_subtile)40977   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, n_div_4_subtile) {
40978     TEST_REQUIRES_X86_SSE2;
40979     for (uint32_t n = 8; n <= 12; n += 4) {
40980       for (size_t k = 1; k <= 40; k += 9) {
40981         for (uint32_t m = 1; m <= 1; m++) {
40982           GemmMicrokernelTester()
40983             .extended_weights(true)
40984             .mr(1)
40985             .nr(4)
40986             .kr(2)
40987             .sr(4)
40988             .m(m)
40989             .n(n)
40990             .k(k)
40991             .iterations(1)
40992             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
40993         }
40994       }
40995     }
40996   }
40997 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,strided_cm_subtile)40998   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, strided_cm_subtile) {
40999     TEST_REQUIRES_X86_SSE2;
41000     for (size_t k = 1; k <= 40; k += 9) {
41001       for (uint32_t n = 1; n <= 4; n++) {
41002         for (uint32_t m = 1; m <= 1; m++) {
41003           GemmMicrokernelTester()
41004             .extended_weights(true)
41005             .mr(1)
41006             .nr(4)
41007             .kr(2)
41008             .sr(4)
41009             .m(m)
41010             .n(n)
41011             .k(k)
41012             .cm_stride(7)
41013             .iterations(1)
41014             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41015         }
41016       }
41017     }
41018   }
41019 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2,strided_cm)41020   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__SSE2, strided_cm) {
41021     TEST_REQUIRES_X86_SSE2;
41022     GemmMicrokernelTester()
41023       .extended_weights(true)
41024       .mr(1)
41025       .nr(4)
41026       .kr(2)
41027       .sr(4)
41028       .m(1)
41029       .n(4)
41030       .k(8)
41031       .cm_stride(7)
41032       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41033   }
41034 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
41035 
41036 
41037 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_eq_8)41038   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_eq_8) {
41039     TEST_REQUIRES_X86_SSE2;
41040     GemmMicrokernelTester()
41041       .extended_weights(true)
41042       .mr(2)
41043       .nr(4)
41044       .kr(2)
41045       .sr(4)
41046       .m(2)
41047       .n(4)
41048       .k(8)
41049       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41050   }
41051 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,strided_cn)41052   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, strided_cn) {
41053     TEST_REQUIRES_X86_SSE2;
41054     GemmMicrokernelTester()
41055       .extended_weights(true)
41056       .mr(2)
41057       .nr(4)
41058       .kr(2)
41059       .sr(4)
41060       .m(2)
41061       .n(4)
41062       .k(8)
41063       .cn_stride(7)
41064       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41065   }
41066 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_eq_8_strided_a)41067   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_eq_8_strided_a) {
41068     TEST_REQUIRES_X86_SSE2;
41069     GemmMicrokernelTester()
41070       .extended_weights(true)
41071       .mr(2)
41072       .nr(4)
41073       .kr(2)
41074       .sr(4)
41075       .m(2)
41076       .n(4)
41077       .k(8)
41078       .a_stride(11)
41079       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41080   }
41081 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_eq_8_subtile)41082   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_eq_8_subtile) {
41083     TEST_REQUIRES_X86_SSE2;
41084     for (uint32_t n = 1; n <= 4; n++) {
41085       for (uint32_t m = 1; m <= 2; m++) {
41086         GemmMicrokernelTester()
41087           .extended_weights(true)
41088           .mr(2)
41089           .nr(4)
41090           .kr(2)
41091           .sr(4)
41092           .m(m)
41093           .n(n)
41094           .k(8)
41095           .iterations(1)
41096           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41097       }
41098     }
41099   }
41100 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_eq_8_subtile_m)41101   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_eq_8_subtile_m) {
41102     TEST_REQUIRES_X86_SSE2;
41103     for (uint32_t m = 1; m <= 2; m++) {
41104       GemmMicrokernelTester()
41105         .extended_weights(true)
41106         .mr(2)
41107         .nr(4)
41108         .kr(2)
41109         .sr(4)
41110         .m(m)
41111         .n(4)
41112         .k(8)
41113         .iterations(1)
41114         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41115     }
41116   }
41117 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_eq_8_subtile_n)41118   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_eq_8_subtile_n) {
41119     TEST_REQUIRES_X86_SSE2;
41120     for (uint32_t n = 1; n <= 4; n++) {
41121       GemmMicrokernelTester()
41122         .extended_weights(true)
41123         .mr(2)
41124         .nr(4)
41125         .kr(2)
41126         .sr(4)
41127         .m(2)
41128         .n(n)
41129         .k(8)
41130         .iterations(1)
41131         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41132     }
41133   }
41134 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_lt_8)41135   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_lt_8) {
41136     TEST_REQUIRES_X86_SSE2;
41137     for (size_t k = 1; k < 8; k++) {
41138       GemmMicrokernelTester()
41139         .extended_weights(true)
41140         .mr(2)
41141         .nr(4)
41142         .kr(2)
41143         .sr(4)
41144         .m(2)
41145         .n(4)
41146         .k(k)
41147         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41148     }
41149   }
41150 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_lt_8_strided_a)41151   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_lt_8_strided_a) {
41152     TEST_REQUIRES_X86_SSE2;
41153     for (size_t k = 1; k < 8; k++) {
41154       GemmMicrokernelTester()
41155         .extended_weights(true)
41156         .mr(2)
41157         .nr(4)
41158         .kr(2)
41159         .sr(4)
41160         .m(2)
41161         .n(4)
41162         .k(k)
41163         .a_stride(11)
41164         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41165     }
41166   }
41167 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_lt_8_subtile)41168   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_lt_8_subtile) {
41169     TEST_REQUIRES_X86_SSE2;
41170     for (size_t k = 1; k < 8; k++) {
41171       for (uint32_t n = 1; n <= 4; n++) {
41172         for (uint32_t m = 1; m <= 2; m++) {
41173           GemmMicrokernelTester()
41174             .extended_weights(true)
41175             .mr(2)
41176             .nr(4)
41177             .kr(2)
41178             .sr(4)
41179             .m(m)
41180             .n(n)
41181             .k(k)
41182             .iterations(1)
41183             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41184         }
41185       }
41186     }
41187   }
41188 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_gt_8)41189   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_gt_8) {
41190     TEST_REQUIRES_X86_SSE2;
41191     for (size_t k = 9; k < 16; k++) {
41192       GemmMicrokernelTester()
41193         .extended_weights(true)
41194         .mr(2)
41195         .nr(4)
41196         .kr(2)
41197         .sr(4)
41198         .m(2)
41199         .n(4)
41200         .k(k)
41201         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41202     }
41203   }
41204 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_gt_8_strided_a)41205   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_gt_8_strided_a) {
41206     TEST_REQUIRES_X86_SSE2;
41207     for (size_t k = 9; k < 16; k++) {
41208       GemmMicrokernelTester()
41209         .extended_weights(true)
41210         .mr(2)
41211         .nr(4)
41212         .kr(2)
41213         .sr(4)
41214         .m(2)
41215         .n(4)
41216         .k(k)
41217         .a_stride(19)
41218         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41219     }
41220   }
41221 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_gt_8_subtile)41222   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_gt_8_subtile) {
41223     TEST_REQUIRES_X86_SSE2;
41224     for (size_t k = 9; k < 16; k++) {
41225       for (uint32_t n = 1; n <= 4; n++) {
41226         for (uint32_t m = 1; m <= 2; m++) {
41227           GemmMicrokernelTester()
41228             .extended_weights(true)
41229             .mr(2)
41230             .nr(4)
41231             .kr(2)
41232             .sr(4)
41233             .m(m)
41234             .n(n)
41235             .k(k)
41236             .iterations(1)
41237             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41238         }
41239       }
41240     }
41241   }
41242 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_div_8)41243   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_div_8) {
41244     TEST_REQUIRES_X86_SSE2;
41245     for (size_t k = 16; k <= 80; k += 8) {
41246       GemmMicrokernelTester()
41247         .extended_weights(true)
41248         .mr(2)
41249         .nr(4)
41250         .kr(2)
41251         .sr(4)
41252         .m(2)
41253         .n(4)
41254         .k(k)
41255         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41256     }
41257   }
41258 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_div_8_strided_a)41259   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_div_8_strided_a) {
41260     TEST_REQUIRES_X86_SSE2;
41261     for (size_t k = 16; k <= 80; k += 8) {
41262       GemmMicrokernelTester()
41263         .extended_weights(true)
41264         .mr(2)
41265         .nr(4)
41266         .kr(2)
41267         .sr(4)
41268         .m(2)
41269         .n(4)
41270         .k(k)
41271         .a_stride(83)
41272         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41273     }
41274   }
41275 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,k_div_8_subtile)41276   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, k_div_8_subtile) {
41277     TEST_REQUIRES_X86_SSE2;
41278     for (size_t k = 16; k <= 80; k += 8) {
41279       for (uint32_t n = 1; n <= 4; n++) {
41280         for (uint32_t m = 1; m <= 2; m++) {
41281           GemmMicrokernelTester()
41282             .extended_weights(true)
41283             .mr(2)
41284             .nr(4)
41285             .kr(2)
41286             .sr(4)
41287             .m(m)
41288             .n(n)
41289             .k(k)
41290             .iterations(1)
41291             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41292         }
41293       }
41294     }
41295   }
41296 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_gt_4)41297   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_gt_4) {
41298     TEST_REQUIRES_X86_SSE2;
41299     for (uint32_t n = 5; n < 8; n++) {
41300       for (size_t k = 1; k <= 40; k += 9) {
41301         GemmMicrokernelTester()
41302           .extended_weights(true)
41303           .mr(2)
41304           .nr(4)
41305           .kr(2)
41306           .sr(4)
41307           .m(2)
41308           .n(n)
41309           .k(k)
41310           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41311       }
41312     }
41313   }
41314 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_gt_4_strided_cn)41315   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_gt_4_strided_cn) {
41316     TEST_REQUIRES_X86_SSE2;
41317     for (uint32_t n = 5; n < 8; n++) {
41318       for (size_t k = 1; k <= 40; k += 9) {
41319         GemmMicrokernelTester()
41320           .extended_weights(true)
41321           .mr(2)
41322           .nr(4)
41323           .kr(2)
41324           .sr(4)
41325           .m(2)
41326           .n(n)
41327           .k(k)
41328           .cn_stride(7)
41329           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41330       }
41331     }
41332   }
41333 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_gt_4_strided_a)41334   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_gt_4_strided_a) {
41335     TEST_REQUIRES_X86_SSE2;
41336     for (uint32_t n = 5; n < 8; n++) {
41337       for (size_t k = 1; k <= 40; k += 9) {
41338         GemmMicrokernelTester()
41339           .extended_weights(true)
41340           .mr(2)
41341           .nr(4)
41342           .kr(2)
41343           .sr(4)
41344           .m(2)
41345           .n(n)
41346           .k(k)
41347           .a_stride(43)
41348           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41349       }
41350     }
41351   }
41352 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_gt_4_subtile)41353   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_gt_4_subtile) {
41354     TEST_REQUIRES_X86_SSE2;
41355     for (uint32_t n = 5; n < 8; n++) {
41356       for (size_t k = 1; k <= 40; k += 9) {
41357         for (uint32_t m = 1; m <= 2; m++) {
41358           GemmMicrokernelTester()
41359             .extended_weights(true)
41360             .mr(2)
41361             .nr(4)
41362             .kr(2)
41363             .sr(4)
41364             .m(m)
41365             .n(n)
41366             .k(k)
41367             .iterations(1)
41368             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41369         }
41370       }
41371     }
41372   }
41373 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_div_4)41374   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_div_4) {
41375     TEST_REQUIRES_X86_SSE2;
41376     for (uint32_t n = 8; n <= 12; n += 4) {
41377       for (size_t k = 1; k <= 40; k += 9) {
41378         GemmMicrokernelTester()
41379           .extended_weights(true)
41380           .mr(2)
41381           .nr(4)
41382           .kr(2)
41383           .sr(4)
41384           .m(2)
41385           .n(n)
41386           .k(k)
41387           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41388       }
41389     }
41390   }
41391 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_div_4_strided_cn)41392   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_div_4_strided_cn) {
41393     TEST_REQUIRES_X86_SSE2;
41394     for (uint32_t n = 8; n <= 12; n += 4) {
41395       for (size_t k = 1; k <= 40; k += 9) {
41396         GemmMicrokernelTester()
41397           .extended_weights(true)
41398           .mr(2)
41399           .nr(4)
41400           .kr(2)
41401           .sr(4)
41402           .m(2)
41403           .n(n)
41404           .k(k)
41405           .cn_stride(7)
41406           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41407       }
41408     }
41409   }
41410 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_div_4_strided_a)41411   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_div_4_strided_a) {
41412     TEST_REQUIRES_X86_SSE2;
41413     for (uint32_t n = 8; n <= 12; n += 4) {
41414       for (size_t k = 1; k <= 40; k += 9) {
41415         GemmMicrokernelTester()
41416           .extended_weights(true)
41417           .mr(2)
41418           .nr(4)
41419           .kr(2)
41420           .sr(4)
41421           .m(2)
41422           .n(n)
41423           .k(k)
41424           .a_stride(43)
41425           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41426       }
41427     }
41428   }
41429 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,n_div_4_subtile)41430   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, n_div_4_subtile) {
41431     TEST_REQUIRES_X86_SSE2;
41432     for (uint32_t n = 8; n <= 12; n += 4) {
41433       for (size_t k = 1; k <= 40; k += 9) {
41434         for (uint32_t m = 1; m <= 2; m++) {
41435           GemmMicrokernelTester()
41436             .extended_weights(true)
41437             .mr(2)
41438             .nr(4)
41439             .kr(2)
41440             .sr(4)
41441             .m(m)
41442             .n(n)
41443             .k(k)
41444             .iterations(1)
41445             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41446         }
41447       }
41448     }
41449   }
41450 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,strided_cm_subtile)41451   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, strided_cm_subtile) {
41452     TEST_REQUIRES_X86_SSE2;
41453     for (size_t k = 1; k <= 40; k += 9) {
41454       for (uint32_t n = 1; n <= 4; n++) {
41455         for (uint32_t m = 1; m <= 2; m++) {
41456           GemmMicrokernelTester()
41457             .extended_weights(true)
41458             .mr(2)
41459             .nr(4)
41460             .kr(2)
41461             .sr(4)
41462             .m(m)
41463             .n(n)
41464             .k(k)
41465             .cm_stride(7)
41466             .iterations(1)
41467             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41468         }
41469       }
41470     }
41471   }
41472 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2,strided_cm)41473   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE2, strided_cm) {
41474     TEST_REQUIRES_X86_SSE2;
41475     GemmMicrokernelTester()
41476       .extended_weights(true)
41477       .mr(2)
41478       .nr(4)
41479       .kr(2)
41480       .sr(4)
41481       .m(2)
41482       .n(4)
41483       .k(8)
41484       .cm_stride(7)
41485       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
41486   }
41487 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
41488 
41489 
41490 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_eq_8)41491   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_eq_8) {
41492     TEST_REQUIRES_X86_SSE41;
41493     GemmMicrokernelTester()
41494       .extended_weights(true)
41495       .mr(2)
41496       .nr(4)
41497       .kr(2)
41498       .sr(4)
41499       .m(2)
41500       .n(4)
41501       .k(8)
41502       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41503   }
41504 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,strided_cn)41505   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, strided_cn) {
41506     TEST_REQUIRES_X86_SSE41;
41507     GemmMicrokernelTester()
41508       .extended_weights(true)
41509       .mr(2)
41510       .nr(4)
41511       .kr(2)
41512       .sr(4)
41513       .m(2)
41514       .n(4)
41515       .k(8)
41516       .cn_stride(7)
41517       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41518   }
41519 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_eq_8_strided_a)41520   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_eq_8_strided_a) {
41521     TEST_REQUIRES_X86_SSE41;
41522     GemmMicrokernelTester()
41523       .extended_weights(true)
41524       .mr(2)
41525       .nr(4)
41526       .kr(2)
41527       .sr(4)
41528       .m(2)
41529       .n(4)
41530       .k(8)
41531       .a_stride(11)
41532       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41533   }
41534 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_eq_8_subtile)41535   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_eq_8_subtile) {
41536     TEST_REQUIRES_X86_SSE41;
41537     for (uint32_t n = 1; n <= 4; n++) {
41538       for (uint32_t m = 1; m <= 2; m++) {
41539         GemmMicrokernelTester()
41540           .extended_weights(true)
41541           .mr(2)
41542           .nr(4)
41543           .kr(2)
41544           .sr(4)
41545           .m(m)
41546           .n(n)
41547           .k(8)
41548           .iterations(1)
41549           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41550       }
41551     }
41552   }
41553 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_eq_8_subtile_m)41554   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_eq_8_subtile_m) {
41555     TEST_REQUIRES_X86_SSE41;
41556     for (uint32_t m = 1; m <= 2; m++) {
41557       GemmMicrokernelTester()
41558         .extended_weights(true)
41559         .mr(2)
41560         .nr(4)
41561         .kr(2)
41562         .sr(4)
41563         .m(m)
41564         .n(4)
41565         .k(8)
41566         .iterations(1)
41567         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41568     }
41569   }
41570 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_eq_8_subtile_n)41571   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_eq_8_subtile_n) {
41572     TEST_REQUIRES_X86_SSE41;
41573     for (uint32_t n = 1; n <= 4; n++) {
41574       GemmMicrokernelTester()
41575         .extended_weights(true)
41576         .mr(2)
41577         .nr(4)
41578         .kr(2)
41579         .sr(4)
41580         .m(2)
41581         .n(n)
41582         .k(8)
41583         .iterations(1)
41584         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41585     }
41586   }
41587 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_lt_8)41588   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_lt_8) {
41589     TEST_REQUIRES_X86_SSE41;
41590     for (size_t k = 1; k < 8; k++) {
41591       GemmMicrokernelTester()
41592         .extended_weights(true)
41593         .mr(2)
41594         .nr(4)
41595         .kr(2)
41596         .sr(4)
41597         .m(2)
41598         .n(4)
41599         .k(k)
41600         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41601     }
41602   }
41603 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_lt_8_strided_a)41604   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_lt_8_strided_a) {
41605     TEST_REQUIRES_X86_SSE41;
41606     for (size_t k = 1; k < 8; k++) {
41607       GemmMicrokernelTester()
41608         .extended_weights(true)
41609         .mr(2)
41610         .nr(4)
41611         .kr(2)
41612         .sr(4)
41613         .m(2)
41614         .n(4)
41615         .k(k)
41616         .a_stride(11)
41617         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41618     }
41619   }
41620 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_lt_8_subtile)41621   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_lt_8_subtile) {
41622     TEST_REQUIRES_X86_SSE41;
41623     for (size_t k = 1; k < 8; k++) {
41624       for (uint32_t n = 1; n <= 4; n++) {
41625         for (uint32_t m = 1; m <= 2; m++) {
41626           GemmMicrokernelTester()
41627             .extended_weights(true)
41628             .mr(2)
41629             .nr(4)
41630             .kr(2)
41631             .sr(4)
41632             .m(m)
41633             .n(n)
41634             .k(k)
41635             .iterations(1)
41636             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41637         }
41638       }
41639     }
41640   }
41641 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_gt_8)41642   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_gt_8) {
41643     TEST_REQUIRES_X86_SSE41;
41644     for (size_t k = 9; k < 16; k++) {
41645       GemmMicrokernelTester()
41646         .extended_weights(true)
41647         .mr(2)
41648         .nr(4)
41649         .kr(2)
41650         .sr(4)
41651         .m(2)
41652         .n(4)
41653         .k(k)
41654         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41655     }
41656   }
41657 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_gt_8_strided_a)41658   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_gt_8_strided_a) {
41659     TEST_REQUIRES_X86_SSE41;
41660     for (size_t k = 9; k < 16; k++) {
41661       GemmMicrokernelTester()
41662         .extended_weights(true)
41663         .mr(2)
41664         .nr(4)
41665         .kr(2)
41666         .sr(4)
41667         .m(2)
41668         .n(4)
41669         .k(k)
41670         .a_stride(19)
41671         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41672     }
41673   }
41674 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_gt_8_subtile)41675   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_gt_8_subtile) {
41676     TEST_REQUIRES_X86_SSE41;
41677     for (size_t k = 9; k < 16; k++) {
41678       for (uint32_t n = 1; n <= 4; n++) {
41679         for (uint32_t m = 1; m <= 2; m++) {
41680           GemmMicrokernelTester()
41681             .extended_weights(true)
41682             .mr(2)
41683             .nr(4)
41684             .kr(2)
41685             .sr(4)
41686             .m(m)
41687             .n(n)
41688             .k(k)
41689             .iterations(1)
41690             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41691         }
41692       }
41693     }
41694   }
41695 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_div_8)41696   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_div_8) {
41697     TEST_REQUIRES_X86_SSE41;
41698     for (size_t k = 16; k <= 80; k += 8) {
41699       GemmMicrokernelTester()
41700         .extended_weights(true)
41701         .mr(2)
41702         .nr(4)
41703         .kr(2)
41704         .sr(4)
41705         .m(2)
41706         .n(4)
41707         .k(k)
41708         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41709     }
41710   }
41711 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_div_8_strided_a)41712   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_div_8_strided_a) {
41713     TEST_REQUIRES_X86_SSE41;
41714     for (size_t k = 16; k <= 80; k += 8) {
41715       GemmMicrokernelTester()
41716         .extended_weights(true)
41717         .mr(2)
41718         .nr(4)
41719         .kr(2)
41720         .sr(4)
41721         .m(2)
41722         .n(4)
41723         .k(k)
41724         .a_stride(83)
41725         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41726     }
41727   }
41728 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,k_div_8_subtile)41729   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, k_div_8_subtile) {
41730     TEST_REQUIRES_X86_SSE41;
41731     for (size_t k = 16; k <= 80; k += 8) {
41732       for (uint32_t n = 1; n <= 4; n++) {
41733         for (uint32_t m = 1; m <= 2; m++) {
41734           GemmMicrokernelTester()
41735             .extended_weights(true)
41736             .mr(2)
41737             .nr(4)
41738             .kr(2)
41739             .sr(4)
41740             .m(m)
41741             .n(n)
41742             .k(k)
41743             .iterations(1)
41744             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41745         }
41746       }
41747     }
41748   }
41749 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_gt_4)41750   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_gt_4) {
41751     TEST_REQUIRES_X86_SSE41;
41752     for (uint32_t n = 5; n < 8; n++) {
41753       for (size_t k = 1; k <= 40; k += 9) {
41754         GemmMicrokernelTester()
41755           .extended_weights(true)
41756           .mr(2)
41757           .nr(4)
41758           .kr(2)
41759           .sr(4)
41760           .m(2)
41761           .n(n)
41762           .k(k)
41763           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41764       }
41765     }
41766   }
41767 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_gt_4_strided_cn)41768   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_gt_4_strided_cn) {
41769     TEST_REQUIRES_X86_SSE41;
41770     for (uint32_t n = 5; n < 8; n++) {
41771       for (size_t k = 1; k <= 40; k += 9) {
41772         GemmMicrokernelTester()
41773           .extended_weights(true)
41774           .mr(2)
41775           .nr(4)
41776           .kr(2)
41777           .sr(4)
41778           .m(2)
41779           .n(n)
41780           .k(k)
41781           .cn_stride(7)
41782           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41783       }
41784     }
41785   }
41786 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_gt_4_strided_a)41787   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_gt_4_strided_a) {
41788     TEST_REQUIRES_X86_SSE41;
41789     for (uint32_t n = 5; n < 8; n++) {
41790       for (size_t k = 1; k <= 40; k += 9) {
41791         GemmMicrokernelTester()
41792           .extended_weights(true)
41793           .mr(2)
41794           .nr(4)
41795           .kr(2)
41796           .sr(4)
41797           .m(2)
41798           .n(n)
41799           .k(k)
41800           .a_stride(43)
41801           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41802       }
41803     }
41804   }
41805 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_gt_4_subtile)41806   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_gt_4_subtile) {
41807     TEST_REQUIRES_X86_SSE41;
41808     for (uint32_t n = 5; n < 8; n++) {
41809       for (size_t k = 1; k <= 40; k += 9) {
41810         for (uint32_t m = 1; m <= 2; m++) {
41811           GemmMicrokernelTester()
41812             .extended_weights(true)
41813             .mr(2)
41814             .nr(4)
41815             .kr(2)
41816             .sr(4)
41817             .m(m)
41818             .n(n)
41819             .k(k)
41820             .iterations(1)
41821             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41822         }
41823       }
41824     }
41825   }
41826 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_div_4)41827   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_div_4) {
41828     TEST_REQUIRES_X86_SSE41;
41829     for (uint32_t n = 8; n <= 12; n += 4) {
41830       for (size_t k = 1; k <= 40; k += 9) {
41831         GemmMicrokernelTester()
41832           .extended_weights(true)
41833           .mr(2)
41834           .nr(4)
41835           .kr(2)
41836           .sr(4)
41837           .m(2)
41838           .n(n)
41839           .k(k)
41840           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41841       }
41842     }
41843   }
41844 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_div_4_strided_cn)41845   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_div_4_strided_cn) {
41846     TEST_REQUIRES_X86_SSE41;
41847     for (uint32_t n = 8; n <= 12; n += 4) {
41848       for (size_t k = 1; k <= 40; k += 9) {
41849         GemmMicrokernelTester()
41850           .extended_weights(true)
41851           .mr(2)
41852           .nr(4)
41853           .kr(2)
41854           .sr(4)
41855           .m(2)
41856           .n(n)
41857           .k(k)
41858           .cn_stride(7)
41859           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41860       }
41861     }
41862   }
41863 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_div_4_strided_a)41864   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_div_4_strided_a) {
41865     TEST_REQUIRES_X86_SSE41;
41866     for (uint32_t n = 8; n <= 12; n += 4) {
41867       for (size_t k = 1; k <= 40; k += 9) {
41868         GemmMicrokernelTester()
41869           .extended_weights(true)
41870           .mr(2)
41871           .nr(4)
41872           .kr(2)
41873           .sr(4)
41874           .m(2)
41875           .n(n)
41876           .k(k)
41877           .a_stride(43)
41878           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41879       }
41880     }
41881   }
41882 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,n_div_4_subtile)41883   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, n_div_4_subtile) {
41884     TEST_REQUIRES_X86_SSE41;
41885     for (uint32_t n = 8; n <= 12; n += 4) {
41886       for (size_t k = 1; k <= 40; k += 9) {
41887         for (uint32_t m = 1; m <= 2; m++) {
41888           GemmMicrokernelTester()
41889             .extended_weights(true)
41890             .mr(2)
41891             .nr(4)
41892             .kr(2)
41893             .sr(4)
41894             .m(m)
41895             .n(n)
41896             .k(k)
41897             .iterations(1)
41898             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41899         }
41900       }
41901     }
41902   }
41903 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,strided_cm_subtile)41904   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, strided_cm_subtile) {
41905     TEST_REQUIRES_X86_SSE41;
41906     for (size_t k = 1; k <= 40; k += 9) {
41907       for (uint32_t n = 1; n <= 4; n++) {
41908         for (uint32_t m = 1; m <= 2; m++) {
41909           GemmMicrokernelTester()
41910             .extended_weights(true)
41911             .mr(2)
41912             .nr(4)
41913             .kr(2)
41914             .sr(4)
41915             .m(m)
41916             .n(n)
41917             .k(k)
41918             .cm_stride(7)
41919             .iterations(1)
41920             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41921         }
41922       }
41923     }
41924   }
41925 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41,strided_cm)41926   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__SSE41, strided_cm) {
41927     TEST_REQUIRES_X86_SSE41;
41928     GemmMicrokernelTester()
41929       .extended_weights(true)
41930       .mr(2)
41931       .nr(4)
41932       .kr(2)
41933       .sr(4)
41934       .m(2)
41935       .n(4)
41936       .k(8)
41937       .cm_stride(7)
41938       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41939   }
41940 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
41941 
41942 
41943 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_eq_8)41944   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_eq_8) {
41945     TEST_REQUIRES_X86_SSE41;
41946     GemmMicrokernelTester()
41947       .extended_weights(true)
41948       .mr(3)
41949       .nr(4)
41950       .kr(2)
41951       .sr(4)
41952       .m(3)
41953       .n(4)
41954       .k(8)
41955       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41956   }
41957 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,strided_cn)41958   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, strided_cn) {
41959     TEST_REQUIRES_X86_SSE41;
41960     GemmMicrokernelTester()
41961       .extended_weights(true)
41962       .mr(3)
41963       .nr(4)
41964       .kr(2)
41965       .sr(4)
41966       .m(3)
41967       .n(4)
41968       .k(8)
41969       .cn_stride(7)
41970       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41971   }
41972 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_eq_8_strided_a)41973   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_eq_8_strided_a) {
41974     TEST_REQUIRES_X86_SSE41;
41975     GemmMicrokernelTester()
41976       .extended_weights(true)
41977       .mr(3)
41978       .nr(4)
41979       .kr(2)
41980       .sr(4)
41981       .m(3)
41982       .n(4)
41983       .k(8)
41984       .a_stride(11)
41985       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
41986   }
41987 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_eq_8_subtile)41988   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_eq_8_subtile) {
41989     TEST_REQUIRES_X86_SSE41;
41990     for (uint32_t n = 1; n <= 4; n++) {
41991       for (uint32_t m = 1; m <= 3; m++) {
41992         GemmMicrokernelTester()
41993           .extended_weights(true)
41994           .mr(3)
41995           .nr(4)
41996           .kr(2)
41997           .sr(4)
41998           .m(m)
41999           .n(n)
42000           .k(8)
42001           .iterations(1)
42002           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42003       }
42004     }
42005   }
42006 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_eq_8_subtile_m)42007   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_eq_8_subtile_m) {
42008     TEST_REQUIRES_X86_SSE41;
42009     for (uint32_t m = 1; m <= 3; m++) {
42010       GemmMicrokernelTester()
42011         .extended_weights(true)
42012         .mr(3)
42013         .nr(4)
42014         .kr(2)
42015         .sr(4)
42016         .m(m)
42017         .n(4)
42018         .k(8)
42019         .iterations(1)
42020         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42021     }
42022   }
42023 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_eq_8_subtile_n)42024   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_eq_8_subtile_n) {
42025     TEST_REQUIRES_X86_SSE41;
42026     for (uint32_t n = 1; n <= 4; n++) {
42027       GemmMicrokernelTester()
42028         .extended_weights(true)
42029         .mr(3)
42030         .nr(4)
42031         .kr(2)
42032         .sr(4)
42033         .m(3)
42034         .n(n)
42035         .k(8)
42036         .iterations(1)
42037         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42038     }
42039   }
42040 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_lt_8)42041   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_lt_8) {
42042     TEST_REQUIRES_X86_SSE41;
42043     for (size_t k = 1; k < 8; k++) {
42044       GemmMicrokernelTester()
42045         .extended_weights(true)
42046         .mr(3)
42047         .nr(4)
42048         .kr(2)
42049         .sr(4)
42050         .m(3)
42051         .n(4)
42052         .k(k)
42053         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42054     }
42055   }
42056 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_lt_8_strided_a)42057   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_lt_8_strided_a) {
42058     TEST_REQUIRES_X86_SSE41;
42059     for (size_t k = 1; k < 8; k++) {
42060       GemmMicrokernelTester()
42061         .extended_weights(true)
42062         .mr(3)
42063         .nr(4)
42064         .kr(2)
42065         .sr(4)
42066         .m(3)
42067         .n(4)
42068         .k(k)
42069         .a_stride(11)
42070         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42071     }
42072   }
42073 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_lt_8_subtile)42074   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_lt_8_subtile) {
42075     TEST_REQUIRES_X86_SSE41;
42076     for (size_t k = 1; k < 8; k++) {
42077       for (uint32_t n = 1; n <= 4; n++) {
42078         for (uint32_t m = 1; m <= 3; m++) {
42079           GemmMicrokernelTester()
42080             .extended_weights(true)
42081             .mr(3)
42082             .nr(4)
42083             .kr(2)
42084             .sr(4)
42085             .m(m)
42086             .n(n)
42087             .k(k)
42088             .iterations(1)
42089             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42090         }
42091       }
42092     }
42093   }
42094 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_gt_8)42095   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_gt_8) {
42096     TEST_REQUIRES_X86_SSE41;
42097     for (size_t k = 9; k < 16; k++) {
42098       GemmMicrokernelTester()
42099         .extended_weights(true)
42100         .mr(3)
42101         .nr(4)
42102         .kr(2)
42103         .sr(4)
42104         .m(3)
42105         .n(4)
42106         .k(k)
42107         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42108     }
42109   }
42110 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_gt_8_strided_a)42111   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_gt_8_strided_a) {
42112     TEST_REQUIRES_X86_SSE41;
42113     for (size_t k = 9; k < 16; k++) {
42114       GemmMicrokernelTester()
42115         .extended_weights(true)
42116         .mr(3)
42117         .nr(4)
42118         .kr(2)
42119         .sr(4)
42120         .m(3)
42121         .n(4)
42122         .k(k)
42123         .a_stride(19)
42124         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42125     }
42126   }
42127 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_gt_8_subtile)42128   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_gt_8_subtile) {
42129     TEST_REQUIRES_X86_SSE41;
42130     for (size_t k = 9; k < 16; k++) {
42131       for (uint32_t n = 1; n <= 4; n++) {
42132         for (uint32_t m = 1; m <= 3; m++) {
42133           GemmMicrokernelTester()
42134             .extended_weights(true)
42135             .mr(3)
42136             .nr(4)
42137             .kr(2)
42138             .sr(4)
42139             .m(m)
42140             .n(n)
42141             .k(k)
42142             .iterations(1)
42143             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42144         }
42145       }
42146     }
42147   }
42148 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_div_8)42149   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_div_8) {
42150     TEST_REQUIRES_X86_SSE41;
42151     for (size_t k = 16; k <= 80; k += 8) {
42152       GemmMicrokernelTester()
42153         .extended_weights(true)
42154         .mr(3)
42155         .nr(4)
42156         .kr(2)
42157         .sr(4)
42158         .m(3)
42159         .n(4)
42160         .k(k)
42161         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42162     }
42163   }
42164 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_div_8_strided_a)42165   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_div_8_strided_a) {
42166     TEST_REQUIRES_X86_SSE41;
42167     for (size_t k = 16; k <= 80; k += 8) {
42168       GemmMicrokernelTester()
42169         .extended_weights(true)
42170         .mr(3)
42171         .nr(4)
42172         .kr(2)
42173         .sr(4)
42174         .m(3)
42175         .n(4)
42176         .k(k)
42177         .a_stride(83)
42178         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42179     }
42180   }
42181 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,k_div_8_subtile)42182   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, k_div_8_subtile) {
42183     TEST_REQUIRES_X86_SSE41;
42184     for (size_t k = 16; k <= 80; k += 8) {
42185       for (uint32_t n = 1; n <= 4; n++) {
42186         for (uint32_t m = 1; m <= 3; m++) {
42187           GemmMicrokernelTester()
42188             .extended_weights(true)
42189             .mr(3)
42190             .nr(4)
42191             .kr(2)
42192             .sr(4)
42193             .m(m)
42194             .n(n)
42195             .k(k)
42196             .iterations(1)
42197             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42198         }
42199       }
42200     }
42201   }
42202 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_gt_4)42203   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_gt_4) {
42204     TEST_REQUIRES_X86_SSE41;
42205     for (uint32_t n = 5; n < 8; n++) {
42206       for (size_t k = 1; k <= 40; k += 9) {
42207         GemmMicrokernelTester()
42208           .extended_weights(true)
42209           .mr(3)
42210           .nr(4)
42211           .kr(2)
42212           .sr(4)
42213           .m(3)
42214           .n(n)
42215           .k(k)
42216           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42217       }
42218     }
42219   }
42220 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_gt_4_strided_cn)42221   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_gt_4_strided_cn) {
42222     TEST_REQUIRES_X86_SSE41;
42223     for (uint32_t n = 5; n < 8; n++) {
42224       for (size_t k = 1; k <= 40; k += 9) {
42225         GemmMicrokernelTester()
42226           .extended_weights(true)
42227           .mr(3)
42228           .nr(4)
42229           .kr(2)
42230           .sr(4)
42231           .m(3)
42232           .n(n)
42233           .k(k)
42234           .cn_stride(7)
42235           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42236       }
42237     }
42238   }
42239 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_gt_4_strided_a)42240   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_gt_4_strided_a) {
42241     TEST_REQUIRES_X86_SSE41;
42242     for (uint32_t n = 5; n < 8; n++) {
42243       for (size_t k = 1; k <= 40; k += 9) {
42244         GemmMicrokernelTester()
42245           .extended_weights(true)
42246           .mr(3)
42247           .nr(4)
42248           .kr(2)
42249           .sr(4)
42250           .m(3)
42251           .n(n)
42252           .k(k)
42253           .a_stride(43)
42254           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42255       }
42256     }
42257   }
42258 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_gt_4_subtile)42259   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_gt_4_subtile) {
42260     TEST_REQUIRES_X86_SSE41;
42261     for (uint32_t n = 5; n < 8; n++) {
42262       for (size_t k = 1; k <= 40; k += 9) {
42263         for (uint32_t m = 1; m <= 3; m++) {
42264           GemmMicrokernelTester()
42265             .extended_weights(true)
42266             .mr(3)
42267             .nr(4)
42268             .kr(2)
42269             .sr(4)
42270             .m(m)
42271             .n(n)
42272             .k(k)
42273             .iterations(1)
42274             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42275         }
42276       }
42277     }
42278   }
42279 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_div_4)42280   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_div_4) {
42281     TEST_REQUIRES_X86_SSE41;
42282     for (uint32_t n = 8; n <= 12; n += 4) {
42283       for (size_t k = 1; k <= 40; k += 9) {
42284         GemmMicrokernelTester()
42285           .extended_weights(true)
42286           .mr(3)
42287           .nr(4)
42288           .kr(2)
42289           .sr(4)
42290           .m(3)
42291           .n(n)
42292           .k(k)
42293           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42294       }
42295     }
42296   }
42297 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_div_4_strided_cn)42298   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_div_4_strided_cn) {
42299     TEST_REQUIRES_X86_SSE41;
42300     for (uint32_t n = 8; n <= 12; n += 4) {
42301       for (size_t k = 1; k <= 40; k += 9) {
42302         GemmMicrokernelTester()
42303           .extended_weights(true)
42304           .mr(3)
42305           .nr(4)
42306           .kr(2)
42307           .sr(4)
42308           .m(3)
42309           .n(n)
42310           .k(k)
42311           .cn_stride(7)
42312           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42313       }
42314     }
42315   }
42316 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_div_4_strided_a)42317   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_div_4_strided_a) {
42318     TEST_REQUIRES_X86_SSE41;
42319     for (uint32_t n = 8; n <= 12; n += 4) {
42320       for (size_t k = 1; k <= 40; k += 9) {
42321         GemmMicrokernelTester()
42322           .extended_weights(true)
42323           .mr(3)
42324           .nr(4)
42325           .kr(2)
42326           .sr(4)
42327           .m(3)
42328           .n(n)
42329           .k(k)
42330           .a_stride(43)
42331           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42332       }
42333     }
42334   }
42335 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,n_div_4_subtile)42336   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, n_div_4_subtile) {
42337     TEST_REQUIRES_X86_SSE41;
42338     for (uint32_t n = 8; n <= 12; n += 4) {
42339       for (size_t k = 1; k <= 40; k += 9) {
42340         for (uint32_t m = 1; m <= 3; m++) {
42341           GemmMicrokernelTester()
42342             .extended_weights(true)
42343             .mr(3)
42344             .nr(4)
42345             .kr(2)
42346             .sr(4)
42347             .m(m)
42348             .n(n)
42349             .k(k)
42350             .iterations(1)
42351             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42352         }
42353       }
42354     }
42355   }
42356 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,strided_cm_subtile)42357   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, strided_cm_subtile) {
42358     TEST_REQUIRES_X86_SSE41;
42359     for (size_t k = 1; k <= 40; k += 9) {
42360       for (uint32_t n = 1; n <= 4; n++) {
42361         for (uint32_t m = 1; m <= 3; m++) {
42362           GemmMicrokernelTester()
42363             .extended_weights(true)
42364             .mr(3)
42365             .nr(4)
42366             .kr(2)
42367             .sr(4)
42368             .m(m)
42369             .n(n)
42370             .k(k)
42371             .cm_stride(7)
42372             .iterations(1)
42373             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42374         }
42375       }
42376     }
42377   }
42378 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41,strided_cm)42379   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__SSE41, strided_cm) {
42380     TEST_REQUIRES_X86_SSE41;
42381     GemmMicrokernelTester()
42382       .extended_weights(true)
42383       .mr(3)
42384       .nr(4)
42385       .kr(2)
42386       .sr(4)
42387       .m(3)
42388       .n(4)
42389       .k(8)
42390       .cm_stride(7)
42391       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42392   }
42393 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
42394 
42395 
42396 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_eq_8)42397   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_eq_8) {
42398     TEST_REQUIRES_X86_SSE41;
42399     GemmMicrokernelTester()
42400       .extended_weights(true)
42401       .mr(4)
42402       .nr(4)
42403       .kr(2)
42404       .sr(4)
42405       .m(4)
42406       .n(4)
42407       .k(8)
42408       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42409   }
42410 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,strided_cn)42411   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, strided_cn) {
42412     TEST_REQUIRES_X86_SSE41;
42413     GemmMicrokernelTester()
42414       .extended_weights(true)
42415       .mr(4)
42416       .nr(4)
42417       .kr(2)
42418       .sr(4)
42419       .m(4)
42420       .n(4)
42421       .k(8)
42422       .cn_stride(7)
42423       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42424   }
42425 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_eq_8_strided_a)42426   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_eq_8_strided_a) {
42427     TEST_REQUIRES_X86_SSE41;
42428     GemmMicrokernelTester()
42429       .extended_weights(true)
42430       .mr(4)
42431       .nr(4)
42432       .kr(2)
42433       .sr(4)
42434       .m(4)
42435       .n(4)
42436       .k(8)
42437       .a_stride(11)
42438       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42439   }
42440 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_eq_8_subtile)42441   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_eq_8_subtile) {
42442     TEST_REQUIRES_X86_SSE41;
42443     for (uint32_t n = 1; n <= 4; n++) {
42444       for (uint32_t m = 1; m <= 4; m++) {
42445         GemmMicrokernelTester()
42446           .extended_weights(true)
42447           .mr(4)
42448           .nr(4)
42449           .kr(2)
42450           .sr(4)
42451           .m(m)
42452           .n(n)
42453           .k(8)
42454           .iterations(1)
42455           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42456       }
42457     }
42458   }
42459 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_eq_8_subtile_m)42460   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_eq_8_subtile_m) {
42461     TEST_REQUIRES_X86_SSE41;
42462     for (uint32_t m = 1; m <= 4; m++) {
42463       GemmMicrokernelTester()
42464         .extended_weights(true)
42465         .mr(4)
42466         .nr(4)
42467         .kr(2)
42468         .sr(4)
42469         .m(m)
42470         .n(4)
42471         .k(8)
42472         .iterations(1)
42473         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42474     }
42475   }
42476 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_eq_8_subtile_n)42477   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_eq_8_subtile_n) {
42478     TEST_REQUIRES_X86_SSE41;
42479     for (uint32_t n = 1; n <= 4; n++) {
42480       GemmMicrokernelTester()
42481         .extended_weights(true)
42482         .mr(4)
42483         .nr(4)
42484         .kr(2)
42485         .sr(4)
42486         .m(4)
42487         .n(n)
42488         .k(8)
42489         .iterations(1)
42490         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42491     }
42492   }
42493 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_lt_8)42494   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_lt_8) {
42495     TEST_REQUIRES_X86_SSE41;
42496     for (size_t k = 1; k < 8; k++) {
42497       GemmMicrokernelTester()
42498         .extended_weights(true)
42499         .mr(4)
42500         .nr(4)
42501         .kr(2)
42502         .sr(4)
42503         .m(4)
42504         .n(4)
42505         .k(k)
42506         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42507     }
42508   }
42509 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_lt_8_strided_a)42510   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_lt_8_strided_a) {
42511     TEST_REQUIRES_X86_SSE41;
42512     for (size_t k = 1; k < 8; k++) {
42513       GemmMicrokernelTester()
42514         .extended_weights(true)
42515         .mr(4)
42516         .nr(4)
42517         .kr(2)
42518         .sr(4)
42519         .m(4)
42520         .n(4)
42521         .k(k)
42522         .a_stride(11)
42523         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42524     }
42525   }
42526 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_lt_8_subtile)42527   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_lt_8_subtile) {
42528     TEST_REQUIRES_X86_SSE41;
42529     for (size_t k = 1; k < 8; k++) {
42530       for (uint32_t n = 1; n <= 4; n++) {
42531         for (uint32_t m = 1; m <= 4; m++) {
42532           GemmMicrokernelTester()
42533             .extended_weights(true)
42534             .mr(4)
42535             .nr(4)
42536             .kr(2)
42537             .sr(4)
42538             .m(m)
42539             .n(n)
42540             .k(k)
42541             .iterations(1)
42542             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42543         }
42544       }
42545     }
42546   }
42547 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_gt_8)42548   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_gt_8) {
42549     TEST_REQUIRES_X86_SSE41;
42550     for (size_t k = 9; k < 16; k++) {
42551       GemmMicrokernelTester()
42552         .extended_weights(true)
42553         .mr(4)
42554         .nr(4)
42555         .kr(2)
42556         .sr(4)
42557         .m(4)
42558         .n(4)
42559         .k(k)
42560         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42561     }
42562   }
42563 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_gt_8_strided_a)42564   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_gt_8_strided_a) {
42565     TEST_REQUIRES_X86_SSE41;
42566     for (size_t k = 9; k < 16; k++) {
42567       GemmMicrokernelTester()
42568         .extended_weights(true)
42569         .mr(4)
42570         .nr(4)
42571         .kr(2)
42572         .sr(4)
42573         .m(4)
42574         .n(4)
42575         .k(k)
42576         .a_stride(19)
42577         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42578     }
42579   }
42580 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_gt_8_subtile)42581   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_gt_8_subtile) {
42582     TEST_REQUIRES_X86_SSE41;
42583     for (size_t k = 9; k < 16; k++) {
42584       for (uint32_t n = 1; n <= 4; n++) {
42585         for (uint32_t m = 1; m <= 4; m++) {
42586           GemmMicrokernelTester()
42587             .extended_weights(true)
42588             .mr(4)
42589             .nr(4)
42590             .kr(2)
42591             .sr(4)
42592             .m(m)
42593             .n(n)
42594             .k(k)
42595             .iterations(1)
42596             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42597         }
42598       }
42599     }
42600   }
42601 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_div_8)42602   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_div_8) {
42603     TEST_REQUIRES_X86_SSE41;
42604     for (size_t k = 16; k <= 80; k += 8) {
42605       GemmMicrokernelTester()
42606         .extended_weights(true)
42607         .mr(4)
42608         .nr(4)
42609         .kr(2)
42610         .sr(4)
42611         .m(4)
42612         .n(4)
42613         .k(k)
42614         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42615     }
42616   }
42617 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_div_8_strided_a)42618   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_div_8_strided_a) {
42619     TEST_REQUIRES_X86_SSE41;
42620     for (size_t k = 16; k <= 80; k += 8) {
42621       GemmMicrokernelTester()
42622         .extended_weights(true)
42623         .mr(4)
42624         .nr(4)
42625         .kr(2)
42626         .sr(4)
42627         .m(4)
42628         .n(4)
42629         .k(k)
42630         .a_stride(83)
42631         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42632     }
42633   }
42634 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,k_div_8_subtile)42635   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, k_div_8_subtile) {
42636     TEST_REQUIRES_X86_SSE41;
42637     for (size_t k = 16; k <= 80; k += 8) {
42638       for (uint32_t n = 1; n <= 4; n++) {
42639         for (uint32_t m = 1; m <= 4; m++) {
42640           GemmMicrokernelTester()
42641             .extended_weights(true)
42642             .mr(4)
42643             .nr(4)
42644             .kr(2)
42645             .sr(4)
42646             .m(m)
42647             .n(n)
42648             .k(k)
42649             .iterations(1)
42650             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42651         }
42652       }
42653     }
42654   }
42655 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_gt_4)42656   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_gt_4) {
42657     TEST_REQUIRES_X86_SSE41;
42658     for (uint32_t n = 5; n < 8; n++) {
42659       for (size_t k = 1; k <= 40; k += 9) {
42660         GemmMicrokernelTester()
42661           .extended_weights(true)
42662           .mr(4)
42663           .nr(4)
42664           .kr(2)
42665           .sr(4)
42666           .m(4)
42667           .n(n)
42668           .k(k)
42669           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42670       }
42671     }
42672   }
42673 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_gt_4_strided_cn)42674   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_gt_4_strided_cn) {
42675     TEST_REQUIRES_X86_SSE41;
42676     for (uint32_t n = 5; n < 8; n++) {
42677       for (size_t k = 1; k <= 40; k += 9) {
42678         GemmMicrokernelTester()
42679           .extended_weights(true)
42680           .mr(4)
42681           .nr(4)
42682           .kr(2)
42683           .sr(4)
42684           .m(4)
42685           .n(n)
42686           .k(k)
42687           .cn_stride(7)
42688           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42689       }
42690     }
42691   }
42692 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_gt_4_strided_a)42693   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_gt_4_strided_a) {
42694     TEST_REQUIRES_X86_SSE41;
42695     for (uint32_t n = 5; n < 8; n++) {
42696       for (size_t k = 1; k <= 40; k += 9) {
42697         GemmMicrokernelTester()
42698           .extended_weights(true)
42699           .mr(4)
42700           .nr(4)
42701           .kr(2)
42702           .sr(4)
42703           .m(4)
42704           .n(n)
42705           .k(k)
42706           .a_stride(43)
42707           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42708       }
42709     }
42710   }
42711 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_gt_4_subtile)42712   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_gt_4_subtile) {
42713     TEST_REQUIRES_X86_SSE41;
42714     for (uint32_t n = 5; n < 8; n++) {
42715       for (size_t k = 1; k <= 40; k += 9) {
42716         for (uint32_t m = 1; m <= 4; m++) {
42717           GemmMicrokernelTester()
42718             .extended_weights(true)
42719             .mr(4)
42720             .nr(4)
42721             .kr(2)
42722             .sr(4)
42723             .m(m)
42724             .n(n)
42725             .k(k)
42726             .iterations(1)
42727             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42728         }
42729       }
42730     }
42731   }
42732 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_div_4)42733   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_div_4) {
42734     TEST_REQUIRES_X86_SSE41;
42735     for (uint32_t n = 8; n <= 12; n += 4) {
42736       for (size_t k = 1; k <= 40; k += 9) {
42737         GemmMicrokernelTester()
42738           .extended_weights(true)
42739           .mr(4)
42740           .nr(4)
42741           .kr(2)
42742           .sr(4)
42743           .m(4)
42744           .n(n)
42745           .k(k)
42746           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42747       }
42748     }
42749   }
42750 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_div_4_strided_cn)42751   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_div_4_strided_cn) {
42752     TEST_REQUIRES_X86_SSE41;
42753     for (uint32_t n = 8; n <= 12; n += 4) {
42754       for (size_t k = 1; k <= 40; k += 9) {
42755         GemmMicrokernelTester()
42756           .extended_weights(true)
42757           .mr(4)
42758           .nr(4)
42759           .kr(2)
42760           .sr(4)
42761           .m(4)
42762           .n(n)
42763           .k(k)
42764           .cn_stride(7)
42765           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42766       }
42767     }
42768   }
42769 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_div_4_strided_a)42770   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_div_4_strided_a) {
42771     TEST_REQUIRES_X86_SSE41;
42772     for (uint32_t n = 8; n <= 12; n += 4) {
42773       for (size_t k = 1; k <= 40; k += 9) {
42774         GemmMicrokernelTester()
42775           .extended_weights(true)
42776           .mr(4)
42777           .nr(4)
42778           .kr(2)
42779           .sr(4)
42780           .m(4)
42781           .n(n)
42782           .k(k)
42783           .a_stride(43)
42784           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42785       }
42786     }
42787   }
42788 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,n_div_4_subtile)42789   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, n_div_4_subtile) {
42790     TEST_REQUIRES_X86_SSE41;
42791     for (uint32_t n = 8; n <= 12; n += 4) {
42792       for (size_t k = 1; k <= 40; k += 9) {
42793         for (uint32_t m = 1; m <= 4; m++) {
42794           GemmMicrokernelTester()
42795             .extended_weights(true)
42796             .mr(4)
42797             .nr(4)
42798             .kr(2)
42799             .sr(4)
42800             .m(m)
42801             .n(n)
42802             .k(k)
42803             .iterations(1)
42804             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42805         }
42806       }
42807     }
42808   }
42809 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,strided_cm_subtile)42810   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, strided_cm_subtile) {
42811     TEST_REQUIRES_X86_SSE41;
42812     for (size_t k = 1; k <= 40; k += 9) {
42813       for (uint32_t n = 1; n <= 4; n++) {
42814         for (uint32_t m = 1; m <= 4; m++) {
42815           GemmMicrokernelTester()
42816             .extended_weights(true)
42817             .mr(4)
42818             .nr(4)
42819             .kr(2)
42820             .sr(4)
42821             .m(m)
42822             .n(n)
42823             .k(k)
42824             .cm_stride(7)
42825             .iterations(1)
42826             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42827         }
42828       }
42829     }
42830   }
42831 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41,strided_cm)42832   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__SSE41, strided_cm) {
42833     TEST_REQUIRES_X86_SSE41;
42834     GemmMicrokernelTester()
42835       .extended_weights(true)
42836       .mr(4)
42837       .nr(4)
42838       .kr(2)
42839       .sr(4)
42840       .m(4)
42841       .n(4)
42842       .k(8)
42843       .cm_stride(7)
42844       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42845   }
42846 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
42847 
42848 
42849 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_eq_8)42850   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_eq_8) {
42851     TEST_REQUIRES_X86_XOP;
42852     GemmMicrokernelTester()
42853       .extended_weights(true)
42854       .mr(1)
42855       .nr(4)
42856       .kr(2)
42857       .sr(4)
42858       .m(1)
42859       .n(4)
42860       .k(8)
42861       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42862   }
42863 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,strided_cn)42864   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, strided_cn) {
42865     TEST_REQUIRES_X86_XOP;
42866     GemmMicrokernelTester()
42867       .extended_weights(true)
42868       .mr(1)
42869       .nr(4)
42870       .kr(2)
42871       .sr(4)
42872       .m(1)
42873       .n(4)
42874       .k(8)
42875       .cn_stride(7)
42876       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42877   }
42878 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_eq_8_strided_a)42879   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_eq_8_strided_a) {
42880     TEST_REQUIRES_X86_XOP;
42881     GemmMicrokernelTester()
42882       .extended_weights(true)
42883       .mr(1)
42884       .nr(4)
42885       .kr(2)
42886       .sr(4)
42887       .m(1)
42888       .n(4)
42889       .k(8)
42890       .a_stride(11)
42891       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42892   }
42893 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_eq_8_subtile)42894   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_eq_8_subtile) {
42895     TEST_REQUIRES_X86_XOP;
42896     for (uint32_t n = 1; n <= 4; n++) {
42897       for (uint32_t m = 1; m <= 1; m++) {
42898         GemmMicrokernelTester()
42899           .extended_weights(true)
42900           .mr(1)
42901           .nr(4)
42902           .kr(2)
42903           .sr(4)
42904           .m(m)
42905           .n(n)
42906           .k(8)
42907           .iterations(1)
42908           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42909       }
42910     }
42911   }
42912 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_eq_8_subtile_m)42913   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_eq_8_subtile_m) {
42914     TEST_REQUIRES_X86_XOP;
42915     for (uint32_t m = 1; m <= 1; m++) {
42916       GemmMicrokernelTester()
42917         .extended_weights(true)
42918         .mr(1)
42919         .nr(4)
42920         .kr(2)
42921         .sr(4)
42922         .m(m)
42923         .n(4)
42924         .k(8)
42925         .iterations(1)
42926         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42927     }
42928   }
42929 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_eq_8_subtile_n)42930   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_eq_8_subtile_n) {
42931     TEST_REQUIRES_X86_XOP;
42932     for (uint32_t n = 1; n <= 4; n++) {
42933       GemmMicrokernelTester()
42934         .extended_weights(true)
42935         .mr(1)
42936         .nr(4)
42937         .kr(2)
42938         .sr(4)
42939         .m(1)
42940         .n(n)
42941         .k(8)
42942         .iterations(1)
42943         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42944     }
42945   }
42946 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_lt_8)42947   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_lt_8) {
42948     TEST_REQUIRES_X86_XOP;
42949     for (size_t k = 1; k < 8; k++) {
42950       GemmMicrokernelTester()
42951         .extended_weights(true)
42952         .mr(1)
42953         .nr(4)
42954         .kr(2)
42955         .sr(4)
42956         .m(1)
42957         .n(4)
42958         .k(k)
42959         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42960     }
42961   }
42962 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_lt_8_strided_a)42963   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_lt_8_strided_a) {
42964     TEST_REQUIRES_X86_XOP;
42965     for (size_t k = 1; k < 8; k++) {
42966       GemmMicrokernelTester()
42967         .extended_weights(true)
42968         .mr(1)
42969         .nr(4)
42970         .kr(2)
42971         .sr(4)
42972         .m(1)
42973         .n(4)
42974         .k(k)
42975         .a_stride(11)
42976         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42977     }
42978   }
42979 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_lt_8_subtile)42980   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_lt_8_subtile) {
42981     TEST_REQUIRES_X86_XOP;
42982     for (size_t k = 1; k < 8; k++) {
42983       for (uint32_t n = 1; n <= 4; n++) {
42984         for (uint32_t m = 1; m <= 1; m++) {
42985           GemmMicrokernelTester()
42986             .extended_weights(true)
42987             .mr(1)
42988             .nr(4)
42989             .kr(2)
42990             .sr(4)
42991             .m(m)
42992             .n(n)
42993             .k(k)
42994             .iterations(1)
42995             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
42996         }
42997       }
42998     }
42999   }
43000 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_gt_8)43001   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_gt_8) {
43002     TEST_REQUIRES_X86_XOP;
43003     for (size_t k = 9; k < 16; k++) {
43004       GemmMicrokernelTester()
43005         .extended_weights(true)
43006         .mr(1)
43007         .nr(4)
43008         .kr(2)
43009         .sr(4)
43010         .m(1)
43011         .n(4)
43012         .k(k)
43013         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43014     }
43015   }
43016 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_gt_8_strided_a)43017   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_gt_8_strided_a) {
43018     TEST_REQUIRES_X86_XOP;
43019     for (size_t k = 9; k < 16; k++) {
43020       GemmMicrokernelTester()
43021         .extended_weights(true)
43022         .mr(1)
43023         .nr(4)
43024         .kr(2)
43025         .sr(4)
43026         .m(1)
43027         .n(4)
43028         .k(k)
43029         .a_stride(19)
43030         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43031     }
43032   }
43033 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_gt_8_subtile)43034   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_gt_8_subtile) {
43035     TEST_REQUIRES_X86_XOP;
43036     for (size_t k = 9; k < 16; k++) {
43037       for (uint32_t n = 1; n <= 4; n++) {
43038         for (uint32_t m = 1; m <= 1; m++) {
43039           GemmMicrokernelTester()
43040             .extended_weights(true)
43041             .mr(1)
43042             .nr(4)
43043             .kr(2)
43044             .sr(4)
43045             .m(m)
43046             .n(n)
43047             .k(k)
43048             .iterations(1)
43049             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43050         }
43051       }
43052     }
43053   }
43054 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_div_8)43055   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_div_8) {
43056     TEST_REQUIRES_X86_XOP;
43057     for (size_t k = 16; k <= 80; k += 8) {
43058       GemmMicrokernelTester()
43059         .extended_weights(true)
43060         .mr(1)
43061         .nr(4)
43062         .kr(2)
43063         .sr(4)
43064         .m(1)
43065         .n(4)
43066         .k(k)
43067         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43068     }
43069   }
43070 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_div_8_strided_a)43071   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_div_8_strided_a) {
43072     TEST_REQUIRES_X86_XOP;
43073     for (size_t k = 16; k <= 80; k += 8) {
43074       GemmMicrokernelTester()
43075         .extended_weights(true)
43076         .mr(1)
43077         .nr(4)
43078         .kr(2)
43079         .sr(4)
43080         .m(1)
43081         .n(4)
43082         .k(k)
43083         .a_stride(83)
43084         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43085     }
43086   }
43087 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,k_div_8_subtile)43088   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, k_div_8_subtile) {
43089     TEST_REQUIRES_X86_XOP;
43090     for (size_t k = 16; k <= 80; k += 8) {
43091       for (uint32_t n = 1; n <= 4; n++) {
43092         for (uint32_t m = 1; m <= 1; m++) {
43093           GemmMicrokernelTester()
43094             .extended_weights(true)
43095             .mr(1)
43096             .nr(4)
43097             .kr(2)
43098             .sr(4)
43099             .m(m)
43100             .n(n)
43101             .k(k)
43102             .iterations(1)
43103             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43104         }
43105       }
43106     }
43107   }
43108 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_gt_4)43109   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_gt_4) {
43110     TEST_REQUIRES_X86_XOP;
43111     for (uint32_t n = 5; n < 8; n++) {
43112       for (size_t k = 1; k <= 40; k += 9) {
43113         GemmMicrokernelTester()
43114           .extended_weights(true)
43115           .mr(1)
43116           .nr(4)
43117           .kr(2)
43118           .sr(4)
43119           .m(1)
43120           .n(n)
43121           .k(k)
43122           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43123       }
43124     }
43125   }
43126 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_gt_4_strided_cn)43127   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_gt_4_strided_cn) {
43128     TEST_REQUIRES_X86_XOP;
43129     for (uint32_t n = 5; n < 8; n++) {
43130       for (size_t k = 1; k <= 40; k += 9) {
43131         GemmMicrokernelTester()
43132           .extended_weights(true)
43133           .mr(1)
43134           .nr(4)
43135           .kr(2)
43136           .sr(4)
43137           .m(1)
43138           .n(n)
43139           .k(k)
43140           .cn_stride(7)
43141           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43142       }
43143     }
43144   }
43145 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_gt_4_strided_a)43146   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_gt_4_strided_a) {
43147     TEST_REQUIRES_X86_XOP;
43148     for (uint32_t n = 5; n < 8; n++) {
43149       for (size_t k = 1; k <= 40; k += 9) {
43150         GemmMicrokernelTester()
43151           .extended_weights(true)
43152           .mr(1)
43153           .nr(4)
43154           .kr(2)
43155           .sr(4)
43156           .m(1)
43157           .n(n)
43158           .k(k)
43159           .a_stride(43)
43160           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43161       }
43162     }
43163   }
43164 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_gt_4_subtile)43165   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_gt_4_subtile) {
43166     TEST_REQUIRES_X86_XOP;
43167     for (uint32_t n = 5; n < 8; n++) {
43168       for (size_t k = 1; k <= 40; k += 9) {
43169         for (uint32_t m = 1; m <= 1; m++) {
43170           GemmMicrokernelTester()
43171             .extended_weights(true)
43172             .mr(1)
43173             .nr(4)
43174             .kr(2)
43175             .sr(4)
43176             .m(m)
43177             .n(n)
43178             .k(k)
43179             .iterations(1)
43180             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43181         }
43182       }
43183     }
43184   }
43185 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_div_4)43186   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_div_4) {
43187     TEST_REQUIRES_X86_XOP;
43188     for (uint32_t n = 8; n <= 12; n += 4) {
43189       for (size_t k = 1; k <= 40; k += 9) {
43190         GemmMicrokernelTester()
43191           .extended_weights(true)
43192           .mr(1)
43193           .nr(4)
43194           .kr(2)
43195           .sr(4)
43196           .m(1)
43197           .n(n)
43198           .k(k)
43199           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43200       }
43201     }
43202   }
43203 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_div_4_strided_cn)43204   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_div_4_strided_cn) {
43205     TEST_REQUIRES_X86_XOP;
43206     for (uint32_t n = 8; n <= 12; n += 4) {
43207       for (size_t k = 1; k <= 40; k += 9) {
43208         GemmMicrokernelTester()
43209           .extended_weights(true)
43210           .mr(1)
43211           .nr(4)
43212           .kr(2)
43213           .sr(4)
43214           .m(1)
43215           .n(n)
43216           .k(k)
43217           .cn_stride(7)
43218           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43219       }
43220     }
43221   }
43222 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_div_4_strided_a)43223   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_div_4_strided_a) {
43224     TEST_REQUIRES_X86_XOP;
43225     for (uint32_t n = 8; n <= 12; n += 4) {
43226       for (size_t k = 1; k <= 40; k += 9) {
43227         GemmMicrokernelTester()
43228           .extended_weights(true)
43229           .mr(1)
43230           .nr(4)
43231           .kr(2)
43232           .sr(4)
43233           .m(1)
43234           .n(n)
43235           .k(k)
43236           .a_stride(43)
43237           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43238       }
43239     }
43240   }
43241 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,n_div_4_subtile)43242   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, n_div_4_subtile) {
43243     TEST_REQUIRES_X86_XOP;
43244     for (uint32_t n = 8; n <= 12; n += 4) {
43245       for (size_t k = 1; k <= 40; k += 9) {
43246         for (uint32_t m = 1; m <= 1; m++) {
43247           GemmMicrokernelTester()
43248             .extended_weights(true)
43249             .mr(1)
43250             .nr(4)
43251             .kr(2)
43252             .sr(4)
43253             .m(m)
43254             .n(n)
43255             .k(k)
43256             .iterations(1)
43257             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43258         }
43259       }
43260     }
43261   }
43262 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,strided_cm_subtile)43263   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, strided_cm_subtile) {
43264     TEST_REQUIRES_X86_XOP;
43265     for (size_t k = 1; k <= 40; k += 9) {
43266       for (uint32_t n = 1; n <= 4; n++) {
43267         for (uint32_t m = 1; m <= 1; m++) {
43268           GemmMicrokernelTester()
43269             .extended_weights(true)
43270             .mr(1)
43271             .nr(4)
43272             .kr(2)
43273             .sr(4)
43274             .m(m)
43275             .n(n)
43276             .k(k)
43277             .cm_stride(7)
43278             .iterations(1)
43279             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43280         }
43281       }
43282     }
43283   }
43284 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP,strided_cm)43285   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C2S4__XOP, strided_cm) {
43286     TEST_REQUIRES_X86_XOP;
43287     GemmMicrokernelTester()
43288       .extended_weights(true)
43289       .mr(1)
43290       .nr(4)
43291       .kr(2)
43292       .sr(4)
43293       .m(1)
43294       .n(4)
43295       .k(8)
43296       .cm_stride(7)
43297       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43298   }
43299 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
43300 
43301 
43302 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_eq_8)43303   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_eq_8) {
43304     TEST_REQUIRES_X86_XOP;
43305     GemmMicrokernelTester()
43306       .extended_weights(true)
43307       .mr(2)
43308       .nr(4)
43309       .kr(2)
43310       .sr(4)
43311       .m(2)
43312       .n(4)
43313       .k(8)
43314       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43315   }
43316 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,strided_cn)43317   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, strided_cn) {
43318     TEST_REQUIRES_X86_XOP;
43319     GemmMicrokernelTester()
43320       .extended_weights(true)
43321       .mr(2)
43322       .nr(4)
43323       .kr(2)
43324       .sr(4)
43325       .m(2)
43326       .n(4)
43327       .k(8)
43328       .cn_stride(7)
43329       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43330   }
43331 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_eq_8_strided_a)43332   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_eq_8_strided_a) {
43333     TEST_REQUIRES_X86_XOP;
43334     GemmMicrokernelTester()
43335       .extended_weights(true)
43336       .mr(2)
43337       .nr(4)
43338       .kr(2)
43339       .sr(4)
43340       .m(2)
43341       .n(4)
43342       .k(8)
43343       .a_stride(11)
43344       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43345   }
43346 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_eq_8_subtile)43347   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_eq_8_subtile) {
43348     TEST_REQUIRES_X86_XOP;
43349     for (uint32_t n = 1; n <= 4; n++) {
43350       for (uint32_t m = 1; m <= 2; m++) {
43351         GemmMicrokernelTester()
43352           .extended_weights(true)
43353           .mr(2)
43354           .nr(4)
43355           .kr(2)
43356           .sr(4)
43357           .m(m)
43358           .n(n)
43359           .k(8)
43360           .iterations(1)
43361           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43362       }
43363     }
43364   }
43365 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_eq_8_subtile_m)43366   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_eq_8_subtile_m) {
43367     TEST_REQUIRES_X86_XOP;
43368     for (uint32_t m = 1; m <= 2; m++) {
43369       GemmMicrokernelTester()
43370         .extended_weights(true)
43371         .mr(2)
43372         .nr(4)
43373         .kr(2)
43374         .sr(4)
43375         .m(m)
43376         .n(4)
43377         .k(8)
43378         .iterations(1)
43379         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43380     }
43381   }
43382 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_eq_8_subtile_n)43383   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_eq_8_subtile_n) {
43384     TEST_REQUIRES_X86_XOP;
43385     for (uint32_t n = 1; n <= 4; n++) {
43386       GemmMicrokernelTester()
43387         .extended_weights(true)
43388         .mr(2)
43389         .nr(4)
43390         .kr(2)
43391         .sr(4)
43392         .m(2)
43393         .n(n)
43394         .k(8)
43395         .iterations(1)
43396         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43397     }
43398   }
43399 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_lt_8)43400   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_lt_8) {
43401     TEST_REQUIRES_X86_XOP;
43402     for (size_t k = 1; k < 8; k++) {
43403       GemmMicrokernelTester()
43404         .extended_weights(true)
43405         .mr(2)
43406         .nr(4)
43407         .kr(2)
43408         .sr(4)
43409         .m(2)
43410         .n(4)
43411         .k(k)
43412         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43413     }
43414   }
43415 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_lt_8_strided_a)43416   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_lt_8_strided_a) {
43417     TEST_REQUIRES_X86_XOP;
43418     for (size_t k = 1; k < 8; k++) {
43419       GemmMicrokernelTester()
43420         .extended_weights(true)
43421         .mr(2)
43422         .nr(4)
43423         .kr(2)
43424         .sr(4)
43425         .m(2)
43426         .n(4)
43427         .k(k)
43428         .a_stride(11)
43429         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43430     }
43431   }
43432 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_lt_8_subtile)43433   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_lt_8_subtile) {
43434     TEST_REQUIRES_X86_XOP;
43435     for (size_t k = 1; k < 8; k++) {
43436       for (uint32_t n = 1; n <= 4; n++) {
43437         for (uint32_t m = 1; m <= 2; m++) {
43438           GemmMicrokernelTester()
43439             .extended_weights(true)
43440             .mr(2)
43441             .nr(4)
43442             .kr(2)
43443             .sr(4)
43444             .m(m)
43445             .n(n)
43446             .k(k)
43447             .iterations(1)
43448             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43449         }
43450       }
43451     }
43452   }
43453 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_gt_8)43454   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_gt_8) {
43455     TEST_REQUIRES_X86_XOP;
43456     for (size_t k = 9; k < 16; k++) {
43457       GemmMicrokernelTester()
43458         .extended_weights(true)
43459         .mr(2)
43460         .nr(4)
43461         .kr(2)
43462         .sr(4)
43463         .m(2)
43464         .n(4)
43465         .k(k)
43466         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43467     }
43468   }
43469 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_gt_8_strided_a)43470   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_gt_8_strided_a) {
43471     TEST_REQUIRES_X86_XOP;
43472     for (size_t k = 9; k < 16; k++) {
43473       GemmMicrokernelTester()
43474         .extended_weights(true)
43475         .mr(2)
43476         .nr(4)
43477         .kr(2)
43478         .sr(4)
43479         .m(2)
43480         .n(4)
43481         .k(k)
43482         .a_stride(19)
43483         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43484     }
43485   }
43486 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_gt_8_subtile)43487   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_gt_8_subtile) {
43488     TEST_REQUIRES_X86_XOP;
43489     for (size_t k = 9; k < 16; k++) {
43490       for (uint32_t n = 1; n <= 4; n++) {
43491         for (uint32_t m = 1; m <= 2; m++) {
43492           GemmMicrokernelTester()
43493             .extended_weights(true)
43494             .mr(2)
43495             .nr(4)
43496             .kr(2)
43497             .sr(4)
43498             .m(m)
43499             .n(n)
43500             .k(k)
43501             .iterations(1)
43502             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43503         }
43504       }
43505     }
43506   }
43507 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_div_8)43508   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_div_8) {
43509     TEST_REQUIRES_X86_XOP;
43510     for (size_t k = 16; k <= 80; k += 8) {
43511       GemmMicrokernelTester()
43512         .extended_weights(true)
43513         .mr(2)
43514         .nr(4)
43515         .kr(2)
43516         .sr(4)
43517         .m(2)
43518         .n(4)
43519         .k(k)
43520         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43521     }
43522   }
43523 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_div_8_strided_a)43524   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_div_8_strided_a) {
43525     TEST_REQUIRES_X86_XOP;
43526     for (size_t k = 16; k <= 80; k += 8) {
43527       GemmMicrokernelTester()
43528         .extended_weights(true)
43529         .mr(2)
43530         .nr(4)
43531         .kr(2)
43532         .sr(4)
43533         .m(2)
43534         .n(4)
43535         .k(k)
43536         .a_stride(83)
43537         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43538     }
43539   }
43540 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,k_div_8_subtile)43541   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, k_div_8_subtile) {
43542     TEST_REQUIRES_X86_XOP;
43543     for (size_t k = 16; k <= 80; k += 8) {
43544       for (uint32_t n = 1; n <= 4; n++) {
43545         for (uint32_t m = 1; m <= 2; m++) {
43546           GemmMicrokernelTester()
43547             .extended_weights(true)
43548             .mr(2)
43549             .nr(4)
43550             .kr(2)
43551             .sr(4)
43552             .m(m)
43553             .n(n)
43554             .k(k)
43555             .iterations(1)
43556             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43557         }
43558       }
43559     }
43560   }
43561 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_gt_4)43562   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_gt_4) {
43563     TEST_REQUIRES_X86_XOP;
43564     for (uint32_t n = 5; n < 8; n++) {
43565       for (size_t k = 1; k <= 40; k += 9) {
43566         GemmMicrokernelTester()
43567           .extended_weights(true)
43568           .mr(2)
43569           .nr(4)
43570           .kr(2)
43571           .sr(4)
43572           .m(2)
43573           .n(n)
43574           .k(k)
43575           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43576       }
43577     }
43578   }
43579 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_gt_4_strided_cn)43580   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_gt_4_strided_cn) {
43581     TEST_REQUIRES_X86_XOP;
43582     for (uint32_t n = 5; n < 8; n++) {
43583       for (size_t k = 1; k <= 40; k += 9) {
43584         GemmMicrokernelTester()
43585           .extended_weights(true)
43586           .mr(2)
43587           .nr(4)
43588           .kr(2)
43589           .sr(4)
43590           .m(2)
43591           .n(n)
43592           .k(k)
43593           .cn_stride(7)
43594           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43595       }
43596     }
43597   }
43598 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_gt_4_strided_a)43599   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_gt_4_strided_a) {
43600     TEST_REQUIRES_X86_XOP;
43601     for (uint32_t n = 5; n < 8; n++) {
43602       for (size_t k = 1; k <= 40; k += 9) {
43603         GemmMicrokernelTester()
43604           .extended_weights(true)
43605           .mr(2)
43606           .nr(4)
43607           .kr(2)
43608           .sr(4)
43609           .m(2)
43610           .n(n)
43611           .k(k)
43612           .a_stride(43)
43613           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43614       }
43615     }
43616   }
43617 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_gt_4_subtile)43618   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_gt_4_subtile) {
43619     TEST_REQUIRES_X86_XOP;
43620     for (uint32_t n = 5; n < 8; n++) {
43621       for (size_t k = 1; k <= 40; k += 9) {
43622         for (uint32_t m = 1; m <= 2; m++) {
43623           GemmMicrokernelTester()
43624             .extended_weights(true)
43625             .mr(2)
43626             .nr(4)
43627             .kr(2)
43628             .sr(4)
43629             .m(m)
43630             .n(n)
43631             .k(k)
43632             .iterations(1)
43633             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43634         }
43635       }
43636     }
43637   }
43638 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_div_4)43639   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_div_4) {
43640     TEST_REQUIRES_X86_XOP;
43641     for (uint32_t n = 8; n <= 12; n += 4) {
43642       for (size_t k = 1; k <= 40; k += 9) {
43643         GemmMicrokernelTester()
43644           .extended_weights(true)
43645           .mr(2)
43646           .nr(4)
43647           .kr(2)
43648           .sr(4)
43649           .m(2)
43650           .n(n)
43651           .k(k)
43652           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43653       }
43654     }
43655   }
43656 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_div_4_strided_cn)43657   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_div_4_strided_cn) {
43658     TEST_REQUIRES_X86_XOP;
43659     for (uint32_t n = 8; n <= 12; n += 4) {
43660       for (size_t k = 1; k <= 40; k += 9) {
43661         GemmMicrokernelTester()
43662           .extended_weights(true)
43663           .mr(2)
43664           .nr(4)
43665           .kr(2)
43666           .sr(4)
43667           .m(2)
43668           .n(n)
43669           .k(k)
43670           .cn_stride(7)
43671           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43672       }
43673     }
43674   }
43675 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_div_4_strided_a)43676   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_div_4_strided_a) {
43677     TEST_REQUIRES_X86_XOP;
43678     for (uint32_t n = 8; n <= 12; n += 4) {
43679       for (size_t k = 1; k <= 40; k += 9) {
43680         GemmMicrokernelTester()
43681           .extended_weights(true)
43682           .mr(2)
43683           .nr(4)
43684           .kr(2)
43685           .sr(4)
43686           .m(2)
43687           .n(n)
43688           .k(k)
43689           .a_stride(43)
43690           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43691       }
43692     }
43693   }
43694 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,n_div_4_subtile)43695   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, n_div_4_subtile) {
43696     TEST_REQUIRES_X86_XOP;
43697     for (uint32_t n = 8; n <= 12; n += 4) {
43698       for (size_t k = 1; k <= 40; k += 9) {
43699         for (uint32_t m = 1; m <= 2; m++) {
43700           GemmMicrokernelTester()
43701             .extended_weights(true)
43702             .mr(2)
43703             .nr(4)
43704             .kr(2)
43705             .sr(4)
43706             .m(m)
43707             .n(n)
43708             .k(k)
43709             .iterations(1)
43710             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43711         }
43712       }
43713     }
43714   }
43715 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,strided_cm_subtile)43716   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, strided_cm_subtile) {
43717     TEST_REQUIRES_X86_XOP;
43718     for (size_t k = 1; k <= 40; k += 9) {
43719       for (uint32_t n = 1; n <= 4; n++) {
43720         for (uint32_t m = 1; m <= 2; m++) {
43721           GemmMicrokernelTester()
43722             .extended_weights(true)
43723             .mr(2)
43724             .nr(4)
43725             .kr(2)
43726             .sr(4)
43727             .m(m)
43728             .n(n)
43729             .k(k)
43730             .cm_stride(7)
43731             .iterations(1)
43732             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43733         }
43734       }
43735     }
43736   }
43737 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP,strided_cm)43738   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2S4__XOP, strided_cm) {
43739     TEST_REQUIRES_X86_XOP;
43740     GemmMicrokernelTester()
43741       .extended_weights(true)
43742       .mr(2)
43743       .nr(4)
43744       .kr(2)
43745       .sr(4)
43746       .m(2)
43747       .n(4)
43748       .k(8)
43749       .cm_stride(7)
43750       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43751   }
43752 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
43753 
43754 
43755 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_eq_8)43756   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_eq_8) {
43757     TEST_REQUIRES_X86_AVX;
43758     GemmMicrokernelTester()
43759       .extended_weights(true)
43760       .mr(3)
43761       .nr(4)
43762       .kr(2)
43763       .sr(4)
43764       .m(3)
43765       .n(4)
43766       .k(8)
43767       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43768   }
43769 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,strided_cn)43770   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, strided_cn) {
43771     TEST_REQUIRES_X86_AVX;
43772     GemmMicrokernelTester()
43773       .extended_weights(true)
43774       .mr(3)
43775       .nr(4)
43776       .kr(2)
43777       .sr(4)
43778       .m(3)
43779       .n(4)
43780       .k(8)
43781       .cn_stride(7)
43782       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43783   }
43784 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_eq_8_strided_a)43785   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_eq_8_strided_a) {
43786     TEST_REQUIRES_X86_AVX;
43787     GemmMicrokernelTester()
43788       .extended_weights(true)
43789       .mr(3)
43790       .nr(4)
43791       .kr(2)
43792       .sr(4)
43793       .m(3)
43794       .n(4)
43795       .k(8)
43796       .a_stride(11)
43797       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43798   }
43799 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_eq_8_subtile)43800   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_eq_8_subtile) {
43801     TEST_REQUIRES_X86_AVX;
43802     for (uint32_t n = 1; n <= 4; n++) {
43803       for (uint32_t m = 1; m <= 3; m++) {
43804         GemmMicrokernelTester()
43805           .extended_weights(true)
43806           .mr(3)
43807           .nr(4)
43808           .kr(2)
43809           .sr(4)
43810           .m(m)
43811           .n(n)
43812           .k(8)
43813           .iterations(1)
43814           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43815       }
43816     }
43817   }
43818 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_eq_8_subtile_m)43819   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_eq_8_subtile_m) {
43820     TEST_REQUIRES_X86_AVX;
43821     for (uint32_t m = 1; m <= 3; m++) {
43822       GemmMicrokernelTester()
43823         .extended_weights(true)
43824         .mr(3)
43825         .nr(4)
43826         .kr(2)
43827         .sr(4)
43828         .m(m)
43829         .n(4)
43830         .k(8)
43831         .iterations(1)
43832         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43833     }
43834   }
43835 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_eq_8_subtile_n)43836   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_eq_8_subtile_n) {
43837     TEST_REQUIRES_X86_AVX;
43838     for (uint32_t n = 1; n <= 4; n++) {
43839       GemmMicrokernelTester()
43840         .extended_weights(true)
43841         .mr(3)
43842         .nr(4)
43843         .kr(2)
43844         .sr(4)
43845         .m(3)
43846         .n(n)
43847         .k(8)
43848         .iterations(1)
43849         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43850     }
43851   }
43852 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_lt_8)43853   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_lt_8) {
43854     TEST_REQUIRES_X86_AVX;
43855     for (size_t k = 1; k < 8; k++) {
43856       GemmMicrokernelTester()
43857         .extended_weights(true)
43858         .mr(3)
43859         .nr(4)
43860         .kr(2)
43861         .sr(4)
43862         .m(3)
43863         .n(4)
43864         .k(k)
43865         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43866     }
43867   }
43868 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_lt_8_strided_a)43869   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_lt_8_strided_a) {
43870     TEST_REQUIRES_X86_AVX;
43871     for (size_t k = 1; k < 8; k++) {
43872       GemmMicrokernelTester()
43873         .extended_weights(true)
43874         .mr(3)
43875         .nr(4)
43876         .kr(2)
43877         .sr(4)
43878         .m(3)
43879         .n(4)
43880         .k(k)
43881         .a_stride(11)
43882         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43883     }
43884   }
43885 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_lt_8_subtile)43886   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_lt_8_subtile) {
43887     TEST_REQUIRES_X86_AVX;
43888     for (size_t k = 1; k < 8; k++) {
43889       for (uint32_t n = 1; n <= 4; n++) {
43890         for (uint32_t m = 1; m <= 3; m++) {
43891           GemmMicrokernelTester()
43892             .extended_weights(true)
43893             .mr(3)
43894             .nr(4)
43895             .kr(2)
43896             .sr(4)
43897             .m(m)
43898             .n(n)
43899             .k(k)
43900             .iterations(1)
43901             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43902         }
43903       }
43904     }
43905   }
43906 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_gt_8)43907   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_gt_8) {
43908     TEST_REQUIRES_X86_AVX;
43909     for (size_t k = 9; k < 16; k++) {
43910       GemmMicrokernelTester()
43911         .extended_weights(true)
43912         .mr(3)
43913         .nr(4)
43914         .kr(2)
43915         .sr(4)
43916         .m(3)
43917         .n(4)
43918         .k(k)
43919         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43920     }
43921   }
43922 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_gt_8_strided_a)43923   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_gt_8_strided_a) {
43924     TEST_REQUIRES_X86_AVX;
43925     for (size_t k = 9; k < 16; k++) {
43926       GemmMicrokernelTester()
43927         .extended_weights(true)
43928         .mr(3)
43929         .nr(4)
43930         .kr(2)
43931         .sr(4)
43932         .m(3)
43933         .n(4)
43934         .k(k)
43935         .a_stride(19)
43936         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43937     }
43938   }
43939 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_gt_8_subtile)43940   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_gt_8_subtile) {
43941     TEST_REQUIRES_X86_AVX;
43942     for (size_t k = 9; k < 16; k++) {
43943       for (uint32_t n = 1; n <= 4; n++) {
43944         for (uint32_t m = 1; m <= 3; m++) {
43945           GemmMicrokernelTester()
43946             .extended_weights(true)
43947             .mr(3)
43948             .nr(4)
43949             .kr(2)
43950             .sr(4)
43951             .m(m)
43952             .n(n)
43953             .k(k)
43954             .iterations(1)
43955             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43956         }
43957       }
43958     }
43959   }
43960 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_div_8)43961   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_div_8) {
43962     TEST_REQUIRES_X86_AVX;
43963     for (size_t k = 16; k <= 80; k += 8) {
43964       GemmMicrokernelTester()
43965         .extended_weights(true)
43966         .mr(3)
43967         .nr(4)
43968         .kr(2)
43969         .sr(4)
43970         .m(3)
43971         .n(4)
43972         .k(k)
43973         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43974     }
43975   }
43976 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_div_8_strided_a)43977   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_div_8_strided_a) {
43978     TEST_REQUIRES_X86_AVX;
43979     for (size_t k = 16; k <= 80; k += 8) {
43980       GemmMicrokernelTester()
43981         .extended_weights(true)
43982         .mr(3)
43983         .nr(4)
43984         .kr(2)
43985         .sr(4)
43986         .m(3)
43987         .n(4)
43988         .k(k)
43989         .a_stride(83)
43990         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
43991     }
43992   }
43993 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,k_div_8_subtile)43994   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, k_div_8_subtile) {
43995     TEST_REQUIRES_X86_AVX;
43996     for (size_t k = 16; k <= 80; k += 8) {
43997       for (uint32_t n = 1; n <= 4; n++) {
43998         for (uint32_t m = 1; m <= 3; m++) {
43999           GemmMicrokernelTester()
44000             .extended_weights(true)
44001             .mr(3)
44002             .nr(4)
44003             .kr(2)
44004             .sr(4)
44005             .m(m)
44006             .n(n)
44007             .k(k)
44008             .iterations(1)
44009             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44010         }
44011       }
44012     }
44013   }
44014 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_gt_4)44015   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_gt_4) {
44016     TEST_REQUIRES_X86_AVX;
44017     for (uint32_t n = 5; n < 8; n++) {
44018       for (size_t k = 1; k <= 40; k += 9) {
44019         GemmMicrokernelTester()
44020           .extended_weights(true)
44021           .mr(3)
44022           .nr(4)
44023           .kr(2)
44024           .sr(4)
44025           .m(3)
44026           .n(n)
44027           .k(k)
44028           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44029       }
44030     }
44031   }
44032 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_gt_4_strided_cn)44033   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_gt_4_strided_cn) {
44034     TEST_REQUIRES_X86_AVX;
44035     for (uint32_t n = 5; n < 8; n++) {
44036       for (size_t k = 1; k <= 40; k += 9) {
44037         GemmMicrokernelTester()
44038           .extended_weights(true)
44039           .mr(3)
44040           .nr(4)
44041           .kr(2)
44042           .sr(4)
44043           .m(3)
44044           .n(n)
44045           .k(k)
44046           .cn_stride(7)
44047           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44048       }
44049     }
44050   }
44051 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_gt_4_strided_a)44052   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_gt_4_strided_a) {
44053     TEST_REQUIRES_X86_AVX;
44054     for (uint32_t n = 5; n < 8; n++) {
44055       for (size_t k = 1; k <= 40; k += 9) {
44056         GemmMicrokernelTester()
44057           .extended_weights(true)
44058           .mr(3)
44059           .nr(4)
44060           .kr(2)
44061           .sr(4)
44062           .m(3)
44063           .n(n)
44064           .k(k)
44065           .a_stride(43)
44066           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44067       }
44068     }
44069   }
44070 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_gt_4_subtile)44071   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_gt_4_subtile) {
44072     TEST_REQUIRES_X86_AVX;
44073     for (uint32_t n = 5; n < 8; n++) {
44074       for (size_t k = 1; k <= 40; k += 9) {
44075         for (uint32_t m = 1; m <= 3; m++) {
44076           GemmMicrokernelTester()
44077             .extended_weights(true)
44078             .mr(3)
44079             .nr(4)
44080             .kr(2)
44081             .sr(4)
44082             .m(m)
44083             .n(n)
44084             .k(k)
44085             .iterations(1)
44086             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44087         }
44088       }
44089     }
44090   }
44091 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_div_4)44092   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_div_4) {
44093     TEST_REQUIRES_X86_AVX;
44094     for (uint32_t n = 8; n <= 12; n += 4) {
44095       for (size_t k = 1; k <= 40; k += 9) {
44096         GemmMicrokernelTester()
44097           .extended_weights(true)
44098           .mr(3)
44099           .nr(4)
44100           .kr(2)
44101           .sr(4)
44102           .m(3)
44103           .n(n)
44104           .k(k)
44105           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44106       }
44107     }
44108   }
44109 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_div_4_strided_cn)44110   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_div_4_strided_cn) {
44111     TEST_REQUIRES_X86_AVX;
44112     for (uint32_t n = 8; n <= 12; n += 4) {
44113       for (size_t k = 1; k <= 40; k += 9) {
44114         GemmMicrokernelTester()
44115           .extended_weights(true)
44116           .mr(3)
44117           .nr(4)
44118           .kr(2)
44119           .sr(4)
44120           .m(3)
44121           .n(n)
44122           .k(k)
44123           .cn_stride(7)
44124           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44125       }
44126     }
44127   }
44128 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_div_4_strided_a)44129   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_div_4_strided_a) {
44130     TEST_REQUIRES_X86_AVX;
44131     for (uint32_t n = 8; n <= 12; n += 4) {
44132       for (size_t k = 1; k <= 40; k += 9) {
44133         GemmMicrokernelTester()
44134           .extended_weights(true)
44135           .mr(3)
44136           .nr(4)
44137           .kr(2)
44138           .sr(4)
44139           .m(3)
44140           .n(n)
44141           .k(k)
44142           .a_stride(43)
44143           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44144       }
44145     }
44146   }
44147 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,n_div_4_subtile)44148   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, n_div_4_subtile) {
44149     TEST_REQUIRES_X86_AVX;
44150     for (uint32_t n = 8; n <= 12; n += 4) {
44151       for (size_t k = 1; k <= 40; k += 9) {
44152         for (uint32_t m = 1; m <= 3; m++) {
44153           GemmMicrokernelTester()
44154             .extended_weights(true)
44155             .mr(3)
44156             .nr(4)
44157             .kr(2)
44158             .sr(4)
44159             .m(m)
44160             .n(n)
44161             .k(k)
44162             .iterations(1)
44163             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44164         }
44165       }
44166     }
44167   }
44168 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,strided_cm_subtile)44169   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, strided_cm_subtile) {
44170     TEST_REQUIRES_X86_AVX;
44171     for (size_t k = 1; k <= 40; k += 9) {
44172       for (uint32_t n = 1; n <= 4; n++) {
44173         for (uint32_t m = 1; m <= 3; m++) {
44174           GemmMicrokernelTester()
44175             .extended_weights(true)
44176             .mr(3)
44177             .nr(4)
44178             .kr(2)
44179             .sr(4)
44180             .m(m)
44181             .n(n)
44182             .k(k)
44183             .cm_stride(7)
44184             .iterations(1)
44185             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44186         }
44187       }
44188     }
44189   }
44190 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX,strided_cm)44191   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2S4__AVX, strided_cm) {
44192     TEST_REQUIRES_X86_AVX;
44193     GemmMicrokernelTester()
44194       .extended_weights(true)
44195       .mr(3)
44196       .nr(4)
44197       .kr(2)
44198       .sr(4)
44199       .m(3)
44200       .n(4)
44201       .k(8)
44202       .cm_stride(7)
44203       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2s4__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44204   }
44205 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
44206 
44207 
44208 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_eq_8)44209   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_eq_8) {
44210     TEST_REQUIRES_X86_XOP;
44211     GemmMicrokernelTester()
44212       .extended_weights(true)
44213       .mr(4)
44214       .nr(4)
44215       .kr(2)
44216       .sr(4)
44217       .m(4)
44218       .n(4)
44219       .k(8)
44220       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44221   }
44222 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,strided_cn)44223   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, strided_cn) {
44224     TEST_REQUIRES_X86_XOP;
44225     GemmMicrokernelTester()
44226       .extended_weights(true)
44227       .mr(4)
44228       .nr(4)
44229       .kr(2)
44230       .sr(4)
44231       .m(4)
44232       .n(4)
44233       .k(8)
44234       .cn_stride(7)
44235       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44236   }
44237 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_eq_8_strided_a)44238   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_eq_8_strided_a) {
44239     TEST_REQUIRES_X86_XOP;
44240     GemmMicrokernelTester()
44241       .extended_weights(true)
44242       .mr(4)
44243       .nr(4)
44244       .kr(2)
44245       .sr(4)
44246       .m(4)
44247       .n(4)
44248       .k(8)
44249       .a_stride(11)
44250       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44251   }
44252 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_eq_8_subtile)44253   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_eq_8_subtile) {
44254     TEST_REQUIRES_X86_XOP;
44255     for (uint32_t n = 1; n <= 4; n++) {
44256       for (uint32_t m = 1; m <= 4; m++) {
44257         GemmMicrokernelTester()
44258           .extended_weights(true)
44259           .mr(4)
44260           .nr(4)
44261           .kr(2)
44262           .sr(4)
44263           .m(m)
44264           .n(n)
44265           .k(8)
44266           .iterations(1)
44267           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44268       }
44269     }
44270   }
44271 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_eq_8_subtile_m)44272   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_eq_8_subtile_m) {
44273     TEST_REQUIRES_X86_XOP;
44274     for (uint32_t m = 1; m <= 4; m++) {
44275       GemmMicrokernelTester()
44276         .extended_weights(true)
44277         .mr(4)
44278         .nr(4)
44279         .kr(2)
44280         .sr(4)
44281         .m(m)
44282         .n(4)
44283         .k(8)
44284         .iterations(1)
44285         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44286     }
44287   }
44288 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_eq_8_subtile_n)44289   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_eq_8_subtile_n) {
44290     TEST_REQUIRES_X86_XOP;
44291     for (uint32_t n = 1; n <= 4; n++) {
44292       GemmMicrokernelTester()
44293         .extended_weights(true)
44294         .mr(4)
44295         .nr(4)
44296         .kr(2)
44297         .sr(4)
44298         .m(4)
44299         .n(n)
44300         .k(8)
44301         .iterations(1)
44302         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44303     }
44304   }
44305 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_lt_8)44306   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_lt_8) {
44307     TEST_REQUIRES_X86_XOP;
44308     for (size_t k = 1; k < 8; k++) {
44309       GemmMicrokernelTester()
44310         .extended_weights(true)
44311         .mr(4)
44312         .nr(4)
44313         .kr(2)
44314         .sr(4)
44315         .m(4)
44316         .n(4)
44317         .k(k)
44318         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44319     }
44320   }
44321 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_lt_8_strided_a)44322   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_lt_8_strided_a) {
44323     TEST_REQUIRES_X86_XOP;
44324     for (size_t k = 1; k < 8; k++) {
44325       GemmMicrokernelTester()
44326         .extended_weights(true)
44327         .mr(4)
44328         .nr(4)
44329         .kr(2)
44330         .sr(4)
44331         .m(4)
44332         .n(4)
44333         .k(k)
44334         .a_stride(11)
44335         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44336     }
44337   }
44338 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_lt_8_subtile)44339   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_lt_8_subtile) {
44340     TEST_REQUIRES_X86_XOP;
44341     for (size_t k = 1; k < 8; k++) {
44342       for (uint32_t n = 1; n <= 4; n++) {
44343         for (uint32_t m = 1; m <= 4; m++) {
44344           GemmMicrokernelTester()
44345             .extended_weights(true)
44346             .mr(4)
44347             .nr(4)
44348             .kr(2)
44349             .sr(4)
44350             .m(m)
44351             .n(n)
44352             .k(k)
44353             .iterations(1)
44354             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44355         }
44356       }
44357     }
44358   }
44359 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_gt_8)44360   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_gt_8) {
44361     TEST_REQUIRES_X86_XOP;
44362     for (size_t k = 9; k < 16; k++) {
44363       GemmMicrokernelTester()
44364         .extended_weights(true)
44365         .mr(4)
44366         .nr(4)
44367         .kr(2)
44368         .sr(4)
44369         .m(4)
44370         .n(4)
44371         .k(k)
44372         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44373     }
44374   }
44375 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_gt_8_strided_a)44376   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_gt_8_strided_a) {
44377     TEST_REQUIRES_X86_XOP;
44378     for (size_t k = 9; k < 16; k++) {
44379       GemmMicrokernelTester()
44380         .extended_weights(true)
44381         .mr(4)
44382         .nr(4)
44383         .kr(2)
44384         .sr(4)
44385         .m(4)
44386         .n(4)
44387         .k(k)
44388         .a_stride(19)
44389         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44390     }
44391   }
44392 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_gt_8_subtile)44393   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_gt_8_subtile) {
44394     TEST_REQUIRES_X86_XOP;
44395     for (size_t k = 9; k < 16; k++) {
44396       for (uint32_t n = 1; n <= 4; n++) {
44397         for (uint32_t m = 1; m <= 4; m++) {
44398           GemmMicrokernelTester()
44399             .extended_weights(true)
44400             .mr(4)
44401             .nr(4)
44402             .kr(2)
44403             .sr(4)
44404             .m(m)
44405             .n(n)
44406             .k(k)
44407             .iterations(1)
44408             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44409         }
44410       }
44411     }
44412   }
44413 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_div_8)44414   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_div_8) {
44415     TEST_REQUIRES_X86_XOP;
44416     for (size_t k = 16; k <= 80; k += 8) {
44417       GemmMicrokernelTester()
44418         .extended_weights(true)
44419         .mr(4)
44420         .nr(4)
44421         .kr(2)
44422         .sr(4)
44423         .m(4)
44424         .n(4)
44425         .k(k)
44426         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44427     }
44428   }
44429 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_div_8_strided_a)44430   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_div_8_strided_a) {
44431     TEST_REQUIRES_X86_XOP;
44432     for (size_t k = 16; k <= 80; k += 8) {
44433       GemmMicrokernelTester()
44434         .extended_weights(true)
44435         .mr(4)
44436         .nr(4)
44437         .kr(2)
44438         .sr(4)
44439         .m(4)
44440         .n(4)
44441         .k(k)
44442         .a_stride(83)
44443         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44444     }
44445   }
44446 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,k_div_8_subtile)44447   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, k_div_8_subtile) {
44448     TEST_REQUIRES_X86_XOP;
44449     for (size_t k = 16; k <= 80; k += 8) {
44450       for (uint32_t n = 1; n <= 4; n++) {
44451         for (uint32_t m = 1; m <= 4; m++) {
44452           GemmMicrokernelTester()
44453             .extended_weights(true)
44454             .mr(4)
44455             .nr(4)
44456             .kr(2)
44457             .sr(4)
44458             .m(m)
44459             .n(n)
44460             .k(k)
44461             .iterations(1)
44462             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44463         }
44464       }
44465     }
44466   }
44467 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_gt_4)44468   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_gt_4) {
44469     TEST_REQUIRES_X86_XOP;
44470     for (uint32_t n = 5; n < 8; n++) {
44471       for (size_t k = 1; k <= 40; k += 9) {
44472         GemmMicrokernelTester()
44473           .extended_weights(true)
44474           .mr(4)
44475           .nr(4)
44476           .kr(2)
44477           .sr(4)
44478           .m(4)
44479           .n(n)
44480           .k(k)
44481           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44482       }
44483     }
44484   }
44485 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_gt_4_strided_cn)44486   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_gt_4_strided_cn) {
44487     TEST_REQUIRES_X86_XOP;
44488     for (uint32_t n = 5; n < 8; n++) {
44489       for (size_t k = 1; k <= 40; k += 9) {
44490         GemmMicrokernelTester()
44491           .extended_weights(true)
44492           .mr(4)
44493           .nr(4)
44494           .kr(2)
44495           .sr(4)
44496           .m(4)
44497           .n(n)
44498           .k(k)
44499           .cn_stride(7)
44500           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44501       }
44502     }
44503   }
44504 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_gt_4_strided_a)44505   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_gt_4_strided_a) {
44506     TEST_REQUIRES_X86_XOP;
44507     for (uint32_t n = 5; n < 8; n++) {
44508       for (size_t k = 1; k <= 40; k += 9) {
44509         GemmMicrokernelTester()
44510           .extended_weights(true)
44511           .mr(4)
44512           .nr(4)
44513           .kr(2)
44514           .sr(4)
44515           .m(4)
44516           .n(n)
44517           .k(k)
44518           .a_stride(43)
44519           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44520       }
44521     }
44522   }
44523 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_gt_4_subtile)44524   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_gt_4_subtile) {
44525     TEST_REQUIRES_X86_XOP;
44526     for (uint32_t n = 5; n < 8; n++) {
44527       for (size_t k = 1; k <= 40; k += 9) {
44528         for (uint32_t m = 1; m <= 4; m++) {
44529           GemmMicrokernelTester()
44530             .extended_weights(true)
44531             .mr(4)
44532             .nr(4)
44533             .kr(2)
44534             .sr(4)
44535             .m(m)
44536             .n(n)
44537             .k(k)
44538             .iterations(1)
44539             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44540         }
44541       }
44542     }
44543   }
44544 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_div_4)44545   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_div_4) {
44546     TEST_REQUIRES_X86_XOP;
44547     for (uint32_t n = 8; n <= 12; n += 4) {
44548       for (size_t k = 1; k <= 40; k += 9) {
44549         GemmMicrokernelTester()
44550           .extended_weights(true)
44551           .mr(4)
44552           .nr(4)
44553           .kr(2)
44554           .sr(4)
44555           .m(4)
44556           .n(n)
44557           .k(k)
44558           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44559       }
44560     }
44561   }
44562 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_div_4_strided_cn)44563   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_div_4_strided_cn) {
44564     TEST_REQUIRES_X86_XOP;
44565     for (uint32_t n = 8; n <= 12; n += 4) {
44566       for (size_t k = 1; k <= 40; k += 9) {
44567         GemmMicrokernelTester()
44568           .extended_weights(true)
44569           .mr(4)
44570           .nr(4)
44571           .kr(2)
44572           .sr(4)
44573           .m(4)
44574           .n(n)
44575           .k(k)
44576           .cn_stride(7)
44577           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44578       }
44579     }
44580   }
44581 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_div_4_strided_a)44582   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_div_4_strided_a) {
44583     TEST_REQUIRES_X86_XOP;
44584     for (uint32_t n = 8; n <= 12; n += 4) {
44585       for (size_t k = 1; k <= 40; k += 9) {
44586         GemmMicrokernelTester()
44587           .extended_weights(true)
44588           .mr(4)
44589           .nr(4)
44590           .kr(2)
44591           .sr(4)
44592           .m(4)
44593           .n(n)
44594           .k(k)
44595           .a_stride(43)
44596           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44597       }
44598     }
44599   }
44600 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,n_div_4_subtile)44601   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, n_div_4_subtile) {
44602     TEST_REQUIRES_X86_XOP;
44603     for (uint32_t n = 8; n <= 12; n += 4) {
44604       for (size_t k = 1; k <= 40; k += 9) {
44605         for (uint32_t m = 1; m <= 4; m++) {
44606           GemmMicrokernelTester()
44607             .extended_weights(true)
44608             .mr(4)
44609             .nr(4)
44610             .kr(2)
44611             .sr(4)
44612             .m(m)
44613             .n(n)
44614             .k(k)
44615             .iterations(1)
44616             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44617         }
44618       }
44619     }
44620   }
44621 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,strided_cm_subtile)44622   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, strided_cm_subtile) {
44623     TEST_REQUIRES_X86_XOP;
44624     for (size_t k = 1; k <= 40; k += 9) {
44625       for (uint32_t n = 1; n <= 4; n++) {
44626         for (uint32_t m = 1; m <= 4; m++) {
44627           GemmMicrokernelTester()
44628             .extended_weights(true)
44629             .mr(4)
44630             .nr(4)
44631             .kr(2)
44632             .sr(4)
44633             .m(m)
44634             .n(n)
44635             .k(k)
44636             .cm_stride(7)
44637             .iterations(1)
44638             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44639         }
44640       }
44641     }
44642   }
44643 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP,strided_cm)44644   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2S4__XOP, strided_cm) {
44645     TEST_REQUIRES_X86_XOP;
44646     GemmMicrokernelTester()
44647       .extended_weights(true)
44648       .mr(4)
44649       .nr(4)
44650       .kr(2)
44651       .sr(4)
44652       .m(4)
44653       .n(4)
44654       .k(8)
44655       .cm_stride(7)
44656       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2s4__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
44657   }
44658 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
44659 
44660 
44661 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_eq_8)44662   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_eq_8) {
44663     TEST_REQUIRES_X86_SSE2;
44664     GemmMicrokernelTester()
44665       .extended_weights(true)
44666       .mr(1)
44667       .nr(4)
44668       .kr(8)
44669       .sr(1)
44670       .m(1)
44671       .n(4)
44672       .k(8)
44673       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44674   }
44675 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,strided_cn)44676   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, strided_cn) {
44677     TEST_REQUIRES_X86_SSE2;
44678     GemmMicrokernelTester()
44679       .extended_weights(true)
44680       .mr(1)
44681       .nr(4)
44682       .kr(8)
44683       .sr(1)
44684       .m(1)
44685       .n(4)
44686       .k(8)
44687       .cn_stride(7)
44688       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44689   }
44690 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_eq_8_strided_a)44691   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_eq_8_strided_a) {
44692     TEST_REQUIRES_X86_SSE2;
44693     GemmMicrokernelTester()
44694       .extended_weights(true)
44695       .mr(1)
44696       .nr(4)
44697       .kr(8)
44698       .sr(1)
44699       .m(1)
44700       .n(4)
44701       .k(8)
44702       .a_stride(11)
44703       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44704   }
44705 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_eq_8_subtile)44706   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_eq_8_subtile) {
44707     TEST_REQUIRES_X86_SSE2;
44708     for (uint32_t n = 1; n <= 4; n++) {
44709       for (uint32_t m = 1; m <= 1; m++) {
44710         GemmMicrokernelTester()
44711           .extended_weights(true)
44712           .mr(1)
44713           .nr(4)
44714           .kr(8)
44715           .sr(1)
44716           .m(m)
44717           .n(n)
44718           .k(8)
44719           .iterations(1)
44720           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44721       }
44722     }
44723   }
44724 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_eq_8_subtile_m)44725   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_eq_8_subtile_m) {
44726     TEST_REQUIRES_X86_SSE2;
44727     for (uint32_t m = 1; m <= 1; m++) {
44728       GemmMicrokernelTester()
44729         .extended_weights(true)
44730         .mr(1)
44731         .nr(4)
44732         .kr(8)
44733         .sr(1)
44734         .m(m)
44735         .n(4)
44736         .k(8)
44737         .iterations(1)
44738         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44739     }
44740   }
44741 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_eq_8_subtile_n)44742   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_eq_8_subtile_n) {
44743     TEST_REQUIRES_X86_SSE2;
44744     for (uint32_t n = 1; n <= 4; n++) {
44745       GemmMicrokernelTester()
44746         .extended_weights(true)
44747         .mr(1)
44748         .nr(4)
44749         .kr(8)
44750         .sr(1)
44751         .m(1)
44752         .n(n)
44753         .k(8)
44754         .iterations(1)
44755         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44756     }
44757   }
44758 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_lt_8)44759   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_lt_8) {
44760     TEST_REQUIRES_X86_SSE2;
44761     for (size_t k = 1; k < 8; k++) {
44762       GemmMicrokernelTester()
44763         .extended_weights(true)
44764         .mr(1)
44765         .nr(4)
44766         .kr(8)
44767         .sr(1)
44768         .m(1)
44769         .n(4)
44770         .k(k)
44771         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44772     }
44773   }
44774 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_lt_8_strided_a)44775   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_lt_8_strided_a) {
44776     TEST_REQUIRES_X86_SSE2;
44777     for (size_t k = 1; k < 8; k++) {
44778       GemmMicrokernelTester()
44779         .extended_weights(true)
44780         .mr(1)
44781         .nr(4)
44782         .kr(8)
44783         .sr(1)
44784         .m(1)
44785         .n(4)
44786         .k(k)
44787         .a_stride(11)
44788         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44789     }
44790   }
44791 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_lt_8_subtile)44792   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_lt_8_subtile) {
44793     TEST_REQUIRES_X86_SSE2;
44794     for (size_t k = 1; k < 8; k++) {
44795       for (uint32_t n = 1; n <= 4; n++) {
44796         for (uint32_t m = 1; m <= 1; m++) {
44797           GemmMicrokernelTester()
44798             .extended_weights(true)
44799             .mr(1)
44800             .nr(4)
44801             .kr(8)
44802             .sr(1)
44803             .m(m)
44804             .n(n)
44805             .k(k)
44806             .iterations(1)
44807             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44808         }
44809       }
44810     }
44811   }
44812 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_gt_8)44813   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_gt_8) {
44814     TEST_REQUIRES_X86_SSE2;
44815     for (size_t k = 9; k < 16; k++) {
44816       GemmMicrokernelTester()
44817         .extended_weights(true)
44818         .mr(1)
44819         .nr(4)
44820         .kr(8)
44821         .sr(1)
44822         .m(1)
44823         .n(4)
44824         .k(k)
44825         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44826     }
44827   }
44828 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_gt_8_strided_a)44829   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_gt_8_strided_a) {
44830     TEST_REQUIRES_X86_SSE2;
44831     for (size_t k = 9; k < 16; k++) {
44832       GemmMicrokernelTester()
44833         .extended_weights(true)
44834         .mr(1)
44835         .nr(4)
44836         .kr(8)
44837         .sr(1)
44838         .m(1)
44839         .n(4)
44840         .k(k)
44841         .a_stride(19)
44842         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44843     }
44844   }
44845 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_gt_8_subtile)44846   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_gt_8_subtile) {
44847     TEST_REQUIRES_X86_SSE2;
44848     for (size_t k = 9; k < 16; k++) {
44849       for (uint32_t n = 1; n <= 4; n++) {
44850         for (uint32_t m = 1; m <= 1; m++) {
44851           GemmMicrokernelTester()
44852             .extended_weights(true)
44853             .mr(1)
44854             .nr(4)
44855             .kr(8)
44856             .sr(1)
44857             .m(m)
44858             .n(n)
44859             .k(k)
44860             .iterations(1)
44861             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44862         }
44863       }
44864     }
44865   }
44866 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_div_8)44867   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_div_8) {
44868     TEST_REQUIRES_X86_SSE2;
44869     for (size_t k = 16; k <= 80; k += 8) {
44870       GemmMicrokernelTester()
44871         .extended_weights(true)
44872         .mr(1)
44873         .nr(4)
44874         .kr(8)
44875         .sr(1)
44876         .m(1)
44877         .n(4)
44878         .k(k)
44879         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44880     }
44881   }
44882 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_div_8_strided_a)44883   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_div_8_strided_a) {
44884     TEST_REQUIRES_X86_SSE2;
44885     for (size_t k = 16; k <= 80; k += 8) {
44886       GemmMicrokernelTester()
44887         .extended_weights(true)
44888         .mr(1)
44889         .nr(4)
44890         .kr(8)
44891         .sr(1)
44892         .m(1)
44893         .n(4)
44894         .k(k)
44895         .a_stride(83)
44896         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44897     }
44898   }
44899 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,k_div_8_subtile)44900   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, k_div_8_subtile) {
44901     TEST_REQUIRES_X86_SSE2;
44902     for (size_t k = 16; k <= 80; k += 8) {
44903       for (uint32_t n = 1; n <= 4; n++) {
44904         for (uint32_t m = 1; m <= 1; m++) {
44905           GemmMicrokernelTester()
44906             .extended_weights(true)
44907             .mr(1)
44908             .nr(4)
44909             .kr(8)
44910             .sr(1)
44911             .m(m)
44912             .n(n)
44913             .k(k)
44914             .iterations(1)
44915             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44916         }
44917       }
44918     }
44919   }
44920 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_gt_4)44921   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_gt_4) {
44922     TEST_REQUIRES_X86_SSE2;
44923     for (uint32_t n = 5; n < 8; n++) {
44924       for (size_t k = 1; k <= 40; k += 9) {
44925         GemmMicrokernelTester()
44926           .extended_weights(true)
44927           .mr(1)
44928           .nr(4)
44929           .kr(8)
44930           .sr(1)
44931           .m(1)
44932           .n(n)
44933           .k(k)
44934           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44935       }
44936     }
44937   }
44938 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_gt_4_strided_cn)44939   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_gt_4_strided_cn) {
44940     TEST_REQUIRES_X86_SSE2;
44941     for (uint32_t n = 5; n < 8; n++) {
44942       for (size_t k = 1; k <= 40; k += 9) {
44943         GemmMicrokernelTester()
44944           .extended_weights(true)
44945           .mr(1)
44946           .nr(4)
44947           .kr(8)
44948           .sr(1)
44949           .m(1)
44950           .n(n)
44951           .k(k)
44952           .cn_stride(7)
44953           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44954       }
44955     }
44956   }
44957 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_gt_4_strided_a)44958   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_gt_4_strided_a) {
44959     TEST_REQUIRES_X86_SSE2;
44960     for (uint32_t n = 5; n < 8; n++) {
44961       for (size_t k = 1; k <= 40; k += 9) {
44962         GemmMicrokernelTester()
44963           .extended_weights(true)
44964           .mr(1)
44965           .nr(4)
44966           .kr(8)
44967           .sr(1)
44968           .m(1)
44969           .n(n)
44970           .k(k)
44971           .a_stride(43)
44972           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44973       }
44974     }
44975   }
44976 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_gt_4_subtile)44977   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_gt_4_subtile) {
44978     TEST_REQUIRES_X86_SSE2;
44979     for (uint32_t n = 5; n < 8; n++) {
44980       for (size_t k = 1; k <= 40; k += 9) {
44981         for (uint32_t m = 1; m <= 1; m++) {
44982           GemmMicrokernelTester()
44983             .extended_weights(true)
44984             .mr(1)
44985             .nr(4)
44986             .kr(8)
44987             .sr(1)
44988             .m(m)
44989             .n(n)
44990             .k(k)
44991             .iterations(1)
44992             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
44993         }
44994       }
44995     }
44996   }
44997 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_div_4)44998   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_div_4) {
44999     TEST_REQUIRES_X86_SSE2;
45000     for (uint32_t n = 8; n <= 12; n += 4) {
45001       for (size_t k = 1; k <= 40; k += 9) {
45002         GemmMicrokernelTester()
45003           .extended_weights(true)
45004           .mr(1)
45005           .nr(4)
45006           .kr(8)
45007           .sr(1)
45008           .m(1)
45009           .n(n)
45010           .k(k)
45011           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45012       }
45013     }
45014   }
45015 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_div_4_strided_cn)45016   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_div_4_strided_cn) {
45017     TEST_REQUIRES_X86_SSE2;
45018     for (uint32_t n = 8; n <= 12; n += 4) {
45019       for (size_t k = 1; k <= 40; k += 9) {
45020         GemmMicrokernelTester()
45021           .extended_weights(true)
45022           .mr(1)
45023           .nr(4)
45024           .kr(8)
45025           .sr(1)
45026           .m(1)
45027           .n(n)
45028           .k(k)
45029           .cn_stride(7)
45030           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45031       }
45032     }
45033   }
45034 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_div_4_strided_a)45035   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_div_4_strided_a) {
45036     TEST_REQUIRES_X86_SSE2;
45037     for (uint32_t n = 8; n <= 12; n += 4) {
45038       for (size_t k = 1; k <= 40; k += 9) {
45039         GemmMicrokernelTester()
45040           .extended_weights(true)
45041           .mr(1)
45042           .nr(4)
45043           .kr(8)
45044           .sr(1)
45045           .m(1)
45046           .n(n)
45047           .k(k)
45048           .a_stride(43)
45049           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45050       }
45051     }
45052   }
45053 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,n_div_4_subtile)45054   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, n_div_4_subtile) {
45055     TEST_REQUIRES_X86_SSE2;
45056     for (uint32_t n = 8; n <= 12; n += 4) {
45057       for (size_t k = 1; k <= 40; k += 9) {
45058         for (uint32_t m = 1; m <= 1; m++) {
45059           GemmMicrokernelTester()
45060             .extended_weights(true)
45061             .mr(1)
45062             .nr(4)
45063             .kr(8)
45064             .sr(1)
45065             .m(m)
45066             .n(n)
45067             .k(k)
45068             .iterations(1)
45069             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45070         }
45071       }
45072     }
45073   }
45074 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,strided_cm_subtile)45075   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, strided_cm_subtile) {
45076     TEST_REQUIRES_X86_SSE2;
45077     for (size_t k = 1; k <= 40; k += 9) {
45078       for (uint32_t n = 1; n <= 4; n++) {
45079         for (uint32_t m = 1; m <= 1; m++) {
45080           GemmMicrokernelTester()
45081             .extended_weights(true)
45082             .mr(1)
45083             .nr(4)
45084             .kr(8)
45085             .sr(1)
45086             .m(m)
45087             .n(n)
45088             .k(k)
45089             .cm_stride(7)
45090             .iterations(1)
45091             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45092         }
45093       }
45094     }
45095   }
45096 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2,strided_cm)45097   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE2, strided_cm) {
45098     TEST_REQUIRES_X86_SSE2;
45099     GemmMicrokernelTester()
45100       .extended_weights(true)
45101       .mr(1)
45102       .nr(4)
45103       .kr(8)
45104       .sr(1)
45105       .m(1)
45106       .n(4)
45107       .k(8)
45108       .cm_stride(7)
45109       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse2, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45110   }
45111 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
45112 
45113 
45114 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_eq_8)45115   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_eq_8) {
45116     TEST_REQUIRES_X86_SSSE3;
45117     GemmMicrokernelTester()
45118       .extended_weights(true)
45119       .mr(3)
45120       .nr(4)
45121       .kr(8)
45122       .sr(1)
45123       .m(3)
45124       .n(4)
45125       .k(8)
45126       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45127   }
45128 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,strided_cn)45129   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, strided_cn) {
45130     TEST_REQUIRES_X86_SSSE3;
45131     GemmMicrokernelTester()
45132       .extended_weights(true)
45133       .mr(3)
45134       .nr(4)
45135       .kr(8)
45136       .sr(1)
45137       .m(3)
45138       .n(4)
45139       .k(8)
45140       .cn_stride(7)
45141       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45142   }
45143 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_eq_8_strided_a)45144   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_eq_8_strided_a) {
45145     TEST_REQUIRES_X86_SSSE3;
45146     GemmMicrokernelTester()
45147       .extended_weights(true)
45148       .mr(3)
45149       .nr(4)
45150       .kr(8)
45151       .sr(1)
45152       .m(3)
45153       .n(4)
45154       .k(8)
45155       .a_stride(11)
45156       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45157   }
45158 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_eq_8_subtile)45159   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_eq_8_subtile) {
45160     TEST_REQUIRES_X86_SSSE3;
45161     for (uint32_t n = 1; n <= 4; n++) {
45162       for (uint32_t m = 1; m <= 3; m++) {
45163         GemmMicrokernelTester()
45164           .extended_weights(true)
45165           .mr(3)
45166           .nr(4)
45167           .kr(8)
45168           .sr(1)
45169           .m(m)
45170           .n(n)
45171           .k(8)
45172           .iterations(1)
45173           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45174       }
45175     }
45176   }
45177 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_eq_8_subtile_m)45178   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_eq_8_subtile_m) {
45179     TEST_REQUIRES_X86_SSSE3;
45180     for (uint32_t m = 1; m <= 3; m++) {
45181       GemmMicrokernelTester()
45182         .extended_weights(true)
45183         .mr(3)
45184         .nr(4)
45185         .kr(8)
45186         .sr(1)
45187         .m(m)
45188         .n(4)
45189         .k(8)
45190         .iterations(1)
45191         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45192     }
45193   }
45194 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_eq_8_subtile_n)45195   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_eq_8_subtile_n) {
45196     TEST_REQUIRES_X86_SSSE3;
45197     for (uint32_t n = 1; n <= 4; n++) {
45198       GemmMicrokernelTester()
45199         .extended_weights(true)
45200         .mr(3)
45201         .nr(4)
45202         .kr(8)
45203         .sr(1)
45204         .m(3)
45205         .n(n)
45206         .k(8)
45207         .iterations(1)
45208         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45209     }
45210   }
45211 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_lt_8)45212   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_lt_8) {
45213     TEST_REQUIRES_X86_SSSE3;
45214     for (size_t k = 1; k < 8; k++) {
45215       GemmMicrokernelTester()
45216         .extended_weights(true)
45217         .mr(3)
45218         .nr(4)
45219         .kr(8)
45220         .sr(1)
45221         .m(3)
45222         .n(4)
45223         .k(k)
45224         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45225     }
45226   }
45227 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_lt_8_strided_a)45228   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_lt_8_strided_a) {
45229     TEST_REQUIRES_X86_SSSE3;
45230     for (size_t k = 1; k < 8; k++) {
45231       GemmMicrokernelTester()
45232         .extended_weights(true)
45233         .mr(3)
45234         .nr(4)
45235         .kr(8)
45236         .sr(1)
45237         .m(3)
45238         .n(4)
45239         .k(k)
45240         .a_stride(11)
45241         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45242     }
45243   }
45244 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_lt_8_subtile)45245   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_lt_8_subtile) {
45246     TEST_REQUIRES_X86_SSSE3;
45247     for (size_t k = 1; k < 8; k++) {
45248       for (uint32_t n = 1; n <= 4; n++) {
45249         for (uint32_t m = 1; m <= 3; m++) {
45250           GemmMicrokernelTester()
45251             .extended_weights(true)
45252             .mr(3)
45253             .nr(4)
45254             .kr(8)
45255             .sr(1)
45256             .m(m)
45257             .n(n)
45258             .k(k)
45259             .iterations(1)
45260             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45261         }
45262       }
45263     }
45264   }
45265 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_gt_8)45266   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_gt_8) {
45267     TEST_REQUIRES_X86_SSSE3;
45268     for (size_t k = 9; k < 16; k++) {
45269       GemmMicrokernelTester()
45270         .extended_weights(true)
45271         .mr(3)
45272         .nr(4)
45273         .kr(8)
45274         .sr(1)
45275         .m(3)
45276         .n(4)
45277         .k(k)
45278         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45279     }
45280   }
45281 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_gt_8_strided_a)45282   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_gt_8_strided_a) {
45283     TEST_REQUIRES_X86_SSSE3;
45284     for (size_t k = 9; k < 16; k++) {
45285       GemmMicrokernelTester()
45286         .extended_weights(true)
45287         .mr(3)
45288         .nr(4)
45289         .kr(8)
45290         .sr(1)
45291         .m(3)
45292         .n(4)
45293         .k(k)
45294         .a_stride(19)
45295         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45296     }
45297   }
45298 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_gt_8_subtile)45299   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_gt_8_subtile) {
45300     TEST_REQUIRES_X86_SSSE3;
45301     for (size_t k = 9; k < 16; k++) {
45302       for (uint32_t n = 1; n <= 4; n++) {
45303         for (uint32_t m = 1; m <= 3; m++) {
45304           GemmMicrokernelTester()
45305             .extended_weights(true)
45306             .mr(3)
45307             .nr(4)
45308             .kr(8)
45309             .sr(1)
45310             .m(m)
45311             .n(n)
45312             .k(k)
45313             .iterations(1)
45314             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45315         }
45316       }
45317     }
45318   }
45319 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_div_8)45320   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_div_8) {
45321     TEST_REQUIRES_X86_SSSE3;
45322     for (size_t k = 16; k <= 80; k += 8) {
45323       GemmMicrokernelTester()
45324         .extended_weights(true)
45325         .mr(3)
45326         .nr(4)
45327         .kr(8)
45328         .sr(1)
45329         .m(3)
45330         .n(4)
45331         .k(k)
45332         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45333     }
45334   }
45335 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_div_8_strided_a)45336   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_div_8_strided_a) {
45337     TEST_REQUIRES_X86_SSSE3;
45338     for (size_t k = 16; k <= 80; k += 8) {
45339       GemmMicrokernelTester()
45340         .extended_weights(true)
45341         .mr(3)
45342         .nr(4)
45343         .kr(8)
45344         .sr(1)
45345         .m(3)
45346         .n(4)
45347         .k(k)
45348         .a_stride(83)
45349         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45350     }
45351   }
45352 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,k_div_8_subtile)45353   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, k_div_8_subtile) {
45354     TEST_REQUIRES_X86_SSSE3;
45355     for (size_t k = 16; k <= 80; k += 8) {
45356       for (uint32_t n = 1; n <= 4; n++) {
45357         for (uint32_t m = 1; m <= 3; m++) {
45358           GemmMicrokernelTester()
45359             .extended_weights(true)
45360             .mr(3)
45361             .nr(4)
45362             .kr(8)
45363             .sr(1)
45364             .m(m)
45365             .n(n)
45366             .k(k)
45367             .iterations(1)
45368             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45369         }
45370       }
45371     }
45372   }
45373 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_gt_4)45374   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_gt_4) {
45375     TEST_REQUIRES_X86_SSSE3;
45376     for (uint32_t n = 5; n < 8; n++) {
45377       for (size_t k = 1; k <= 40; k += 9) {
45378         GemmMicrokernelTester()
45379           .extended_weights(true)
45380           .mr(3)
45381           .nr(4)
45382           .kr(8)
45383           .sr(1)
45384           .m(3)
45385           .n(n)
45386           .k(k)
45387           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45388       }
45389     }
45390   }
45391 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_gt_4_strided_cn)45392   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_gt_4_strided_cn) {
45393     TEST_REQUIRES_X86_SSSE3;
45394     for (uint32_t n = 5; n < 8; n++) {
45395       for (size_t k = 1; k <= 40; k += 9) {
45396         GemmMicrokernelTester()
45397           .extended_weights(true)
45398           .mr(3)
45399           .nr(4)
45400           .kr(8)
45401           .sr(1)
45402           .m(3)
45403           .n(n)
45404           .k(k)
45405           .cn_stride(7)
45406           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45407       }
45408     }
45409   }
45410 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_gt_4_strided_a)45411   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_gt_4_strided_a) {
45412     TEST_REQUIRES_X86_SSSE3;
45413     for (uint32_t n = 5; n < 8; n++) {
45414       for (size_t k = 1; k <= 40; k += 9) {
45415         GemmMicrokernelTester()
45416           .extended_weights(true)
45417           .mr(3)
45418           .nr(4)
45419           .kr(8)
45420           .sr(1)
45421           .m(3)
45422           .n(n)
45423           .k(k)
45424           .a_stride(43)
45425           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45426       }
45427     }
45428   }
45429 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_gt_4_subtile)45430   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_gt_4_subtile) {
45431     TEST_REQUIRES_X86_SSSE3;
45432     for (uint32_t n = 5; n < 8; n++) {
45433       for (size_t k = 1; k <= 40; k += 9) {
45434         for (uint32_t m = 1; m <= 3; m++) {
45435           GemmMicrokernelTester()
45436             .extended_weights(true)
45437             .mr(3)
45438             .nr(4)
45439             .kr(8)
45440             .sr(1)
45441             .m(m)
45442             .n(n)
45443             .k(k)
45444             .iterations(1)
45445             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45446         }
45447       }
45448     }
45449   }
45450 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_div_4)45451   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_div_4) {
45452     TEST_REQUIRES_X86_SSSE3;
45453     for (uint32_t n = 8; n <= 12; n += 4) {
45454       for (size_t k = 1; k <= 40; k += 9) {
45455         GemmMicrokernelTester()
45456           .extended_weights(true)
45457           .mr(3)
45458           .nr(4)
45459           .kr(8)
45460           .sr(1)
45461           .m(3)
45462           .n(n)
45463           .k(k)
45464           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45465       }
45466     }
45467   }
45468 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_div_4_strided_cn)45469   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_div_4_strided_cn) {
45470     TEST_REQUIRES_X86_SSSE3;
45471     for (uint32_t n = 8; n <= 12; n += 4) {
45472       for (size_t k = 1; k <= 40; k += 9) {
45473         GemmMicrokernelTester()
45474           .extended_weights(true)
45475           .mr(3)
45476           .nr(4)
45477           .kr(8)
45478           .sr(1)
45479           .m(3)
45480           .n(n)
45481           .k(k)
45482           .cn_stride(7)
45483           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45484       }
45485     }
45486   }
45487 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_div_4_strided_a)45488   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_div_4_strided_a) {
45489     TEST_REQUIRES_X86_SSSE3;
45490     for (uint32_t n = 8; n <= 12; n += 4) {
45491       for (size_t k = 1; k <= 40; k += 9) {
45492         GemmMicrokernelTester()
45493           .extended_weights(true)
45494           .mr(3)
45495           .nr(4)
45496           .kr(8)
45497           .sr(1)
45498           .m(3)
45499           .n(n)
45500           .k(k)
45501           .a_stride(43)
45502           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45503       }
45504     }
45505   }
45506 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,n_div_4_subtile)45507   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, n_div_4_subtile) {
45508     TEST_REQUIRES_X86_SSSE3;
45509     for (uint32_t n = 8; n <= 12; n += 4) {
45510       for (size_t k = 1; k <= 40; k += 9) {
45511         for (uint32_t m = 1; m <= 3; m++) {
45512           GemmMicrokernelTester()
45513             .extended_weights(true)
45514             .mr(3)
45515             .nr(4)
45516             .kr(8)
45517             .sr(1)
45518             .m(m)
45519             .n(n)
45520             .k(k)
45521             .iterations(1)
45522             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45523         }
45524       }
45525     }
45526   }
45527 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,strided_cm_subtile)45528   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, strided_cm_subtile) {
45529     TEST_REQUIRES_X86_SSSE3;
45530     for (size_t k = 1; k <= 40; k += 9) {
45531       for (uint32_t n = 1; n <= 4; n++) {
45532         for (uint32_t m = 1; m <= 3; m++) {
45533           GemmMicrokernelTester()
45534             .extended_weights(true)
45535             .mr(3)
45536             .nr(4)
45537             .kr(8)
45538             .sr(1)
45539             .m(m)
45540             .n(n)
45541             .k(k)
45542             .cm_stride(7)
45543             .iterations(1)
45544             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45545         }
45546       }
45547     }
45548   }
45549 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3,strided_cm)45550   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__SSSE3, strided_cm) {
45551     TEST_REQUIRES_X86_SSSE3;
45552     GemmMicrokernelTester()
45553       .extended_weights(true)
45554       .mr(3)
45555       .nr(4)
45556       .kr(8)
45557       .sr(1)
45558       .m(3)
45559       .n(4)
45560       .k(8)
45561       .cm_stride(7)
45562       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__ssse3, xnn_init_qs8_conv_minmax_fp32_sse2_params, xnn_qs8_requantize_fp32);
45563   }
45564 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
45565 
45566 
45567 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_eq_8)45568   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_eq_8) {
45569     TEST_REQUIRES_X86_SSE41;
45570     GemmMicrokernelTester()
45571       .extended_weights(true)
45572       .mr(1)
45573       .nr(4)
45574       .kr(8)
45575       .sr(1)
45576       .m(1)
45577       .n(4)
45578       .k(8)
45579       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45580   }
45581 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,strided_cn)45582   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, strided_cn) {
45583     TEST_REQUIRES_X86_SSE41;
45584     GemmMicrokernelTester()
45585       .extended_weights(true)
45586       .mr(1)
45587       .nr(4)
45588       .kr(8)
45589       .sr(1)
45590       .m(1)
45591       .n(4)
45592       .k(8)
45593       .cn_stride(7)
45594       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45595   }
45596 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_eq_8_strided_a)45597   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_eq_8_strided_a) {
45598     TEST_REQUIRES_X86_SSE41;
45599     GemmMicrokernelTester()
45600       .extended_weights(true)
45601       .mr(1)
45602       .nr(4)
45603       .kr(8)
45604       .sr(1)
45605       .m(1)
45606       .n(4)
45607       .k(8)
45608       .a_stride(11)
45609       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45610   }
45611 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_eq_8_subtile)45612   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_eq_8_subtile) {
45613     TEST_REQUIRES_X86_SSE41;
45614     for (uint32_t n = 1; n <= 4; n++) {
45615       for (uint32_t m = 1; m <= 1; m++) {
45616         GemmMicrokernelTester()
45617           .extended_weights(true)
45618           .mr(1)
45619           .nr(4)
45620           .kr(8)
45621           .sr(1)
45622           .m(m)
45623           .n(n)
45624           .k(8)
45625           .iterations(1)
45626           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45627       }
45628     }
45629   }
45630 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_eq_8_subtile_m)45631   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_eq_8_subtile_m) {
45632     TEST_REQUIRES_X86_SSE41;
45633     for (uint32_t m = 1; m <= 1; m++) {
45634       GemmMicrokernelTester()
45635         .extended_weights(true)
45636         .mr(1)
45637         .nr(4)
45638         .kr(8)
45639         .sr(1)
45640         .m(m)
45641         .n(4)
45642         .k(8)
45643         .iterations(1)
45644         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45645     }
45646   }
45647 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_eq_8_subtile_n)45648   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_eq_8_subtile_n) {
45649     TEST_REQUIRES_X86_SSE41;
45650     for (uint32_t n = 1; n <= 4; n++) {
45651       GemmMicrokernelTester()
45652         .extended_weights(true)
45653         .mr(1)
45654         .nr(4)
45655         .kr(8)
45656         .sr(1)
45657         .m(1)
45658         .n(n)
45659         .k(8)
45660         .iterations(1)
45661         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45662     }
45663   }
45664 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_lt_8)45665   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_lt_8) {
45666     TEST_REQUIRES_X86_SSE41;
45667     for (size_t k = 1; k < 8; k++) {
45668       GemmMicrokernelTester()
45669         .extended_weights(true)
45670         .mr(1)
45671         .nr(4)
45672         .kr(8)
45673         .sr(1)
45674         .m(1)
45675         .n(4)
45676         .k(k)
45677         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45678     }
45679   }
45680 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_lt_8_strided_a)45681   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_lt_8_strided_a) {
45682     TEST_REQUIRES_X86_SSE41;
45683     for (size_t k = 1; k < 8; k++) {
45684       GemmMicrokernelTester()
45685         .extended_weights(true)
45686         .mr(1)
45687         .nr(4)
45688         .kr(8)
45689         .sr(1)
45690         .m(1)
45691         .n(4)
45692         .k(k)
45693         .a_stride(11)
45694         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45695     }
45696   }
45697 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_lt_8_subtile)45698   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_lt_8_subtile) {
45699     TEST_REQUIRES_X86_SSE41;
45700     for (size_t k = 1; k < 8; k++) {
45701       for (uint32_t n = 1; n <= 4; n++) {
45702         for (uint32_t m = 1; m <= 1; m++) {
45703           GemmMicrokernelTester()
45704             .extended_weights(true)
45705             .mr(1)
45706             .nr(4)
45707             .kr(8)
45708             .sr(1)
45709             .m(m)
45710             .n(n)
45711             .k(k)
45712             .iterations(1)
45713             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45714         }
45715       }
45716     }
45717   }
45718 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_gt_8)45719   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_gt_8) {
45720     TEST_REQUIRES_X86_SSE41;
45721     for (size_t k = 9; k < 16; k++) {
45722       GemmMicrokernelTester()
45723         .extended_weights(true)
45724         .mr(1)
45725         .nr(4)
45726         .kr(8)
45727         .sr(1)
45728         .m(1)
45729         .n(4)
45730         .k(k)
45731         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45732     }
45733   }
45734 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_gt_8_strided_a)45735   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_gt_8_strided_a) {
45736     TEST_REQUIRES_X86_SSE41;
45737     for (size_t k = 9; k < 16; k++) {
45738       GemmMicrokernelTester()
45739         .extended_weights(true)
45740         .mr(1)
45741         .nr(4)
45742         .kr(8)
45743         .sr(1)
45744         .m(1)
45745         .n(4)
45746         .k(k)
45747         .a_stride(19)
45748         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45749     }
45750   }
45751 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_gt_8_subtile)45752   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_gt_8_subtile) {
45753     TEST_REQUIRES_X86_SSE41;
45754     for (size_t k = 9; k < 16; k++) {
45755       for (uint32_t n = 1; n <= 4; n++) {
45756         for (uint32_t m = 1; m <= 1; m++) {
45757           GemmMicrokernelTester()
45758             .extended_weights(true)
45759             .mr(1)
45760             .nr(4)
45761             .kr(8)
45762             .sr(1)
45763             .m(m)
45764             .n(n)
45765             .k(k)
45766             .iterations(1)
45767             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45768         }
45769       }
45770     }
45771   }
45772 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_div_8)45773   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_div_8) {
45774     TEST_REQUIRES_X86_SSE41;
45775     for (size_t k = 16; k <= 80; k += 8) {
45776       GemmMicrokernelTester()
45777         .extended_weights(true)
45778         .mr(1)
45779         .nr(4)
45780         .kr(8)
45781         .sr(1)
45782         .m(1)
45783         .n(4)
45784         .k(k)
45785         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45786     }
45787   }
45788 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_div_8_strided_a)45789   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_div_8_strided_a) {
45790     TEST_REQUIRES_X86_SSE41;
45791     for (size_t k = 16; k <= 80; k += 8) {
45792       GemmMicrokernelTester()
45793         .extended_weights(true)
45794         .mr(1)
45795         .nr(4)
45796         .kr(8)
45797         .sr(1)
45798         .m(1)
45799         .n(4)
45800         .k(k)
45801         .a_stride(83)
45802         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45803     }
45804   }
45805 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,k_div_8_subtile)45806   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, k_div_8_subtile) {
45807     TEST_REQUIRES_X86_SSE41;
45808     for (size_t k = 16; k <= 80; k += 8) {
45809       for (uint32_t n = 1; n <= 4; n++) {
45810         for (uint32_t m = 1; m <= 1; m++) {
45811           GemmMicrokernelTester()
45812             .extended_weights(true)
45813             .mr(1)
45814             .nr(4)
45815             .kr(8)
45816             .sr(1)
45817             .m(m)
45818             .n(n)
45819             .k(k)
45820             .iterations(1)
45821             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45822         }
45823       }
45824     }
45825   }
45826 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_gt_4)45827   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_gt_4) {
45828     TEST_REQUIRES_X86_SSE41;
45829     for (uint32_t n = 5; n < 8; n++) {
45830       for (size_t k = 1; k <= 40; k += 9) {
45831         GemmMicrokernelTester()
45832           .extended_weights(true)
45833           .mr(1)
45834           .nr(4)
45835           .kr(8)
45836           .sr(1)
45837           .m(1)
45838           .n(n)
45839           .k(k)
45840           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45841       }
45842     }
45843   }
45844 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_gt_4_strided_cn)45845   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_gt_4_strided_cn) {
45846     TEST_REQUIRES_X86_SSE41;
45847     for (uint32_t n = 5; n < 8; n++) {
45848       for (size_t k = 1; k <= 40; k += 9) {
45849         GemmMicrokernelTester()
45850           .extended_weights(true)
45851           .mr(1)
45852           .nr(4)
45853           .kr(8)
45854           .sr(1)
45855           .m(1)
45856           .n(n)
45857           .k(k)
45858           .cn_stride(7)
45859           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45860       }
45861     }
45862   }
45863 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_gt_4_strided_a)45864   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_gt_4_strided_a) {
45865     TEST_REQUIRES_X86_SSE41;
45866     for (uint32_t n = 5; n < 8; n++) {
45867       for (size_t k = 1; k <= 40; k += 9) {
45868         GemmMicrokernelTester()
45869           .extended_weights(true)
45870           .mr(1)
45871           .nr(4)
45872           .kr(8)
45873           .sr(1)
45874           .m(1)
45875           .n(n)
45876           .k(k)
45877           .a_stride(43)
45878           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45879       }
45880     }
45881   }
45882 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_gt_4_subtile)45883   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_gt_4_subtile) {
45884     TEST_REQUIRES_X86_SSE41;
45885     for (uint32_t n = 5; n < 8; n++) {
45886       for (size_t k = 1; k <= 40; k += 9) {
45887         for (uint32_t m = 1; m <= 1; m++) {
45888           GemmMicrokernelTester()
45889             .extended_weights(true)
45890             .mr(1)
45891             .nr(4)
45892             .kr(8)
45893             .sr(1)
45894             .m(m)
45895             .n(n)
45896             .k(k)
45897             .iterations(1)
45898             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45899         }
45900       }
45901     }
45902   }
45903 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_div_4)45904   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_div_4) {
45905     TEST_REQUIRES_X86_SSE41;
45906     for (uint32_t n = 8; n <= 12; n += 4) {
45907       for (size_t k = 1; k <= 40; k += 9) {
45908         GemmMicrokernelTester()
45909           .extended_weights(true)
45910           .mr(1)
45911           .nr(4)
45912           .kr(8)
45913           .sr(1)
45914           .m(1)
45915           .n(n)
45916           .k(k)
45917           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45918       }
45919     }
45920   }
45921 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_div_4_strided_cn)45922   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_div_4_strided_cn) {
45923     TEST_REQUIRES_X86_SSE41;
45924     for (uint32_t n = 8; n <= 12; n += 4) {
45925       for (size_t k = 1; k <= 40; k += 9) {
45926         GemmMicrokernelTester()
45927           .extended_weights(true)
45928           .mr(1)
45929           .nr(4)
45930           .kr(8)
45931           .sr(1)
45932           .m(1)
45933           .n(n)
45934           .k(k)
45935           .cn_stride(7)
45936           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45937       }
45938     }
45939   }
45940 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_div_4_strided_a)45941   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_div_4_strided_a) {
45942     TEST_REQUIRES_X86_SSE41;
45943     for (uint32_t n = 8; n <= 12; n += 4) {
45944       for (size_t k = 1; k <= 40; k += 9) {
45945         GemmMicrokernelTester()
45946           .extended_weights(true)
45947           .mr(1)
45948           .nr(4)
45949           .kr(8)
45950           .sr(1)
45951           .m(1)
45952           .n(n)
45953           .k(k)
45954           .a_stride(43)
45955           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45956       }
45957     }
45958   }
45959 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,n_div_4_subtile)45960   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, n_div_4_subtile) {
45961     TEST_REQUIRES_X86_SSE41;
45962     for (uint32_t n = 8; n <= 12; n += 4) {
45963       for (size_t k = 1; k <= 40; k += 9) {
45964         for (uint32_t m = 1; m <= 1; m++) {
45965           GemmMicrokernelTester()
45966             .extended_weights(true)
45967             .mr(1)
45968             .nr(4)
45969             .kr(8)
45970             .sr(1)
45971             .m(m)
45972             .n(n)
45973             .k(k)
45974             .iterations(1)
45975             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45976         }
45977       }
45978     }
45979   }
45980 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,strided_cm_subtile)45981   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, strided_cm_subtile) {
45982     TEST_REQUIRES_X86_SSE41;
45983     for (size_t k = 1; k <= 40; k += 9) {
45984       for (uint32_t n = 1; n <= 4; n++) {
45985         for (uint32_t m = 1; m <= 1; m++) {
45986           GemmMicrokernelTester()
45987             .extended_weights(true)
45988             .mr(1)
45989             .nr(4)
45990             .kr(8)
45991             .sr(1)
45992             .m(m)
45993             .n(n)
45994             .k(k)
45995             .cm_stride(7)
45996             .iterations(1)
45997             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
45998         }
45999       }
46000     }
46001   }
46002 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41,strided_cm)46003   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__SSE41, strided_cm) {
46004     TEST_REQUIRES_X86_SSE41;
46005     GemmMicrokernelTester()
46006       .extended_weights(true)
46007       .mr(1)
46008       .nr(4)
46009       .kr(8)
46010       .sr(1)
46011       .m(1)
46012       .n(4)
46013       .k(8)
46014       .cm_stride(7)
46015       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46016   }
46017 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
46018 
46019 
46020 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_eq_8)46021   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_eq_8) {
46022     TEST_REQUIRES_X86_SSE41;
46023     GemmMicrokernelTester()
46024       .extended_weights(true)
46025       .mr(2)
46026       .nr(4)
46027       .kr(8)
46028       .sr(1)
46029       .m(2)
46030       .n(4)
46031       .k(8)
46032       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46033   }
46034 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,strided_cn)46035   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, strided_cn) {
46036     TEST_REQUIRES_X86_SSE41;
46037     GemmMicrokernelTester()
46038       .extended_weights(true)
46039       .mr(2)
46040       .nr(4)
46041       .kr(8)
46042       .sr(1)
46043       .m(2)
46044       .n(4)
46045       .k(8)
46046       .cn_stride(7)
46047       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46048   }
46049 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_eq_8_strided_a)46050   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_eq_8_strided_a) {
46051     TEST_REQUIRES_X86_SSE41;
46052     GemmMicrokernelTester()
46053       .extended_weights(true)
46054       .mr(2)
46055       .nr(4)
46056       .kr(8)
46057       .sr(1)
46058       .m(2)
46059       .n(4)
46060       .k(8)
46061       .a_stride(11)
46062       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46063   }
46064 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_eq_8_subtile)46065   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_eq_8_subtile) {
46066     TEST_REQUIRES_X86_SSE41;
46067     for (uint32_t n = 1; n <= 4; n++) {
46068       for (uint32_t m = 1; m <= 2; m++) {
46069         GemmMicrokernelTester()
46070           .extended_weights(true)
46071           .mr(2)
46072           .nr(4)
46073           .kr(8)
46074           .sr(1)
46075           .m(m)
46076           .n(n)
46077           .k(8)
46078           .iterations(1)
46079           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46080       }
46081     }
46082   }
46083 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_eq_8_subtile_m)46084   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_eq_8_subtile_m) {
46085     TEST_REQUIRES_X86_SSE41;
46086     for (uint32_t m = 1; m <= 2; m++) {
46087       GemmMicrokernelTester()
46088         .extended_weights(true)
46089         .mr(2)
46090         .nr(4)
46091         .kr(8)
46092         .sr(1)
46093         .m(m)
46094         .n(4)
46095         .k(8)
46096         .iterations(1)
46097         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46098     }
46099   }
46100 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_eq_8_subtile_n)46101   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_eq_8_subtile_n) {
46102     TEST_REQUIRES_X86_SSE41;
46103     for (uint32_t n = 1; n <= 4; n++) {
46104       GemmMicrokernelTester()
46105         .extended_weights(true)
46106         .mr(2)
46107         .nr(4)
46108         .kr(8)
46109         .sr(1)
46110         .m(2)
46111         .n(n)
46112         .k(8)
46113         .iterations(1)
46114         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46115     }
46116   }
46117 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_lt_8)46118   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_lt_8) {
46119     TEST_REQUIRES_X86_SSE41;
46120     for (size_t k = 1; k < 8; k++) {
46121       GemmMicrokernelTester()
46122         .extended_weights(true)
46123         .mr(2)
46124         .nr(4)
46125         .kr(8)
46126         .sr(1)
46127         .m(2)
46128         .n(4)
46129         .k(k)
46130         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46131     }
46132   }
46133 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_lt_8_strided_a)46134   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_lt_8_strided_a) {
46135     TEST_REQUIRES_X86_SSE41;
46136     for (size_t k = 1; k < 8; k++) {
46137       GemmMicrokernelTester()
46138         .extended_weights(true)
46139         .mr(2)
46140         .nr(4)
46141         .kr(8)
46142         .sr(1)
46143         .m(2)
46144         .n(4)
46145         .k(k)
46146         .a_stride(11)
46147         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46148     }
46149   }
46150 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_lt_8_subtile)46151   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_lt_8_subtile) {
46152     TEST_REQUIRES_X86_SSE41;
46153     for (size_t k = 1; k < 8; k++) {
46154       for (uint32_t n = 1; n <= 4; n++) {
46155         for (uint32_t m = 1; m <= 2; m++) {
46156           GemmMicrokernelTester()
46157             .extended_weights(true)
46158             .mr(2)
46159             .nr(4)
46160             .kr(8)
46161             .sr(1)
46162             .m(m)
46163             .n(n)
46164             .k(k)
46165             .iterations(1)
46166             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46167         }
46168       }
46169     }
46170   }
46171 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_gt_8)46172   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_gt_8) {
46173     TEST_REQUIRES_X86_SSE41;
46174     for (size_t k = 9; k < 16; k++) {
46175       GemmMicrokernelTester()
46176         .extended_weights(true)
46177         .mr(2)
46178         .nr(4)
46179         .kr(8)
46180         .sr(1)
46181         .m(2)
46182         .n(4)
46183         .k(k)
46184         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46185     }
46186   }
46187 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_gt_8_strided_a)46188   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_gt_8_strided_a) {
46189     TEST_REQUIRES_X86_SSE41;
46190     for (size_t k = 9; k < 16; k++) {
46191       GemmMicrokernelTester()
46192         .extended_weights(true)
46193         .mr(2)
46194         .nr(4)
46195         .kr(8)
46196         .sr(1)
46197         .m(2)
46198         .n(4)
46199         .k(k)
46200         .a_stride(19)
46201         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46202     }
46203   }
46204 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_gt_8_subtile)46205   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_gt_8_subtile) {
46206     TEST_REQUIRES_X86_SSE41;
46207     for (size_t k = 9; k < 16; k++) {
46208       for (uint32_t n = 1; n <= 4; n++) {
46209         for (uint32_t m = 1; m <= 2; m++) {
46210           GemmMicrokernelTester()
46211             .extended_weights(true)
46212             .mr(2)
46213             .nr(4)
46214             .kr(8)
46215             .sr(1)
46216             .m(m)
46217             .n(n)
46218             .k(k)
46219             .iterations(1)
46220             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46221         }
46222       }
46223     }
46224   }
46225 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_div_8)46226   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_div_8) {
46227     TEST_REQUIRES_X86_SSE41;
46228     for (size_t k = 16; k <= 80; k += 8) {
46229       GemmMicrokernelTester()
46230         .extended_weights(true)
46231         .mr(2)
46232         .nr(4)
46233         .kr(8)
46234         .sr(1)
46235         .m(2)
46236         .n(4)
46237         .k(k)
46238         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46239     }
46240   }
46241 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_div_8_strided_a)46242   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_div_8_strided_a) {
46243     TEST_REQUIRES_X86_SSE41;
46244     for (size_t k = 16; k <= 80; k += 8) {
46245       GemmMicrokernelTester()
46246         .extended_weights(true)
46247         .mr(2)
46248         .nr(4)
46249         .kr(8)
46250         .sr(1)
46251         .m(2)
46252         .n(4)
46253         .k(k)
46254         .a_stride(83)
46255         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46256     }
46257   }
46258 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,k_div_8_subtile)46259   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, k_div_8_subtile) {
46260     TEST_REQUIRES_X86_SSE41;
46261     for (size_t k = 16; k <= 80; k += 8) {
46262       for (uint32_t n = 1; n <= 4; n++) {
46263         for (uint32_t m = 1; m <= 2; m++) {
46264           GemmMicrokernelTester()
46265             .extended_weights(true)
46266             .mr(2)
46267             .nr(4)
46268             .kr(8)
46269             .sr(1)
46270             .m(m)
46271             .n(n)
46272             .k(k)
46273             .iterations(1)
46274             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46275         }
46276       }
46277     }
46278   }
46279 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_gt_4)46280   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_gt_4) {
46281     TEST_REQUIRES_X86_SSE41;
46282     for (uint32_t n = 5; n < 8; n++) {
46283       for (size_t k = 1; k <= 40; k += 9) {
46284         GemmMicrokernelTester()
46285           .extended_weights(true)
46286           .mr(2)
46287           .nr(4)
46288           .kr(8)
46289           .sr(1)
46290           .m(2)
46291           .n(n)
46292           .k(k)
46293           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46294       }
46295     }
46296   }
46297 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_gt_4_strided_cn)46298   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_gt_4_strided_cn) {
46299     TEST_REQUIRES_X86_SSE41;
46300     for (uint32_t n = 5; n < 8; n++) {
46301       for (size_t k = 1; k <= 40; k += 9) {
46302         GemmMicrokernelTester()
46303           .extended_weights(true)
46304           .mr(2)
46305           .nr(4)
46306           .kr(8)
46307           .sr(1)
46308           .m(2)
46309           .n(n)
46310           .k(k)
46311           .cn_stride(7)
46312           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46313       }
46314     }
46315   }
46316 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_gt_4_strided_a)46317   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_gt_4_strided_a) {
46318     TEST_REQUIRES_X86_SSE41;
46319     for (uint32_t n = 5; n < 8; n++) {
46320       for (size_t k = 1; k <= 40; k += 9) {
46321         GemmMicrokernelTester()
46322           .extended_weights(true)
46323           .mr(2)
46324           .nr(4)
46325           .kr(8)
46326           .sr(1)
46327           .m(2)
46328           .n(n)
46329           .k(k)
46330           .a_stride(43)
46331           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46332       }
46333     }
46334   }
46335 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_gt_4_subtile)46336   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_gt_4_subtile) {
46337     TEST_REQUIRES_X86_SSE41;
46338     for (uint32_t n = 5; n < 8; n++) {
46339       for (size_t k = 1; k <= 40; k += 9) {
46340         for (uint32_t m = 1; m <= 2; m++) {
46341           GemmMicrokernelTester()
46342             .extended_weights(true)
46343             .mr(2)
46344             .nr(4)
46345             .kr(8)
46346             .sr(1)
46347             .m(m)
46348             .n(n)
46349             .k(k)
46350             .iterations(1)
46351             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46352         }
46353       }
46354     }
46355   }
46356 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_div_4)46357   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_div_4) {
46358     TEST_REQUIRES_X86_SSE41;
46359     for (uint32_t n = 8; n <= 12; n += 4) {
46360       for (size_t k = 1; k <= 40; k += 9) {
46361         GemmMicrokernelTester()
46362           .extended_weights(true)
46363           .mr(2)
46364           .nr(4)
46365           .kr(8)
46366           .sr(1)
46367           .m(2)
46368           .n(n)
46369           .k(k)
46370           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46371       }
46372     }
46373   }
46374 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_div_4_strided_cn)46375   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_div_4_strided_cn) {
46376     TEST_REQUIRES_X86_SSE41;
46377     for (uint32_t n = 8; n <= 12; n += 4) {
46378       for (size_t k = 1; k <= 40; k += 9) {
46379         GemmMicrokernelTester()
46380           .extended_weights(true)
46381           .mr(2)
46382           .nr(4)
46383           .kr(8)
46384           .sr(1)
46385           .m(2)
46386           .n(n)
46387           .k(k)
46388           .cn_stride(7)
46389           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46390       }
46391     }
46392   }
46393 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_div_4_strided_a)46394   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_div_4_strided_a) {
46395     TEST_REQUIRES_X86_SSE41;
46396     for (uint32_t n = 8; n <= 12; n += 4) {
46397       for (size_t k = 1; k <= 40; k += 9) {
46398         GemmMicrokernelTester()
46399           .extended_weights(true)
46400           .mr(2)
46401           .nr(4)
46402           .kr(8)
46403           .sr(1)
46404           .m(2)
46405           .n(n)
46406           .k(k)
46407           .a_stride(43)
46408           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46409       }
46410     }
46411   }
46412 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,n_div_4_subtile)46413   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, n_div_4_subtile) {
46414     TEST_REQUIRES_X86_SSE41;
46415     for (uint32_t n = 8; n <= 12; n += 4) {
46416       for (size_t k = 1; k <= 40; k += 9) {
46417         for (uint32_t m = 1; m <= 2; m++) {
46418           GemmMicrokernelTester()
46419             .extended_weights(true)
46420             .mr(2)
46421             .nr(4)
46422             .kr(8)
46423             .sr(1)
46424             .m(m)
46425             .n(n)
46426             .k(k)
46427             .iterations(1)
46428             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46429         }
46430       }
46431     }
46432   }
46433 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,strided_cm_subtile)46434   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, strided_cm_subtile) {
46435     TEST_REQUIRES_X86_SSE41;
46436     for (size_t k = 1; k <= 40; k += 9) {
46437       for (uint32_t n = 1; n <= 4; n++) {
46438         for (uint32_t m = 1; m <= 2; m++) {
46439           GemmMicrokernelTester()
46440             .extended_weights(true)
46441             .mr(2)
46442             .nr(4)
46443             .kr(8)
46444             .sr(1)
46445             .m(m)
46446             .n(n)
46447             .k(k)
46448             .cm_stride(7)
46449             .iterations(1)
46450             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46451         }
46452       }
46453     }
46454   }
46455 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41,strided_cm)46456   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__SSE41, strided_cm) {
46457     TEST_REQUIRES_X86_SSE41;
46458     GemmMicrokernelTester()
46459       .extended_weights(true)
46460       .mr(2)
46461       .nr(4)
46462       .kr(8)
46463       .sr(1)
46464       .m(2)
46465       .n(4)
46466       .k(8)
46467       .cm_stride(7)
46468       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__sse41, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46469   }
46470 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
46471 
46472 
46473 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_eq_8)46474   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_eq_8) {
46475     TEST_REQUIRES_X86_AVX;
46476     GemmMicrokernelTester()
46477       .extended_weights(true)
46478       .mr(1)
46479       .nr(4)
46480       .kr(8)
46481       .sr(1)
46482       .m(1)
46483       .n(4)
46484       .k(8)
46485       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46486   }
46487 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,strided_cn)46488   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, strided_cn) {
46489     TEST_REQUIRES_X86_AVX;
46490     GemmMicrokernelTester()
46491       .extended_weights(true)
46492       .mr(1)
46493       .nr(4)
46494       .kr(8)
46495       .sr(1)
46496       .m(1)
46497       .n(4)
46498       .k(8)
46499       .cn_stride(7)
46500       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46501   }
46502 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_eq_8_strided_a)46503   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_eq_8_strided_a) {
46504     TEST_REQUIRES_X86_AVX;
46505     GemmMicrokernelTester()
46506       .extended_weights(true)
46507       .mr(1)
46508       .nr(4)
46509       .kr(8)
46510       .sr(1)
46511       .m(1)
46512       .n(4)
46513       .k(8)
46514       .a_stride(11)
46515       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46516   }
46517 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_eq_8_subtile)46518   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_eq_8_subtile) {
46519     TEST_REQUIRES_X86_AVX;
46520     for (uint32_t n = 1; n <= 4; n++) {
46521       for (uint32_t m = 1; m <= 1; m++) {
46522         GemmMicrokernelTester()
46523           .extended_weights(true)
46524           .mr(1)
46525           .nr(4)
46526           .kr(8)
46527           .sr(1)
46528           .m(m)
46529           .n(n)
46530           .k(8)
46531           .iterations(1)
46532           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46533       }
46534     }
46535   }
46536 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_eq_8_subtile_m)46537   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_eq_8_subtile_m) {
46538     TEST_REQUIRES_X86_AVX;
46539     for (uint32_t m = 1; m <= 1; m++) {
46540       GemmMicrokernelTester()
46541         .extended_weights(true)
46542         .mr(1)
46543         .nr(4)
46544         .kr(8)
46545         .sr(1)
46546         .m(m)
46547         .n(4)
46548         .k(8)
46549         .iterations(1)
46550         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46551     }
46552   }
46553 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_eq_8_subtile_n)46554   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_eq_8_subtile_n) {
46555     TEST_REQUIRES_X86_AVX;
46556     for (uint32_t n = 1; n <= 4; n++) {
46557       GemmMicrokernelTester()
46558         .extended_weights(true)
46559         .mr(1)
46560         .nr(4)
46561         .kr(8)
46562         .sr(1)
46563         .m(1)
46564         .n(n)
46565         .k(8)
46566         .iterations(1)
46567         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46568     }
46569   }
46570 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_lt_8)46571   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_lt_8) {
46572     TEST_REQUIRES_X86_AVX;
46573     for (size_t k = 1; k < 8; k++) {
46574       GemmMicrokernelTester()
46575         .extended_weights(true)
46576         .mr(1)
46577         .nr(4)
46578         .kr(8)
46579         .sr(1)
46580         .m(1)
46581         .n(4)
46582         .k(k)
46583         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46584     }
46585   }
46586 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_lt_8_strided_a)46587   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_lt_8_strided_a) {
46588     TEST_REQUIRES_X86_AVX;
46589     for (size_t k = 1; k < 8; k++) {
46590       GemmMicrokernelTester()
46591         .extended_weights(true)
46592         .mr(1)
46593         .nr(4)
46594         .kr(8)
46595         .sr(1)
46596         .m(1)
46597         .n(4)
46598         .k(k)
46599         .a_stride(11)
46600         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46601     }
46602   }
46603 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_lt_8_subtile)46604   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_lt_8_subtile) {
46605     TEST_REQUIRES_X86_AVX;
46606     for (size_t k = 1; k < 8; k++) {
46607       for (uint32_t n = 1; n <= 4; n++) {
46608         for (uint32_t m = 1; m <= 1; m++) {
46609           GemmMicrokernelTester()
46610             .extended_weights(true)
46611             .mr(1)
46612             .nr(4)
46613             .kr(8)
46614             .sr(1)
46615             .m(m)
46616             .n(n)
46617             .k(k)
46618             .iterations(1)
46619             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46620         }
46621       }
46622     }
46623   }
46624 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_gt_8)46625   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_gt_8) {
46626     TEST_REQUIRES_X86_AVX;
46627     for (size_t k = 9; k < 16; k++) {
46628       GemmMicrokernelTester()
46629         .extended_weights(true)
46630         .mr(1)
46631         .nr(4)
46632         .kr(8)
46633         .sr(1)
46634         .m(1)
46635         .n(4)
46636         .k(k)
46637         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46638     }
46639   }
46640 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_gt_8_strided_a)46641   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_gt_8_strided_a) {
46642     TEST_REQUIRES_X86_AVX;
46643     for (size_t k = 9; k < 16; k++) {
46644       GemmMicrokernelTester()
46645         .extended_weights(true)
46646         .mr(1)
46647         .nr(4)
46648         .kr(8)
46649         .sr(1)
46650         .m(1)
46651         .n(4)
46652         .k(k)
46653         .a_stride(19)
46654         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46655     }
46656   }
46657 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_gt_8_subtile)46658   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_gt_8_subtile) {
46659     TEST_REQUIRES_X86_AVX;
46660     for (size_t k = 9; k < 16; k++) {
46661       for (uint32_t n = 1; n <= 4; n++) {
46662         for (uint32_t m = 1; m <= 1; m++) {
46663           GemmMicrokernelTester()
46664             .extended_weights(true)
46665             .mr(1)
46666             .nr(4)
46667             .kr(8)
46668             .sr(1)
46669             .m(m)
46670             .n(n)
46671             .k(k)
46672             .iterations(1)
46673             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46674         }
46675       }
46676     }
46677   }
46678 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_div_8)46679   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_div_8) {
46680     TEST_REQUIRES_X86_AVX;
46681     for (size_t k = 16; k <= 80; k += 8) {
46682       GemmMicrokernelTester()
46683         .extended_weights(true)
46684         .mr(1)
46685         .nr(4)
46686         .kr(8)
46687         .sr(1)
46688         .m(1)
46689         .n(4)
46690         .k(k)
46691         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46692     }
46693   }
46694 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_div_8_strided_a)46695   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_div_8_strided_a) {
46696     TEST_REQUIRES_X86_AVX;
46697     for (size_t k = 16; k <= 80; k += 8) {
46698       GemmMicrokernelTester()
46699         .extended_weights(true)
46700         .mr(1)
46701         .nr(4)
46702         .kr(8)
46703         .sr(1)
46704         .m(1)
46705         .n(4)
46706         .k(k)
46707         .a_stride(83)
46708         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46709     }
46710   }
46711 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,k_div_8_subtile)46712   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, k_div_8_subtile) {
46713     TEST_REQUIRES_X86_AVX;
46714     for (size_t k = 16; k <= 80; k += 8) {
46715       for (uint32_t n = 1; n <= 4; n++) {
46716         for (uint32_t m = 1; m <= 1; m++) {
46717           GemmMicrokernelTester()
46718             .extended_weights(true)
46719             .mr(1)
46720             .nr(4)
46721             .kr(8)
46722             .sr(1)
46723             .m(m)
46724             .n(n)
46725             .k(k)
46726             .iterations(1)
46727             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46728         }
46729       }
46730     }
46731   }
46732 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_gt_4)46733   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_gt_4) {
46734     TEST_REQUIRES_X86_AVX;
46735     for (uint32_t n = 5; n < 8; n++) {
46736       for (size_t k = 1; k <= 40; k += 9) {
46737         GemmMicrokernelTester()
46738           .extended_weights(true)
46739           .mr(1)
46740           .nr(4)
46741           .kr(8)
46742           .sr(1)
46743           .m(1)
46744           .n(n)
46745           .k(k)
46746           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46747       }
46748     }
46749   }
46750 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_gt_4_strided_cn)46751   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_gt_4_strided_cn) {
46752     TEST_REQUIRES_X86_AVX;
46753     for (uint32_t n = 5; n < 8; n++) {
46754       for (size_t k = 1; k <= 40; k += 9) {
46755         GemmMicrokernelTester()
46756           .extended_weights(true)
46757           .mr(1)
46758           .nr(4)
46759           .kr(8)
46760           .sr(1)
46761           .m(1)
46762           .n(n)
46763           .k(k)
46764           .cn_stride(7)
46765           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46766       }
46767     }
46768   }
46769 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_gt_4_strided_a)46770   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_gt_4_strided_a) {
46771     TEST_REQUIRES_X86_AVX;
46772     for (uint32_t n = 5; n < 8; n++) {
46773       for (size_t k = 1; k <= 40; k += 9) {
46774         GemmMicrokernelTester()
46775           .extended_weights(true)
46776           .mr(1)
46777           .nr(4)
46778           .kr(8)
46779           .sr(1)
46780           .m(1)
46781           .n(n)
46782           .k(k)
46783           .a_stride(43)
46784           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46785       }
46786     }
46787   }
46788 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_gt_4_subtile)46789   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_gt_4_subtile) {
46790     TEST_REQUIRES_X86_AVX;
46791     for (uint32_t n = 5; n < 8; n++) {
46792       for (size_t k = 1; k <= 40; k += 9) {
46793         for (uint32_t m = 1; m <= 1; m++) {
46794           GemmMicrokernelTester()
46795             .extended_weights(true)
46796             .mr(1)
46797             .nr(4)
46798             .kr(8)
46799             .sr(1)
46800             .m(m)
46801             .n(n)
46802             .k(k)
46803             .iterations(1)
46804             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46805         }
46806       }
46807     }
46808   }
46809 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_div_4)46810   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_div_4) {
46811     TEST_REQUIRES_X86_AVX;
46812     for (uint32_t n = 8; n <= 12; n += 4) {
46813       for (size_t k = 1; k <= 40; k += 9) {
46814         GemmMicrokernelTester()
46815           .extended_weights(true)
46816           .mr(1)
46817           .nr(4)
46818           .kr(8)
46819           .sr(1)
46820           .m(1)
46821           .n(n)
46822           .k(k)
46823           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46824       }
46825     }
46826   }
46827 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_div_4_strided_cn)46828   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_div_4_strided_cn) {
46829     TEST_REQUIRES_X86_AVX;
46830     for (uint32_t n = 8; n <= 12; n += 4) {
46831       for (size_t k = 1; k <= 40; k += 9) {
46832         GemmMicrokernelTester()
46833           .extended_weights(true)
46834           .mr(1)
46835           .nr(4)
46836           .kr(8)
46837           .sr(1)
46838           .m(1)
46839           .n(n)
46840           .k(k)
46841           .cn_stride(7)
46842           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46843       }
46844     }
46845   }
46846 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_div_4_strided_a)46847   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_div_4_strided_a) {
46848     TEST_REQUIRES_X86_AVX;
46849     for (uint32_t n = 8; n <= 12; n += 4) {
46850       for (size_t k = 1; k <= 40; k += 9) {
46851         GemmMicrokernelTester()
46852           .extended_weights(true)
46853           .mr(1)
46854           .nr(4)
46855           .kr(8)
46856           .sr(1)
46857           .m(1)
46858           .n(n)
46859           .k(k)
46860           .a_stride(43)
46861           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46862       }
46863     }
46864   }
46865 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,n_div_4_subtile)46866   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, n_div_4_subtile) {
46867     TEST_REQUIRES_X86_AVX;
46868     for (uint32_t n = 8; n <= 12; n += 4) {
46869       for (size_t k = 1; k <= 40; k += 9) {
46870         for (uint32_t m = 1; m <= 1; m++) {
46871           GemmMicrokernelTester()
46872             .extended_weights(true)
46873             .mr(1)
46874             .nr(4)
46875             .kr(8)
46876             .sr(1)
46877             .m(m)
46878             .n(n)
46879             .k(k)
46880             .iterations(1)
46881             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46882         }
46883       }
46884     }
46885   }
46886 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,strided_cm_subtile)46887   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, strided_cm_subtile) {
46888     TEST_REQUIRES_X86_AVX;
46889     for (size_t k = 1; k <= 40; k += 9) {
46890       for (uint32_t n = 1; n <= 4; n++) {
46891         for (uint32_t m = 1; m <= 1; m++) {
46892           GemmMicrokernelTester()
46893             .extended_weights(true)
46894             .mr(1)
46895             .nr(4)
46896             .kr(8)
46897             .sr(1)
46898             .m(m)
46899             .n(n)
46900             .k(k)
46901             .cm_stride(7)
46902             .iterations(1)
46903             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46904         }
46905       }
46906     }
46907   }
46908 
TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX,strided_cm)46909   TEST(QS8_GEMM_XW_MINMAX_FP32_1X4C8__AVX, strided_cm) {
46910     TEST_REQUIRES_X86_AVX;
46911     GemmMicrokernelTester()
46912       .extended_weights(true)
46913       .mr(1)
46914       .nr(4)
46915       .kr(8)
46916       .sr(1)
46917       .m(1)
46918       .n(4)
46919       .k(8)
46920       .cm_stride(7)
46921       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_1x4c8__avx, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46922   }
46923 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
46924 
46925 
46926 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_eq_8)46927   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_eq_8) {
46928     TEST_REQUIRES_X86_XOP;
46929     GemmMicrokernelTester()
46930       .extended_weights(true)
46931       .mr(2)
46932       .nr(4)
46933       .kr(8)
46934       .sr(1)
46935       .m(2)
46936       .n(4)
46937       .k(8)
46938       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46939   }
46940 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,strided_cn)46941   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, strided_cn) {
46942     TEST_REQUIRES_X86_XOP;
46943     GemmMicrokernelTester()
46944       .extended_weights(true)
46945       .mr(2)
46946       .nr(4)
46947       .kr(8)
46948       .sr(1)
46949       .m(2)
46950       .n(4)
46951       .k(8)
46952       .cn_stride(7)
46953       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46954   }
46955 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_eq_8_strided_a)46956   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_eq_8_strided_a) {
46957     TEST_REQUIRES_X86_XOP;
46958     GemmMicrokernelTester()
46959       .extended_weights(true)
46960       .mr(2)
46961       .nr(4)
46962       .kr(8)
46963       .sr(1)
46964       .m(2)
46965       .n(4)
46966       .k(8)
46967       .a_stride(11)
46968       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46969   }
46970 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_eq_8_subtile)46971   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_eq_8_subtile) {
46972     TEST_REQUIRES_X86_XOP;
46973     for (uint32_t n = 1; n <= 4; n++) {
46974       for (uint32_t m = 1; m <= 2; m++) {
46975         GemmMicrokernelTester()
46976           .extended_weights(true)
46977           .mr(2)
46978           .nr(4)
46979           .kr(8)
46980           .sr(1)
46981           .m(m)
46982           .n(n)
46983           .k(8)
46984           .iterations(1)
46985           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
46986       }
46987     }
46988   }
46989 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_eq_8_subtile_m)46990   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_eq_8_subtile_m) {
46991     TEST_REQUIRES_X86_XOP;
46992     for (uint32_t m = 1; m <= 2; m++) {
46993       GemmMicrokernelTester()
46994         .extended_weights(true)
46995         .mr(2)
46996         .nr(4)
46997         .kr(8)
46998         .sr(1)
46999         .m(m)
47000         .n(4)
47001         .k(8)
47002         .iterations(1)
47003         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47004     }
47005   }
47006 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_eq_8_subtile_n)47007   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_eq_8_subtile_n) {
47008     TEST_REQUIRES_X86_XOP;
47009     for (uint32_t n = 1; n <= 4; n++) {
47010       GemmMicrokernelTester()
47011         .extended_weights(true)
47012         .mr(2)
47013         .nr(4)
47014         .kr(8)
47015         .sr(1)
47016         .m(2)
47017         .n(n)
47018         .k(8)
47019         .iterations(1)
47020         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47021     }
47022   }
47023 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_lt_8)47024   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_lt_8) {
47025     TEST_REQUIRES_X86_XOP;
47026     for (size_t k = 1; k < 8; k++) {
47027       GemmMicrokernelTester()
47028         .extended_weights(true)
47029         .mr(2)
47030         .nr(4)
47031         .kr(8)
47032         .sr(1)
47033         .m(2)
47034         .n(4)
47035         .k(k)
47036         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47037     }
47038   }
47039 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_lt_8_strided_a)47040   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_lt_8_strided_a) {
47041     TEST_REQUIRES_X86_XOP;
47042     for (size_t k = 1; k < 8; k++) {
47043       GemmMicrokernelTester()
47044         .extended_weights(true)
47045         .mr(2)
47046         .nr(4)
47047         .kr(8)
47048         .sr(1)
47049         .m(2)
47050         .n(4)
47051         .k(k)
47052         .a_stride(11)
47053         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47054     }
47055   }
47056 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_lt_8_subtile)47057   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_lt_8_subtile) {
47058     TEST_REQUIRES_X86_XOP;
47059     for (size_t k = 1; k < 8; k++) {
47060       for (uint32_t n = 1; n <= 4; n++) {
47061         for (uint32_t m = 1; m <= 2; m++) {
47062           GemmMicrokernelTester()
47063             .extended_weights(true)
47064             .mr(2)
47065             .nr(4)
47066             .kr(8)
47067             .sr(1)
47068             .m(m)
47069             .n(n)
47070             .k(k)
47071             .iterations(1)
47072             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47073         }
47074       }
47075     }
47076   }
47077 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_gt_8)47078   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_gt_8) {
47079     TEST_REQUIRES_X86_XOP;
47080     for (size_t k = 9; k < 16; k++) {
47081       GemmMicrokernelTester()
47082         .extended_weights(true)
47083         .mr(2)
47084         .nr(4)
47085         .kr(8)
47086         .sr(1)
47087         .m(2)
47088         .n(4)
47089         .k(k)
47090         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47091     }
47092   }
47093 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_gt_8_strided_a)47094   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_gt_8_strided_a) {
47095     TEST_REQUIRES_X86_XOP;
47096     for (size_t k = 9; k < 16; k++) {
47097       GemmMicrokernelTester()
47098         .extended_weights(true)
47099         .mr(2)
47100         .nr(4)
47101         .kr(8)
47102         .sr(1)
47103         .m(2)
47104         .n(4)
47105         .k(k)
47106         .a_stride(19)
47107         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47108     }
47109   }
47110 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_gt_8_subtile)47111   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_gt_8_subtile) {
47112     TEST_REQUIRES_X86_XOP;
47113     for (size_t k = 9; k < 16; k++) {
47114       for (uint32_t n = 1; n <= 4; n++) {
47115         for (uint32_t m = 1; m <= 2; m++) {
47116           GemmMicrokernelTester()
47117             .extended_weights(true)
47118             .mr(2)
47119             .nr(4)
47120             .kr(8)
47121             .sr(1)
47122             .m(m)
47123             .n(n)
47124             .k(k)
47125             .iterations(1)
47126             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47127         }
47128       }
47129     }
47130   }
47131 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_div_8)47132   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_div_8) {
47133     TEST_REQUIRES_X86_XOP;
47134     for (size_t k = 16; k <= 80; k += 8) {
47135       GemmMicrokernelTester()
47136         .extended_weights(true)
47137         .mr(2)
47138         .nr(4)
47139         .kr(8)
47140         .sr(1)
47141         .m(2)
47142         .n(4)
47143         .k(k)
47144         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47145     }
47146   }
47147 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_div_8_strided_a)47148   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_div_8_strided_a) {
47149     TEST_REQUIRES_X86_XOP;
47150     for (size_t k = 16; k <= 80; k += 8) {
47151       GemmMicrokernelTester()
47152         .extended_weights(true)
47153         .mr(2)
47154         .nr(4)
47155         .kr(8)
47156         .sr(1)
47157         .m(2)
47158         .n(4)
47159         .k(k)
47160         .a_stride(83)
47161         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47162     }
47163   }
47164 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,k_div_8_subtile)47165   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, k_div_8_subtile) {
47166     TEST_REQUIRES_X86_XOP;
47167     for (size_t k = 16; k <= 80; k += 8) {
47168       for (uint32_t n = 1; n <= 4; n++) {
47169         for (uint32_t m = 1; m <= 2; m++) {
47170           GemmMicrokernelTester()
47171             .extended_weights(true)
47172             .mr(2)
47173             .nr(4)
47174             .kr(8)
47175             .sr(1)
47176             .m(m)
47177             .n(n)
47178             .k(k)
47179             .iterations(1)
47180             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47181         }
47182       }
47183     }
47184   }
47185 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_gt_4)47186   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_gt_4) {
47187     TEST_REQUIRES_X86_XOP;
47188     for (uint32_t n = 5; n < 8; n++) {
47189       for (size_t k = 1; k <= 40; k += 9) {
47190         GemmMicrokernelTester()
47191           .extended_weights(true)
47192           .mr(2)
47193           .nr(4)
47194           .kr(8)
47195           .sr(1)
47196           .m(2)
47197           .n(n)
47198           .k(k)
47199           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47200       }
47201     }
47202   }
47203 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_gt_4_strided_cn)47204   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_gt_4_strided_cn) {
47205     TEST_REQUIRES_X86_XOP;
47206     for (uint32_t n = 5; n < 8; n++) {
47207       for (size_t k = 1; k <= 40; k += 9) {
47208         GemmMicrokernelTester()
47209           .extended_weights(true)
47210           .mr(2)
47211           .nr(4)
47212           .kr(8)
47213           .sr(1)
47214           .m(2)
47215           .n(n)
47216           .k(k)
47217           .cn_stride(7)
47218           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47219       }
47220     }
47221   }
47222 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_gt_4_strided_a)47223   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_gt_4_strided_a) {
47224     TEST_REQUIRES_X86_XOP;
47225     for (uint32_t n = 5; n < 8; n++) {
47226       for (size_t k = 1; k <= 40; k += 9) {
47227         GemmMicrokernelTester()
47228           .extended_weights(true)
47229           .mr(2)
47230           .nr(4)
47231           .kr(8)
47232           .sr(1)
47233           .m(2)
47234           .n(n)
47235           .k(k)
47236           .a_stride(43)
47237           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47238       }
47239     }
47240   }
47241 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_gt_4_subtile)47242   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_gt_4_subtile) {
47243     TEST_REQUIRES_X86_XOP;
47244     for (uint32_t n = 5; n < 8; n++) {
47245       for (size_t k = 1; k <= 40; k += 9) {
47246         for (uint32_t m = 1; m <= 2; m++) {
47247           GemmMicrokernelTester()
47248             .extended_weights(true)
47249             .mr(2)
47250             .nr(4)
47251             .kr(8)
47252             .sr(1)
47253             .m(m)
47254             .n(n)
47255             .k(k)
47256             .iterations(1)
47257             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47258         }
47259       }
47260     }
47261   }
47262 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_div_4)47263   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_div_4) {
47264     TEST_REQUIRES_X86_XOP;
47265     for (uint32_t n = 8; n <= 12; n += 4) {
47266       for (size_t k = 1; k <= 40; k += 9) {
47267         GemmMicrokernelTester()
47268           .extended_weights(true)
47269           .mr(2)
47270           .nr(4)
47271           .kr(8)
47272           .sr(1)
47273           .m(2)
47274           .n(n)
47275           .k(k)
47276           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47277       }
47278     }
47279   }
47280 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_div_4_strided_cn)47281   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_div_4_strided_cn) {
47282     TEST_REQUIRES_X86_XOP;
47283     for (uint32_t n = 8; n <= 12; n += 4) {
47284       for (size_t k = 1; k <= 40; k += 9) {
47285         GemmMicrokernelTester()
47286           .extended_weights(true)
47287           .mr(2)
47288           .nr(4)
47289           .kr(8)
47290           .sr(1)
47291           .m(2)
47292           .n(n)
47293           .k(k)
47294           .cn_stride(7)
47295           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47296       }
47297     }
47298   }
47299 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_div_4_strided_a)47300   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_div_4_strided_a) {
47301     TEST_REQUIRES_X86_XOP;
47302     for (uint32_t n = 8; n <= 12; n += 4) {
47303       for (size_t k = 1; k <= 40; k += 9) {
47304         GemmMicrokernelTester()
47305           .extended_weights(true)
47306           .mr(2)
47307           .nr(4)
47308           .kr(8)
47309           .sr(1)
47310           .m(2)
47311           .n(n)
47312           .k(k)
47313           .a_stride(43)
47314           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47315       }
47316     }
47317   }
47318 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,n_div_4_subtile)47319   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, n_div_4_subtile) {
47320     TEST_REQUIRES_X86_XOP;
47321     for (uint32_t n = 8; n <= 12; n += 4) {
47322       for (size_t k = 1; k <= 40; k += 9) {
47323         for (uint32_t m = 1; m <= 2; m++) {
47324           GemmMicrokernelTester()
47325             .extended_weights(true)
47326             .mr(2)
47327             .nr(4)
47328             .kr(8)
47329             .sr(1)
47330             .m(m)
47331             .n(n)
47332             .k(k)
47333             .iterations(1)
47334             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47335         }
47336       }
47337     }
47338   }
47339 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,strided_cm_subtile)47340   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, strided_cm_subtile) {
47341     TEST_REQUIRES_X86_XOP;
47342     for (size_t k = 1; k <= 40; k += 9) {
47343       for (uint32_t n = 1; n <= 4; n++) {
47344         for (uint32_t m = 1; m <= 2; m++) {
47345           GemmMicrokernelTester()
47346             .extended_weights(true)
47347             .mr(2)
47348             .nr(4)
47349             .kr(8)
47350             .sr(1)
47351             .m(m)
47352             .n(n)
47353             .k(k)
47354             .cm_stride(7)
47355             .iterations(1)
47356             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47357         }
47358       }
47359     }
47360   }
47361 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP,strided_cm)47362   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__XOP, strided_cm) {
47363     TEST_REQUIRES_X86_XOP;
47364     GemmMicrokernelTester()
47365       .extended_weights(true)
47366       .mr(2)
47367       .nr(4)
47368       .kr(8)
47369       .sr(1)
47370       .m(2)
47371       .n(4)
47372       .k(8)
47373       .cm_stride(7)
47374       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47375   }
47376 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
47377 
47378 
47379 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_eq_8)47380   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_eq_8) {
47381     TEST_REQUIRES_X86_XOP;
47382     GemmMicrokernelTester()
47383       .extended_weights(true)
47384       .mr(3)
47385       .nr(4)
47386       .kr(8)
47387       .sr(1)
47388       .m(3)
47389       .n(4)
47390       .k(8)
47391       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47392   }
47393 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,strided_cn)47394   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, strided_cn) {
47395     TEST_REQUIRES_X86_XOP;
47396     GemmMicrokernelTester()
47397       .extended_weights(true)
47398       .mr(3)
47399       .nr(4)
47400       .kr(8)
47401       .sr(1)
47402       .m(3)
47403       .n(4)
47404       .k(8)
47405       .cn_stride(7)
47406       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47407   }
47408 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_eq_8_strided_a)47409   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_eq_8_strided_a) {
47410     TEST_REQUIRES_X86_XOP;
47411     GemmMicrokernelTester()
47412       .extended_weights(true)
47413       .mr(3)
47414       .nr(4)
47415       .kr(8)
47416       .sr(1)
47417       .m(3)
47418       .n(4)
47419       .k(8)
47420       .a_stride(11)
47421       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47422   }
47423 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_eq_8_subtile)47424   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_eq_8_subtile) {
47425     TEST_REQUIRES_X86_XOP;
47426     for (uint32_t n = 1; n <= 4; n++) {
47427       for (uint32_t m = 1; m <= 3; m++) {
47428         GemmMicrokernelTester()
47429           .extended_weights(true)
47430           .mr(3)
47431           .nr(4)
47432           .kr(8)
47433           .sr(1)
47434           .m(m)
47435           .n(n)
47436           .k(8)
47437           .iterations(1)
47438           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47439       }
47440     }
47441   }
47442 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_eq_8_subtile_m)47443   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_eq_8_subtile_m) {
47444     TEST_REQUIRES_X86_XOP;
47445     for (uint32_t m = 1; m <= 3; m++) {
47446       GemmMicrokernelTester()
47447         .extended_weights(true)
47448         .mr(3)
47449         .nr(4)
47450         .kr(8)
47451         .sr(1)
47452         .m(m)
47453         .n(4)
47454         .k(8)
47455         .iterations(1)
47456         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47457     }
47458   }
47459 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_eq_8_subtile_n)47460   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_eq_8_subtile_n) {
47461     TEST_REQUIRES_X86_XOP;
47462     for (uint32_t n = 1; n <= 4; n++) {
47463       GemmMicrokernelTester()
47464         .extended_weights(true)
47465         .mr(3)
47466         .nr(4)
47467         .kr(8)
47468         .sr(1)
47469         .m(3)
47470         .n(n)
47471         .k(8)
47472         .iterations(1)
47473         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47474     }
47475   }
47476 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_lt_8)47477   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_lt_8) {
47478     TEST_REQUIRES_X86_XOP;
47479     for (size_t k = 1; k < 8; k++) {
47480       GemmMicrokernelTester()
47481         .extended_weights(true)
47482         .mr(3)
47483         .nr(4)
47484         .kr(8)
47485         .sr(1)
47486         .m(3)
47487         .n(4)
47488         .k(k)
47489         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47490     }
47491   }
47492 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_lt_8_strided_a)47493   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_lt_8_strided_a) {
47494     TEST_REQUIRES_X86_XOP;
47495     for (size_t k = 1; k < 8; k++) {
47496       GemmMicrokernelTester()
47497         .extended_weights(true)
47498         .mr(3)
47499         .nr(4)
47500         .kr(8)
47501         .sr(1)
47502         .m(3)
47503         .n(4)
47504         .k(k)
47505         .a_stride(11)
47506         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47507     }
47508   }
47509 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_lt_8_subtile)47510   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_lt_8_subtile) {
47511     TEST_REQUIRES_X86_XOP;
47512     for (size_t k = 1; k < 8; k++) {
47513       for (uint32_t n = 1; n <= 4; n++) {
47514         for (uint32_t m = 1; m <= 3; m++) {
47515           GemmMicrokernelTester()
47516             .extended_weights(true)
47517             .mr(3)
47518             .nr(4)
47519             .kr(8)
47520             .sr(1)
47521             .m(m)
47522             .n(n)
47523             .k(k)
47524             .iterations(1)
47525             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47526         }
47527       }
47528     }
47529   }
47530 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_gt_8)47531   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_gt_8) {
47532     TEST_REQUIRES_X86_XOP;
47533     for (size_t k = 9; k < 16; k++) {
47534       GemmMicrokernelTester()
47535         .extended_weights(true)
47536         .mr(3)
47537         .nr(4)
47538         .kr(8)
47539         .sr(1)
47540         .m(3)
47541         .n(4)
47542         .k(k)
47543         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47544     }
47545   }
47546 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_gt_8_strided_a)47547   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_gt_8_strided_a) {
47548     TEST_REQUIRES_X86_XOP;
47549     for (size_t k = 9; k < 16; k++) {
47550       GemmMicrokernelTester()
47551         .extended_weights(true)
47552         .mr(3)
47553         .nr(4)
47554         .kr(8)
47555         .sr(1)
47556         .m(3)
47557         .n(4)
47558         .k(k)
47559         .a_stride(19)
47560         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47561     }
47562   }
47563 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_gt_8_subtile)47564   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_gt_8_subtile) {
47565     TEST_REQUIRES_X86_XOP;
47566     for (size_t k = 9; k < 16; k++) {
47567       for (uint32_t n = 1; n <= 4; n++) {
47568         for (uint32_t m = 1; m <= 3; m++) {
47569           GemmMicrokernelTester()
47570             .extended_weights(true)
47571             .mr(3)
47572             .nr(4)
47573             .kr(8)
47574             .sr(1)
47575             .m(m)
47576             .n(n)
47577             .k(k)
47578             .iterations(1)
47579             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47580         }
47581       }
47582     }
47583   }
47584 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_div_8)47585   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_div_8) {
47586     TEST_REQUIRES_X86_XOP;
47587     for (size_t k = 16; k <= 80; k += 8) {
47588       GemmMicrokernelTester()
47589         .extended_weights(true)
47590         .mr(3)
47591         .nr(4)
47592         .kr(8)
47593         .sr(1)
47594         .m(3)
47595         .n(4)
47596         .k(k)
47597         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47598     }
47599   }
47600 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_div_8_strided_a)47601   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_div_8_strided_a) {
47602     TEST_REQUIRES_X86_XOP;
47603     for (size_t k = 16; k <= 80; k += 8) {
47604       GemmMicrokernelTester()
47605         .extended_weights(true)
47606         .mr(3)
47607         .nr(4)
47608         .kr(8)
47609         .sr(1)
47610         .m(3)
47611         .n(4)
47612         .k(k)
47613         .a_stride(83)
47614         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47615     }
47616   }
47617 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,k_div_8_subtile)47618   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, k_div_8_subtile) {
47619     TEST_REQUIRES_X86_XOP;
47620     for (size_t k = 16; k <= 80; k += 8) {
47621       for (uint32_t n = 1; n <= 4; n++) {
47622         for (uint32_t m = 1; m <= 3; m++) {
47623           GemmMicrokernelTester()
47624             .extended_weights(true)
47625             .mr(3)
47626             .nr(4)
47627             .kr(8)
47628             .sr(1)
47629             .m(m)
47630             .n(n)
47631             .k(k)
47632             .iterations(1)
47633             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47634         }
47635       }
47636     }
47637   }
47638 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_gt_4)47639   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_gt_4) {
47640     TEST_REQUIRES_X86_XOP;
47641     for (uint32_t n = 5; n < 8; n++) {
47642       for (size_t k = 1; k <= 40; k += 9) {
47643         GemmMicrokernelTester()
47644           .extended_weights(true)
47645           .mr(3)
47646           .nr(4)
47647           .kr(8)
47648           .sr(1)
47649           .m(3)
47650           .n(n)
47651           .k(k)
47652           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47653       }
47654     }
47655   }
47656 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_gt_4_strided_cn)47657   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_gt_4_strided_cn) {
47658     TEST_REQUIRES_X86_XOP;
47659     for (uint32_t n = 5; n < 8; n++) {
47660       for (size_t k = 1; k <= 40; k += 9) {
47661         GemmMicrokernelTester()
47662           .extended_weights(true)
47663           .mr(3)
47664           .nr(4)
47665           .kr(8)
47666           .sr(1)
47667           .m(3)
47668           .n(n)
47669           .k(k)
47670           .cn_stride(7)
47671           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47672       }
47673     }
47674   }
47675 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_gt_4_strided_a)47676   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_gt_4_strided_a) {
47677     TEST_REQUIRES_X86_XOP;
47678     for (uint32_t n = 5; n < 8; n++) {
47679       for (size_t k = 1; k <= 40; k += 9) {
47680         GemmMicrokernelTester()
47681           .extended_weights(true)
47682           .mr(3)
47683           .nr(4)
47684           .kr(8)
47685           .sr(1)
47686           .m(3)
47687           .n(n)
47688           .k(k)
47689           .a_stride(43)
47690           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47691       }
47692     }
47693   }
47694 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_gt_4_subtile)47695   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_gt_4_subtile) {
47696     TEST_REQUIRES_X86_XOP;
47697     for (uint32_t n = 5; n < 8; n++) {
47698       for (size_t k = 1; k <= 40; k += 9) {
47699         for (uint32_t m = 1; m <= 3; m++) {
47700           GemmMicrokernelTester()
47701             .extended_weights(true)
47702             .mr(3)
47703             .nr(4)
47704             .kr(8)
47705             .sr(1)
47706             .m(m)
47707             .n(n)
47708             .k(k)
47709             .iterations(1)
47710             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47711         }
47712       }
47713     }
47714   }
47715 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_div_4)47716   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_div_4) {
47717     TEST_REQUIRES_X86_XOP;
47718     for (uint32_t n = 8; n <= 12; n += 4) {
47719       for (size_t k = 1; k <= 40; k += 9) {
47720         GemmMicrokernelTester()
47721           .extended_weights(true)
47722           .mr(3)
47723           .nr(4)
47724           .kr(8)
47725           .sr(1)
47726           .m(3)
47727           .n(n)
47728           .k(k)
47729           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47730       }
47731     }
47732   }
47733 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_div_4_strided_cn)47734   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_div_4_strided_cn) {
47735     TEST_REQUIRES_X86_XOP;
47736     for (uint32_t n = 8; n <= 12; n += 4) {
47737       for (size_t k = 1; k <= 40; k += 9) {
47738         GemmMicrokernelTester()
47739           .extended_weights(true)
47740           .mr(3)
47741           .nr(4)
47742           .kr(8)
47743           .sr(1)
47744           .m(3)
47745           .n(n)
47746           .k(k)
47747           .cn_stride(7)
47748           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47749       }
47750     }
47751   }
47752 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_div_4_strided_a)47753   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_div_4_strided_a) {
47754     TEST_REQUIRES_X86_XOP;
47755     for (uint32_t n = 8; n <= 12; n += 4) {
47756       for (size_t k = 1; k <= 40; k += 9) {
47757         GemmMicrokernelTester()
47758           .extended_weights(true)
47759           .mr(3)
47760           .nr(4)
47761           .kr(8)
47762           .sr(1)
47763           .m(3)
47764           .n(n)
47765           .k(k)
47766           .a_stride(43)
47767           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47768       }
47769     }
47770   }
47771 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,n_div_4_subtile)47772   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, n_div_4_subtile) {
47773     TEST_REQUIRES_X86_XOP;
47774     for (uint32_t n = 8; n <= 12; n += 4) {
47775       for (size_t k = 1; k <= 40; k += 9) {
47776         for (uint32_t m = 1; m <= 3; m++) {
47777           GemmMicrokernelTester()
47778             .extended_weights(true)
47779             .mr(3)
47780             .nr(4)
47781             .kr(8)
47782             .sr(1)
47783             .m(m)
47784             .n(n)
47785             .k(k)
47786             .iterations(1)
47787             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47788         }
47789       }
47790     }
47791   }
47792 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,strided_cm_subtile)47793   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, strided_cm_subtile) {
47794     TEST_REQUIRES_X86_XOP;
47795     for (size_t k = 1; k <= 40; k += 9) {
47796       for (uint32_t n = 1; n <= 4; n++) {
47797         for (uint32_t m = 1; m <= 3; m++) {
47798           GemmMicrokernelTester()
47799             .extended_weights(true)
47800             .mr(3)
47801             .nr(4)
47802             .kr(8)
47803             .sr(1)
47804             .m(m)
47805             .n(n)
47806             .k(k)
47807             .cm_stride(7)
47808             .iterations(1)
47809             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47810         }
47811       }
47812     }
47813   }
47814 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP,strided_cm)47815   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__XOP, strided_cm) {
47816     TEST_REQUIRES_X86_XOP;
47817     GemmMicrokernelTester()
47818       .extended_weights(true)
47819       .mr(3)
47820       .nr(4)
47821       .kr(8)
47822       .sr(1)
47823       .m(3)
47824       .n(4)
47825       .k(8)
47826       .cm_stride(7)
47827       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__xop, xnn_init_qs8_conv_minmax_fp32_sse4_params, xnn_qs8_requantize_fp32);
47828   }
47829 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
47830 
47831 
47832 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_eq_8)47833   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_eq_8) {
47834     TEST_REQUIRES_X86_AVX2;
47835     GemmMicrokernelTester()
47836       .mr(1)
47837       .nr(8)
47838       .kr(8)
47839       .sr(1)
47840       .m(1)
47841       .n(8)
47842       .k(8)
47843       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47844   }
47845 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,strided_cn)47846   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, strided_cn) {
47847     TEST_REQUIRES_X86_AVX2;
47848     GemmMicrokernelTester()
47849       .mr(1)
47850       .nr(8)
47851       .kr(8)
47852       .sr(1)
47853       .m(1)
47854       .n(8)
47855       .k(8)
47856       .cn_stride(11)
47857       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47858   }
47859 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_eq_8_strided_a)47860   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_eq_8_strided_a) {
47861     TEST_REQUIRES_X86_AVX2;
47862     GemmMicrokernelTester()
47863       .mr(1)
47864       .nr(8)
47865       .kr(8)
47866       .sr(1)
47867       .m(1)
47868       .n(8)
47869       .k(8)
47870       .a_stride(11)
47871       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47872   }
47873 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_eq_8_subtile)47874   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_eq_8_subtile) {
47875     TEST_REQUIRES_X86_AVX2;
47876     for (uint32_t n = 1; n <= 8; n++) {
47877       for (uint32_t m = 1; m <= 1; m++) {
47878         GemmMicrokernelTester()
47879           .mr(1)
47880           .nr(8)
47881           .kr(8)
47882           .sr(1)
47883           .m(m)
47884           .n(n)
47885           .k(8)
47886           .iterations(1)
47887           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47888       }
47889     }
47890   }
47891 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_eq_8_subtile_m)47892   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_eq_8_subtile_m) {
47893     TEST_REQUIRES_X86_AVX2;
47894     for (uint32_t m = 1; m <= 1; m++) {
47895       GemmMicrokernelTester()
47896         .mr(1)
47897         .nr(8)
47898         .kr(8)
47899         .sr(1)
47900         .m(m)
47901         .n(8)
47902         .k(8)
47903         .iterations(1)
47904         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47905     }
47906   }
47907 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_eq_8_subtile_n)47908   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_eq_8_subtile_n) {
47909     TEST_REQUIRES_X86_AVX2;
47910     for (uint32_t n = 1; n <= 8; n++) {
47911       GemmMicrokernelTester()
47912         .mr(1)
47913         .nr(8)
47914         .kr(8)
47915         .sr(1)
47916         .m(1)
47917         .n(n)
47918         .k(8)
47919         .iterations(1)
47920         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47921     }
47922   }
47923 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_lt_8)47924   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_lt_8) {
47925     TEST_REQUIRES_X86_AVX2;
47926     for (size_t k = 1; k < 8; k++) {
47927       GemmMicrokernelTester()
47928         .mr(1)
47929         .nr(8)
47930         .kr(8)
47931         .sr(1)
47932         .m(1)
47933         .n(8)
47934         .k(k)
47935         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47936     }
47937   }
47938 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_lt_8_strided_a)47939   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_lt_8_strided_a) {
47940     TEST_REQUIRES_X86_AVX2;
47941     for (size_t k = 1; k < 8; k++) {
47942       GemmMicrokernelTester()
47943         .mr(1)
47944         .nr(8)
47945         .kr(8)
47946         .sr(1)
47947         .m(1)
47948         .n(8)
47949         .k(k)
47950         .a_stride(11)
47951         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47952     }
47953   }
47954 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_lt_8_subtile)47955   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_lt_8_subtile) {
47956     TEST_REQUIRES_X86_AVX2;
47957     for (size_t k = 1; k < 8; k++) {
47958       for (uint32_t n = 1; n <= 8; n++) {
47959         for (uint32_t m = 1; m <= 1; m++) {
47960           GemmMicrokernelTester()
47961             .mr(1)
47962             .nr(8)
47963             .kr(8)
47964             .sr(1)
47965             .m(m)
47966             .n(n)
47967             .k(k)
47968             .iterations(1)
47969             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47970         }
47971       }
47972     }
47973   }
47974 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_gt_8)47975   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_gt_8) {
47976     TEST_REQUIRES_X86_AVX2;
47977     for (size_t k = 9; k < 16; k++) {
47978       GemmMicrokernelTester()
47979         .mr(1)
47980         .nr(8)
47981         .kr(8)
47982         .sr(1)
47983         .m(1)
47984         .n(8)
47985         .k(k)
47986         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
47987     }
47988   }
47989 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_gt_8_strided_a)47990   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_gt_8_strided_a) {
47991     TEST_REQUIRES_X86_AVX2;
47992     for (size_t k = 9; k < 16; k++) {
47993       GemmMicrokernelTester()
47994         .mr(1)
47995         .nr(8)
47996         .kr(8)
47997         .sr(1)
47998         .m(1)
47999         .n(8)
48000         .k(k)
48001         .a_stride(19)
48002         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48003     }
48004   }
48005 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_gt_8_subtile)48006   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_gt_8_subtile) {
48007     TEST_REQUIRES_X86_AVX2;
48008     for (size_t k = 9; k < 16; k++) {
48009       for (uint32_t n = 1; n <= 8; n++) {
48010         for (uint32_t m = 1; m <= 1; m++) {
48011           GemmMicrokernelTester()
48012             .mr(1)
48013             .nr(8)
48014             .kr(8)
48015             .sr(1)
48016             .m(m)
48017             .n(n)
48018             .k(k)
48019             .iterations(1)
48020             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48021         }
48022       }
48023     }
48024   }
48025 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_div_8)48026   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_div_8) {
48027     TEST_REQUIRES_X86_AVX2;
48028     for (size_t k = 16; k <= 80; k += 8) {
48029       GemmMicrokernelTester()
48030         .mr(1)
48031         .nr(8)
48032         .kr(8)
48033         .sr(1)
48034         .m(1)
48035         .n(8)
48036         .k(k)
48037         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48038     }
48039   }
48040 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_div_8_strided_a)48041   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_div_8_strided_a) {
48042     TEST_REQUIRES_X86_AVX2;
48043     for (size_t k = 16; k <= 80; k += 8) {
48044       GemmMicrokernelTester()
48045         .mr(1)
48046         .nr(8)
48047         .kr(8)
48048         .sr(1)
48049         .m(1)
48050         .n(8)
48051         .k(k)
48052         .a_stride(83)
48053         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48054     }
48055   }
48056 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,k_div_8_subtile)48057   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, k_div_8_subtile) {
48058     TEST_REQUIRES_X86_AVX2;
48059     for (size_t k = 16; k <= 80; k += 8) {
48060       for (uint32_t n = 1; n <= 8; n++) {
48061         for (uint32_t m = 1; m <= 1; m++) {
48062           GemmMicrokernelTester()
48063             .mr(1)
48064             .nr(8)
48065             .kr(8)
48066             .sr(1)
48067             .m(m)
48068             .n(n)
48069             .k(k)
48070             .iterations(1)
48071             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48072         }
48073       }
48074     }
48075   }
48076 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_gt_8)48077   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_gt_8) {
48078     TEST_REQUIRES_X86_AVX2;
48079     for (uint32_t n = 9; n < 16; n++) {
48080       for (size_t k = 1; k <= 40; k += 9) {
48081         GemmMicrokernelTester()
48082           .mr(1)
48083           .nr(8)
48084           .kr(8)
48085           .sr(1)
48086           .m(1)
48087           .n(n)
48088           .k(k)
48089           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48090       }
48091     }
48092   }
48093 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_gt_8_strided_cn)48094   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_gt_8_strided_cn) {
48095     TEST_REQUIRES_X86_AVX2;
48096     for (uint32_t n = 9; n < 16; n++) {
48097       for (size_t k = 1; k <= 40; k += 9) {
48098         GemmMicrokernelTester()
48099           .mr(1)
48100           .nr(8)
48101           .kr(8)
48102           .sr(1)
48103           .m(1)
48104           .n(n)
48105           .k(k)
48106           .cn_stride(11)
48107           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48108       }
48109     }
48110   }
48111 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_gt_8_strided_a)48112   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_gt_8_strided_a) {
48113     TEST_REQUIRES_X86_AVX2;
48114     for (uint32_t n = 9; n < 16; n++) {
48115       for (size_t k = 1; k <= 40; k += 9) {
48116         GemmMicrokernelTester()
48117           .mr(1)
48118           .nr(8)
48119           .kr(8)
48120           .sr(1)
48121           .m(1)
48122           .n(n)
48123           .k(k)
48124           .a_stride(43)
48125           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48126       }
48127     }
48128   }
48129 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_gt_8_subtile)48130   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_gt_8_subtile) {
48131     TEST_REQUIRES_X86_AVX2;
48132     for (uint32_t n = 9; n < 16; n++) {
48133       for (size_t k = 1; k <= 40; k += 9) {
48134         for (uint32_t m = 1; m <= 1; m++) {
48135           GemmMicrokernelTester()
48136             .mr(1)
48137             .nr(8)
48138             .kr(8)
48139             .sr(1)
48140             .m(m)
48141             .n(n)
48142             .k(k)
48143             .iterations(1)
48144             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48145         }
48146       }
48147     }
48148   }
48149 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_div_8)48150   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_div_8) {
48151     TEST_REQUIRES_X86_AVX2;
48152     for (uint32_t n = 16; n <= 24; n += 8) {
48153       for (size_t k = 1; k <= 40; k += 9) {
48154         GemmMicrokernelTester()
48155           .mr(1)
48156           .nr(8)
48157           .kr(8)
48158           .sr(1)
48159           .m(1)
48160           .n(n)
48161           .k(k)
48162           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48163       }
48164     }
48165   }
48166 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_div_8_strided_cn)48167   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_div_8_strided_cn) {
48168     TEST_REQUIRES_X86_AVX2;
48169     for (uint32_t n = 16; n <= 24; n += 8) {
48170       for (size_t k = 1; k <= 40; k += 9) {
48171         GemmMicrokernelTester()
48172           .mr(1)
48173           .nr(8)
48174           .kr(8)
48175           .sr(1)
48176           .m(1)
48177           .n(n)
48178           .k(k)
48179           .cn_stride(11)
48180           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48181       }
48182     }
48183   }
48184 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_div_8_strided_a)48185   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_div_8_strided_a) {
48186     TEST_REQUIRES_X86_AVX2;
48187     for (uint32_t n = 16; n <= 24; n += 8) {
48188       for (size_t k = 1; k <= 40; k += 9) {
48189         GemmMicrokernelTester()
48190           .mr(1)
48191           .nr(8)
48192           .kr(8)
48193           .sr(1)
48194           .m(1)
48195           .n(n)
48196           .k(k)
48197           .a_stride(43)
48198           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48199       }
48200     }
48201   }
48202 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,n_div_8_subtile)48203   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, n_div_8_subtile) {
48204     TEST_REQUIRES_X86_AVX2;
48205     for (uint32_t n = 16; n <= 24; n += 8) {
48206       for (size_t k = 1; k <= 40; k += 9) {
48207         for (uint32_t m = 1; m <= 1; m++) {
48208           GemmMicrokernelTester()
48209             .mr(1)
48210             .nr(8)
48211             .kr(8)
48212             .sr(1)
48213             .m(m)
48214             .n(n)
48215             .k(k)
48216             .iterations(1)
48217             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48218         }
48219       }
48220     }
48221   }
48222 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,strided_cm_subtile)48223   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, strided_cm_subtile) {
48224     TEST_REQUIRES_X86_AVX2;
48225     for (size_t k = 1; k <= 40; k += 9) {
48226       for (uint32_t n = 1; n <= 8; n++) {
48227         for (uint32_t m = 1; m <= 1; m++) {
48228           GemmMicrokernelTester()
48229             .mr(1)
48230             .nr(8)
48231             .kr(8)
48232             .sr(1)
48233             .m(m)
48234             .n(n)
48235             .k(k)
48236             .cm_stride(11)
48237             .iterations(1)
48238             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48239         }
48240       }
48241     }
48242   }
48243 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,qmin)48244   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, qmin) {
48245     TEST_REQUIRES_X86_AVX2;
48246     GemmMicrokernelTester()
48247       .mr(1)
48248       .nr(8)
48249       .kr(8)
48250       .sr(1)
48251       .m(1)
48252       .n(8)
48253       .k(8)
48254       .qmin(128)
48255       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48256   }
48257 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,qmax)48258   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, qmax) {
48259     TEST_REQUIRES_X86_AVX2;
48260     GemmMicrokernelTester()
48261       .mr(1)
48262       .nr(8)
48263       .kr(8)
48264       .sr(1)
48265       .m(1)
48266       .n(8)
48267       .k(8)
48268       .qmax(128)
48269       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48270   }
48271 
TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2,strided_cm)48272   TEST(QS8_GEMM_MINMAX_FP32_1X8C8__AVX2, strided_cm) {
48273     TEST_REQUIRES_X86_AVX2;
48274     GemmMicrokernelTester()
48275       .mr(1)
48276       .nr(8)
48277       .kr(8)
48278       .sr(1)
48279       .m(1)
48280       .n(8)
48281       .k(8)
48282       .cm_stride(11)
48283       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48284   }
48285 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
48286 
48287 
48288 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_eq_8)48289   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_eq_8) {
48290     TEST_REQUIRES_X86_AVX2;
48291     GemmMicrokernelTester()
48292       .extended_weights(true)
48293       .mr(2)
48294       .nr(8)
48295       .kr(8)
48296       .sr(1)
48297       .m(2)
48298       .n(8)
48299       .k(8)
48300       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48301   }
48302 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,strided_cn)48303   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, strided_cn) {
48304     TEST_REQUIRES_X86_AVX2;
48305     GemmMicrokernelTester()
48306       .extended_weights(true)
48307       .mr(2)
48308       .nr(8)
48309       .kr(8)
48310       .sr(1)
48311       .m(2)
48312       .n(8)
48313       .k(8)
48314       .cn_stride(11)
48315       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48316   }
48317 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_eq_8_strided_a)48318   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_eq_8_strided_a) {
48319     TEST_REQUIRES_X86_AVX2;
48320     GemmMicrokernelTester()
48321       .extended_weights(true)
48322       .mr(2)
48323       .nr(8)
48324       .kr(8)
48325       .sr(1)
48326       .m(2)
48327       .n(8)
48328       .k(8)
48329       .a_stride(11)
48330       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48331   }
48332 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_eq_8_subtile)48333   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_eq_8_subtile) {
48334     TEST_REQUIRES_X86_AVX2;
48335     for (uint32_t n = 1; n <= 8; n++) {
48336       for (uint32_t m = 1; m <= 2; m++) {
48337         GemmMicrokernelTester()
48338           .extended_weights(true)
48339           .mr(2)
48340           .nr(8)
48341           .kr(8)
48342           .sr(1)
48343           .m(m)
48344           .n(n)
48345           .k(8)
48346           .iterations(1)
48347           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48348       }
48349     }
48350   }
48351 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_eq_8_subtile_m)48352   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_eq_8_subtile_m) {
48353     TEST_REQUIRES_X86_AVX2;
48354     for (uint32_t m = 1; m <= 2; m++) {
48355       GemmMicrokernelTester()
48356         .extended_weights(true)
48357         .mr(2)
48358         .nr(8)
48359         .kr(8)
48360         .sr(1)
48361         .m(m)
48362         .n(8)
48363         .k(8)
48364         .iterations(1)
48365         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48366     }
48367   }
48368 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_eq_8_subtile_n)48369   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_eq_8_subtile_n) {
48370     TEST_REQUIRES_X86_AVX2;
48371     for (uint32_t n = 1; n <= 8; n++) {
48372       GemmMicrokernelTester()
48373         .extended_weights(true)
48374         .mr(2)
48375         .nr(8)
48376         .kr(8)
48377         .sr(1)
48378         .m(2)
48379         .n(n)
48380         .k(8)
48381         .iterations(1)
48382         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48383     }
48384   }
48385 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_lt_8)48386   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_lt_8) {
48387     TEST_REQUIRES_X86_AVX2;
48388     for (size_t k = 1; k < 8; k++) {
48389       GemmMicrokernelTester()
48390         .extended_weights(true)
48391         .mr(2)
48392         .nr(8)
48393         .kr(8)
48394         .sr(1)
48395         .m(2)
48396         .n(8)
48397         .k(k)
48398         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48399     }
48400   }
48401 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_lt_8_strided_a)48402   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_lt_8_strided_a) {
48403     TEST_REQUIRES_X86_AVX2;
48404     for (size_t k = 1; k < 8; k++) {
48405       GemmMicrokernelTester()
48406         .extended_weights(true)
48407         .mr(2)
48408         .nr(8)
48409         .kr(8)
48410         .sr(1)
48411         .m(2)
48412         .n(8)
48413         .k(k)
48414         .a_stride(11)
48415         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48416     }
48417   }
48418 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_lt_8_subtile)48419   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_lt_8_subtile) {
48420     TEST_REQUIRES_X86_AVX2;
48421     for (size_t k = 1; k < 8; k++) {
48422       for (uint32_t n = 1; n <= 8; n++) {
48423         for (uint32_t m = 1; m <= 2; m++) {
48424           GemmMicrokernelTester()
48425             .extended_weights(true)
48426             .mr(2)
48427             .nr(8)
48428             .kr(8)
48429             .sr(1)
48430             .m(m)
48431             .n(n)
48432             .k(k)
48433             .iterations(1)
48434             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48435         }
48436       }
48437     }
48438   }
48439 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_gt_8)48440   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_gt_8) {
48441     TEST_REQUIRES_X86_AVX2;
48442     for (size_t k = 9; k < 16; k++) {
48443       GemmMicrokernelTester()
48444         .extended_weights(true)
48445         .mr(2)
48446         .nr(8)
48447         .kr(8)
48448         .sr(1)
48449         .m(2)
48450         .n(8)
48451         .k(k)
48452         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48453     }
48454   }
48455 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_gt_8_strided_a)48456   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_gt_8_strided_a) {
48457     TEST_REQUIRES_X86_AVX2;
48458     for (size_t k = 9; k < 16; k++) {
48459       GemmMicrokernelTester()
48460         .extended_weights(true)
48461         .mr(2)
48462         .nr(8)
48463         .kr(8)
48464         .sr(1)
48465         .m(2)
48466         .n(8)
48467         .k(k)
48468         .a_stride(19)
48469         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48470     }
48471   }
48472 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_gt_8_subtile)48473   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_gt_8_subtile) {
48474     TEST_REQUIRES_X86_AVX2;
48475     for (size_t k = 9; k < 16; k++) {
48476       for (uint32_t n = 1; n <= 8; n++) {
48477         for (uint32_t m = 1; m <= 2; m++) {
48478           GemmMicrokernelTester()
48479             .extended_weights(true)
48480             .mr(2)
48481             .nr(8)
48482             .kr(8)
48483             .sr(1)
48484             .m(m)
48485             .n(n)
48486             .k(k)
48487             .iterations(1)
48488             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48489         }
48490       }
48491     }
48492   }
48493 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_div_8)48494   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_div_8) {
48495     TEST_REQUIRES_X86_AVX2;
48496     for (size_t k = 16; k <= 80; k += 8) {
48497       GemmMicrokernelTester()
48498         .extended_weights(true)
48499         .mr(2)
48500         .nr(8)
48501         .kr(8)
48502         .sr(1)
48503         .m(2)
48504         .n(8)
48505         .k(k)
48506         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48507     }
48508   }
48509 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_div_8_strided_a)48510   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_div_8_strided_a) {
48511     TEST_REQUIRES_X86_AVX2;
48512     for (size_t k = 16; k <= 80; k += 8) {
48513       GemmMicrokernelTester()
48514         .extended_weights(true)
48515         .mr(2)
48516         .nr(8)
48517         .kr(8)
48518         .sr(1)
48519         .m(2)
48520         .n(8)
48521         .k(k)
48522         .a_stride(83)
48523         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48524     }
48525   }
48526 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,k_div_8_subtile)48527   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, k_div_8_subtile) {
48528     TEST_REQUIRES_X86_AVX2;
48529     for (size_t k = 16; k <= 80; k += 8) {
48530       for (uint32_t n = 1; n <= 8; n++) {
48531         for (uint32_t m = 1; m <= 2; m++) {
48532           GemmMicrokernelTester()
48533             .extended_weights(true)
48534             .mr(2)
48535             .nr(8)
48536             .kr(8)
48537             .sr(1)
48538             .m(m)
48539             .n(n)
48540             .k(k)
48541             .iterations(1)
48542             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48543         }
48544       }
48545     }
48546   }
48547 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_gt_8)48548   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_gt_8) {
48549     TEST_REQUIRES_X86_AVX2;
48550     for (uint32_t n = 9; n < 16; n++) {
48551       for (size_t k = 1; k <= 40; k += 9) {
48552         GemmMicrokernelTester()
48553           .extended_weights(true)
48554           .mr(2)
48555           .nr(8)
48556           .kr(8)
48557           .sr(1)
48558           .m(2)
48559           .n(n)
48560           .k(k)
48561           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48562       }
48563     }
48564   }
48565 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_gt_8_strided_cn)48566   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_gt_8_strided_cn) {
48567     TEST_REQUIRES_X86_AVX2;
48568     for (uint32_t n = 9; n < 16; n++) {
48569       for (size_t k = 1; k <= 40; k += 9) {
48570         GemmMicrokernelTester()
48571           .extended_weights(true)
48572           .mr(2)
48573           .nr(8)
48574           .kr(8)
48575           .sr(1)
48576           .m(2)
48577           .n(n)
48578           .k(k)
48579           .cn_stride(11)
48580           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48581       }
48582     }
48583   }
48584 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_gt_8_strided_a)48585   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_gt_8_strided_a) {
48586     TEST_REQUIRES_X86_AVX2;
48587     for (uint32_t n = 9; n < 16; n++) {
48588       for (size_t k = 1; k <= 40; k += 9) {
48589         GemmMicrokernelTester()
48590           .extended_weights(true)
48591           .mr(2)
48592           .nr(8)
48593           .kr(8)
48594           .sr(1)
48595           .m(2)
48596           .n(n)
48597           .k(k)
48598           .a_stride(43)
48599           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48600       }
48601     }
48602   }
48603 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_gt_8_subtile)48604   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_gt_8_subtile) {
48605     TEST_REQUIRES_X86_AVX2;
48606     for (uint32_t n = 9; n < 16; n++) {
48607       for (size_t k = 1; k <= 40; k += 9) {
48608         for (uint32_t m = 1; m <= 2; m++) {
48609           GemmMicrokernelTester()
48610             .extended_weights(true)
48611             .mr(2)
48612             .nr(8)
48613             .kr(8)
48614             .sr(1)
48615             .m(m)
48616             .n(n)
48617             .k(k)
48618             .iterations(1)
48619             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48620         }
48621       }
48622     }
48623   }
48624 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_div_8)48625   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_div_8) {
48626     TEST_REQUIRES_X86_AVX2;
48627     for (uint32_t n = 16; n <= 24; n += 8) {
48628       for (size_t k = 1; k <= 40; k += 9) {
48629         GemmMicrokernelTester()
48630           .extended_weights(true)
48631           .mr(2)
48632           .nr(8)
48633           .kr(8)
48634           .sr(1)
48635           .m(2)
48636           .n(n)
48637           .k(k)
48638           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48639       }
48640     }
48641   }
48642 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_div_8_strided_cn)48643   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_div_8_strided_cn) {
48644     TEST_REQUIRES_X86_AVX2;
48645     for (uint32_t n = 16; n <= 24; n += 8) {
48646       for (size_t k = 1; k <= 40; k += 9) {
48647         GemmMicrokernelTester()
48648           .extended_weights(true)
48649           .mr(2)
48650           .nr(8)
48651           .kr(8)
48652           .sr(1)
48653           .m(2)
48654           .n(n)
48655           .k(k)
48656           .cn_stride(11)
48657           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48658       }
48659     }
48660   }
48661 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_div_8_strided_a)48662   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_div_8_strided_a) {
48663     TEST_REQUIRES_X86_AVX2;
48664     for (uint32_t n = 16; n <= 24; n += 8) {
48665       for (size_t k = 1; k <= 40; k += 9) {
48666         GemmMicrokernelTester()
48667           .extended_weights(true)
48668           .mr(2)
48669           .nr(8)
48670           .kr(8)
48671           .sr(1)
48672           .m(2)
48673           .n(n)
48674           .k(k)
48675           .a_stride(43)
48676           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48677       }
48678     }
48679   }
48680 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,n_div_8_subtile)48681   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, n_div_8_subtile) {
48682     TEST_REQUIRES_X86_AVX2;
48683     for (uint32_t n = 16; n <= 24; n += 8) {
48684       for (size_t k = 1; k <= 40; k += 9) {
48685         for (uint32_t m = 1; m <= 2; m++) {
48686           GemmMicrokernelTester()
48687             .extended_weights(true)
48688             .mr(2)
48689             .nr(8)
48690             .kr(8)
48691             .sr(1)
48692             .m(m)
48693             .n(n)
48694             .k(k)
48695             .iterations(1)
48696             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48697         }
48698       }
48699     }
48700   }
48701 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,strided_cm_subtile)48702   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, strided_cm_subtile) {
48703     TEST_REQUIRES_X86_AVX2;
48704     for (size_t k = 1; k <= 40; k += 9) {
48705       for (uint32_t n = 1; n <= 8; n++) {
48706         for (uint32_t m = 1; m <= 2; m++) {
48707           GemmMicrokernelTester()
48708             .extended_weights(true)
48709             .mr(2)
48710             .nr(8)
48711             .kr(8)
48712             .sr(1)
48713             .m(m)
48714             .n(n)
48715             .k(k)
48716             .cm_stride(11)
48717             .iterations(1)
48718             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48719         }
48720       }
48721     }
48722   }
48723 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2,strided_cm)48724   TEST(QS8_GEMM_XW_MINMAX_FP32_2X8C8__AVX2, strided_cm) {
48725     TEST_REQUIRES_X86_AVX2;
48726     GemmMicrokernelTester()
48727       .extended_weights(true)
48728       .mr(2)
48729       .nr(8)
48730       .kr(8)
48731       .sr(1)
48732       .m(2)
48733       .n(8)
48734       .k(8)
48735       .cm_stride(11)
48736       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48737   }
48738 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
48739 
48740 
48741 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_eq_8)48742   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_eq_8) {
48743     TEST_REQUIRES_X86_AVX2;
48744     GemmMicrokernelTester()
48745       .extended_weights(true)
48746       .mr(3)
48747       .nr(8)
48748       .kr(8)
48749       .sr(1)
48750       .m(3)
48751       .n(8)
48752       .k(8)
48753       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48754   }
48755 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,strided_cn)48756   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, strided_cn) {
48757     TEST_REQUIRES_X86_AVX2;
48758     GemmMicrokernelTester()
48759       .extended_weights(true)
48760       .mr(3)
48761       .nr(8)
48762       .kr(8)
48763       .sr(1)
48764       .m(3)
48765       .n(8)
48766       .k(8)
48767       .cn_stride(11)
48768       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48769   }
48770 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_eq_8_strided_a)48771   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_eq_8_strided_a) {
48772     TEST_REQUIRES_X86_AVX2;
48773     GemmMicrokernelTester()
48774       .extended_weights(true)
48775       .mr(3)
48776       .nr(8)
48777       .kr(8)
48778       .sr(1)
48779       .m(3)
48780       .n(8)
48781       .k(8)
48782       .a_stride(11)
48783       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48784   }
48785 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_eq_8_subtile)48786   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_eq_8_subtile) {
48787     TEST_REQUIRES_X86_AVX2;
48788     for (uint32_t n = 1; n <= 8; n++) {
48789       for (uint32_t m = 1; m <= 3; m++) {
48790         GemmMicrokernelTester()
48791           .extended_weights(true)
48792           .mr(3)
48793           .nr(8)
48794           .kr(8)
48795           .sr(1)
48796           .m(m)
48797           .n(n)
48798           .k(8)
48799           .iterations(1)
48800           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48801       }
48802     }
48803   }
48804 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_eq_8_subtile_m)48805   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_eq_8_subtile_m) {
48806     TEST_REQUIRES_X86_AVX2;
48807     for (uint32_t m = 1; m <= 3; m++) {
48808       GemmMicrokernelTester()
48809         .extended_weights(true)
48810         .mr(3)
48811         .nr(8)
48812         .kr(8)
48813         .sr(1)
48814         .m(m)
48815         .n(8)
48816         .k(8)
48817         .iterations(1)
48818         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48819     }
48820   }
48821 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_eq_8_subtile_n)48822   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_eq_8_subtile_n) {
48823     TEST_REQUIRES_X86_AVX2;
48824     for (uint32_t n = 1; n <= 8; n++) {
48825       GemmMicrokernelTester()
48826         .extended_weights(true)
48827         .mr(3)
48828         .nr(8)
48829         .kr(8)
48830         .sr(1)
48831         .m(3)
48832         .n(n)
48833         .k(8)
48834         .iterations(1)
48835         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48836     }
48837   }
48838 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_lt_8)48839   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_lt_8) {
48840     TEST_REQUIRES_X86_AVX2;
48841     for (size_t k = 1; k < 8; k++) {
48842       GemmMicrokernelTester()
48843         .extended_weights(true)
48844         .mr(3)
48845         .nr(8)
48846         .kr(8)
48847         .sr(1)
48848         .m(3)
48849         .n(8)
48850         .k(k)
48851         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48852     }
48853   }
48854 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_lt_8_strided_a)48855   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_lt_8_strided_a) {
48856     TEST_REQUIRES_X86_AVX2;
48857     for (size_t k = 1; k < 8; k++) {
48858       GemmMicrokernelTester()
48859         .extended_weights(true)
48860         .mr(3)
48861         .nr(8)
48862         .kr(8)
48863         .sr(1)
48864         .m(3)
48865         .n(8)
48866         .k(k)
48867         .a_stride(11)
48868         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48869     }
48870   }
48871 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_lt_8_subtile)48872   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_lt_8_subtile) {
48873     TEST_REQUIRES_X86_AVX2;
48874     for (size_t k = 1; k < 8; k++) {
48875       for (uint32_t n = 1; n <= 8; n++) {
48876         for (uint32_t m = 1; m <= 3; m++) {
48877           GemmMicrokernelTester()
48878             .extended_weights(true)
48879             .mr(3)
48880             .nr(8)
48881             .kr(8)
48882             .sr(1)
48883             .m(m)
48884             .n(n)
48885             .k(k)
48886             .iterations(1)
48887             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48888         }
48889       }
48890     }
48891   }
48892 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_gt_8)48893   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_gt_8) {
48894     TEST_REQUIRES_X86_AVX2;
48895     for (size_t k = 9; k < 16; k++) {
48896       GemmMicrokernelTester()
48897         .extended_weights(true)
48898         .mr(3)
48899         .nr(8)
48900         .kr(8)
48901         .sr(1)
48902         .m(3)
48903         .n(8)
48904         .k(k)
48905         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48906     }
48907   }
48908 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_gt_8_strided_a)48909   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_gt_8_strided_a) {
48910     TEST_REQUIRES_X86_AVX2;
48911     for (size_t k = 9; k < 16; k++) {
48912       GemmMicrokernelTester()
48913         .extended_weights(true)
48914         .mr(3)
48915         .nr(8)
48916         .kr(8)
48917         .sr(1)
48918         .m(3)
48919         .n(8)
48920         .k(k)
48921         .a_stride(19)
48922         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48923     }
48924   }
48925 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_gt_8_subtile)48926   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_gt_8_subtile) {
48927     TEST_REQUIRES_X86_AVX2;
48928     for (size_t k = 9; k < 16; k++) {
48929       for (uint32_t n = 1; n <= 8; n++) {
48930         for (uint32_t m = 1; m <= 3; m++) {
48931           GemmMicrokernelTester()
48932             .extended_weights(true)
48933             .mr(3)
48934             .nr(8)
48935             .kr(8)
48936             .sr(1)
48937             .m(m)
48938             .n(n)
48939             .k(k)
48940             .iterations(1)
48941             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48942         }
48943       }
48944     }
48945   }
48946 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_div_8)48947   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_div_8) {
48948     TEST_REQUIRES_X86_AVX2;
48949     for (size_t k = 16; k <= 80; k += 8) {
48950       GemmMicrokernelTester()
48951         .extended_weights(true)
48952         .mr(3)
48953         .nr(8)
48954         .kr(8)
48955         .sr(1)
48956         .m(3)
48957         .n(8)
48958         .k(k)
48959         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48960     }
48961   }
48962 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_div_8_strided_a)48963   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_div_8_strided_a) {
48964     TEST_REQUIRES_X86_AVX2;
48965     for (size_t k = 16; k <= 80; k += 8) {
48966       GemmMicrokernelTester()
48967         .extended_weights(true)
48968         .mr(3)
48969         .nr(8)
48970         .kr(8)
48971         .sr(1)
48972         .m(3)
48973         .n(8)
48974         .k(k)
48975         .a_stride(83)
48976         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48977     }
48978   }
48979 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,k_div_8_subtile)48980   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, k_div_8_subtile) {
48981     TEST_REQUIRES_X86_AVX2;
48982     for (size_t k = 16; k <= 80; k += 8) {
48983       for (uint32_t n = 1; n <= 8; n++) {
48984         for (uint32_t m = 1; m <= 3; m++) {
48985           GemmMicrokernelTester()
48986             .extended_weights(true)
48987             .mr(3)
48988             .nr(8)
48989             .kr(8)
48990             .sr(1)
48991             .m(m)
48992             .n(n)
48993             .k(k)
48994             .iterations(1)
48995             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
48996         }
48997       }
48998     }
48999   }
49000 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_gt_8)49001   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_gt_8) {
49002     TEST_REQUIRES_X86_AVX2;
49003     for (uint32_t n = 9; n < 16; n++) {
49004       for (size_t k = 1; k <= 40; k += 9) {
49005         GemmMicrokernelTester()
49006           .extended_weights(true)
49007           .mr(3)
49008           .nr(8)
49009           .kr(8)
49010           .sr(1)
49011           .m(3)
49012           .n(n)
49013           .k(k)
49014           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49015       }
49016     }
49017   }
49018 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_gt_8_strided_cn)49019   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_gt_8_strided_cn) {
49020     TEST_REQUIRES_X86_AVX2;
49021     for (uint32_t n = 9; n < 16; n++) {
49022       for (size_t k = 1; k <= 40; k += 9) {
49023         GemmMicrokernelTester()
49024           .extended_weights(true)
49025           .mr(3)
49026           .nr(8)
49027           .kr(8)
49028           .sr(1)
49029           .m(3)
49030           .n(n)
49031           .k(k)
49032           .cn_stride(11)
49033           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49034       }
49035     }
49036   }
49037 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_gt_8_strided_a)49038   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_gt_8_strided_a) {
49039     TEST_REQUIRES_X86_AVX2;
49040     for (uint32_t n = 9; n < 16; n++) {
49041       for (size_t k = 1; k <= 40; k += 9) {
49042         GemmMicrokernelTester()
49043           .extended_weights(true)
49044           .mr(3)
49045           .nr(8)
49046           .kr(8)
49047           .sr(1)
49048           .m(3)
49049           .n(n)
49050           .k(k)
49051           .a_stride(43)
49052           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49053       }
49054     }
49055   }
49056 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_gt_8_subtile)49057   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_gt_8_subtile) {
49058     TEST_REQUIRES_X86_AVX2;
49059     for (uint32_t n = 9; n < 16; n++) {
49060       for (size_t k = 1; k <= 40; k += 9) {
49061         for (uint32_t m = 1; m <= 3; m++) {
49062           GemmMicrokernelTester()
49063             .extended_weights(true)
49064             .mr(3)
49065             .nr(8)
49066             .kr(8)
49067             .sr(1)
49068             .m(m)
49069             .n(n)
49070             .k(k)
49071             .iterations(1)
49072             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49073         }
49074       }
49075     }
49076   }
49077 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_div_8)49078   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_div_8) {
49079     TEST_REQUIRES_X86_AVX2;
49080     for (uint32_t n = 16; n <= 24; n += 8) {
49081       for (size_t k = 1; k <= 40; k += 9) {
49082         GemmMicrokernelTester()
49083           .extended_weights(true)
49084           .mr(3)
49085           .nr(8)
49086           .kr(8)
49087           .sr(1)
49088           .m(3)
49089           .n(n)
49090           .k(k)
49091           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49092       }
49093     }
49094   }
49095 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_div_8_strided_cn)49096   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_div_8_strided_cn) {
49097     TEST_REQUIRES_X86_AVX2;
49098     for (uint32_t n = 16; n <= 24; n += 8) {
49099       for (size_t k = 1; k <= 40; k += 9) {
49100         GemmMicrokernelTester()
49101           .extended_weights(true)
49102           .mr(3)
49103           .nr(8)
49104           .kr(8)
49105           .sr(1)
49106           .m(3)
49107           .n(n)
49108           .k(k)
49109           .cn_stride(11)
49110           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49111       }
49112     }
49113   }
49114 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_div_8_strided_a)49115   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_div_8_strided_a) {
49116     TEST_REQUIRES_X86_AVX2;
49117     for (uint32_t n = 16; n <= 24; n += 8) {
49118       for (size_t k = 1; k <= 40; k += 9) {
49119         GemmMicrokernelTester()
49120           .extended_weights(true)
49121           .mr(3)
49122           .nr(8)
49123           .kr(8)
49124           .sr(1)
49125           .m(3)
49126           .n(n)
49127           .k(k)
49128           .a_stride(43)
49129           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49130       }
49131     }
49132   }
49133 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,n_div_8_subtile)49134   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, n_div_8_subtile) {
49135     TEST_REQUIRES_X86_AVX2;
49136     for (uint32_t n = 16; n <= 24; n += 8) {
49137       for (size_t k = 1; k <= 40; k += 9) {
49138         for (uint32_t m = 1; m <= 3; m++) {
49139           GemmMicrokernelTester()
49140             .extended_weights(true)
49141             .mr(3)
49142             .nr(8)
49143             .kr(8)
49144             .sr(1)
49145             .m(m)
49146             .n(n)
49147             .k(k)
49148             .iterations(1)
49149             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49150         }
49151       }
49152     }
49153   }
49154 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,strided_cm_subtile)49155   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, strided_cm_subtile) {
49156     TEST_REQUIRES_X86_AVX2;
49157     for (size_t k = 1; k <= 40; k += 9) {
49158       for (uint32_t n = 1; n <= 8; n++) {
49159         for (uint32_t m = 1; m <= 3; m++) {
49160           GemmMicrokernelTester()
49161             .extended_weights(true)
49162             .mr(3)
49163             .nr(8)
49164             .kr(8)
49165             .sr(1)
49166             .m(m)
49167             .n(n)
49168             .k(k)
49169             .cm_stride(11)
49170             .iterations(1)
49171             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49172         }
49173       }
49174     }
49175   }
49176 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2,strided_cm)49177   TEST(QS8_GEMM_XW_MINMAX_FP32_3X8C8__AVX2, strided_cm) {
49178     TEST_REQUIRES_X86_AVX2;
49179     GemmMicrokernelTester()
49180       .extended_weights(true)
49181       .mr(3)
49182       .nr(8)
49183       .kr(8)
49184       .sr(1)
49185       .m(3)
49186       .n(8)
49187       .k(8)
49188       .cm_stride(11)
49189       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x8c8__avx2, xnn_init_qs8_conv_minmax_fp32_avx2_params, xnn_qs8_requantize_fp32);
49190   }
49191 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
49192 
49193 
49194 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_eq_8)49195   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_eq_8) {
49196     TEST_REQUIRES_X86_AVX512SKX;
49197     GemmMicrokernelTester()
49198       .mr(3)
49199       .nr(16)
49200       .kr(8)
49201       .sr(1)
49202       .m(3)
49203       .n(16)
49204       .k(8)
49205       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49206   }
49207 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,strided_cn)49208   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, strided_cn) {
49209     TEST_REQUIRES_X86_AVX512SKX;
49210     GemmMicrokernelTester()
49211       .mr(3)
49212       .nr(16)
49213       .kr(8)
49214       .sr(1)
49215       .m(3)
49216       .n(16)
49217       .k(8)
49218       .cn_stride(19)
49219       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49220   }
49221 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_eq_8_strided_a)49222   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_eq_8_strided_a) {
49223     TEST_REQUIRES_X86_AVX512SKX;
49224     GemmMicrokernelTester()
49225       .mr(3)
49226       .nr(16)
49227       .kr(8)
49228       .sr(1)
49229       .m(3)
49230       .n(16)
49231       .k(8)
49232       .a_stride(11)
49233       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49234   }
49235 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_eq_8_subtile)49236   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_eq_8_subtile) {
49237     TEST_REQUIRES_X86_AVX512SKX;
49238     for (uint32_t n = 1; n <= 16; n++) {
49239       for (uint32_t m = 1; m <= 3; m++) {
49240         GemmMicrokernelTester()
49241           .mr(3)
49242           .nr(16)
49243           .kr(8)
49244           .sr(1)
49245           .m(m)
49246           .n(n)
49247           .k(8)
49248           .iterations(1)
49249           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49250       }
49251     }
49252   }
49253 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_eq_8_subtile_m)49254   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_eq_8_subtile_m) {
49255     TEST_REQUIRES_X86_AVX512SKX;
49256     for (uint32_t m = 1; m <= 3; m++) {
49257       GemmMicrokernelTester()
49258         .mr(3)
49259         .nr(16)
49260         .kr(8)
49261         .sr(1)
49262         .m(m)
49263         .n(16)
49264         .k(8)
49265         .iterations(1)
49266         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49267     }
49268   }
49269 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_eq_8_subtile_n)49270   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_eq_8_subtile_n) {
49271     TEST_REQUIRES_X86_AVX512SKX;
49272     for (uint32_t n = 1; n <= 16; n++) {
49273       GemmMicrokernelTester()
49274         .mr(3)
49275         .nr(16)
49276         .kr(8)
49277         .sr(1)
49278         .m(3)
49279         .n(n)
49280         .k(8)
49281         .iterations(1)
49282         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49283     }
49284   }
49285 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_lt_8)49286   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_lt_8) {
49287     TEST_REQUIRES_X86_AVX512SKX;
49288     for (size_t k = 1; k < 8; k++) {
49289       GemmMicrokernelTester()
49290         .mr(3)
49291         .nr(16)
49292         .kr(8)
49293         .sr(1)
49294         .m(3)
49295         .n(16)
49296         .k(k)
49297         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49298     }
49299   }
49300 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_lt_8_strided_a)49301   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_lt_8_strided_a) {
49302     TEST_REQUIRES_X86_AVX512SKX;
49303     for (size_t k = 1; k < 8; k++) {
49304       GemmMicrokernelTester()
49305         .mr(3)
49306         .nr(16)
49307         .kr(8)
49308         .sr(1)
49309         .m(3)
49310         .n(16)
49311         .k(k)
49312         .a_stride(11)
49313         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49314     }
49315   }
49316 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_lt_8_subtile)49317   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_lt_8_subtile) {
49318     TEST_REQUIRES_X86_AVX512SKX;
49319     for (size_t k = 1; k < 8; k++) {
49320       for (uint32_t n = 1; n <= 16; n++) {
49321         for (uint32_t m = 1; m <= 3; m++) {
49322           GemmMicrokernelTester()
49323             .mr(3)
49324             .nr(16)
49325             .kr(8)
49326             .sr(1)
49327             .m(m)
49328             .n(n)
49329             .k(k)
49330             .iterations(1)
49331             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49332         }
49333       }
49334     }
49335   }
49336 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_gt_8)49337   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_gt_8) {
49338     TEST_REQUIRES_X86_AVX512SKX;
49339     for (size_t k = 9; k < 16; k++) {
49340       GemmMicrokernelTester()
49341         .mr(3)
49342         .nr(16)
49343         .kr(8)
49344         .sr(1)
49345         .m(3)
49346         .n(16)
49347         .k(k)
49348         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49349     }
49350   }
49351 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_gt_8_strided_a)49352   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_gt_8_strided_a) {
49353     TEST_REQUIRES_X86_AVX512SKX;
49354     for (size_t k = 9; k < 16; k++) {
49355       GemmMicrokernelTester()
49356         .mr(3)
49357         .nr(16)
49358         .kr(8)
49359         .sr(1)
49360         .m(3)
49361         .n(16)
49362         .k(k)
49363         .a_stride(19)
49364         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49365     }
49366   }
49367 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_gt_8_subtile)49368   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_gt_8_subtile) {
49369     TEST_REQUIRES_X86_AVX512SKX;
49370     for (size_t k = 9; k < 16; k++) {
49371       for (uint32_t n = 1; n <= 16; n++) {
49372         for (uint32_t m = 1; m <= 3; m++) {
49373           GemmMicrokernelTester()
49374             .mr(3)
49375             .nr(16)
49376             .kr(8)
49377             .sr(1)
49378             .m(m)
49379             .n(n)
49380             .k(k)
49381             .iterations(1)
49382             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49383         }
49384       }
49385     }
49386   }
49387 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_div_8)49388   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_div_8) {
49389     TEST_REQUIRES_X86_AVX512SKX;
49390     for (size_t k = 16; k <= 80; k += 8) {
49391       GemmMicrokernelTester()
49392         .mr(3)
49393         .nr(16)
49394         .kr(8)
49395         .sr(1)
49396         .m(3)
49397         .n(16)
49398         .k(k)
49399         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49400     }
49401   }
49402 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_div_8_strided_a)49403   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_div_8_strided_a) {
49404     TEST_REQUIRES_X86_AVX512SKX;
49405     for (size_t k = 16; k <= 80; k += 8) {
49406       GemmMicrokernelTester()
49407         .mr(3)
49408         .nr(16)
49409         .kr(8)
49410         .sr(1)
49411         .m(3)
49412         .n(16)
49413         .k(k)
49414         .a_stride(83)
49415         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49416     }
49417   }
49418 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,k_div_8_subtile)49419   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, k_div_8_subtile) {
49420     TEST_REQUIRES_X86_AVX512SKX;
49421     for (size_t k = 16; k <= 80; k += 8) {
49422       for (uint32_t n = 1; n <= 16; n++) {
49423         for (uint32_t m = 1; m <= 3; m++) {
49424           GemmMicrokernelTester()
49425             .mr(3)
49426             .nr(16)
49427             .kr(8)
49428             .sr(1)
49429             .m(m)
49430             .n(n)
49431             .k(k)
49432             .iterations(1)
49433             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49434         }
49435       }
49436     }
49437   }
49438 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_gt_16)49439   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_gt_16) {
49440     TEST_REQUIRES_X86_AVX512SKX;
49441     for (uint32_t n = 17; n < 32; n++) {
49442       for (size_t k = 1; k <= 40; k += 9) {
49443         GemmMicrokernelTester()
49444           .mr(3)
49445           .nr(16)
49446           .kr(8)
49447           .sr(1)
49448           .m(3)
49449           .n(n)
49450           .k(k)
49451           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49452       }
49453     }
49454   }
49455 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_gt_16_strided_cn)49456   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_gt_16_strided_cn) {
49457     TEST_REQUIRES_X86_AVX512SKX;
49458     for (uint32_t n = 17; n < 32; n++) {
49459       for (size_t k = 1; k <= 40; k += 9) {
49460         GemmMicrokernelTester()
49461           .mr(3)
49462           .nr(16)
49463           .kr(8)
49464           .sr(1)
49465           .m(3)
49466           .n(n)
49467           .k(k)
49468           .cn_stride(19)
49469           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49470       }
49471     }
49472   }
49473 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_gt_16_strided_a)49474   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_gt_16_strided_a) {
49475     TEST_REQUIRES_X86_AVX512SKX;
49476     for (uint32_t n = 17; n < 32; n++) {
49477       for (size_t k = 1; k <= 40; k += 9) {
49478         GemmMicrokernelTester()
49479           .mr(3)
49480           .nr(16)
49481           .kr(8)
49482           .sr(1)
49483           .m(3)
49484           .n(n)
49485           .k(k)
49486           .a_stride(43)
49487           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49488       }
49489     }
49490   }
49491 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_gt_16_subtile)49492   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_gt_16_subtile) {
49493     TEST_REQUIRES_X86_AVX512SKX;
49494     for (uint32_t n = 17; n < 32; n++) {
49495       for (size_t k = 1; k <= 40; k += 9) {
49496         for (uint32_t m = 1; m <= 3; m++) {
49497           GemmMicrokernelTester()
49498             .mr(3)
49499             .nr(16)
49500             .kr(8)
49501             .sr(1)
49502             .m(m)
49503             .n(n)
49504             .k(k)
49505             .iterations(1)
49506             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49507         }
49508       }
49509     }
49510   }
49511 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_div_16)49512   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_div_16) {
49513     TEST_REQUIRES_X86_AVX512SKX;
49514     for (uint32_t n = 32; n <= 48; n += 16) {
49515       for (size_t k = 1; k <= 40; k += 9) {
49516         GemmMicrokernelTester()
49517           .mr(3)
49518           .nr(16)
49519           .kr(8)
49520           .sr(1)
49521           .m(3)
49522           .n(n)
49523           .k(k)
49524           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49525       }
49526     }
49527   }
49528 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_div_16_strided_cn)49529   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_div_16_strided_cn) {
49530     TEST_REQUIRES_X86_AVX512SKX;
49531     for (uint32_t n = 32; n <= 48; n += 16) {
49532       for (size_t k = 1; k <= 40; k += 9) {
49533         GemmMicrokernelTester()
49534           .mr(3)
49535           .nr(16)
49536           .kr(8)
49537           .sr(1)
49538           .m(3)
49539           .n(n)
49540           .k(k)
49541           .cn_stride(19)
49542           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49543       }
49544     }
49545   }
49546 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_div_16_strided_a)49547   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_div_16_strided_a) {
49548     TEST_REQUIRES_X86_AVX512SKX;
49549     for (uint32_t n = 32; n <= 48; n += 16) {
49550       for (size_t k = 1; k <= 40; k += 9) {
49551         GemmMicrokernelTester()
49552           .mr(3)
49553           .nr(16)
49554           .kr(8)
49555           .sr(1)
49556           .m(3)
49557           .n(n)
49558           .k(k)
49559           .a_stride(43)
49560           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49561       }
49562     }
49563   }
49564 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,n_div_16_subtile)49565   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, n_div_16_subtile) {
49566     TEST_REQUIRES_X86_AVX512SKX;
49567     for (uint32_t n = 32; n <= 48; n += 16) {
49568       for (size_t k = 1; k <= 40; k += 9) {
49569         for (uint32_t m = 1; m <= 3; m++) {
49570           GemmMicrokernelTester()
49571             .mr(3)
49572             .nr(16)
49573             .kr(8)
49574             .sr(1)
49575             .m(m)
49576             .n(n)
49577             .k(k)
49578             .iterations(1)
49579             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49580         }
49581       }
49582     }
49583   }
49584 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,strided_cm_subtile)49585   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, strided_cm_subtile) {
49586     TEST_REQUIRES_X86_AVX512SKX;
49587     for (size_t k = 1; k <= 40; k += 9) {
49588       for (uint32_t n = 1; n <= 16; n++) {
49589         for (uint32_t m = 1; m <= 3; m++) {
49590           GemmMicrokernelTester()
49591             .mr(3)
49592             .nr(16)
49593             .kr(8)
49594             .sr(1)
49595             .m(m)
49596             .n(n)
49597             .k(k)
49598             .cm_stride(19)
49599             .iterations(1)
49600             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49601         }
49602       }
49603     }
49604   }
49605 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,qmin)49606   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, qmin) {
49607     TEST_REQUIRES_X86_AVX512SKX;
49608     GemmMicrokernelTester()
49609       .mr(3)
49610       .nr(16)
49611       .kr(8)
49612       .sr(1)
49613       .m(3)
49614       .n(16)
49615       .k(8)
49616       .qmin(128)
49617       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49618   }
49619 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,qmax)49620   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, qmax) {
49621     TEST_REQUIRES_X86_AVX512SKX;
49622     GemmMicrokernelTester()
49623       .mr(3)
49624       .nr(16)
49625       .kr(8)
49626       .sr(1)
49627       .m(3)
49628       .n(16)
49629       .k(8)
49630       .qmax(128)
49631       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49632   }
49633 
TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX,strided_cm)49634   TEST(QS8_GEMM_MINMAX_FP32_3X16C8__AVX512SKX, strided_cm) {
49635     TEST_REQUIRES_X86_AVX512SKX;
49636     GemmMicrokernelTester()
49637       .mr(3)
49638       .nr(16)
49639       .kr(8)
49640       .sr(1)
49641       .m(3)
49642       .n(16)
49643       .k(8)
49644       .cm_stride(19)
49645       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x16c8__avx512skx, xnn_init_qs8_conv_minmax_fp32_avx512_params, xnn_qs8_requantize_fp32);
49646   }
49647 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
49648 
49649 
49650 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8)49651   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8) {
49652     GemmMicrokernelTester()
49653       .mr(1)
49654       .nr(4)
49655       .kr(2)
49656       .sr(4)
49657       .m(1)
49658       .n(4)
49659       .k(8)
49660       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49661   }
49662 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cn)49663   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cn) {
49664     GemmMicrokernelTester()
49665       .mr(1)
49666       .nr(4)
49667       .kr(2)
49668       .sr(4)
49669       .m(1)
49670       .n(4)
49671       .k(8)
49672       .cn_stride(7)
49673       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49674   }
49675 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)49676   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
49677     GemmMicrokernelTester()
49678       .mr(1)
49679       .nr(4)
49680       .kr(2)
49681       .sr(4)
49682       .m(1)
49683       .n(4)
49684       .k(8)
49685       .a_stride(11)
49686       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49687   }
49688 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)49689   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
49690     for (uint32_t n = 1; n <= 4; n++) {
49691       for (uint32_t m = 1; m <= 1; m++) {
49692         GemmMicrokernelTester()
49693           .mr(1)
49694           .nr(4)
49695           .kr(2)
49696           .sr(4)
49697           .m(m)
49698           .n(n)
49699           .k(8)
49700           .iterations(1)
49701           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49702       }
49703     }
49704   }
49705 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)49706   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
49707     for (uint32_t m = 1; m <= 1; m++) {
49708       GemmMicrokernelTester()
49709         .mr(1)
49710         .nr(4)
49711         .kr(2)
49712         .sr(4)
49713         .m(m)
49714         .n(4)
49715         .k(8)
49716         .iterations(1)
49717         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49718     }
49719   }
49720 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)49721   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
49722     for (uint32_t n = 1; n <= 4; n++) {
49723       GemmMicrokernelTester()
49724         .mr(1)
49725         .nr(4)
49726         .kr(2)
49727         .sr(4)
49728         .m(1)
49729         .n(n)
49730         .k(8)
49731         .iterations(1)
49732         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49733     }
49734   }
49735 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8)49736   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8) {
49737     for (size_t k = 1; k < 8; k++) {
49738       GemmMicrokernelTester()
49739         .mr(1)
49740         .nr(4)
49741         .kr(2)
49742         .sr(4)
49743         .m(1)
49744         .n(4)
49745         .k(k)
49746         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49747     }
49748   }
49749 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)49750   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
49751     for (size_t k = 1; k < 8; k++) {
49752       GemmMicrokernelTester()
49753         .mr(1)
49754         .nr(4)
49755         .kr(2)
49756         .sr(4)
49757         .m(1)
49758         .n(4)
49759         .k(k)
49760         .a_stride(11)
49761         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49762     }
49763   }
49764 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)49765   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
49766     for (size_t k = 1; k < 8; k++) {
49767       for (uint32_t n = 1; n <= 4; n++) {
49768         for (uint32_t m = 1; m <= 1; m++) {
49769           GemmMicrokernelTester()
49770             .mr(1)
49771             .nr(4)
49772             .kr(2)
49773             .sr(4)
49774             .m(m)
49775             .n(n)
49776             .k(k)
49777             .iterations(1)
49778             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49779         }
49780       }
49781     }
49782   }
49783 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8)49784   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8) {
49785     for (size_t k = 9; k < 16; k++) {
49786       GemmMicrokernelTester()
49787         .mr(1)
49788         .nr(4)
49789         .kr(2)
49790         .sr(4)
49791         .m(1)
49792         .n(4)
49793         .k(k)
49794         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49795     }
49796   }
49797 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)49798   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
49799     for (size_t k = 9; k < 16; k++) {
49800       GemmMicrokernelTester()
49801         .mr(1)
49802         .nr(4)
49803         .kr(2)
49804         .sr(4)
49805         .m(1)
49806         .n(4)
49807         .k(k)
49808         .a_stride(19)
49809         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49810     }
49811   }
49812 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)49813   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
49814     for (size_t k = 9; k < 16; k++) {
49815       for (uint32_t n = 1; n <= 4; n++) {
49816         for (uint32_t m = 1; m <= 1; m++) {
49817           GemmMicrokernelTester()
49818             .mr(1)
49819             .nr(4)
49820             .kr(2)
49821             .sr(4)
49822             .m(m)
49823             .n(n)
49824             .k(k)
49825             .iterations(1)
49826             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49827         }
49828       }
49829     }
49830   }
49831 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8)49832   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8) {
49833     for (size_t k = 16; k <= 80; k += 8) {
49834       GemmMicrokernelTester()
49835         .mr(1)
49836         .nr(4)
49837         .kr(2)
49838         .sr(4)
49839         .m(1)
49840         .n(4)
49841         .k(k)
49842         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49843     }
49844   }
49845 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)49846   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
49847     for (size_t k = 16; k <= 80; k += 8) {
49848       GemmMicrokernelTester()
49849         .mr(1)
49850         .nr(4)
49851         .kr(2)
49852         .sr(4)
49853         .m(1)
49854         .n(4)
49855         .k(k)
49856         .a_stride(83)
49857         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49858     }
49859   }
49860 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)49861   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
49862     for (size_t k = 16; k <= 80; k += 8) {
49863       for (uint32_t n = 1; n <= 4; n++) {
49864         for (uint32_t m = 1; m <= 1; m++) {
49865           GemmMicrokernelTester()
49866             .mr(1)
49867             .nr(4)
49868             .kr(2)
49869             .sr(4)
49870             .m(m)
49871             .n(n)
49872             .k(k)
49873             .iterations(1)
49874             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49875         }
49876       }
49877     }
49878   }
49879 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4)49880   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4) {
49881     for (uint32_t n = 5; n < 8; n++) {
49882       for (size_t k = 1; k <= 40; k += 9) {
49883         GemmMicrokernelTester()
49884           .mr(1)
49885           .nr(4)
49886           .kr(2)
49887           .sr(4)
49888           .m(1)
49889           .n(n)
49890           .k(k)
49891           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49892       }
49893     }
49894   }
49895 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)49896   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
49897     for (uint32_t n = 5; n < 8; n++) {
49898       for (size_t k = 1; k <= 40; k += 9) {
49899         GemmMicrokernelTester()
49900           .mr(1)
49901           .nr(4)
49902           .kr(2)
49903           .sr(4)
49904           .m(1)
49905           .n(n)
49906           .k(k)
49907           .cn_stride(7)
49908           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49909       }
49910     }
49911   }
49912 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)49913   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
49914     for (uint32_t n = 5; n < 8; n++) {
49915       for (size_t k = 1; k <= 40; k += 9) {
49916         GemmMicrokernelTester()
49917           .mr(1)
49918           .nr(4)
49919           .kr(2)
49920           .sr(4)
49921           .m(1)
49922           .n(n)
49923           .k(k)
49924           .a_stride(43)
49925           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49926       }
49927     }
49928   }
49929 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)49930   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
49931     for (uint32_t n = 5; n < 8; n++) {
49932       for (size_t k = 1; k <= 40; k += 9) {
49933         for (uint32_t m = 1; m <= 1; m++) {
49934           GemmMicrokernelTester()
49935             .mr(1)
49936             .nr(4)
49937             .kr(2)
49938             .sr(4)
49939             .m(m)
49940             .n(n)
49941             .k(k)
49942             .iterations(1)
49943             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49944         }
49945       }
49946     }
49947   }
49948 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4)49949   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4) {
49950     for (uint32_t n = 8; n <= 12; n += 4) {
49951       for (size_t k = 1; k <= 40; k += 9) {
49952         GemmMicrokernelTester()
49953           .mr(1)
49954           .nr(4)
49955           .kr(2)
49956           .sr(4)
49957           .m(1)
49958           .n(n)
49959           .k(k)
49960           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49961       }
49962     }
49963   }
49964 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)49965   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
49966     for (uint32_t n = 8; n <= 12; n += 4) {
49967       for (size_t k = 1; k <= 40; k += 9) {
49968         GemmMicrokernelTester()
49969           .mr(1)
49970           .nr(4)
49971           .kr(2)
49972           .sr(4)
49973           .m(1)
49974           .n(n)
49975           .k(k)
49976           .cn_stride(7)
49977           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49978       }
49979     }
49980   }
49981 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)49982   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
49983     for (uint32_t n = 8; n <= 12; n += 4) {
49984       for (size_t k = 1; k <= 40; k += 9) {
49985         GemmMicrokernelTester()
49986           .mr(1)
49987           .nr(4)
49988           .kr(2)
49989           .sr(4)
49990           .m(1)
49991           .n(n)
49992           .k(k)
49993           .a_stride(43)
49994           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
49995       }
49996     }
49997   }
49998 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)49999   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
50000     for (uint32_t n = 8; n <= 12; n += 4) {
50001       for (size_t k = 1; k <= 40; k += 9) {
50002         for (uint32_t m = 1; m <= 1; m++) {
50003           GemmMicrokernelTester()
50004             .mr(1)
50005             .nr(4)
50006             .kr(2)
50007             .sr(4)
50008             .m(m)
50009             .n(n)
50010             .k(k)
50011             .iterations(1)
50012             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50013         }
50014       }
50015     }
50016   }
50017 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)50018   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
50019     for (size_t k = 1; k <= 40; k += 9) {
50020       for (uint32_t n = 1; n <= 4; n++) {
50021         for (uint32_t m = 1; m <= 1; m++) {
50022           GemmMicrokernelTester()
50023             .mr(1)
50024             .nr(4)
50025             .kr(2)
50026             .sr(4)
50027             .m(m)
50028             .n(n)
50029             .k(k)
50030             .cm_stride(7)
50031             .iterations(1)
50032             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50033         }
50034       }
50035     }
50036   }
50037 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,qmin)50038   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, qmin) {
50039     GemmMicrokernelTester()
50040       .mr(1)
50041       .nr(4)
50042       .kr(2)
50043       .sr(4)
50044       .m(1)
50045       .n(4)
50046       .k(8)
50047       .qmin(128)
50048       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50049   }
50050 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,qmax)50051   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, qmax) {
50052     GemmMicrokernelTester()
50053       .mr(1)
50054       .nr(4)
50055       .kr(2)
50056       .sr(4)
50057       .m(1)
50058       .n(4)
50059       .k(8)
50060       .qmax(128)
50061       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50062   }
50063 
TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm)50064   TEST(QS8_GEMM_MINMAX_FP32_1X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm) {
50065     GemmMicrokernelTester()
50066       .mr(1)
50067       .nr(4)
50068       .kr(2)
50069       .sr(4)
50070       .m(1)
50071       .n(4)
50072       .k(8)
50073       .cm_stride(7)
50074       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50075   }
50076 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
50077 
50078 
50079 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8)50080   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8) {
50081     GemmMicrokernelTester()
50082       .mr(1)
50083       .nr(4)
50084       .kr(8)
50085       .sr(1)
50086       .m(1)
50087       .n(4)
50088       .k(8)
50089       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50090   }
50091 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,strided_cn)50092   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, strided_cn) {
50093     GemmMicrokernelTester()
50094       .mr(1)
50095       .nr(4)
50096       .kr(8)
50097       .sr(1)
50098       .m(1)
50099       .n(4)
50100       .k(8)
50101       .cn_stride(7)
50102       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50103   }
50104 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)50105   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
50106     GemmMicrokernelTester()
50107       .mr(1)
50108       .nr(4)
50109       .kr(8)
50110       .sr(1)
50111       .m(1)
50112       .n(4)
50113       .k(8)
50114       .a_stride(11)
50115       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50116   }
50117 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)50118   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
50119     for (uint32_t n = 1; n <= 4; n++) {
50120       for (uint32_t m = 1; m <= 1; m++) {
50121         GemmMicrokernelTester()
50122           .mr(1)
50123           .nr(4)
50124           .kr(8)
50125           .sr(1)
50126           .m(m)
50127           .n(n)
50128           .k(8)
50129           .iterations(1)
50130           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50131       }
50132     }
50133   }
50134 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)50135   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
50136     for (uint32_t m = 1; m <= 1; m++) {
50137       GemmMicrokernelTester()
50138         .mr(1)
50139         .nr(4)
50140         .kr(8)
50141         .sr(1)
50142         .m(m)
50143         .n(4)
50144         .k(8)
50145         .iterations(1)
50146         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50147     }
50148   }
50149 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)50150   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
50151     for (uint32_t n = 1; n <= 4; n++) {
50152       GemmMicrokernelTester()
50153         .mr(1)
50154         .nr(4)
50155         .kr(8)
50156         .sr(1)
50157         .m(1)
50158         .n(n)
50159         .k(8)
50160         .iterations(1)
50161         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50162     }
50163   }
50164 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8)50165   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8) {
50166     for (size_t k = 1; k < 8; k++) {
50167       GemmMicrokernelTester()
50168         .mr(1)
50169         .nr(4)
50170         .kr(8)
50171         .sr(1)
50172         .m(1)
50173         .n(4)
50174         .k(k)
50175         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50176     }
50177   }
50178 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)50179   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
50180     for (size_t k = 1; k < 8; k++) {
50181       GemmMicrokernelTester()
50182         .mr(1)
50183         .nr(4)
50184         .kr(8)
50185         .sr(1)
50186         .m(1)
50187         .n(4)
50188         .k(k)
50189         .a_stride(11)
50190         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50191     }
50192   }
50193 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)50194   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
50195     for (size_t k = 1; k < 8; k++) {
50196       for (uint32_t n = 1; n <= 4; n++) {
50197         for (uint32_t m = 1; m <= 1; m++) {
50198           GemmMicrokernelTester()
50199             .mr(1)
50200             .nr(4)
50201             .kr(8)
50202             .sr(1)
50203             .m(m)
50204             .n(n)
50205             .k(k)
50206             .iterations(1)
50207             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50208         }
50209       }
50210     }
50211   }
50212 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8)50213   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8) {
50214     for (size_t k = 9; k < 16; k++) {
50215       GemmMicrokernelTester()
50216         .mr(1)
50217         .nr(4)
50218         .kr(8)
50219         .sr(1)
50220         .m(1)
50221         .n(4)
50222         .k(k)
50223         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50224     }
50225   }
50226 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)50227   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
50228     for (size_t k = 9; k < 16; k++) {
50229       GemmMicrokernelTester()
50230         .mr(1)
50231         .nr(4)
50232         .kr(8)
50233         .sr(1)
50234         .m(1)
50235         .n(4)
50236         .k(k)
50237         .a_stride(19)
50238         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50239     }
50240   }
50241 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)50242   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
50243     for (size_t k = 9; k < 16; k++) {
50244       for (uint32_t n = 1; n <= 4; n++) {
50245         for (uint32_t m = 1; m <= 1; m++) {
50246           GemmMicrokernelTester()
50247             .mr(1)
50248             .nr(4)
50249             .kr(8)
50250             .sr(1)
50251             .m(m)
50252             .n(n)
50253             .k(k)
50254             .iterations(1)
50255             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50256         }
50257       }
50258     }
50259   }
50260 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_div_8)50261   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_div_8) {
50262     for (size_t k = 16; k <= 80; k += 8) {
50263       GemmMicrokernelTester()
50264         .mr(1)
50265         .nr(4)
50266         .kr(8)
50267         .sr(1)
50268         .m(1)
50269         .n(4)
50270         .k(k)
50271         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50272     }
50273   }
50274 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)50275   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
50276     for (size_t k = 16; k <= 80; k += 8) {
50277       GemmMicrokernelTester()
50278         .mr(1)
50279         .nr(4)
50280         .kr(8)
50281         .sr(1)
50282         .m(1)
50283         .n(4)
50284         .k(k)
50285         .a_stride(83)
50286         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50287     }
50288   }
50289 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)50290   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
50291     for (size_t k = 16; k <= 80; k += 8) {
50292       for (uint32_t n = 1; n <= 4; n++) {
50293         for (uint32_t m = 1; m <= 1; m++) {
50294           GemmMicrokernelTester()
50295             .mr(1)
50296             .nr(4)
50297             .kr(8)
50298             .sr(1)
50299             .m(m)
50300             .n(n)
50301             .k(k)
50302             .iterations(1)
50303             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50304         }
50305       }
50306     }
50307   }
50308 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4)50309   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4) {
50310     for (uint32_t n = 5; n < 8; n++) {
50311       for (size_t k = 1; k <= 40; k += 9) {
50312         GemmMicrokernelTester()
50313           .mr(1)
50314           .nr(4)
50315           .kr(8)
50316           .sr(1)
50317           .m(1)
50318           .n(n)
50319           .k(k)
50320           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50321       }
50322     }
50323   }
50324 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)50325   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
50326     for (uint32_t n = 5; n < 8; n++) {
50327       for (size_t k = 1; k <= 40; k += 9) {
50328         GemmMicrokernelTester()
50329           .mr(1)
50330           .nr(4)
50331           .kr(8)
50332           .sr(1)
50333           .m(1)
50334           .n(n)
50335           .k(k)
50336           .cn_stride(7)
50337           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50338       }
50339     }
50340   }
50341 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)50342   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
50343     for (uint32_t n = 5; n < 8; n++) {
50344       for (size_t k = 1; k <= 40; k += 9) {
50345         GemmMicrokernelTester()
50346           .mr(1)
50347           .nr(4)
50348           .kr(8)
50349           .sr(1)
50350           .m(1)
50351           .n(n)
50352           .k(k)
50353           .a_stride(43)
50354           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50355       }
50356     }
50357   }
50358 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)50359   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
50360     for (uint32_t n = 5; n < 8; n++) {
50361       for (size_t k = 1; k <= 40; k += 9) {
50362         for (uint32_t m = 1; m <= 1; m++) {
50363           GemmMicrokernelTester()
50364             .mr(1)
50365             .nr(4)
50366             .kr(8)
50367             .sr(1)
50368             .m(m)
50369             .n(n)
50370             .k(k)
50371             .iterations(1)
50372             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50373         }
50374       }
50375     }
50376   }
50377 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_div_4)50378   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_div_4) {
50379     for (uint32_t n = 8; n <= 12; n += 4) {
50380       for (size_t k = 1; k <= 40; k += 9) {
50381         GemmMicrokernelTester()
50382           .mr(1)
50383           .nr(4)
50384           .kr(8)
50385           .sr(1)
50386           .m(1)
50387           .n(n)
50388           .k(k)
50389           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50390       }
50391     }
50392   }
50393 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)50394   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
50395     for (uint32_t n = 8; n <= 12; n += 4) {
50396       for (size_t k = 1; k <= 40; k += 9) {
50397         GemmMicrokernelTester()
50398           .mr(1)
50399           .nr(4)
50400           .kr(8)
50401           .sr(1)
50402           .m(1)
50403           .n(n)
50404           .k(k)
50405           .cn_stride(7)
50406           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50407       }
50408     }
50409   }
50410 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)50411   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
50412     for (uint32_t n = 8; n <= 12; n += 4) {
50413       for (size_t k = 1; k <= 40; k += 9) {
50414         GemmMicrokernelTester()
50415           .mr(1)
50416           .nr(4)
50417           .kr(8)
50418           .sr(1)
50419           .m(1)
50420           .n(n)
50421           .k(k)
50422           .a_stride(43)
50423           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50424       }
50425     }
50426   }
50427 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)50428   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
50429     for (uint32_t n = 8; n <= 12; n += 4) {
50430       for (size_t k = 1; k <= 40; k += 9) {
50431         for (uint32_t m = 1; m <= 1; m++) {
50432           GemmMicrokernelTester()
50433             .mr(1)
50434             .nr(4)
50435             .kr(8)
50436             .sr(1)
50437             .m(m)
50438             .n(n)
50439             .k(k)
50440             .iterations(1)
50441             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50442         }
50443       }
50444     }
50445   }
50446 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)50447   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
50448     for (size_t k = 1; k <= 40; k += 9) {
50449       for (uint32_t n = 1; n <= 4; n++) {
50450         for (uint32_t m = 1; m <= 1; m++) {
50451           GemmMicrokernelTester()
50452             .mr(1)
50453             .nr(4)
50454             .kr(8)
50455             .sr(1)
50456             .m(m)
50457             .n(n)
50458             .k(k)
50459             .cm_stride(7)
50460             .iterations(1)
50461             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50462         }
50463       }
50464     }
50465   }
50466 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,qmin)50467   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, qmin) {
50468     GemmMicrokernelTester()
50469       .mr(1)
50470       .nr(4)
50471       .kr(8)
50472       .sr(1)
50473       .m(1)
50474       .n(4)
50475       .k(8)
50476       .qmin(128)
50477       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50478   }
50479 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,qmax)50480   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, qmax) {
50481     GemmMicrokernelTester()
50482       .mr(1)
50483       .nr(4)
50484       .kr(8)
50485       .sr(1)
50486       .m(1)
50487       .n(4)
50488       .k(8)
50489       .qmax(128)
50490       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50491   }
50492 
TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64,strided_cm)50493   TEST(QS8_GEMM_MINMAX_FP32_1X4C8__WASMSIMD_DOT16X2_LD64, strided_cm) {
50494     GemmMicrokernelTester()
50495       .mr(1)
50496       .nr(4)
50497       .kr(8)
50498       .sr(1)
50499       .m(1)
50500       .n(4)
50501       .k(8)
50502       .cm_stride(7)
50503       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50504   }
50505 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
50506 
50507 
50508 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8)50509   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8) {
50510     GemmMicrokernelTester()
50511       .mr(2)
50512       .nr(4)
50513       .kr(2)
50514       .sr(1)
50515       .m(2)
50516       .n(4)
50517       .k(8)
50518       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50519   }
50520 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,strided_cn)50521   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, strided_cn) {
50522     GemmMicrokernelTester()
50523       .mr(2)
50524       .nr(4)
50525       .kr(2)
50526       .sr(1)
50527       .m(2)
50528       .n(4)
50529       .k(8)
50530       .cn_stride(7)
50531       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50532   }
50533 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)50534   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
50535     GemmMicrokernelTester()
50536       .mr(2)
50537       .nr(4)
50538       .kr(2)
50539       .sr(1)
50540       .m(2)
50541       .n(4)
50542       .k(8)
50543       .a_stride(11)
50544       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50545   }
50546 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)50547   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
50548     for (uint32_t n = 1; n <= 4; n++) {
50549       for (uint32_t m = 1; m <= 2; m++) {
50550         GemmMicrokernelTester()
50551           .mr(2)
50552           .nr(4)
50553           .kr(2)
50554           .sr(1)
50555           .m(m)
50556           .n(n)
50557           .k(8)
50558           .iterations(1)
50559           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50560       }
50561     }
50562   }
50563 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)50564   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
50565     for (uint32_t m = 1; m <= 2; m++) {
50566       GemmMicrokernelTester()
50567         .mr(2)
50568         .nr(4)
50569         .kr(2)
50570         .sr(1)
50571         .m(m)
50572         .n(4)
50573         .k(8)
50574         .iterations(1)
50575         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50576     }
50577   }
50578 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)50579   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
50580     for (uint32_t n = 1; n <= 4; n++) {
50581       GemmMicrokernelTester()
50582         .mr(2)
50583         .nr(4)
50584         .kr(2)
50585         .sr(1)
50586         .m(2)
50587         .n(n)
50588         .k(8)
50589         .iterations(1)
50590         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50591     }
50592   }
50593 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8)50594   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8) {
50595     for (size_t k = 1; k < 8; k++) {
50596       GemmMicrokernelTester()
50597         .mr(2)
50598         .nr(4)
50599         .kr(2)
50600         .sr(1)
50601         .m(2)
50602         .n(4)
50603         .k(k)
50604         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50605     }
50606   }
50607 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)50608   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
50609     for (size_t k = 1; k < 8; k++) {
50610       GemmMicrokernelTester()
50611         .mr(2)
50612         .nr(4)
50613         .kr(2)
50614         .sr(1)
50615         .m(2)
50616         .n(4)
50617         .k(k)
50618         .a_stride(11)
50619         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50620     }
50621   }
50622 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)50623   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
50624     for (size_t k = 1; k < 8; k++) {
50625       for (uint32_t n = 1; n <= 4; n++) {
50626         for (uint32_t m = 1; m <= 2; m++) {
50627           GemmMicrokernelTester()
50628             .mr(2)
50629             .nr(4)
50630             .kr(2)
50631             .sr(1)
50632             .m(m)
50633             .n(n)
50634             .k(k)
50635             .iterations(1)
50636             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50637         }
50638       }
50639     }
50640   }
50641 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8)50642   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8) {
50643     for (size_t k = 9; k < 16; k++) {
50644       GemmMicrokernelTester()
50645         .mr(2)
50646         .nr(4)
50647         .kr(2)
50648         .sr(1)
50649         .m(2)
50650         .n(4)
50651         .k(k)
50652         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50653     }
50654   }
50655 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)50656   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
50657     for (size_t k = 9; k < 16; k++) {
50658       GemmMicrokernelTester()
50659         .mr(2)
50660         .nr(4)
50661         .kr(2)
50662         .sr(1)
50663         .m(2)
50664         .n(4)
50665         .k(k)
50666         .a_stride(19)
50667         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50668     }
50669   }
50670 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)50671   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
50672     for (size_t k = 9; k < 16; k++) {
50673       for (uint32_t n = 1; n <= 4; n++) {
50674         for (uint32_t m = 1; m <= 2; m++) {
50675           GemmMicrokernelTester()
50676             .mr(2)
50677             .nr(4)
50678             .kr(2)
50679             .sr(1)
50680             .m(m)
50681             .n(n)
50682             .k(k)
50683             .iterations(1)
50684             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50685         }
50686       }
50687     }
50688   }
50689 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_div_8)50690   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_div_8) {
50691     for (size_t k = 16; k <= 80; k += 8) {
50692       GemmMicrokernelTester()
50693         .mr(2)
50694         .nr(4)
50695         .kr(2)
50696         .sr(1)
50697         .m(2)
50698         .n(4)
50699         .k(k)
50700         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50701     }
50702   }
50703 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)50704   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
50705     for (size_t k = 16; k <= 80; k += 8) {
50706       GemmMicrokernelTester()
50707         .mr(2)
50708         .nr(4)
50709         .kr(2)
50710         .sr(1)
50711         .m(2)
50712         .n(4)
50713         .k(k)
50714         .a_stride(83)
50715         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50716     }
50717   }
50718 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)50719   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
50720     for (size_t k = 16; k <= 80; k += 8) {
50721       for (uint32_t n = 1; n <= 4; n++) {
50722         for (uint32_t m = 1; m <= 2; m++) {
50723           GemmMicrokernelTester()
50724             .mr(2)
50725             .nr(4)
50726             .kr(2)
50727             .sr(1)
50728             .m(m)
50729             .n(n)
50730             .k(k)
50731             .iterations(1)
50732             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50733         }
50734       }
50735     }
50736   }
50737 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4)50738   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4) {
50739     for (uint32_t n = 5; n < 8; n++) {
50740       for (size_t k = 1; k <= 40; k += 9) {
50741         GemmMicrokernelTester()
50742           .mr(2)
50743           .nr(4)
50744           .kr(2)
50745           .sr(1)
50746           .m(2)
50747           .n(n)
50748           .k(k)
50749           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50750       }
50751     }
50752   }
50753 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)50754   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
50755     for (uint32_t n = 5; n < 8; n++) {
50756       for (size_t k = 1; k <= 40; k += 9) {
50757         GemmMicrokernelTester()
50758           .mr(2)
50759           .nr(4)
50760           .kr(2)
50761           .sr(1)
50762           .m(2)
50763           .n(n)
50764           .k(k)
50765           .cn_stride(7)
50766           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50767       }
50768     }
50769   }
50770 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)50771   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
50772     for (uint32_t n = 5; n < 8; n++) {
50773       for (size_t k = 1; k <= 40; k += 9) {
50774         GemmMicrokernelTester()
50775           .mr(2)
50776           .nr(4)
50777           .kr(2)
50778           .sr(1)
50779           .m(2)
50780           .n(n)
50781           .k(k)
50782           .a_stride(43)
50783           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50784       }
50785     }
50786   }
50787 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)50788   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
50789     for (uint32_t n = 5; n < 8; n++) {
50790       for (size_t k = 1; k <= 40; k += 9) {
50791         for (uint32_t m = 1; m <= 2; m++) {
50792           GemmMicrokernelTester()
50793             .mr(2)
50794             .nr(4)
50795             .kr(2)
50796             .sr(1)
50797             .m(m)
50798             .n(n)
50799             .k(k)
50800             .iterations(1)
50801             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50802         }
50803       }
50804     }
50805   }
50806 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_div_4)50807   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_div_4) {
50808     for (uint32_t n = 8; n <= 12; n += 4) {
50809       for (size_t k = 1; k <= 40; k += 9) {
50810         GemmMicrokernelTester()
50811           .mr(2)
50812           .nr(4)
50813           .kr(2)
50814           .sr(1)
50815           .m(2)
50816           .n(n)
50817           .k(k)
50818           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50819       }
50820     }
50821   }
50822 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)50823   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
50824     for (uint32_t n = 8; n <= 12; n += 4) {
50825       for (size_t k = 1; k <= 40; k += 9) {
50826         GemmMicrokernelTester()
50827           .mr(2)
50828           .nr(4)
50829           .kr(2)
50830           .sr(1)
50831           .m(2)
50832           .n(n)
50833           .k(k)
50834           .cn_stride(7)
50835           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50836       }
50837     }
50838   }
50839 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)50840   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
50841     for (uint32_t n = 8; n <= 12; n += 4) {
50842       for (size_t k = 1; k <= 40; k += 9) {
50843         GemmMicrokernelTester()
50844           .mr(2)
50845           .nr(4)
50846           .kr(2)
50847           .sr(1)
50848           .m(2)
50849           .n(n)
50850           .k(k)
50851           .a_stride(43)
50852           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50853       }
50854     }
50855   }
50856 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)50857   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
50858     for (uint32_t n = 8; n <= 12; n += 4) {
50859       for (size_t k = 1; k <= 40; k += 9) {
50860         for (uint32_t m = 1; m <= 2; m++) {
50861           GemmMicrokernelTester()
50862             .mr(2)
50863             .nr(4)
50864             .kr(2)
50865             .sr(1)
50866             .m(m)
50867             .n(n)
50868             .k(k)
50869             .iterations(1)
50870             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50871         }
50872       }
50873     }
50874   }
50875 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)50876   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
50877     for (size_t k = 1; k <= 40; k += 9) {
50878       for (uint32_t n = 1; n <= 4; n++) {
50879         for (uint32_t m = 1; m <= 2; m++) {
50880           GemmMicrokernelTester()
50881             .mr(2)
50882             .nr(4)
50883             .kr(2)
50884             .sr(1)
50885             .m(m)
50886             .n(n)
50887             .k(k)
50888             .cm_stride(7)
50889             .iterations(1)
50890             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50891         }
50892       }
50893     }
50894   }
50895 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,qmin)50896   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, qmin) {
50897     GemmMicrokernelTester()
50898       .mr(2)
50899       .nr(4)
50900       .kr(2)
50901       .sr(1)
50902       .m(2)
50903       .n(4)
50904       .k(8)
50905       .qmin(128)
50906       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50907   }
50908 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,qmax)50909   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, qmax) {
50910     GemmMicrokernelTester()
50911       .mr(2)
50912       .nr(4)
50913       .kr(2)
50914       .sr(1)
50915       .m(2)
50916       .n(4)
50917       .k(8)
50918       .qmax(128)
50919       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50920   }
50921 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64,strided_cm)50922   TEST(QS8_GEMM_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2_LD64, strided_cm) {
50923     GemmMicrokernelTester()
50924       .mr(2)
50925       .nr(4)
50926       .kr(2)
50927       .sr(1)
50928       .m(2)
50929       .n(4)
50930       .k(8)
50931       .cm_stride(7)
50932       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50933   }
50934 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
50935 
50936 
50937 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8)50938   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8) {
50939     GemmMicrokernelTester()
50940       .mr(2)
50941       .nr(4)
50942       .kr(2)
50943       .sr(4)
50944       .m(2)
50945       .n(4)
50946       .k(8)
50947       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50948   }
50949 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cn)50950   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cn) {
50951     GemmMicrokernelTester()
50952       .mr(2)
50953       .nr(4)
50954       .kr(2)
50955       .sr(4)
50956       .m(2)
50957       .n(4)
50958       .k(8)
50959       .cn_stride(7)
50960       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50961   }
50962 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)50963   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
50964     GemmMicrokernelTester()
50965       .mr(2)
50966       .nr(4)
50967       .kr(2)
50968       .sr(4)
50969       .m(2)
50970       .n(4)
50971       .k(8)
50972       .a_stride(11)
50973       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50974   }
50975 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)50976   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
50977     for (uint32_t n = 1; n <= 4; n++) {
50978       for (uint32_t m = 1; m <= 2; m++) {
50979         GemmMicrokernelTester()
50980           .mr(2)
50981           .nr(4)
50982           .kr(2)
50983           .sr(4)
50984           .m(m)
50985           .n(n)
50986           .k(8)
50987           .iterations(1)
50988           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
50989       }
50990     }
50991   }
50992 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)50993   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
50994     for (uint32_t m = 1; m <= 2; m++) {
50995       GemmMicrokernelTester()
50996         .mr(2)
50997         .nr(4)
50998         .kr(2)
50999         .sr(4)
51000         .m(m)
51001         .n(4)
51002         .k(8)
51003         .iterations(1)
51004         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51005     }
51006   }
51007 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)51008   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
51009     for (uint32_t n = 1; n <= 4; n++) {
51010       GemmMicrokernelTester()
51011         .mr(2)
51012         .nr(4)
51013         .kr(2)
51014         .sr(4)
51015         .m(2)
51016         .n(n)
51017         .k(8)
51018         .iterations(1)
51019         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51020     }
51021   }
51022 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8)51023   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8) {
51024     for (size_t k = 1; k < 8; k++) {
51025       GemmMicrokernelTester()
51026         .mr(2)
51027         .nr(4)
51028         .kr(2)
51029         .sr(4)
51030         .m(2)
51031         .n(4)
51032         .k(k)
51033         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51034     }
51035   }
51036 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)51037   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
51038     for (size_t k = 1; k < 8; k++) {
51039       GemmMicrokernelTester()
51040         .mr(2)
51041         .nr(4)
51042         .kr(2)
51043         .sr(4)
51044         .m(2)
51045         .n(4)
51046         .k(k)
51047         .a_stride(11)
51048         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51049     }
51050   }
51051 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)51052   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
51053     for (size_t k = 1; k < 8; k++) {
51054       for (uint32_t n = 1; n <= 4; n++) {
51055         for (uint32_t m = 1; m <= 2; m++) {
51056           GemmMicrokernelTester()
51057             .mr(2)
51058             .nr(4)
51059             .kr(2)
51060             .sr(4)
51061             .m(m)
51062             .n(n)
51063             .k(k)
51064             .iterations(1)
51065             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51066         }
51067       }
51068     }
51069   }
51070 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8)51071   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8) {
51072     for (size_t k = 9; k < 16; k++) {
51073       GemmMicrokernelTester()
51074         .mr(2)
51075         .nr(4)
51076         .kr(2)
51077         .sr(4)
51078         .m(2)
51079         .n(4)
51080         .k(k)
51081         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51082     }
51083   }
51084 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)51085   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
51086     for (size_t k = 9; k < 16; k++) {
51087       GemmMicrokernelTester()
51088         .mr(2)
51089         .nr(4)
51090         .kr(2)
51091         .sr(4)
51092         .m(2)
51093         .n(4)
51094         .k(k)
51095         .a_stride(19)
51096         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51097     }
51098   }
51099 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)51100   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
51101     for (size_t k = 9; k < 16; k++) {
51102       for (uint32_t n = 1; n <= 4; n++) {
51103         for (uint32_t m = 1; m <= 2; m++) {
51104           GemmMicrokernelTester()
51105             .mr(2)
51106             .nr(4)
51107             .kr(2)
51108             .sr(4)
51109             .m(m)
51110             .n(n)
51111             .k(k)
51112             .iterations(1)
51113             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51114         }
51115       }
51116     }
51117   }
51118 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8)51119   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8) {
51120     for (size_t k = 16; k <= 80; k += 8) {
51121       GemmMicrokernelTester()
51122         .mr(2)
51123         .nr(4)
51124         .kr(2)
51125         .sr(4)
51126         .m(2)
51127         .n(4)
51128         .k(k)
51129         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51130     }
51131   }
51132 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)51133   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
51134     for (size_t k = 16; k <= 80; k += 8) {
51135       GemmMicrokernelTester()
51136         .mr(2)
51137         .nr(4)
51138         .kr(2)
51139         .sr(4)
51140         .m(2)
51141         .n(4)
51142         .k(k)
51143         .a_stride(83)
51144         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51145     }
51146   }
51147 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)51148   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
51149     for (size_t k = 16; k <= 80; k += 8) {
51150       for (uint32_t n = 1; n <= 4; n++) {
51151         for (uint32_t m = 1; m <= 2; m++) {
51152           GemmMicrokernelTester()
51153             .mr(2)
51154             .nr(4)
51155             .kr(2)
51156             .sr(4)
51157             .m(m)
51158             .n(n)
51159             .k(k)
51160             .iterations(1)
51161             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51162         }
51163       }
51164     }
51165   }
51166 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4)51167   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4) {
51168     for (uint32_t n = 5; n < 8; n++) {
51169       for (size_t k = 1; k <= 40; k += 9) {
51170         GemmMicrokernelTester()
51171           .mr(2)
51172           .nr(4)
51173           .kr(2)
51174           .sr(4)
51175           .m(2)
51176           .n(n)
51177           .k(k)
51178           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51179       }
51180     }
51181   }
51182 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)51183   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
51184     for (uint32_t n = 5; n < 8; n++) {
51185       for (size_t k = 1; k <= 40; k += 9) {
51186         GemmMicrokernelTester()
51187           .mr(2)
51188           .nr(4)
51189           .kr(2)
51190           .sr(4)
51191           .m(2)
51192           .n(n)
51193           .k(k)
51194           .cn_stride(7)
51195           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51196       }
51197     }
51198   }
51199 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)51200   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
51201     for (uint32_t n = 5; n < 8; n++) {
51202       for (size_t k = 1; k <= 40; k += 9) {
51203         GemmMicrokernelTester()
51204           .mr(2)
51205           .nr(4)
51206           .kr(2)
51207           .sr(4)
51208           .m(2)
51209           .n(n)
51210           .k(k)
51211           .a_stride(43)
51212           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51213       }
51214     }
51215   }
51216 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)51217   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
51218     for (uint32_t n = 5; n < 8; n++) {
51219       for (size_t k = 1; k <= 40; k += 9) {
51220         for (uint32_t m = 1; m <= 2; m++) {
51221           GemmMicrokernelTester()
51222             .mr(2)
51223             .nr(4)
51224             .kr(2)
51225             .sr(4)
51226             .m(m)
51227             .n(n)
51228             .k(k)
51229             .iterations(1)
51230             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51231         }
51232       }
51233     }
51234   }
51235 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4)51236   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4) {
51237     for (uint32_t n = 8; n <= 12; n += 4) {
51238       for (size_t k = 1; k <= 40; k += 9) {
51239         GemmMicrokernelTester()
51240           .mr(2)
51241           .nr(4)
51242           .kr(2)
51243           .sr(4)
51244           .m(2)
51245           .n(n)
51246           .k(k)
51247           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51248       }
51249     }
51250   }
51251 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)51252   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
51253     for (uint32_t n = 8; n <= 12; n += 4) {
51254       for (size_t k = 1; k <= 40; k += 9) {
51255         GemmMicrokernelTester()
51256           .mr(2)
51257           .nr(4)
51258           .kr(2)
51259           .sr(4)
51260           .m(2)
51261           .n(n)
51262           .k(k)
51263           .cn_stride(7)
51264           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51265       }
51266     }
51267   }
51268 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)51269   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
51270     for (uint32_t n = 8; n <= 12; n += 4) {
51271       for (size_t k = 1; k <= 40; k += 9) {
51272         GemmMicrokernelTester()
51273           .mr(2)
51274           .nr(4)
51275           .kr(2)
51276           .sr(4)
51277           .m(2)
51278           .n(n)
51279           .k(k)
51280           .a_stride(43)
51281           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51282       }
51283     }
51284   }
51285 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)51286   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
51287     for (uint32_t n = 8; n <= 12; n += 4) {
51288       for (size_t k = 1; k <= 40; k += 9) {
51289         for (uint32_t m = 1; m <= 2; m++) {
51290           GemmMicrokernelTester()
51291             .mr(2)
51292             .nr(4)
51293             .kr(2)
51294             .sr(4)
51295             .m(m)
51296             .n(n)
51297             .k(k)
51298             .iterations(1)
51299             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51300         }
51301       }
51302     }
51303   }
51304 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)51305   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
51306     for (size_t k = 1; k <= 40; k += 9) {
51307       for (uint32_t n = 1; n <= 4; n++) {
51308         for (uint32_t m = 1; m <= 2; m++) {
51309           GemmMicrokernelTester()
51310             .mr(2)
51311             .nr(4)
51312             .kr(2)
51313             .sr(4)
51314             .m(m)
51315             .n(n)
51316             .k(k)
51317             .cm_stride(7)
51318             .iterations(1)
51319             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51320         }
51321       }
51322     }
51323   }
51324 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,qmin)51325   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, qmin) {
51326     GemmMicrokernelTester()
51327       .mr(2)
51328       .nr(4)
51329       .kr(2)
51330       .sr(4)
51331       .m(2)
51332       .n(4)
51333       .k(8)
51334       .qmin(128)
51335       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51336   }
51337 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,qmax)51338   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, qmax) {
51339     GemmMicrokernelTester()
51340       .mr(2)
51341       .nr(4)
51342       .kr(2)
51343       .sr(4)
51344       .m(2)
51345       .n(4)
51346       .k(8)
51347       .qmax(128)
51348       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51349   }
51350 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm)51351   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm) {
51352     GemmMicrokernelTester()
51353       .mr(2)
51354       .nr(4)
51355       .kr(2)
51356       .sr(4)
51357       .m(2)
51358       .n(4)
51359       .k(8)
51360       .cm_stride(7)
51361       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51362   }
51363 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
51364 
51365 
51366 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8)51367   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8) {
51368     GemmMicrokernelTester()
51369       .mr(2)
51370       .nr(4)
51371       .kr(2)
51372       .sr(4)
51373       .m(2)
51374       .n(4)
51375       .k(8)
51376       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51377   }
51378 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cn)51379   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cn) {
51380     GemmMicrokernelTester()
51381       .mr(2)
51382       .nr(4)
51383       .kr(2)
51384       .sr(4)
51385       .m(2)
51386       .n(4)
51387       .k(8)
51388       .cn_stride(7)
51389       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51390   }
51391 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_strided_a)51392   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_strided_a) {
51393     GemmMicrokernelTester()
51394       .mr(2)
51395       .nr(4)
51396       .kr(2)
51397       .sr(4)
51398       .m(2)
51399       .n(4)
51400       .k(8)
51401       .a_stride(11)
51402       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51403   }
51404 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile)51405   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile) {
51406     for (uint32_t n = 1; n <= 4; n++) {
51407       for (uint32_t m = 1; m <= 2; m++) {
51408         GemmMicrokernelTester()
51409           .mr(2)
51410           .nr(4)
51411           .kr(2)
51412           .sr(4)
51413           .m(m)
51414           .n(n)
51415           .k(8)
51416           .iterations(1)
51417           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51418       }
51419     }
51420   }
51421 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_m)51422   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_m) {
51423     for (uint32_t m = 1; m <= 2; m++) {
51424       GemmMicrokernelTester()
51425         .mr(2)
51426         .nr(4)
51427         .kr(2)
51428         .sr(4)
51429         .m(m)
51430         .n(4)
51431         .k(8)
51432         .iterations(1)
51433         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51434     }
51435   }
51436 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_n)51437   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_n) {
51438     for (uint32_t n = 1; n <= 4; n++) {
51439       GemmMicrokernelTester()
51440         .mr(2)
51441         .nr(4)
51442         .kr(2)
51443         .sr(4)
51444         .m(2)
51445         .n(n)
51446         .k(8)
51447         .iterations(1)
51448         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51449     }
51450   }
51451 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8)51452   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8) {
51453     for (size_t k = 1; k < 8; k++) {
51454       GemmMicrokernelTester()
51455         .mr(2)
51456         .nr(4)
51457         .kr(2)
51458         .sr(4)
51459         .m(2)
51460         .n(4)
51461         .k(k)
51462         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51463     }
51464   }
51465 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8_strided_a)51466   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8_strided_a) {
51467     for (size_t k = 1; k < 8; k++) {
51468       GemmMicrokernelTester()
51469         .mr(2)
51470         .nr(4)
51471         .kr(2)
51472         .sr(4)
51473         .m(2)
51474         .n(4)
51475         .k(k)
51476         .a_stride(11)
51477         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51478     }
51479   }
51480 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8_subtile)51481   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8_subtile) {
51482     for (size_t k = 1; k < 8; k++) {
51483       for (uint32_t n = 1; n <= 4; n++) {
51484         for (uint32_t m = 1; m <= 2; m++) {
51485           GemmMicrokernelTester()
51486             .mr(2)
51487             .nr(4)
51488             .kr(2)
51489             .sr(4)
51490             .m(m)
51491             .n(n)
51492             .k(k)
51493             .iterations(1)
51494             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51495         }
51496       }
51497     }
51498   }
51499 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8)51500   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8) {
51501     for (size_t k = 9; k < 16; k++) {
51502       GemmMicrokernelTester()
51503         .mr(2)
51504         .nr(4)
51505         .kr(2)
51506         .sr(4)
51507         .m(2)
51508         .n(4)
51509         .k(k)
51510         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51511     }
51512   }
51513 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8_strided_a)51514   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8_strided_a) {
51515     for (size_t k = 9; k < 16; k++) {
51516       GemmMicrokernelTester()
51517         .mr(2)
51518         .nr(4)
51519         .kr(2)
51520         .sr(4)
51521         .m(2)
51522         .n(4)
51523         .k(k)
51524         .a_stride(19)
51525         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51526     }
51527   }
51528 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8_subtile)51529   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8_subtile) {
51530     for (size_t k = 9; k < 16; k++) {
51531       for (uint32_t n = 1; n <= 4; n++) {
51532         for (uint32_t m = 1; m <= 2; m++) {
51533           GemmMicrokernelTester()
51534             .mr(2)
51535             .nr(4)
51536             .kr(2)
51537             .sr(4)
51538             .m(m)
51539             .n(n)
51540             .k(k)
51541             .iterations(1)
51542             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51543         }
51544       }
51545     }
51546   }
51547 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8)51548   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8) {
51549     for (size_t k = 16; k <= 80; k += 8) {
51550       GemmMicrokernelTester()
51551         .mr(2)
51552         .nr(4)
51553         .kr(2)
51554         .sr(4)
51555         .m(2)
51556         .n(4)
51557         .k(k)
51558         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51559     }
51560   }
51561 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8_strided_a)51562   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8_strided_a) {
51563     for (size_t k = 16; k <= 80; k += 8) {
51564       GemmMicrokernelTester()
51565         .mr(2)
51566         .nr(4)
51567         .kr(2)
51568         .sr(4)
51569         .m(2)
51570         .n(4)
51571         .k(k)
51572         .a_stride(83)
51573         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51574     }
51575   }
51576 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8_subtile)51577   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8_subtile) {
51578     for (size_t k = 16; k <= 80; k += 8) {
51579       for (uint32_t n = 1; n <= 4; n++) {
51580         for (uint32_t m = 1; m <= 2; m++) {
51581           GemmMicrokernelTester()
51582             .mr(2)
51583             .nr(4)
51584             .kr(2)
51585             .sr(4)
51586             .m(m)
51587             .n(n)
51588             .k(k)
51589             .iterations(1)
51590             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51591         }
51592       }
51593     }
51594   }
51595 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4)51596   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4) {
51597     for (uint32_t n = 5; n < 8; n++) {
51598       for (size_t k = 1; k <= 40; k += 9) {
51599         GemmMicrokernelTester()
51600           .mr(2)
51601           .nr(4)
51602           .kr(2)
51603           .sr(4)
51604           .m(2)
51605           .n(n)
51606           .k(k)
51607           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51608       }
51609     }
51610   }
51611 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_cn)51612   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_cn) {
51613     for (uint32_t n = 5; n < 8; n++) {
51614       for (size_t k = 1; k <= 40; k += 9) {
51615         GemmMicrokernelTester()
51616           .mr(2)
51617           .nr(4)
51618           .kr(2)
51619           .sr(4)
51620           .m(2)
51621           .n(n)
51622           .k(k)
51623           .cn_stride(7)
51624           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51625       }
51626     }
51627   }
51628 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_a)51629   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_a) {
51630     for (uint32_t n = 5; n < 8; n++) {
51631       for (size_t k = 1; k <= 40; k += 9) {
51632         GemmMicrokernelTester()
51633           .mr(2)
51634           .nr(4)
51635           .kr(2)
51636           .sr(4)
51637           .m(2)
51638           .n(n)
51639           .k(k)
51640           .a_stride(43)
51641           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51642       }
51643     }
51644   }
51645 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_subtile)51646   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_subtile) {
51647     for (uint32_t n = 5; n < 8; n++) {
51648       for (size_t k = 1; k <= 40; k += 9) {
51649         for (uint32_t m = 1; m <= 2; m++) {
51650           GemmMicrokernelTester()
51651             .mr(2)
51652             .nr(4)
51653             .kr(2)
51654             .sr(4)
51655             .m(m)
51656             .n(n)
51657             .k(k)
51658             .iterations(1)
51659             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51660         }
51661       }
51662     }
51663   }
51664 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4)51665   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4) {
51666     for (uint32_t n = 8; n <= 12; n += 4) {
51667       for (size_t k = 1; k <= 40; k += 9) {
51668         GemmMicrokernelTester()
51669           .mr(2)
51670           .nr(4)
51671           .kr(2)
51672           .sr(4)
51673           .m(2)
51674           .n(n)
51675           .k(k)
51676           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51677       }
51678     }
51679   }
51680 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_strided_cn)51681   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_strided_cn) {
51682     for (uint32_t n = 8; n <= 12; n += 4) {
51683       for (size_t k = 1; k <= 40; k += 9) {
51684         GemmMicrokernelTester()
51685           .mr(2)
51686           .nr(4)
51687           .kr(2)
51688           .sr(4)
51689           .m(2)
51690           .n(n)
51691           .k(k)
51692           .cn_stride(7)
51693           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51694       }
51695     }
51696   }
51697 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_strided_a)51698   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_strided_a) {
51699     for (uint32_t n = 8; n <= 12; n += 4) {
51700       for (size_t k = 1; k <= 40; k += 9) {
51701         GemmMicrokernelTester()
51702           .mr(2)
51703           .nr(4)
51704           .kr(2)
51705           .sr(4)
51706           .m(2)
51707           .n(n)
51708           .k(k)
51709           .a_stride(43)
51710           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51711       }
51712     }
51713   }
51714 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_subtile)51715   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_subtile) {
51716     for (uint32_t n = 8; n <= 12; n += 4) {
51717       for (size_t k = 1; k <= 40; k += 9) {
51718         for (uint32_t m = 1; m <= 2; m++) {
51719           GemmMicrokernelTester()
51720             .mr(2)
51721             .nr(4)
51722             .kr(2)
51723             .sr(4)
51724             .m(m)
51725             .n(n)
51726             .k(k)
51727             .iterations(1)
51728             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51729         }
51730       }
51731     }
51732   }
51733 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cm_subtile)51734   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cm_subtile) {
51735     for (size_t k = 1; k <= 40; k += 9) {
51736       for (uint32_t n = 1; n <= 4; n++) {
51737         for (uint32_t m = 1; m <= 2; m++) {
51738           GemmMicrokernelTester()
51739             .mr(2)
51740             .nr(4)
51741             .kr(2)
51742             .sr(4)
51743             .m(m)
51744             .n(n)
51745             .k(k)
51746             .cm_stride(7)
51747             .iterations(1)
51748             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51749         }
51750       }
51751     }
51752   }
51753 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,qmin)51754   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, qmin) {
51755     GemmMicrokernelTester()
51756       .mr(2)
51757       .nr(4)
51758       .kr(2)
51759       .sr(4)
51760       .m(2)
51761       .n(4)
51762       .k(8)
51763       .qmin(128)
51764       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51765   }
51766 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,qmax)51767   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, qmax) {
51768     GemmMicrokernelTester()
51769       .mr(2)
51770       .nr(4)
51771       .kr(2)
51772       .sr(4)
51773       .m(2)
51774       .n(4)
51775       .k(8)
51776       .qmax(128)
51777       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51778   }
51779 
TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cm)51780   TEST(QS8_GEMM_MINMAX_FP32_2X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cm) {
51781     GemmMicrokernelTester()
51782       .mr(2)
51783       .nr(4)
51784       .kr(2)
51785       .sr(4)
51786       .m(2)
51787       .n(4)
51788       .k(8)
51789       .cm_stride(7)
51790       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51791   }
51792 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
51793 
51794 
51795 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8)51796   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8) {
51797     GemmMicrokernelTester()
51798       .mr(3)
51799       .nr(4)
51800       .kr(2)
51801       .sr(4)
51802       .m(3)
51803       .n(4)
51804       .k(8)
51805       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51806   }
51807 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cn)51808   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cn) {
51809     GemmMicrokernelTester()
51810       .mr(3)
51811       .nr(4)
51812       .kr(2)
51813       .sr(4)
51814       .m(3)
51815       .n(4)
51816       .k(8)
51817       .cn_stride(7)
51818       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51819   }
51820 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)51821   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
51822     GemmMicrokernelTester()
51823       .mr(3)
51824       .nr(4)
51825       .kr(2)
51826       .sr(4)
51827       .m(3)
51828       .n(4)
51829       .k(8)
51830       .a_stride(11)
51831       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51832   }
51833 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)51834   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
51835     for (uint32_t n = 1; n <= 4; n++) {
51836       for (uint32_t m = 1; m <= 3; m++) {
51837         GemmMicrokernelTester()
51838           .mr(3)
51839           .nr(4)
51840           .kr(2)
51841           .sr(4)
51842           .m(m)
51843           .n(n)
51844           .k(8)
51845           .iterations(1)
51846           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51847       }
51848     }
51849   }
51850 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)51851   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
51852     for (uint32_t m = 1; m <= 3; m++) {
51853       GemmMicrokernelTester()
51854         .mr(3)
51855         .nr(4)
51856         .kr(2)
51857         .sr(4)
51858         .m(m)
51859         .n(4)
51860         .k(8)
51861         .iterations(1)
51862         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51863     }
51864   }
51865 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)51866   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
51867     for (uint32_t n = 1; n <= 4; n++) {
51868       GemmMicrokernelTester()
51869         .mr(3)
51870         .nr(4)
51871         .kr(2)
51872         .sr(4)
51873         .m(3)
51874         .n(n)
51875         .k(8)
51876         .iterations(1)
51877         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51878     }
51879   }
51880 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8)51881   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8) {
51882     for (size_t k = 1; k < 8; k++) {
51883       GemmMicrokernelTester()
51884         .mr(3)
51885         .nr(4)
51886         .kr(2)
51887         .sr(4)
51888         .m(3)
51889         .n(4)
51890         .k(k)
51891         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51892     }
51893   }
51894 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)51895   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
51896     for (size_t k = 1; k < 8; k++) {
51897       GemmMicrokernelTester()
51898         .mr(3)
51899         .nr(4)
51900         .kr(2)
51901         .sr(4)
51902         .m(3)
51903         .n(4)
51904         .k(k)
51905         .a_stride(11)
51906         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51907     }
51908   }
51909 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)51910   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
51911     for (size_t k = 1; k < 8; k++) {
51912       for (uint32_t n = 1; n <= 4; n++) {
51913         for (uint32_t m = 1; m <= 3; m++) {
51914           GemmMicrokernelTester()
51915             .mr(3)
51916             .nr(4)
51917             .kr(2)
51918             .sr(4)
51919             .m(m)
51920             .n(n)
51921             .k(k)
51922             .iterations(1)
51923             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51924         }
51925       }
51926     }
51927   }
51928 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8)51929   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8) {
51930     for (size_t k = 9; k < 16; k++) {
51931       GemmMicrokernelTester()
51932         .mr(3)
51933         .nr(4)
51934         .kr(2)
51935         .sr(4)
51936         .m(3)
51937         .n(4)
51938         .k(k)
51939         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51940     }
51941   }
51942 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)51943   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
51944     for (size_t k = 9; k < 16; k++) {
51945       GemmMicrokernelTester()
51946         .mr(3)
51947         .nr(4)
51948         .kr(2)
51949         .sr(4)
51950         .m(3)
51951         .n(4)
51952         .k(k)
51953         .a_stride(19)
51954         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51955     }
51956   }
51957 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)51958   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
51959     for (size_t k = 9; k < 16; k++) {
51960       for (uint32_t n = 1; n <= 4; n++) {
51961         for (uint32_t m = 1; m <= 3; m++) {
51962           GemmMicrokernelTester()
51963             .mr(3)
51964             .nr(4)
51965             .kr(2)
51966             .sr(4)
51967             .m(m)
51968             .n(n)
51969             .k(k)
51970             .iterations(1)
51971             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51972         }
51973       }
51974     }
51975   }
51976 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8)51977   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8) {
51978     for (size_t k = 16; k <= 80; k += 8) {
51979       GemmMicrokernelTester()
51980         .mr(3)
51981         .nr(4)
51982         .kr(2)
51983         .sr(4)
51984         .m(3)
51985         .n(4)
51986         .k(k)
51987         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
51988     }
51989   }
51990 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)51991   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
51992     for (size_t k = 16; k <= 80; k += 8) {
51993       GemmMicrokernelTester()
51994         .mr(3)
51995         .nr(4)
51996         .kr(2)
51997         .sr(4)
51998         .m(3)
51999         .n(4)
52000         .k(k)
52001         .a_stride(83)
52002         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52003     }
52004   }
52005 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)52006   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
52007     for (size_t k = 16; k <= 80; k += 8) {
52008       for (uint32_t n = 1; n <= 4; n++) {
52009         for (uint32_t m = 1; m <= 3; m++) {
52010           GemmMicrokernelTester()
52011             .mr(3)
52012             .nr(4)
52013             .kr(2)
52014             .sr(4)
52015             .m(m)
52016             .n(n)
52017             .k(k)
52018             .iterations(1)
52019             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52020         }
52021       }
52022     }
52023   }
52024 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4)52025   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4) {
52026     for (uint32_t n = 5; n < 8; n++) {
52027       for (size_t k = 1; k <= 40; k += 9) {
52028         GemmMicrokernelTester()
52029           .mr(3)
52030           .nr(4)
52031           .kr(2)
52032           .sr(4)
52033           .m(3)
52034           .n(n)
52035           .k(k)
52036           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52037       }
52038     }
52039   }
52040 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)52041   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
52042     for (uint32_t n = 5; n < 8; n++) {
52043       for (size_t k = 1; k <= 40; k += 9) {
52044         GemmMicrokernelTester()
52045           .mr(3)
52046           .nr(4)
52047           .kr(2)
52048           .sr(4)
52049           .m(3)
52050           .n(n)
52051           .k(k)
52052           .cn_stride(7)
52053           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52054       }
52055     }
52056   }
52057 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)52058   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
52059     for (uint32_t n = 5; n < 8; n++) {
52060       for (size_t k = 1; k <= 40; k += 9) {
52061         GemmMicrokernelTester()
52062           .mr(3)
52063           .nr(4)
52064           .kr(2)
52065           .sr(4)
52066           .m(3)
52067           .n(n)
52068           .k(k)
52069           .a_stride(43)
52070           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52071       }
52072     }
52073   }
52074 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)52075   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
52076     for (uint32_t n = 5; n < 8; n++) {
52077       for (size_t k = 1; k <= 40; k += 9) {
52078         for (uint32_t m = 1; m <= 3; m++) {
52079           GemmMicrokernelTester()
52080             .mr(3)
52081             .nr(4)
52082             .kr(2)
52083             .sr(4)
52084             .m(m)
52085             .n(n)
52086             .k(k)
52087             .iterations(1)
52088             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52089         }
52090       }
52091     }
52092   }
52093 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4)52094   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4) {
52095     for (uint32_t n = 8; n <= 12; n += 4) {
52096       for (size_t k = 1; k <= 40; k += 9) {
52097         GemmMicrokernelTester()
52098           .mr(3)
52099           .nr(4)
52100           .kr(2)
52101           .sr(4)
52102           .m(3)
52103           .n(n)
52104           .k(k)
52105           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52106       }
52107     }
52108   }
52109 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)52110   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
52111     for (uint32_t n = 8; n <= 12; n += 4) {
52112       for (size_t k = 1; k <= 40; k += 9) {
52113         GemmMicrokernelTester()
52114           .mr(3)
52115           .nr(4)
52116           .kr(2)
52117           .sr(4)
52118           .m(3)
52119           .n(n)
52120           .k(k)
52121           .cn_stride(7)
52122           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52123       }
52124     }
52125   }
52126 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)52127   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
52128     for (uint32_t n = 8; n <= 12; n += 4) {
52129       for (size_t k = 1; k <= 40; k += 9) {
52130         GemmMicrokernelTester()
52131           .mr(3)
52132           .nr(4)
52133           .kr(2)
52134           .sr(4)
52135           .m(3)
52136           .n(n)
52137           .k(k)
52138           .a_stride(43)
52139           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52140       }
52141     }
52142   }
52143 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)52144   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
52145     for (uint32_t n = 8; n <= 12; n += 4) {
52146       for (size_t k = 1; k <= 40; k += 9) {
52147         for (uint32_t m = 1; m <= 3; m++) {
52148           GemmMicrokernelTester()
52149             .mr(3)
52150             .nr(4)
52151             .kr(2)
52152             .sr(4)
52153             .m(m)
52154             .n(n)
52155             .k(k)
52156             .iterations(1)
52157             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52158         }
52159       }
52160     }
52161   }
52162 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)52163   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
52164     for (size_t k = 1; k <= 40; k += 9) {
52165       for (uint32_t n = 1; n <= 4; n++) {
52166         for (uint32_t m = 1; m <= 3; m++) {
52167           GemmMicrokernelTester()
52168             .mr(3)
52169             .nr(4)
52170             .kr(2)
52171             .sr(4)
52172             .m(m)
52173             .n(n)
52174             .k(k)
52175             .cm_stride(7)
52176             .iterations(1)
52177             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52178         }
52179       }
52180     }
52181   }
52182 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,qmin)52183   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, qmin) {
52184     GemmMicrokernelTester()
52185       .mr(3)
52186       .nr(4)
52187       .kr(2)
52188       .sr(4)
52189       .m(3)
52190       .n(4)
52191       .k(8)
52192       .qmin(128)
52193       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52194   }
52195 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,qmax)52196   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, qmax) {
52197     GemmMicrokernelTester()
52198       .mr(3)
52199       .nr(4)
52200       .kr(2)
52201       .sr(4)
52202       .m(3)
52203       .n(4)
52204       .k(8)
52205       .qmax(128)
52206       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52207   }
52208 
TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm)52209   TEST(QS8_GEMM_MINMAX_FP32_3X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm) {
52210     GemmMicrokernelTester()
52211       .mr(3)
52212       .nr(4)
52213       .kr(2)
52214       .sr(4)
52215       .m(3)
52216       .n(4)
52217       .k(8)
52218       .cm_stride(7)
52219       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52220   }
52221 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
52222 
52223 
52224 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8)52225   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8) {
52226     GemmMicrokernelTester()
52227       .mr(3)
52228       .nr(4)
52229       .kr(8)
52230       .sr(1)
52231       .m(3)
52232       .n(4)
52233       .k(8)
52234       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52235   }
52236 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,strided_cn)52237   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, strided_cn) {
52238     GemmMicrokernelTester()
52239       .mr(3)
52240       .nr(4)
52241       .kr(8)
52242       .sr(1)
52243       .m(3)
52244       .n(4)
52245       .k(8)
52246       .cn_stride(7)
52247       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52248   }
52249 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)52250   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
52251     GemmMicrokernelTester()
52252       .mr(3)
52253       .nr(4)
52254       .kr(8)
52255       .sr(1)
52256       .m(3)
52257       .n(4)
52258       .k(8)
52259       .a_stride(11)
52260       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52261   }
52262 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)52263   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
52264     for (uint32_t n = 1; n <= 4; n++) {
52265       for (uint32_t m = 1; m <= 3; m++) {
52266         GemmMicrokernelTester()
52267           .mr(3)
52268           .nr(4)
52269           .kr(8)
52270           .sr(1)
52271           .m(m)
52272           .n(n)
52273           .k(8)
52274           .iterations(1)
52275           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52276       }
52277     }
52278   }
52279 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)52280   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
52281     for (uint32_t m = 1; m <= 3; m++) {
52282       GemmMicrokernelTester()
52283         .mr(3)
52284         .nr(4)
52285         .kr(8)
52286         .sr(1)
52287         .m(m)
52288         .n(4)
52289         .k(8)
52290         .iterations(1)
52291         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52292     }
52293   }
52294 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)52295   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
52296     for (uint32_t n = 1; n <= 4; n++) {
52297       GemmMicrokernelTester()
52298         .mr(3)
52299         .nr(4)
52300         .kr(8)
52301         .sr(1)
52302         .m(3)
52303         .n(n)
52304         .k(8)
52305         .iterations(1)
52306         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52307     }
52308   }
52309 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8)52310   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8) {
52311     for (size_t k = 1; k < 8; k++) {
52312       GemmMicrokernelTester()
52313         .mr(3)
52314         .nr(4)
52315         .kr(8)
52316         .sr(1)
52317         .m(3)
52318         .n(4)
52319         .k(k)
52320         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52321     }
52322   }
52323 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)52324   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
52325     for (size_t k = 1; k < 8; k++) {
52326       GemmMicrokernelTester()
52327         .mr(3)
52328         .nr(4)
52329         .kr(8)
52330         .sr(1)
52331         .m(3)
52332         .n(4)
52333         .k(k)
52334         .a_stride(11)
52335         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52336     }
52337   }
52338 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)52339   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
52340     for (size_t k = 1; k < 8; k++) {
52341       for (uint32_t n = 1; n <= 4; n++) {
52342         for (uint32_t m = 1; m <= 3; m++) {
52343           GemmMicrokernelTester()
52344             .mr(3)
52345             .nr(4)
52346             .kr(8)
52347             .sr(1)
52348             .m(m)
52349             .n(n)
52350             .k(k)
52351             .iterations(1)
52352             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52353         }
52354       }
52355     }
52356   }
52357 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8)52358   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8) {
52359     for (size_t k = 9; k < 16; k++) {
52360       GemmMicrokernelTester()
52361         .mr(3)
52362         .nr(4)
52363         .kr(8)
52364         .sr(1)
52365         .m(3)
52366         .n(4)
52367         .k(k)
52368         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52369     }
52370   }
52371 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)52372   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
52373     for (size_t k = 9; k < 16; k++) {
52374       GemmMicrokernelTester()
52375         .mr(3)
52376         .nr(4)
52377         .kr(8)
52378         .sr(1)
52379         .m(3)
52380         .n(4)
52381         .k(k)
52382         .a_stride(19)
52383         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52384     }
52385   }
52386 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)52387   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
52388     for (size_t k = 9; k < 16; k++) {
52389       for (uint32_t n = 1; n <= 4; n++) {
52390         for (uint32_t m = 1; m <= 3; m++) {
52391           GemmMicrokernelTester()
52392             .mr(3)
52393             .nr(4)
52394             .kr(8)
52395             .sr(1)
52396             .m(m)
52397             .n(n)
52398             .k(k)
52399             .iterations(1)
52400             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52401         }
52402       }
52403     }
52404   }
52405 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_div_8)52406   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_div_8) {
52407     for (size_t k = 16; k <= 80; k += 8) {
52408       GemmMicrokernelTester()
52409         .mr(3)
52410         .nr(4)
52411         .kr(8)
52412         .sr(1)
52413         .m(3)
52414         .n(4)
52415         .k(k)
52416         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52417     }
52418   }
52419 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)52420   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
52421     for (size_t k = 16; k <= 80; k += 8) {
52422       GemmMicrokernelTester()
52423         .mr(3)
52424         .nr(4)
52425         .kr(8)
52426         .sr(1)
52427         .m(3)
52428         .n(4)
52429         .k(k)
52430         .a_stride(83)
52431         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52432     }
52433   }
52434 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)52435   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
52436     for (size_t k = 16; k <= 80; k += 8) {
52437       for (uint32_t n = 1; n <= 4; n++) {
52438         for (uint32_t m = 1; m <= 3; m++) {
52439           GemmMicrokernelTester()
52440             .mr(3)
52441             .nr(4)
52442             .kr(8)
52443             .sr(1)
52444             .m(m)
52445             .n(n)
52446             .k(k)
52447             .iterations(1)
52448             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52449         }
52450       }
52451     }
52452   }
52453 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4)52454   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4) {
52455     for (uint32_t n = 5; n < 8; n++) {
52456       for (size_t k = 1; k <= 40; k += 9) {
52457         GemmMicrokernelTester()
52458           .mr(3)
52459           .nr(4)
52460           .kr(8)
52461           .sr(1)
52462           .m(3)
52463           .n(n)
52464           .k(k)
52465           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52466       }
52467     }
52468   }
52469 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)52470   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
52471     for (uint32_t n = 5; n < 8; n++) {
52472       for (size_t k = 1; k <= 40; k += 9) {
52473         GemmMicrokernelTester()
52474           .mr(3)
52475           .nr(4)
52476           .kr(8)
52477           .sr(1)
52478           .m(3)
52479           .n(n)
52480           .k(k)
52481           .cn_stride(7)
52482           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52483       }
52484     }
52485   }
52486 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)52487   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
52488     for (uint32_t n = 5; n < 8; n++) {
52489       for (size_t k = 1; k <= 40; k += 9) {
52490         GemmMicrokernelTester()
52491           .mr(3)
52492           .nr(4)
52493           .kr(8)
52494           .sr(1)
52495           .m(3)
52496           .n(n)
52497           .k(k)
52498           .a_stride(43)
52499           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52500       }
52501     }
52502   }
52503 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)52504   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
52505     for (uint32_t n = 5; n < 8; n++) {
52506       for (size_t k = 1; k <= 40; k += 9) {
52507         for (uint32_t m = 1; m <= 3; m++) {
52508           GemmMicrokernelTester()
52509             .mr(3)
52510             .nr(4)
52511             .kr(8)
52512             .sr(1)
52513             .m(m)
52514             .n(n)
52515             .k(k)
52516             .iterations(1)
52517             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52518         }
52519       }
52520     }
52521   }
52522 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_div_4)52523   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_div_4) {
52524     for (uint32_t n = 8; n <= 12; n += 4) {
52525       for (size_t k = 1; k <= 40; k += 9) {
52526         GemmMicrokernelTester()
52527           .mr(3)
52528           .nr(4)
52529           .kr(8)
52530           .sr(1)
52531           .m(3)
52532           .n(n)
52533           .k(k)
52534           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52535       }
52536     }
52537   }
52538 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)52539   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
52540     for (uint32_t n = 8; n <= 12; n += 4) {
52541       for (size_t k = 1; k <= 40; k += 9) {
52542         GemmMicrokernelTester()
52543           .mr(3)
52544           .nr(4)
52545           .kr(8)
52546           .sr(1)
52547           .m(3)
52548           .n(n)
52549           .k(k)
52550           .cn_stride(7)
52551           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52552       }
52553     }
52554   }
52555 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)52556   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
52557     for (uint32_t n = 8; n <= 12; n += 4) {
52558       for (size_t k = 1; k <= 40; k += 9) {
52559         GemmMicrokernelTester()
52560           .mr(3)
52561           .nr(4)
52562           .kr(8)
52563           .sr(1)
52564           .m(3)
52565           .n(n)
52566           .k(k)
52567           .a_stride(43)
52568           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52569       }
52570     }
52571   }
52572 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)52573   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
52574     for (uint32_t n = 8; n <= 12; n += 4) {
52575       for (size_t k = 1; k <= 40; k += 9) {
52576         for (uint32_t m = 1; m <= 3; m++) {
52577           GemmMicrokernelTester()
52578             .mr(3)
52579             .nr(4)
52580             .kr(8)
52581             .sr(1)
52582             .m(m)
52583             .n(n)
52584             .k(k)
52585             .iterations(1)
52586             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52587         }
52588       }
52589     }
52590   }
52591 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)52592   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
52593     for (size_t k = 1; k <= 40; k += 9) {
52594       for (uint32_t n = 1; n <= 4; n++) {
52595         for (uint32_t m = 1; m <= 3; m++) {
52596           GemmMicrokernelTester()
52597             .mr(3)
52598             .nr(4)
52599             .kr(8)
52600             .sr(1)
52601             .m(m)
52602             .n(n)
52603             .k(k)
52604             .cm_stride(7)
52605             .iterations(1)
52606             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52607         }
52608       }
52609     }
52610   }
52611 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,qmin)52612   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, qmin) {
52613     GemmMicrokernelTester()
52614       .mr(3)
52615       .nr(4)
52616       .kr(8)
52617       .sr(1)
52618       .m(3)
52619       .n(4)
52620       .k(8)
52621       .qmin(128)
52622       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52623   }
52624 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,qmax)52625   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, qmax) {
52626     GemmMicrokernelTester()
52627       .mr(3)
52628       .nr(4)
52629       .kr(8)
52630       .sr(1)
52631       .m(3)
52632       .n(4)
52633       .k(8)
52634       .qmax(128)
52635       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52636   }
52637 
TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64,strided_cm)52638   TEST(QS8_GEMM_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2_LD64, strided_cm) {
52639     GemmMicrokernelTester()
52640       .mr(3)
52641       .nr(4)
52642       .kr(8)
52643       .sr(1)
52644       .m(3)
52645       .n(4)
52646       .k(8)
52647       .cm_stride(7)
52648       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52649   }
52650 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
52651 
52652 
52653 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8)52654   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8) {
52655     GemmMicrokernelTester()
52656       .mr(4)
52657       .nr(4)
52658       .kr(2)
52659       .sr(1)
52660       .m(4)
52661       .n(4)
52662       .k(8)
52663       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52664   }
52665 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,strided_cn)52666   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, strided_cn) {
52667     GemmMicrokernelTester()
52668       .mr(4)
52669       .nr(4)
52670       .kr(2)
52671       .sr(1)
52672       .m(4)
52673       .n(4)
52674       .k(8)
52675       .cn_stride(7)
52676       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52677   }
52678 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)52679   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
52680     GemmMicrokernelTester()
52681       .mr(4)
52682       .nr(4)
52683       .kr(2)
52684       .sr(1)
52685       .m(4)
52686       .n(4)
52687       .k(8)
52688       .a_stride(11)
52689       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52690   }
52691 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)52692   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
52693     for (uint32_t n = 1; n <= 4; n++) {
52694       for (uint32_t m = 1; m <= 4; m++) {
52695         GemmMicrokernelTester()
52696           .mr(4)
52697           .nr(4)
52698           .kr(2)
52699           .sr(1)
52700           .m(m)
52701           .n(n)
52702           .k(8)
52703           .iterations(1)
52704           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52705       }
52706     }
52707   }
52708 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)52709   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
52710     for (uint32_t m = 1; m <= 4; m++) {
52711       GemmMicrokernelTester()
52712         .mr(4)
52713         .nr(4)
52714         .kr(2)
52715         .sr(1)
52716         .m(m)
52717         .n(4)
52718         .k(8)
52719         .iterations(1)
52720         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52721     }
52722   }
52723 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)52724   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
52725     for (uint32_t n = 1; n <= 4; n++) {
52726       GemmMicrokernelTester()
52727         .mr(4)
52728         .nr(4)
52729         .kr(2)
52730         .sr(1)
52731         .m(4)
52732         .n(n)
52733         .k(8)
52734         .iterations(1)
52735         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52736     }
52737   }
52738 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8)52739   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8) {
52740     for (size_t k = 1; k < 8; k++) {
52741       GemmMicrokernelTester()
52742         .mr(4)
52743         .nr(4)
52744         .kr(2)
52745         .sr(1)
52746         .m(4)
52747         .n(4)
52748         .k(k)
52749         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52750     }
52751   }
52752 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)52753   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
52754     for (size_t k = 1; k < 8; k++) {
52755       GemmMicrokernelTester()
52756         .mr(4)
52757         .nr(4)
52758         .kr(2)
52759         .sr(1)
52760         .m(4)
52761         .n(4)
52762         .k(k)
52763         .a_stride(11)
52764         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52765     }
52766   }
52767 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)52768   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
52769     for (size_t k = 1; k < 8; k++) {
52770       for (uint32_t n = 1; n <= 4; n++) {
52771         for (uint32_t m = 1; m <= 4; m++) {
52772           GemmMicrokernelTester()
52773             .mr(4)
52774             .nr(4)
52775             .kr(2)
52776             .sr(1)
52777             .m(m)
52778             .n(n)
52779             .k(k)
52780             .iterations(1)
52781             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52782         }
52783       }
52784     }
52785   }
52786 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8)52787   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8) {
52788     for (size_t k = 9; k < 16; k++) {
52789       GemmMicrokernelTester()
52790         .mr(4)
52791         .nr(4)
52792         .kr(2)
52793         .sr(1)
52794         .m(4)
52795         .n(4)
52796         .k(k)
52797         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52798     }
52799   }
52800 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)52801   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
52802     for (size_t k = 9; k < 16; k++) {
52803       GemmMicrokernelTester()
52804         .mr(4)
52805         .nr(4)
52806         .kr(2)
52807         .sr(1)
52808         .m(4)
52809         .n(4)
52810         .k(k)
52811         .a_stride(19)
52812         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52813     }
52814   }
52815 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)52816   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
52817     for (size_t k = 9; k < 16; k++) {
52818       for (uint32_t n = 1; n <= 4; n++) {
52819         for (uint32_t m = 1; m <= 4; m++) {
52820           GemmMicrokernelTester()
52821             .mr(4)
52822             .nr(4)
52823             .kr(2)
52824             .sr(1)
52825             .m(m)
52826             .n(n)
52827             .k(k)
52828             .iterations(1)
52829             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52830         }
52831       }
52832     }
52833   }
52834 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_div_8)52835   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_div_8) {
52836     for (size_t k = 16; k <= 80; k += 8) {
52837       GemmMicrokernelTester()
52838         .mr(4)
52839         .nr(4)
52840         .kr(2)
52841         .sr(1)
52842         .m(4)
52843         .n(4)
52844         .k(k)
52845         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52846     }
52847   }
52848 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)52849   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
52850     for (size_t k = 16; k <= 80; k += 8) {
52851       GemmMicrokernelTester()
52852         .mr(4)
52853         .nr(4)
52854         .kr(2)
52855         .sr(1)
52856         .m(4)
52857         .n(4)
52858         .k(k)
52859         .a_stride(83)
52860         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52861     }
52862   }
52863 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)52864   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
52865     for (size_t k = 16; k <= 80; k += 8) {
52866       for (uint32_t n = 1; n <= 4; n++) {
52867         for (uint32_t m = 1; m <= 4; m++) {
52868           GemmMicrokernelTester()
52869             .mr(4)
52870             .nr(4)
52871             .kr(2)
52872             .sr(1)
52873             .m(m)
52874             .n(n)
52875             .k(k)
52876             .iterations(1)
52877             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52878         }
52879       }
52880     }
52881   }
52882 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4)52883   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4) {
52884     for (uint32_t n = 5; n < 8; n++) {
52885       for (size_t k = 1; k <= 40; k += 9) {
52886         GemmMicrokernelTester()
52887           .mr(4)
52888           .nr(4)
52889           .kr(2)
52890           .sr(1)
52891           .m(4)
52892           .n(n)
52893           .k(k)
52894           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52895       }
52896     }
52897   }
52898 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)52899   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
52900     for (uint32_t n = 5; n < 8; n++) {
52901       for (size_t k = 1; k <= 40; k += 9) {
52902         GemmMicrokernelTester()
52903           .mr(4)
52904           .nr(4)
52905           .kr(2)
52906           .sr(1)
52907           .m(4)
52908           .n(n)
52909           .k(k)
52910           .cn_stride(7)
52911           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52912       }
52913     }
52914   }
52915 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)52916   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
52917     for (uint32_t n = 5; n < 8; n++) {
52918       for (size_t k = 1; k <= 40; k += 9) {
52919         GemmMicrokernelTester()
52920           .mr(4)
52921           .nr(4)
52922           .kr(2)
52923           .sr(1)
52924           .m(4)
52925           .n(n)
52926           .k(k)
52927           .a_stride(43)
52928           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52929       }
52930     }
52931   }
52932 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)52933   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
52934     for (uint32_t n = 5; n < 8; n++) {
52935       for (size_t k = 1; k <= 40; k += 9) {
52936         for (uint32_t m = 1; m <= 4; m++) {
52937           GemmMicrokernelTester()
52938             .mr(4)
52939             .nr(4)
52940             .kr(2)
52941             .sr(1)
52942             .m(m)
52943             .n(n)
52944             .k(k)
52945             .iterations(1)
52946             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52947         }
52948       }
52949     }
52950   }
52951 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_div_4)52952   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_div_4) {
52953     for (uint32_t n = 8; n <= 12; n += 4) {
52954       for (size_t k = 1; k <= 40; k += 9) {
52955         GemmMicrokernelTester()
52956           .mr(4)
52957           .nr(4)
52958           .kr(2)
52959           .sr(1)
52960           .m(4)
52961           .n(n)
52962           .k(k)
52963           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52964       }
52965     }
52966   }
52967 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)52968   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
52969     for (uint32_t n = 8; n <= 12; n += 4) {
52970       for (size_t k = 1; k <= 40; k += 9) {
52971         GemmMicrokernelTester()
52972           .mr(4)
52973           .nr(4)
52974           .kr(2)
52975           .sr(1)
52976           .m(4)
52977           .n(n)
52978           .k(k)
52979           .cn_stride(7)
52980           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52981       }
52982     }
52983   }
52984 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)52985   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
52986     for (uint32_t n = 8; n <= 12; n += 4) {
52987       for (size_t k = 1; k <= 40; k += 9) {
52988         GemmMicrokernelTester()
52989           .mr(4)
52990           .nr(4)
52991           .kr(2)
52992           .sr(1)
52993           .m(4)
52994           .n(n)
52995           .k(k)
52996           .a_stride(43)
52997           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
52998       }
52999     }
53000   }
53001 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)53002   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
53003     for (uint32_t n = 8; n <= 12; n += 4) {
53004       for (size_t k = 1; k <= 40; k += 9) {
53005         for (uint32_t m = 1; m <= 4; m++) {
53006           GemmMicrokernelTester()
53007             .mr(4)
53008             .nr(4)
53009             .kr(2)
53010             .sr(1)
53011             .m(m)
53012             .n(n)
53013             .k(k)
53014             .iterations(1)
53015             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53016         }
53017       }
53018     }
53019   }
53020 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)53021   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
53022     for (size_t k = 1; k <= 40; k += 9) {
53023       for (uint32_t n = 1; n <= 4; n++) {
53024         for (uint32_t m = 1; m <= 4; m++) {
53025           GemmMicrokernelTester()
53026             .mr(4)
53027             .nr(4)
53028             .kr(2)
53029             .sr(1)
53030             .m(m)
53031             .n(n)
53032             .k(k)
53033             .cm_stride(7)
53034             .iterations(1)
53035             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53036         }
53037       }
53038     }
53039   }
53040 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,qmin)53041   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, qmin) {
53042     GemmMicrokernelTester()
53043       .mr(4)
53044       .nr(4)
53045       .kr(2)
53046       .sr(1)
53047       .m(4)
53048       .n(4)
53049       .k(8)
53050       .qmin(128)
53051       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53052   }
53053 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,qmax)53054   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, qmax) {
53055     GemmMicrokernelTester()
53056       .mr(4)
53057       .nr(4)
53058       .kr(2)
53059       .sr(1)
53060       .m(4)
53061       .n(4)
53062       .k(8)
53063       .qmax(128)
53064       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53065   }
53066 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64,strided_cm)53067   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD64, strided_cm) {
53068     GemmMicrokernelTester()
53069       .mr(4)
53070       .nr(4)
53071       .kr(2)
53072       .sr(1)
53073       .m(4)
53074       .n(4)
53075       .k(8)
53076       .cm_stride(7)
53077       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53078   }
53079 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
53080 
53081 
53082 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_eq_8)53083   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_eq_8) {
53084     GemmMicrokernelTester()
53085       .mr(4)
53086       .nr(4)
53087       .kr(2)
53088       .sr(1)
53089       .m(4)
53090       .n(4)
53091       .k(8)
53092       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53093   }
53094 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,strided_cn)53095   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, strided_cn) {
53096     GemmMicrokernelTester()
53097       .mr(4)
53098       .nr(4)
53099       .kr(2)
53100       .sr(1)
53101       .m(4)
53102       .n(4)
53103       .k(8)
53104       .cn_stride(7)
53105       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53106   }
53107 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_eq_8_strided_a)53108   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_eq_8_strided_a) {
53109     GemmMicrokernelTester()
53110       .mr(4)
53111       .nr(4)
53112       .kr(2)
53113       .sr(1)
53114       .m(4)
53115       .n(4)
53116       .k(8)
53117       .a_stride(11)
53118       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53119   }
53120 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile)53121   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile) {
53122     for (uint32_t n = 1; n <= 4; n++) {
53123       for (uint32_t m = 1; m <= 4; m++) {
53124         GemmMicrokernelTester()
53125           .mr(4)
53126           .nr(4)
53127           .kr(2)
53128           .sr(1)
53129           .m(m)
53130           .n(n)
53131           .k(8)
53132           .iterations(1)
53133           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53134       }
53135     }
53136   }
53137 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_m)53138   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_m) {
53139     for (uint32_t m = 1; m <= 4; m++) {
53140       GemmMicrokernelTester()
53141         .mr(4)
53142         .nr(4)
53143         .kr(2)
53144         .sr(1)
53145         .m(m)
53146         .n(4)
53147         .k(8)
53148         .iterations(1)
53149         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53150     }
53151   }
53152 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_n)53153   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_n) {
53154     for (uint32_t n = 1; n <= 4; n++) {
53155       GemmMicrokernelTester()
53156         .mr(4)
53157         .nr(4)
53158         .kr(2)
53159         .sr(1)
53160         .m(4)
53161         .n(n)
53162         .k(8)
53163         .iterations(1)
53164         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53165     }
53166   }
53167 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_lt_8)53168   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_lt_8) {
53169     for (size_t k = 1; k < 8; k++) {
53170       GemmMicrokernelTester()
53171         .mr(4)
53172         .nr(4)
53173         .kr(2)
53174         .sr(1)
53175         .m(4)
53176         .n(4)
53177         .k(k)
53178         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53179     }
53180   }
53181 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_lt_8_strided_a)53182   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_lt_8_strided_a) {
53183     for (size_t k = 1; k < 8; k++) {
53184       GemmMicrokernelTester()
53185         .mr(4)
53186         .nr(4)
53187         .kr(2)
53188         .sr(1)
53189         .m(4)
53190         .n(4)
53191         .k(k)
53192         .a_stride(11)
53193         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53194     }
53195   }
53196 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_lt_8_subtile)53197   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_lt_8_subtile) {
53198     for (size_t k = 1; k < 8; k++) {
53199       for (uint32_t n = 1; n <= 4; n++) {
53200         for (uint32_t m = 1; m <= 4; m++) {
53201           GemmMicrokernelTester()
53202             .mr(4)
53203             .nr(4)
53204             .kr(2)
53205             .sr(1)
53206             .m(m)
53207             .n(n)
53208             .k(k)
53209             .iterations(1)
53210             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53211         }
53212       }
53213     }
53214   }
53215 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_gt_8)53216   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_gt_8) {
53217     for (size_t k = 9; k < 16; k++) {
53218       GemmMicrokernelTester()
53219         .mr(4)
53220         .nr(4)
53221         .kr(2)
53222         .sr(1)
53223         .m(4)
53224         .n(4)
53225         .k(k)
53226         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53227     }
53228   }
53229 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_gt_8_strided_a)53230   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_gt_8_strided_a) {
53231     for (size_t k = 9; k < 16; k++) {
53232       GemmMicrokernelTester()
53233         .mr(4)
53234         .nr(4)
53235         .kr(2)
53236         .sr(1)
53237         .m(4)
53238         .n(4)
53239         .k(k)
53240         .a_stride(19)
53241         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53242     }
53243   }
53244 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_gt_8_subtile)53245   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_gt_8_subtile) {
53246     for (size_t k = 9; k < 16; k++) {
53247       for (uint32_t n = 1; n <= 4; n++) {
53248         for (uint32_t m = 1; m <= 4; m++) {
53249           GemmMicrokernelTester()
53250             .mr(4)
53251             .nr(4)
53252             .kr(2)
53253             .sr(1)
53254             .m(m)
53255             .n(n)
53256             .k(k)
53257             .iterations(1)
53258             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53259         }
53260       }
53261     }
53262   }
53263 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_div_8)53264   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_div_8) {
53265     for (size_t k = 16; k <= 80; k += 8) {
53266       GemmMicrokernelTester()
53267         .mr(4)
53268         .nr(4)
53269         .kr(2)
53270         .sr(1)
53271         .m(4)
53272         .n(4)
53273         .k(k)
53274         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53275     }
53276   }
53277 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_div_8_strided_a)53278   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_div_8_strided_a) {
53279     for (size_t k = 16; k <= 80; k += 8) {
53280       GemmMicrokernelTester()
53281         .mr(4)
53282         .nr(4)
53283         .kr(2)
53284         .sr(1)
53285         .m(4)
53286         .n(4)
53287         .k(k)
53288         .a_stride(83)
53289         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53290     }
53291   }
53292 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,k_div_8_subtile)53293   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, k_div_8_subtile) {
53294     for (size_t k = 16; k <= 80; k += 8) {
53295       for (uint32_t n = 1; n <= 4; n++) {
53296         for (uint32_t m = 1; m <= 4; m++) {
53297           GemmMicrokernelTester()
53298             .mr(4)
53299             .nr(4)
53300             .kr(2)
53301             .sr(1)
53302             .m(m)
53303             .n(n)
53304             .k(k)
53305             .iterations(1)
53306             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53307         }
53308       }
53309     }
53310   }
53311 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_gt_4)53312   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_gt_4) {
53313     for (uint32_t n = 5; n < 8; n++) {
53314       for (size_t k = 1; k <= 40; k += 9) {
53315         GemmMicrokernelTester()
53316           .mr(4)
53317           .nr(4)
53318           .kr(2)
53319           .sr(1)
53320           .m(4)
53321           .n(n)
53322           .k(k)
53323           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53324       }
53325     }
53326   }
53327 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_cn)53328   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_cn) {
53329     for (uint32_t n = 5; n < 8; n++) {
53330       for (size_t k = 1; k <= 40; k += 9) {
53331         GemmMicrokernelTester()
53332           .mr(4)
53333           .nr(4)
53334           .kr(2)
53335           .sr(1)
53336           .m(4)
53337           .n(n)
53338           .k(k)
53339           .cn_stride(7)
53340           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53341       }
53342     }
53343   }
53344 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_a)53345   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_a) {
53346     for (uint32_t n = 5; n < 8; n++) {
53347       for (size_t k = 1; k <= 40; k += 9) {
53348         GemmMicrokernelTester()
53349           .mr(4)
53350           .nr(4)
53351           .kr(2)
53352           .sr(1)
53353           .m(4)
53354           .n(n)
53355           .k(k)
53356           .a_stride(43)
53357           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53358       }
53359     }
53360   }
53361 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_gt_4_subtile)53362   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_gt_4_subtile) {
53363     for (uint32_t n = 5; n < 8; n++) {
53364       for (size_t k = 1; k <= 40; k += 9) {
53365         for (uint32_t m = 1; m <= 4; m++) {
53366           GemmMicrokernelTester()
53367             .mr(4)
53368             .nr(4)
53369             .kr(2)
53370             .sr(1)
53371             .m(m)
53372             .n(n)
53373             .k(k)
53374             .iterations(1)
53375             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53376         }
53377       }
53378     }
53379   }
53380 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_div_4)53381   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_div_4) {
53382     for (uint32_t n = 8; n <= 12; n += 4) {
53383       for (size_t k = 1; k <= 40; k += 9) {
53384         GemmMicrokernelTester()
53385           .mr(4)
53386           .nr(4)
53387           .kr(2)
53388           .sr(1)
53389           .m(4)
53390           .n(n)
53391           .k(k)
53392           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53393       }
53394     }
53395   }
53396 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_div_4_strided_cn)53397   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_div_4_strided_cn) {
53398     for (uint32_t n = 8; n <= 12; n += 4) {
53399       for (size_t k = 1; k <= 40; k += 9) {
53400         GemmMicrokernelTester()
53401           .mr(4)
53402           .nr(4)
53403           .kr(2)
53404           .sr(1)
53405           .m(4)
53406           .n(n)
53407           .k(k)
53408           .cn_stride(7)
53409           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53410       }
53411     }
53412   }
53413 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_div_4_strided_a)53414   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_div_4_strided_a) {
53415     for (uint32_t n = 8; n <= 12; n += 4) {
53416       for (size_t k = 1; k <= 40; k += 9) {
53417         GemmMicrokernelTester()
53418           .mr(4)
53419           .nr(4)
53420           .kr(2)
53421           .sr(1)
53422           .m(4)
53423           .n(n)
53424           .k(k)
53425           .a_stride(43)
53426           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53427       }
53428     }
53429   }
53430 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,n_div_4_subtile)53431   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, n_div_4_subtile) {
53432     for (uint32_t n = 8; n <= 12; n += 4) {
53433       for (size_t k = 1; k <= 40; k += 9) {
53434         for (uint32_t m = 1; m <= 4; m++) {
53435           GemmMicrokernelTester()
53436             .mr(4)
53437             .nr(4)
53438             .kr(2)
53439             .sr(1)
53440             .m(m)
53441             .n(n)
53442             .k(k)
53443             .iterations(1)
53444             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53445         }
53446       }
53447     }
53448   }
53449 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,strided_cm_subtile)53450   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, strided_cm_subtile) {
53451     for (size_t k = 1; k <= 40; k += 9) {
53452       for (uint32_t n = 1; n <= 4; n++) {
53453         for (uint32_t m = 1; m <= 4; m++) {
53454           GemmMicrokernelTester()
53455             .mr(4)
53456             .nr(4)
53457             .kr(2)
53458             .sr(1)
53459             .m(m)
53460             .n(n)
53461             .k(k)
53462             .cm_stride(7)
53463             .iterations(1)
53464             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53465         }
53466       }
53467     }
53468   }
53469 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,qmin)53470   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, qmin) {
53471     GemmMicrokernelTester()
53472       .mr(4)
53473       .nr(4)
53474       .kr(2)
53475       .sr(1)
53476       .m(4)
53477       .n(4)
53478       .k(8)
53479       .qmin(128)
53480       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53481   }
53482 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,qmax)53483   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, qmax) {
53484     GemmMicrokernelTester()
53485       .mr(4)
53486       .nr(4)
53487       .kr(2)
53488       .sr(1)
53489       .m(4)
53490       .n(4)
53491       .k(8)
53492       .qmax(128)
53493       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53494   }
53495 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128,strided_cm)53496   TEST(QS8_GEMM_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2_LD128, strided_cm) {
53497     GemmMicrokernelTester()
53498       .mr(4)
53499       .nr(4)
53500       .kr(2)
53501       .sr(1)
53502       .m(4)
53503       .n(4)
53504       .k(8)
53505       .cm_stride(7)
53506       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53507   }
53508 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
53509 
53510 
53511 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8)53512   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8) {
53513     GemmMicrokernelTester()
53514       .mr(4)
53515       .nr(4)
53516       .kr(2)
53517       .sr(4)
53518       .m(4)
53519       .n(4)
53520       .k(8)
53521       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53522   }
53523 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cn)53524   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cn) {
53525     GemmMicrokernelTester()
53526       .mr(4)
53527       .nr(4)
53528       .kr(2)
53529       .sr(4)
53530       .m(4)
53531       .n(4)
53532       .k(8)
53533       .cn_stride(7)
53534       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53535   }
53536 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_strided_a)53537   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_strided_a) {
53538     GemmMicrokernelTester()
53539       .mr(4)
53540       .nr(4)
53541       .kr(2)
53542       .sr(4)
53543       .m(4)
53544       .n(4)
53545       .k(8)
53546       .a_stride(11)
53547       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53548   }
53549 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile)53550   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile) {
53551     for (uint32_t n = 1; n <= 4; n++) {
53552       for (uint32_t m = 1; m <= 4; m++) {
53553         GemmMicrokernelTester()
53554           .mr(4)
53555           .nr(4)
53556           .kr(2)
53557           .sr(4)
53558           .m(m)
53559           .n(n)
53560           .k(8)
53561           .iterations(1)
53562           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53563       }
53564     }
53565   }
53566 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_m)53567   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_m) {
53568     for (uint32_t m = 1; m <= 4; m++) {
53569       GemmMicrokernelTester()
53570         .mr(4)
53571         .nr(4)
53572         .kr(2)
53573         .sr(4)
53574         .m(m)
53575         .n(4)
53576         .k(8)
53577         .iterations(1)
53578         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53579     }
53580   }
53581 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_eq_8_subtile_n)53582   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_eq_8_subtile_n) {
53583     for (uint32_t n = 1; n <= 4; n++) {
53584       GemmMicrokernelTester()
53585         .mr(4)
53586         .nr(4)
53587         .kr(2)
53588         .sr(4)
53589         .m(4)
53590         .n(n)
53591         .k(8)
53592         .iterations(1)
53593         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53594     }
53595   }
53596 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8)53597   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8) {
53598     for (size_t k = 1; k < 8; k++) {
53599       GemmMicrokernelTester()
53600         .mr(4)
53601         .nr(4)
53602         .kr(2)
53603         .sr(4)
53604         .m(4)
53605         .n(4)
53606         .k(k)
53607         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53608     }
53609   }
53610 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_strided_a)53611   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_strided_a) {
53612     for (size_t k = 1; k < 8; k++) {
53613       GemmMicrokernelTester()
53614         .mr(4)
53615         .nr(4)
53616         .kr(2)
53617         .sr(4)
53618         .m(4)
53619         .n(4)
53620         .k(k)
53621         .a_stride(11)
53622         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53623     }
53624   }
53625 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_lt_8_subtile)53626   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_lt_8_subtile) {
53627     for (size_t k = 1; k < 8; k++) {
53628       for (uint32_t n = 1; n <= 4; n++) {
53629         for (uint32_t m = 1; m <= 4; m++) {
53630           GemmMicrokernelTester()
53631             .mr(4)
53632             .nr(4)
53633             .kr(2)
53634             .sr(4)
53635             .m(m)
53636             .n(n)
53637             .k(k)
53638             .iterations(1)
53639             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53640         }
53641       }
53642     }
53643   }
53644 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8)53645   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8) {
53646     for (size_t k = 9; k < 16; k++) {
53647       GemmMicrokernelTester()
53648         .mr(4)
53649         .nr(4)
53650         .kr(2)
53651         .sr(4)
53652         .m(4)
53653         .n(4)
53654         .k(k)
53655         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53656     }
53657   }
53658 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_strided_a)53659   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_strided_a) {
53660     for (size_t k = 9; k < 16; k++) {
53661       GemmMicrokernelTester()
53662         .mr(4)
53663         .nr(4)
53664         .kr(2)
53665         .sr(4)
53666         .m(4)
53667         .n(4)
53668         .k(k)
53669         .a_stride(19)
53670         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53671     }
53672   }
53673 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_gt_8_subtile)53674   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_gt_8_subtile) {
53675     for (size_t k = 9; k < 16; k++) {
53676       for (uint32_t n = 1; n <= 4; n++) {
53677         for (uint32_t m = 1; m <= 4; m++) {
53678           GemmMicrokernelTester()
53679             .mr(4)
53680             .nr(4)
53681             .kr(2)
53682             .sr(4)
53683             .m(m)
53684             .n(n)
53685             .k(k)
53686             .iterations(1)
53687             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53688         }
53689       }
53690     }
53691   }
53692 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8)53693   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8) {
53694     for (size_t k = 16; k <= 80; k += 8) {
53695       GemmMicrokernelTester()
53696         .mr(4)
53697         .nr(4)
53698         .kr(2)
53699         .sr(4)
53700         .m(4)
53701         .n(4)
53702         .k(k)
53703         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53704     }
53705   }
53706 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_strided_a)53707   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_strided_a) {
53708     for (size_t k = 16; k <= 80; k += 8) {
53709       GemmMicrokernelTester()
53710         .mr(4)
53711         .nr(4)
53712         .kr(2)
53713         .sr(4)
53714         .m(4)
53715         .n(4)
53716         .k(k)
53717         .a_stride(83)
53718         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53719     }
53720   }
53721 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,k_div_8_subtile)53722   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, k_div_8_subtile) {
53723     for (size_t k = 16; k <= 80; k += 8) {
53724       for (uint32_t n = 1; n <= 4; n++) {
53725         for (uint32_t m = 1; m <= 4; m++) {
53726           GemmMicrokernelTester()
53727             .mr(4)
53728             .nr(4)
53729             .kr(2)
53730             .sr(4)
53731             .m(m)
53732             .n(n)
53733             .k(k)
53734             .iterations(1)
53735             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53736         }
53737       }
53738     }
53739   }
53740 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4)53741   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4) {
53742     for (uint32_t n = 5; n < 8; n++) {
53743       for (size_t k = 1; k <= 40; k += 9) {
53744         GemmMicrokernelTester()
53745           .mr(4)
53746           .nr(4)
53747           .kr(2)
53748           .sr(4)
53749           .m(4)
53750           .n(n)
53751           .k(k)
53752           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53753       }
53754     }
53755   }
53756 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_cn)53757   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_cn) {
53758     for (uint32_t n = 5; n < 8; n++) {
53759       for (size_t k = 1; k <= 40; k += 9) {
53760         GemmMicrokernelTester()
53761           .mr(4)
53762           .nr(4)
53763           .kr(2)
53764           .sr(4)
53765           .m(4)
53766           .n(n)
53767           .k(k)
53768           .cn_stride(7)
53769           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53770       }
53771     }
53772   }
53773 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_strided_a)53774   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_strided_a) {
53775     for (uint32_t n = 5; n < 8; n++) {
53776       for (size_t k = 1; k <= 40; k += 9) {
53777         GemmMicrokernelTester()
53778           .mr(4)
53779           .nr(4)
53780           .kr(2)
53781           .sr(4)
53782           .m(4)
53783           .n(n)
53784           .k(k)
53785           .a_stride(43)
53786           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53787       }
53788     }
53789   }
53790 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_gt_4_subtile)53791   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_gt_4_subtile) {
53792     for (uint32_t n = 5; n < 8; n++) {
53793       for (size_t k = 1; k <= 40; k += 9) {
53794         for (uint32_t m = 1; m <= 4; m++) {
53795           GemmMicrokernelTester()
53796             .mr(4)
53797             .nr(4)
53798             .kr(2)
53799             .sr(4)
53800             .m(m)
53801             .n(n)
53802             .k(k)
53803             .iterations(1)
53804             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53805         }
53806       }
53807     }
53808   }
53809 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4)53810   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4) {
53811     for (uint32_t n = 8; n <= 12; n += 4) {
53812       for (size_t k = 1; k <= 40; k += 9) {
53813         GemmMicrokernelTester()
53814           .mr(4)
53815           .nr(4)
53816           .kr(2)
53817           .sr(4)
53818           .m(4)
53819           .n(n)
53820           .k(k)
53821           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53822       }
53823     }
53824   }
53825 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_cn)53826   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_cn) {
53827     for (uint32_t n = 8; n <= 12; n += 4) {
53828       for (size_t k = 1; k <= 40; k += 9) {
53829         GemmMicrokernelTester()
53830           .mr(4)
53831           .nr(4)
53832           .kr(2)
53833           .sr(4)
53834           .m(4)
53835           .n(n)
53836           .k(k)
53837           .cn_stride(7)
53838           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53839       }
53840     }
53841   }
53842 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_strided_a)53843   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_strided_a) {
53844     for (uint32_t n = 8; n <= 12; n += 4) {
53845       for (size_t k = 1; k <= 40; k += 9) {
53846         GemmMicrokernelTester()
53847           .mr(4)
53848           .nr(4)
53849           .kr(2)
53850           .sr(4)
53851           .m(4)
53852           .n(n)
53853           .k(k)
53854           .a_stride(43)
53855           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53856       }
53857     }
53858   }
53859 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,n_div_4_subtile)53860   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, n_div_4_subtile) {
53861     for (uint32_t n = 8; n <= 12; n += 4) {
53862       for (size_t k = 1; k <= 40; k += 9) {
53863         for (uint32_t m = 1; m <= 4; m++) {
53864           GemmMicrokernelTester()
53865             .mr(4)
53866             .nr(4)
53867             .kr(2)
53868             .sr(4)
53869             .m(m)
53870             .n(n)
53871             .k(k)
53872             .iterations(1)
53873             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53874         }
53875       }
53876     }
53877   }
53878 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm_subtile)53879   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm_subtile) {
53880     for (size_t k = 1; k <= 40; k += 9) {
53881       for (uint32_t n = 1; n <= 4; n++) {
53882         for (uint32_t m = 1; m <= 4; m++) {
53883           GemmMicrokernelTester()
53884             .mr(4)
53885             .nr(4)
53886             .kr(2)
53887             .sr(4)
53888             .m(m)
53889             .n(n)
53890             .k(k)
53891             .cm_stride(7)
53892             .iterations(1)
53893             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53894         }
53895       }
53896     }
53897   }
53898 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,qmin)53899   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, qmin) {
53900     GemmMicrokernelTester()
53901       .mr(4)
53902       .nr(4)
53903       .kr(2)
53904       .sr(4)
53905       .m(4)
53906       .n(4)
53907       .k(8)
53908       .qmin(128)
53909       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53910   }
53911 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,qmax)53912   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, qmax) {
53913     GemmMicrokernelTester()
53914       .mr(4)
53915       .nr(4)
53916       .kr(2)
53917       .sr(4)
53918       .m(4)
53919       .n(4)
53920       .k(8)
53921       .qmax(128)
53922       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53923   }
53924 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64,strided_cm)53925   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD64, strided_cm) {
53926     GemmMicrokernelTester()
53927       .mr(4)
53928       .nr(4)
53929       .kr(2)
53930       .sr(4)
53931       .m(4)
53932       .n(4)
53933       .k(8)
53934       .cm_stride(7)
53935       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld64, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53936   }
53937 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
53938 
53939 
53940 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8)53941   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8) {
53942     GemmMicrokernelTester()
53943       .mr(4)
53944       .nr(4)
53945       .kr(2)
53946       .sr(4)
53947       .m(4)
53948       .n(4)
53949       .k(8)
53950       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53951   }
53952 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cn)53953   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cn) {
53954     GemmMicrokernelTester()
53955       .mr(4)
53956       .nr(4)
53957       .kr(2)
53958       .sr(4)
53959       .m(4)
53960       .n(4)
53961       .k(8)
53962       .cn_stride(7)
53963       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53964   }
53965 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_strided_a)53966   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_strided_a) {
53967     GemmMicrokernelTester()
53968       .mr(4)
53969       .nr(4)
53970       .kr(2)
53971       .sr(4)
53972       .m(4)
53973       .n(4)
53974       .k(8)
53975       .a_stride(11)
53976       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53977   }
53978 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile)53979   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile) {
53980     for (uint32_t n = 1; n <= 4; n++) {
53981       for (uint32_t m = 1; m <= 4; m++) {
53982         GemmMicrokernelTester()
53983           .mr(4)
53984           .nr(4)
53985           .kr(2)
53986           .sr(4)
53987           .m(m)
53988           .n(n)
53989           .k(8)
53990           .iterations(1)
53991           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
53992       }
53993     }
53994   }
53995 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_m)53996   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_m) {
53997     for (uint32_t m = 1; m <= 4; m++) {
53998       GemmMicrokernelTester()
53999         .mr(4)
54000         .nr(4)
54001         .kr(2)
54002         .sr(4)
54003         .m(m)
54004         .n(4)
54005         .k(8)
54006         .iterations(1)
54007         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54008     }
54009   }
54010 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_n)54011   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_n) {
54012     for (uint32_t n = 1; n <= 4; n++) {
54013       GemmMicrokernelTester()
54014         .mr(4)
54015         .nr(4)
54016         .kr(2)
54017         .sr(4)
54018         .m(4)
54019         .n(n)
54020         .k(8)
54021         .iterations(1)
54022         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54023     }
54024   }
54025 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8)54026   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8) {
54027     for (size_t k = 1; k < 8; k++) {
54028       GemmMicrokernelTester()
54029         .mr(4)
54030         .nr(4)
54031         .kr(2)
54032         .sr(4)
54033         .m(4)
54034         .n(4)
54035         .k(k)
54036         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54037     }
54038   }
54039 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8_strided_a)54040   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8_strided_a) {
54041     for (size_t k = 1; k < 8; k++) {
54042       GemmMicrokernelTester()
54043         .mr(4)
54044         .nr(4)
54045         .kr(2)
54046         .sr(4)
54047         .m(4)
54048         .n(4)
54049         .k(k)
54050         .a_stride(11)
54051         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54052     }
54053   }
54054 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_lt_8_subtile)54055   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_lt_8_subtile) {
54056     for (size_t k = 1; k < 8; k++) {
54057       for (uint32_t n = 1; n <= 4; n++) {
54058         for (uint32_t m = 1; m <= 4; m++) {
54059           GemmMicrokernelTester()
54060             .mr(4)
54061             .nr(4)
54062             .kr(2)
54063             .sr(4)
54064             .m(m)
54065             .n(n)
54066             .k(k)
54067             .iterations(1)
54068             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54069         }
54070       }
54071     }
54072   }
54073 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8)54074   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8) {
54075     for (size_t k = 9; k < 16; k++) {
54076       GemmMicrokernelTester()
54077         .mr(4)
54078         .nr(4)
54079         .kr(2)
54080         .sr(4)
54081         .m(4)
54082         .n(4)
54083         .k(k)
54084         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54085     }
54086   }
54087 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8_strided_a)54088   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8_strided_a) {
54089     for (size_t k = 9; k < 16; k++) {
54090       GemmMicrokernelTester()
54091         .mr(4)
54092         .nr(4)
54093         .kr(2)
54094         .sr(4)
54095         .m(4)
54096         .n(4)
54097         .k(k)
54098         .a_stride(19)
54099         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54100     }
54101   }
54102 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_gt_8_subtile)54103   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_gt_8_subtile) {
54104     for (size_t k = 9; k < 16; k++) {
54105       for (uint32_t n = 1; n <= 4; n++) {
54106         for (uint32_t m = 1; m <= 4; m++) {
54107           GemmMicrokernelTester()
54108             .mr(4)
54109             .nr(4)
54110             .kr(2)
54111             .sr(4)
54112             .m(m)
54113             .n(n)
54114             .k(k)
54115             .iterations(1)
54116             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54117         }
54118       }
54119     }
54120   }
54121 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8)54122   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8) {
54123     for (size_t k = 16; k <= 80; k += 8) {
54124       GemmMicrokernelTester()
54125         .mr(4)
54126         .nr(4)
54127         .kr(2)
54128         .sr(4)
54129         .m(4)
54130         .n(4)
54131         .k(k)
54132         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54133     }
54134   }
54135 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8_strided_a)54136   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8_strided_a) {
54137     for (size_t k = 16; k <= 80; k += 8) {
54138       GemmMicrokernelTester()
54139         .mr(4)
54140         .nr(4)
54141         .kr(2)
54142         .sr(4)
54143         .m(4)
54144         .n(4)
54145         .k(k)
54146         .a_stride(83)
54147         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54148     }
54149   }
54150 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,k_div_8_subtile)54151   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, k_div_8_subtile) {
54152     for (size_t k = 16; k <= 80; k += 8) {
54153       for (uint32_t n = 1; n <= 4; n++) {
54154         for (uint32_t m = 1; m <= 4; m++) {
54155           GemmMicrokernelTester()
54156             .mr(4)
54157             .nr(4)
54158             .kr(2)
54159             .sr(4)
54160             .m(m)
54161             .n(n)
54162             .k(k)
54163             .iterations(1)
54164             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54165         }
54166       }
54167     }
54168   }
54169 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4)54170   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4) {
54171     for (uint32_t n = 5; n < 8; n++) {
54172       for (size_t k = 1; k <= 40; k += 9) {
54173         GemmMicrokernelTester()
54174           .mr(4)
54175           .nr(4)
54176           .kr(2)
54177           .sr(4)
54178           .m(4)
54179           .n(n)
54180           .k(k)
54181           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54182       }
54183     }
54184   }
54185 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_cn)54186   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_cn) {
54187     for (uint32_t n = 5; n < 8; n++) {
54188       for (size_t k = 1; k <= 40; k += 9) {
54189         GemmMicrokernelTester()
54190           .mr(4)
54191           .nr(4)
54192           .kr(2)
54193           .sr(4)
54194           .m(4)
54195           .n(n)
54196           .k(k)
54197           .cn_stride(7)
54198           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54199       }
54200     }
54201   }
54202 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_a)54203   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_a) {
54204     for (uint32_t n = 5; n < 8; n++) {
54205       for (size_t k = 1; k <= 40; k += 9) {
54206         GemmMicrokernelTester()
54207           .mr(4)
54208           .nr(4)
54209           .kr(2)
54210           .sr(4)
54211           .m(4)
54212           .n(n)
54213           .k(k)
54214           .a_stride(43)
54215           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54216       }
54217     }
54218   }
54219 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_gt_4_subtile)54220   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_gt_4_subtile) {
54221     for (uint32_t n = 5; n < 8; n++) {
54222       for (size_t k = 1; k <= 40; k += 9) {
54223         for (uint32_t m = 1; m <= 4; m++) {
54224           GemmMicrokernelTester()
54225             .mr(4)
54226             .nr(4)
54227             .kr(2)
54228             .sr(4)
54229             .m(m)
54230             .n(n)
54231             .k(k)
54232             .iterations(1)
54233             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54234         }
54235       }
54236     }
54237   }
54238 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4)54239   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4) {
54240     for (uint32_t n = 8; n <= 12; n += 4) {
54241       for (size_t k = 1; k <= 40; k += 9) {
54242         GemmMicrokernelTester()
54243           .mr(4)
54244           .nr(4)
54245           .kr(2)
54246           .sr(4)
54247           .m(4)
54248           .n(n)
54249           .k(k)
54250           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54251       }
54252     }
54253   }
54254 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_strided_cn)54255   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_strided_cn) {
54256     for (uint32_t n = 8; n <= 12; n += 4) {
54257       for (size_t k = 1; k <= 40; k += 9) {
54258         GemmMicrokernelTester()
54259           .mr(4)
54260           .nr(4)
54261           .kr(2)
54262           .sr(4)
54263           .m(4)
54264           .n(n)
54265           .k(k)
54266           .cn_stride(7)
54267           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54268       }
54269     }
54270   }
54271 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_strided_a)54272   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_strided_a) {
54273     for (uint32_t n = 8; n <= 12; n += 4) {
54274       for (size_t k = 1; k <= 40; k += 9) {
54275         GemmMicrokernelTester()
54276           .mr(4)
54277           .nr(4)
54278           .kr(2)
54279           .sr(4)
54280           .m(4)
54281           .n(n)
54282           .k(k)
54283           .a_stride(43)
54284           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54285       }
54286     }
54287   }
54288 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,n_div_4_subtile)54289   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, n_div_4_subtile) {
54290     for (uint32_t n = 8; n <= 12; n += 4) {
54291       for (size_t k = 1; k <= 40; k += 9) {
54292         for (uint32_t m = 1; m <= 4; m++) {
54293           GemmMicrokernelTester()
54294             .mr(4)
54295             .nr(4)
54296             .kr(2)
54297             .sr(4)
54298             .m(m)
54299             .n(n)
54300             .k(k)
54301             .iterations(1)
54302             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54303         }
54304       }
54305     }
54306   }
54307 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cm_subtile)54308   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cm_subtile) {
54309     for (size_t k = 1; k <= 40; k += 9) {
54310       for (uint32_t n = 1; n <= 4; n++) {
54311         for (uint32_t m = 1; m <= 4; m++) {
54312           GemmMicrokernelTester()
54313             .mr(4)
54314             .nr(4)
54315             .kr(2)
54316             .sr(4)
54317             .m(m)
54318             .n(n)
54319             .k(k)
54320             .cm_stride(7)
54321             .iterations(1)
54322             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54323         }
54324       }
54325     }
54326   }
54327 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,qmin)54328   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, qmin) {
54329     GemmMicrokernelTester()
54330       .mr(4)
54331       .nr(4)
54332       .kr(2)
54333       .sr(4)
54334       .m(4)
54335       .n(4)
54336       .k(8)
54337       .qmin(128)
54338       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54339   }
54340 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,qmax)54341   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, qmax) {
54342     GemmMicrokernelTester()
54343       .mr(4)
54344       .nr(4)
54345       .kr(2)
54346       .sr(4)
54347       .m(4)
54348       .n(4)
54349       .k(8)
54350       .qmax(128)
54351       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54352   }
54353 
TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128,strided_cm)54354   TEST(QS8_GEMM_MINMAX_FP32_4X4C2S4__WASMSIMD_DOT16X2_LD128, strided_cm) {
54355     GemmMicrokernelTester()
54356       .mr(4)
54357       .nr(4)
54358       .kr(2)
54359       .sr(4)
54360       .m(4)
54361       .n(4)
54362       .k(8)
54363       .cm_stride(7)
54364       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c2s4__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54365   }
54366 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
54367 
54368 
54369 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_eq_8)54370   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_eq_8) {
54371     GemmMicrokernelTester()
54372       .mr(4)
54373       .nr(4)
54374       .kr(8)
54375       .sr(1)
54376       .m(4)
54377       .n(4)
54378       .k(8)
54379       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54380   }
54381 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,strided_cn)54382   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, strided_cn) {
54383     GemmMicrokernelTester()
54384       .mr(4)
54385       .nr(4)
54386       .kr(8)
54387       .sr(1)
54388       .m(4)
54389       .n(4)
54390       .k(8)
54391       .cn_stride(7)
54392       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54393   }
54394 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_eq_8_strided_a)54395   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_eq_8_strided_a) {
54396     GemmMicrokernelTester()
54397       .mr(4)
54398       .nr(4)
54399       .kr(8)
54400       .sr(1)
54401       .m(4)
54402       .n(4)
54403       .k(8)
54404       .a_stride(11)
54405       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54406   }
54407 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile)54408   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile) {
54409     for (uint32_t n = 1; n <= 4; n++) {
54410       for (uint32_t m = 1; m <= 4; m++) {
54411         GemmMicrokernelTester()
54412           .mr(4)
54413           .nr(4)
54414           .kr(8)
54415           .sr(1)
54416           .m(m)
54417           .n(n)
54418           .k(8)
54419           .iterations(1)
54420           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54421       }
54422     }
54423   }
54424 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_m)54425   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_m) {
54426     for (uint32_t m = 1; m <= 4; m++) {
54427       GemmMicrokernelTester()
54428         .mr(4)
54429         .nr(4)
54430         .kr(8)
54431         .sr(1)
54432         .m(m)
54433         .n(4)
54434         .k(8)
54435         .iterations(1)
54436         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54437     }
54438   }
54439 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_eq_8_subtile_n)54440   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_eq_8_subtile_n) {
54441     for (uint32_t n = 1; n <= 4; n++) {
54442       GemmMicrokernelTester()
54443         .mr(4)
54444         .nr(4)
54445         .kr(8)
54446         .sr(1)
54447         .m(4)
54448         .n(n)
54449         .k(8)
54450         .iterations(1)
54451         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54452     }
54453   }
54454 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_lt_8)54455   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_lt_8) {
54456     for (size_t k = 1; k < 8; k++) {
54457       GemmMicrokernelTester()
54458         .mr(4)
54459         .nr(4)
54460         .kr(8)
54461         .sr(1)
54462         .m(4)
54463         .n(4)
54464         .k(k)
54465         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54466     }
54467   }
54468 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_lt_8_strided_a)54469   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_lt_8_strided_a) {
54470     for (size_t k = 1; k < 8; k++) {
54471       GemmMicrokernelTester()
54472         .mr(4)
54473         .nr(4)
54474         .kr(8)
54475         .sr(1)
54476         .m(4)
54477         .n(4)
54478         .k(k)
54479         .a_stride(11)
54480         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54481     }
54482   }
54483 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_lt_8_subtile)54484   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_lt_8_subtile) {
54485     for (size_t k = 1; k < 8; k++) {
54486       for (uint32_t n = 1; n <= 4; n++) {
54487         for (uint32_t m = 1; m <= 4; m++) {
54488           GemmMicrokernelTester()
54489             .mr(4)
54490             .nr(4)
54491             .kr(8)
54492             .sr(1)
54493             .m(m)
54494             .n(n)
54495             .k(k)
54496             .iterations(1)
54497             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54498         }
54499       }
54500     }
54501   }
54502 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_gt_8)54503   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_gt_8) {
54504     for (size_t k = 9; k < 16; k++) {
54505       GemmMicrokernelTester()
54506         .mr(4)
54507         .nr(4)
54508         .kr(8)
54509         .sr(1)
54510         .m(4)
54511         .n(4)
54512         .k(k)
54513         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54514     }
54515   }
54516 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_gt_8_strided_a)54517   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_gt_8_strided_a) {
54518     for (size_t k = 9; k < 16; k++) {
54519       GemmMicrokernelTester()
54520         .mr(4)
54521         .nr(4)
54522         .kr(8)
54523         .sr(1)
54524         .m(4)
54525         .n(4)
54526         .k(k)
54527         .a_stride(19)
54528         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54529     }
54530   }
54531 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_gt_8_subtile)54532   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_gt_8_subtile) {
54533     for (size_t k = 9; k < 16; k++) {
54534       for (uint32_t n = 1; n <= 4; n++) {
54535         for (uint32_t m = 1; m <= 4; m++) {
54536           GemmMicrokernelTester()
54537             .mr(4)
54538             .nr(4)
54539             .kr(8)
54540             .sr(1)
54541             .m(m)
54542             .n(n)
54543             .k(k)
54544             .iterations(1)
54545             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54546         }
54547       }
54548     }
54549   }
54550 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_div_8)54551   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_div_8) {
54552     for (size_t k = 16; k <= 80; k += 8) {
54553       GemmMicrokernelTester()
54554         .mr(4)
54555         .nr(4)
54556         .kr(8)
54557         .sr(1)
54558         .m(4)
54559         .n(4)
54560         .k(k)
54561         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54562     }
54563   }
54564 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_div_8_strided_a)54565   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_div_8_strided_a) {
54566     for (size_t k = 16; k <= 80; k += 8) {
54567       GemmMicrokernelTester()
54568         .mr(4)
54569         .nr(4)
54570         .kr(8)
54571         .sr(1)
54572         .m(4)
54573         .n(4)
54574         .k(k)
54575         .a_stride(83)
54576         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54577     }
54578   }
54579 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,k_div_8_subtile)54580   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, k_div_8_subtile) {
54581     for (size_t k = 16; k <= 80; k += 8) {
54582       for (uint32_t n = 1; n <= 4; n++) {
54583         for (uint32_t m = 1; m <= 4; m++) {
54584           GemmMicrokernelTester()
54585             .mr(4)
54586             .nr(4)
54587             .kr(8)
54588             .sr(1)
54589             .m(m)
54590             .n(n)
54591             .k(k)
54592             .iterations(1)
54593             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54594         }
54595       }
54596     }
54597   }
54598 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_gt_4)54599   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_gt_4) {
54600     for (uint32_t n = 5; n < 8; n++) {
54601       for (size_t k = 1; k <= 40; k += 9) {
54602         GemmMicrokernelTester()
54603           .mr(4)
54604           .nr(4)
54605           .kr(8)
54606           .sr(1)
54607           .m(4)
54608           .n(n)
54609           .k(k)
54610           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54611       }
54612     }
54613   }
54614 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_cn)54615   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_cn) {
54616     for (uint32_t n = 5; n < 8; n++) {
54617       for (size_t k = 1; k <= 40; k += 9) {
54618         GemmMicrokernelTester()
54619           .mr(4)
54620           .nr(4)
54621           .kr(8)
54622           .sr(1)
54623           .m(4)
54624           .n(n)
54625           .k(k)
54626           .cn_stride(7)
54627           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54628       }
54629     }
54630   }
54631 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_gt_4_strided_a)54632   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_gt_4_strided_a) {
54633     for (uint32_t n = 5; n < 8; n++) {
54634       for (size_t k = 1; k <= 40; k += 9) {
54635         GemmMicrokernelTester()
54636           .mr(4)
54637           .nr(4)
54638           .kr(8)
54639           .sr(1)
54640           .m(4)
54641           .n(n)
54642           .k(k)
54643           .a_stride(43)
54644           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54645       }
54646     }
54647   }
54648 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_gt_4_subtile)54649   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_gt_4_subtile) {
54650     for (uint32_t n = 5; n < 8; n++) {
54651       for (size_t k = 1; k <= 40; k += 9) {
54652         for (uint32_t m = 1; m <= 4; m++) {
54653           GemmMicrokernelTester()
54654             .mr(4)
54655             .nr(4)
54656             .kr(8)
54657             .sr(1)
54658             .m(m)
54659             .n(n)
54660             .k(k)
54661             .iterations(1)
54662             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54663         }
54664       }
54665     }
54666   }
54667 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_div_4)54668   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_div_4) {
54669     for (uint32_t n = 8; n <= 12; n += 4) {
54670       for (size_t k = 1; k <= 40; k += 9) {
54671         GemmMicrokernelTester()
54672           .mr(4)
54673           .nr(4)
54674           .kr(8)
54675           .sr(1)
54676           .m(4)
54677           .n(n)
54678           .k(k)
54679           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54680       }
54681     }
54682   }
54683 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_div_4_strided_cn)54684   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_div_4_strided_cn) {
54685     for (uint32_t n = 8; n <= 12; n += 4) {
54686       for (size_t k = 1; k <= 40; k += 9) {
54687         GemmMicrokernelTester()
54688           .mr(4)
54689           .nr(4)
54690           .kr(8)
54691           .sr(1)
54692           .m(4)
54693           .n(n)
54694           .k(k)
54695           .cn_stride(7)
54696           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54697       }
54698     }
54699   }
54700 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_div_4_strided_a)54701   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_div_4_strided_a) {
54702     for (uint32_t n = 8; n <= 12; n += 4) {
54703       for (size_t k = 1; k <= 40; k += 9) {
54704         GemmMicrokernelTester()
54705           .mr(4)
54706           .nr(4)
54707           .kr(8)
54708           .sr(1)
54709           .m(4)
54710           .n(n)
54711           .k(k)
54712           .a_stride(43)
54713           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54714       }
54715     }
54716   }
54717 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,n_div_4_subtile)54718   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, n_div_4_subtile) {
54719     for (uint32_t n = 8; n <= 12; n += 4) {
54720       for (size_t k = 1; k <= 40; k += 9) {
54721         for (uint32_t m = 1; m <= 4; m++) {
54722           GemmMicrokernelTester()
54723             .mr(4)
54724             .nr(4)
54725             .kr(8)
54726             .sr(1)
54727             .m(m)
54728             .n(n)
54729             .k(k)
54730             .iterations(1)
54731             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54732         }
54733       }
54734     }
54735   }
54736 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,strided_cm_subtile)54737   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, strided_cm_subtile) {
54738     for (size_t k = 1; k <= 40; k += 9) {
54739       for (uint32_t n = 1; n <= 4; n++) {
54740         for (uint32_t m = 1; m <= 4; m++) {
54741           GemmMicrokernelTester()
54742             .mr(4)
54743             .nr(4)
54744             .kr(8)
54745             .sr(1)
54746             .m(m)
54747             .n(n)
54748             .k(k)
54749             .cm_stride(7)
54750             .iterations(1)
54751             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54752         }
54753       }
54754     }
54755   }
54756 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,qmin)54757   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, qmin) {
54758     GemmMicrokernelTester()
54759       .mr(4)
54760       .nr(4)
54761       .kr(8)
54762       .sr(1)
54763       .m(4)
54764       .n(4)
54765       .k(8)
54766       .qmin(128)
54767       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54768   }
54769 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,qmax)54770   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, qmax) {
54771     GemmMicrokernelTester()
54772       .mr(4)
54773       .nr(4)
54774       .kr(8)
54775       .sr(1)
54776       .m(4)
54777       .n(4)
54778       .k(8)
54779       .qmax(128)
54780       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54781   }
54782 
TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128,strided_cm)54783   TEST(QS8_GEMM_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2_LD128, strided_cm) {
54784     GemmMicrokernelTester()
54785       .mr(4)
54786       .nr(4)
54787       .kr(8)
54788       .sr(1)
54789       .m(4)
54790       .n(4)
54791       .k(8)
54792       .cm_stride(7)
54793       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2_ld128, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54794   }
54795 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
54796 
54797 
54798 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_eq_8)54799   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_eq_8) {
54800     GemmMicrokernelTester()
54801       .extended_weights(true)
54802       .mr(2)
54803       .nr(4)
54804       .kr(2)
54805       .sr(1)
54806       .m(2)
54807       .n(4)
54808       .k(8)
54809       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54810   }
54811 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,strided_cn)54812   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, strided_cn) {
54813     GemmMicrokernelTester()
54814       .extended_weights(true)
54815       .mr(2)
54816       .nr(4)
54817       .kr(2)
54818       .sr(1)
54819       .m(2)
54820       .n(4)
54821       .k(8)
54822       .cn_stride(7)
54823       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54824   }
54825 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_eq_8_strided_a)54826   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
54827     GemmMicrokernelTester()
54828       .extended_weights(true)
54829       .mr(2)
54830       .nr(4)
54831       .kr(2)
54832       .sr(1)
54833       .m(2)
54834       .n(4)
54835       .k(8)
54836       .a_stride(11)
54837       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54838   }
54839 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile)54840   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile) {
54841     for (uint32_t n = 1; n <= 4; n++) {
54842       for (uint32_t m = 1; m <= 2; m++) {
54843         GemmMicrokernelTester()
54844           .extended_weights(true)
54845           .mr(2)
54846           .nr(4)
54847           .kr(2)
54848           .sr(1)
54849           .m(m)
54850           .n(n)
54851           .k(8)
54852           .iterations(1)
54853           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54854       }
54855     }
54856   }
54857 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_m)54858   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
54859     for (uint32_t m = 1; m <= 2; m++) {
54860       GemmMicrokernelTester()
54861         .extended_weights(true)
54862         .mr(2)
54863         .nr(4)
54864         .kr(2)
54865         .sr(1)
54866         .m(m)
54867         .n(4)
54868         .k(8)
54869         .iterations(1)
54870         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54871     }
54872   }
54873 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_n)54874   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
54875     for (uint32_t n = 1; n <= 4; n++) {
54876       GemmMicrokernelTester()
54877         .extended_weights(true)
54878         .mr(2)
54879         .nr(4)
54880         .kr(2)
54881         .sr(1)
54882         .m(2)
54883         .n(n)
54884         .k(8)
54885         .iterations(1)
54886         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54887     }
54888   }
54889 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_lt_8)54890   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_lt_8) {
54891     for (size_t k = 1; k < 8; k++) {
54892       GemmMicrokernelTester()
54893         .extended_weights(true)
54894         .mr(2)
54895         .nr(4)
54896         .kr(2)
54897         .sr(1)
54898         .m(2)
54899         .n(4)
54900         .k(k)
54901         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54902     }
54903   }
54904 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_lt_8_strided_a)54905   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
54906     for (size_t k = 1; k < 8; k++) {
54907       GemmMicrokernelTester()
54908         .extended_weights(true)
54909         .mr(2)
54910         .nr(4)
54911         .kr(2)
54912         .sr(1)
54913         .m(2)
54914         .n(4)
54915         .k(k)
54916         .a_stride(11)
54917         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54918     }
54919   }
54920 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_lt_8_subtile)54921   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_lt_8_subtile) {
54922     for (size_t k = 1; k < 8; k++) {
54923       for (uint32_t n = 1; n <= 4; n++) {
54924         for (uint32_t m = 1; m <= 2; m++) {
54925           GemmMicrokernelTester()
54926             .extended_weights(true)
54927             .mr(2)
54928             .nr(4)
54929             .kr(2)
54930             .sr(1)
54931             .m(m)
54932             .n(n)
54933             .k(k)
54934             .iterations(1)
54935             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54936         }
54937       }
54938     }
54939   }
54940 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_gt_8)54941   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_gt_8) {
54942     for (size_t k = 9; k < 16; k++) {
54943       GemmMicrokernelTester()
54944         .extended_weights(true)
54945         .mr(2)
54946         .nr(4)
54947         .kr(2)
54948         .sr(1)
54949         .m(2)
54950         .n(4)
54951         .k(k)
54952         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54953     }
54954   }
54955 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_gt_8_strided_a)54956   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
54957     for (size_t k = 9; k < 16; k++) {
54958       GemmMicrokernelTester()
54959         .extended_weights(true)
54960         .mr(2)
54961         .nr(4)
54962         .kr(2)
54963         .sr(1)
54964         .m(2)
54965         .n(4)
54966         .k(k)
54967         .a_stride(19)
54968         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54969     }
54970   }
54971 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_gt_8_subtile)54972   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_gt_8_subtile) {
54973     for (size_t k = 9; k < 16; k++) {
54974       for (uint32_t n = 1; n <= 4; n++) {
54975         for (uint32_t m = 1; m <= 2; m++) {
54976           GemmMicrokernelTester()
54977             .extended_weights(true)
54978             .mr(2)
54979             .nr(4)
54980             .kr(2)
54981             .sr(1)
54982             .m(m)
54983             .n(n)
54984             .k(k)
54985             .iterations(1)
54986             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
54987         }
54988       }
54989     }
54990   }
54991 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_div_8)54992   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_div_8) {
54993     for (size_t k = 16; k <= 80; k += 8) {
54994       GemmMicrokernelTester()
54995         .extended_weights(true)
54996         .mr(2)
54997         .nr(4)
54998         .kr(2)
54999         .sr(1)
55000         .m(2)
55001         .n(4)
55002         .k(k)
55003         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55004     }
55005   }
55006 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_div_8_strided_a)55007   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_div_8_strided_a) {
55008     for (size_t k = 16; k <= 80; k += 8) {
55009       GemmMicrokernelTester()
55010         .extended_weights(true)
55011         .mr(2)
55012         .nr(4)
55013         .kr(2)
55014         .sr(1)
55015         .m(2)
55016         .n(4)
55017         .k(k)
55018         .a_stride(83)
55019         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55020     }
55021   }
55022 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,k_div_8_subtile)55023   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, k_div_8_subtile) {
55024     for (size_t k = 16; k <= 80; k += 8) {
55025       for (uint32_t n = 1; n <= 4; n++) {
55026         for (uint32_t m = 1; m <= 2; m++) {
55027           GemmMicrokernelTester()
55028             .extended_weights(true)
55029             .mr(2)
55030             .nr(4)
55031             .kr(2)
55032             .sr(1)
55033             .m(m)
55034             .n(n)
55035             .k(k)
55036             .iterations(1)
55037             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55038         }
55039       }
55040     }
55041   }
55042 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_gt_4)55043   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_gt_4) {
55044     for (uint32_t n = 5; n < 8; n++) {
55045       for (size_t k = 1; k <= 40; k += 9) {
55046         GemmMicrokernelTester()
55047           .extended_weights(true)
55048           .mr(2)
55049           .nr(4)
55050           .kr(2)
55051           .sr(1)
55052           .m(2)
55053           .n(n)
55054           .k(k)
55055           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55056       }
55057     }
55058   }
55059 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_cn)55060   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
55061     for (uint32_t n = 5; n < 8; n++) {
55062       for (size_t k = 1; k <= 40; k += 9) {
55063         GemmMicrokernelTester()
55064           .extended_weights(true)
55065           .mr(2)
55066           .nr(4)
55067           .kr(2)
55068           .sr(1)
55069           .m(2)
55070           .n(n)
55071           .k(k)
55072           .cn_stride(7)
55073           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55074       }
55075     }
55076   }
55077 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_a)55078   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
55079     for (uint32_t n = 5; n < 8; n++) {
55080       for (size_t k = 1; k <= 40; k += 9) {
55081         GemmMicrokernelTester()
55082           .extended_weights(true)
55083           .mr(2)
55084           .nr(4)
55085           .kr(2)
55086           .sr(1)
55087           .m(2)
55088           .n(n)
55089           .k(k)
55090           .a_stride(43)
55091           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55092       }
55093     }
55094   }
55095 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_gt_4_subtile)55096   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_gt_4_subtile) {
55097     for (uint32_t n = 5; n < 8; n++) {
55098       for (size_t k = 1; k <= 40; k += 9) {
55099         for (uint32_t m = 1; m <= 2; m++) {
55100           GemmMicrokernelTester()
55101             .extended_weights(true)
55102             .mr(2)
55103             .nr(4)
55104             .kr(2)
55105             .sr(1)
55106             .m(m)
55107             .n(n)
55108             .k(k)
55109             .iterations(1)
55110             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55111         }
55112       }
55113     }
55114   }
55115 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_div_4)55116   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_div_4) {
55117     for (uint32_t n = 8; n <= 12; n += 4) {
55118       for (size_t k = 1; k <= 40; k += 9) {
55119         GemmMicrokernelTester()
55120           .extended_weights(true)
55121           .mr(2)
55122           .nr(4)
55123           .kr(2)
55124           .sr(1)
55125           .m(2)
55126           .n(n)
55127           .k(k)
55128           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55129       }
55130     }
55131   }
55132 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_div_4_strided_cn)55133   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
55134     for (uint32_t n = 8; n <= 12; n += 4) {
55135       for (size_t k = 1; k <= 40; k += 9) {
55136         GemmMicrokernelTester()
55137           .extended_weights(true)
55138           .mr(2)
55139           .nr(4)
55140           .kr(2)
55141           .sr(1)
55142           .m(2)
55143           .n(n)
55144           .k(k)
55145           .cn_stride(7)
55146           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55147       }
55148     }
55149   }
55150 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_div_4_strided_a)55151   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_div_4_strided_a) {
55152     for (uint32_t n = 8; n <= 12; n += 4) {
55153       for (size_t k = 1; k <= 40; k += 9) {
55154         GemmMicrokernelTester()
55155           .extended_weights(true)
55156           .mr(2)
55157           .nr(4)
55158           .kr(2)
55159           .sr(1)
55160           .m(2)
55161           .n(n)
55162           .k(k)
55163           .a_stride(43)
55164           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55165       }
55166     }
55167   }
55168 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,n_div_4_subtile)55169   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, n_div_4_subtile) {
55170     for (uint32_t n = 8; n <= 12; n += 4) {
55171       for (size_t k = 1; k <= 40; k += 9) {
55172         for (uint32_t m = 1; m <= 2; m++) {
55173           GemmMicrokernelTester()
55174             .extended_weights(true)
55175             .mr(2)
55176             .nr(4)
55177             .kr(2)
55178             .sr(1)
55179             .m(m)
55180             .n(n)
55181             .k(k)
55182             .iterations(1)
55183             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55184         }
55185       }
55186     }
55187   }
55188 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,strided_cm_subtile)55189   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, strided_cm_subtile) {
55190     for (size_t k = 1; k <= 40; k += 9) {
55191       for (uint32_t n = 1; n <= 4; n++) {
55192         for (uint32_t m = 1; m <= 2; m++) {
55193           GemmMicrokernelTester()
55194             .extended_weights(true)
55195             .mr(2)
55196             .nr(4)
55197             .kr(2)
55198             .sr(1)
55199             .m(m)
55200             .n(n)
55201             .k(k)
55202             .cm_stride(7)
55203             .iterations(1)
55204             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55205         }
55206       }
55207     }
55208   }
55209 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2,strided_cm)55210   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C2__WASMSIMD_DOT16X2, strided_cm) {
55211     GemmMicrokernelTester()
55212       .extended_weights(true)
55213       .mr(2)
55214       .nr(4)
55215       .kr(2)
55216       .sr(1)
55217       .m(2)
55218       .n(4)
55219       .k(8)
55220       .cm_stride(7)
55221       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55222   }
55223 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
55224 
55225 
55226 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_eq_8)55227   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_eq_8) {
55228     GemmMicrokernelTester()
55229       .extended_weights(true)
55230       .mr(2)
55231       .nr(4)
55232       .kr(8)
55233       .sr(1)
55234       .m(2)
55235       .n(4)
55236       .k(8)
55237       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55238   }
55239 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,strided_cn)55240   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, strided_cn) {
55241     GemmMicrokernelTester()
55242       .extended_weights(true)
55243       .mr(2)
55244       .nr(4)
55245       .kr(8)
55246       .sr(1)
55247       .m(2)
55248       .n(4)
55249       .k(8)
55250       .cn_stride(7)
55251       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55252   }
55253 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_eq_8_strided_a)55254   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
55255     GemmMicrokernelTester()
55256       .extended_weights(true)
55257       .mr(2)
55258       .nr(4)
55259       .kr(8)
55260       .sr(1)
55261       .m(2)
55262       .n(4)
55263       .k(8)
55264       .a_stride(11)
55265       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55266   }
55267 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile)55268   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile) {
55269     for (uint32_t n = 1; n <= 4; n++) {
55270       for (uint32_t m = 1; m <= 2; m++) {
55271         GemmMicrokernelTester()
55272           .extended_weights(true)
55273           .mr(2)
55274           .nr(4)
55275           .kr(8)
55276           .sr(1)
55277           .m(m)
55278           .n(n)
55279           .k(8)
55280           .iterations(1)
55281           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55282       }
55283     }
55284   }
55285 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_m)55286   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
55287     for (uint32_t m = 1; m <= 2; m++) {
55288       GemmMicrokernelTester()
55289         .extended_weights(true)
55290         .mr(2)
55291         .nr(4)
55292         .kr(8)
55293         .sr(1)
55294         .m(m)
55295         .n(4)
55296         .k(8)
55297         .iterations(1)
55298         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55299     }
55300   }
55301 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_n)55302   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
55303     for (uint32_t n = 1; n <= 4; n++) {
55304       GemmMicrokernelTester()
55305         .extended_weights(true)
55306         .mr(2)
55307         .nr(4)
55308         .kr(8)
55309         .sr(1)
55310         .m(2)
55311         .n(n)
55312         .k(8)
55313         .iterations(1)
55314         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55315     }
55316   }
55317 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_lt_8)55318   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_lt_8) {
55319     for (size_t k = 1; k < 8; k++) {
55320       GemmMicrokernelTester()
55321         .extended_weights(true)
55322         .mr(2)
55323         .nr(4)
55324         .kr(8)
55325         .sr(1)
55326         .m(2)
55327         .n(4)
55328         .k(k)
55329         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55330     }
55331   }
55332 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_lt_8_strided_a)55333   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
55334     for (size_t k = 1; k < 8; k++) {
55335       GemmMicrokernelTester()
55336         .extended_weights(true)
55337         .mr(2)
55338         .nr(4)
55339         .kr(8)
55340         .sr(1)
55341         .m(2)
55342         .n(4)
55343         .k(k)
55344         .a_stride(11)
55345         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55346     }
55347   }
55348 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_lt_8_subtile)55349   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_lt_8_subtile) {
55350     for (size_t k = 1; k < 8; k++) {
55351       for (uint32_t n = 1; n <= 4; n++) {
55352         for (uint32_t m = 1; m <= 2; m++) {
55353           GemmMicrokernelTester()
55354             .extended_weights(true)
55355             .mr(2)
55356             .nr(4)
55357             .kr(8)
55358             .sr(1)
55359             .m(m)
55360             .n(n)
55361             .k(k)
55362             .iterations(1)
55363             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55364         }
55365       }
55366     }
55367   }
55368 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_gt_8)55369   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_gt_8) {
55370     for (size_t k = 9; k < 16; k++) {
55371       GemmMicrokernelTester()
55372         .extended_weights(true)
55373         .mr(2)
55374         .nr(4)
55375         .kr(8)
55376         .sr(1)
55377         .m(2)
55378         .n(4)
55379         .k(k)
55380         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55381     }
55382   }
55383 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_gt_8_strided_a)55384   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
55385     for (size_t k = 9; k < 16; k++) {
55386       GemmMicrokernelTester()
55387         .extended_weights(true)
55388         .mr(2)
55389         .nr(4)
55390         .kr(8)
55391         .sr(1)
55392         .m(2)
55393         .n(4)
55394         .k(k)
55395         .a_stride(19)
55396         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55397     }
55398   }
55399 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_gt_8_subtile)55400   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_gt_8_subtile) {
55401     for (size_t k = 9; k < 16; k++) {
55402       for (uint32_t n = 1; n <= 4; n++) {
55403         for (uint32_t m = 1; m <= 2; m++) {
55404           GemmMicrokernelTester()
55405             .extended_weights(true)
55406             .mr(2)
55407             .nr(4)
55408             .kr(8)
55409             .sr(1)
55410             .m(m)
55411             .n(n)
55412             .k(k)
55413             .iterations(1)
55414             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55415         }
55416       }
55417     }
55418   }
55419 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_div_8)55420   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_div_8) {
55421     for (size_t k = 16; k <= 80; k += 8) {
55422       GemmMicrokernelTester()
55423         .extended_weights(true)
55424         .mr(2)
55425         .nr(4)
55426         .kr(8)
55427         .sr(1)
55428         .m(2)
55429         .n(4)
55430         .k(k)
55431         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55432     }
55433   }
55434 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_div_8_strided_a)55435   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_div_8_strided_a) {
55436     for (size_t k = 16; k <= 80; k += 8) {
55437       GemmMicrokernelTester()
55438         .extended_weights(true)
55439         .mr(2)
55440         .nr(4)
55441         .kr(8)
55442         .sr(1)
55443         .m(2)
55444         .n(4)
55445         .k(k)
55446         .a_stride(83)
55447         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55448     }
55449   }
55450 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,k_div_8_subtile)55451   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, k_div_8_subtile) {
55452     for (size_t k = 16; k <= 80; k += 8) {
55453       for (uint32_t n = 1; n <= 4; n++) {
55454         for (uint32_t m = 1; m <= 2; m++) {
55455           GemmMicrokernelTester()
55456             .extended_weights(true)
55457             .mr(2)
55458             .nr(4)
55459             .kr(8)
55460             .sr(1)
55461             .m(m)
55462             .n(n)
55463             .k(k)
55464             .iterations(1)
55465             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55466         }
55467       }
55468     }
55469   }
55470 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_gt_4)55471   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_gt_4) {
55472     for (uint32_t n = 5; n < 8; n++) {
55473       for (size_t k = 1; k <= 40; k += 9) {
55474         GemmMicrokernelTester()
55475           .extended_weights(true)
55476           .mr(2)
55477           .nr(4)
55478           .kr(8)
55479           .sr(1)
55480           .m(2)
55481           .n(n)
55482           .k(k)
55483           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55484       }
55485     }
55486   }
55487 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_cn)55488   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
55489     for (uint32_t n = 5; n < 8; n++) {
55490       for (size_t k = 1; k <= 40; k += 9) {
55491         GemmMicrokernelTester()
55492           .extended_weights(true)
55493           .mr(2)
55494           .nr(4)
55495           .kr(8)
55496           .sr(1)
55497           .m(2)
55498           .n(n)
55499           .k(k)
55500           .cn_stride(7)
55501           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55502       }
55503     }
55504   }
55505 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_a)55506   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
55507     for (uint32_t n = 5; n < 8; n++) {
55508       for (size_t k = 1; k <= 40; k += 9) {
55509         GemmMicrokernelTester()
55510           .extended_weights(true)
55511           .mr(2)
55512           .nr(4)
55513           .kr(8)
55514           .sr(1)
55515           .m(2)
55516           .n(n)
55517           .k(k)
55518           .a_stride(43)
55519           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55520       }
55521     }
55522   }
55523 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_gt_4_subtile)55524   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_gt_4_subtile) {
55525     for (uint32_t n = 5; n < 8; n++) {
55526       for (size_t k = 1; k <= 40; k += 9) {
55527         for (uint32_t m = 1; m <= 2; m++) {
55528           GemmMicrokernelTester()
55529             .extended_weights(true)
55530             .mr(2)
55531             .nr(4)
55532             .kr(8)
55533             .sr(1)
55534             .m(m)
55535             .n(n)
55536             .k(k)
55537             .iterations(1)
55538             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55539         }
55540       }
55541     }
55542   }
55543 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_div_4)55544   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_div_4) {
55545     for (uint32_t n = 8; n <= 12; n += 4) {
55546       for (size_t k = 1; k <= 40; k += 9) {
55547         GemmMicrokernelTester()
55548           .extended_weights(true)
55549           .mr(2)
55550           .nr(4)
55551           .kr(8)
55552           .sr(1)
55553           .m(2)
55554           .n(n)
55555           .k(k)
55556           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55557       }
55558     }
55559   }
55560 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_div_4_strided_cn)55561   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
55562     for (uint32_t n = 8; n <= 12; n += 4) {
55563       for (size_t k = 1; k <= 40; k += 9) {
55564         GemmMicrokernelTester()
55565           .extended_weights(true)
55566           .mr(2)
55567           .nr(4)
55568           .kr(8)
55569           .sr(1)
55570           .m(2)
55571           .n(n)
55572           .k(k)
55573           .cn_stride(7)
55574           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55575       }
55576     }
55577   }
55578 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_div_4_strided_a)55579   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_div_4_strided_a) {
55580     for (uint32_t n = 8; n <= 12; n += 4) {
55581       for (size_t k = 1; k <= 40; k += 9) {
55582         GemmMicrokernelTester()
55583           .extended_weights(true)
55584           .mr(2)
55585           .nr(4)
55586           .kr(8)
55587           .sr(1)
55588           .m(2)
55589           .n(n)
55590           .k(k)
55591           .a_stride(43)
55592           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55593       }
55594     }
55595   }
55596 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,n_div_4_subtile)55597   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, n_div_4_subtile) {
55598     for (uint32_t n = 8; n <= 12; n += 4) {
55599       for (size_t k = 1; k <= 40; k += 9) {
55600         for (uint32_t m = 1; m <= 2; m++) {
55601           GemmMicrokernelTester()
55602             .extended_weights(true)
55603             .mr(2)
55604             .nr(4)
55605             .kr(8)
55606             .sr(1)
55607             .m(m)
55608             .n(n)
55609             .k(k)
55610             .iterations(1)
55611             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55612         }
55613       }
55614     }
55615   }
55616 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,strided_cm_subtile)55617   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, strided_cm_subtile) {
55618     for (size_t k = 1; k <= 40; k += 9) {
55619       for (uint32_t n = 1; n <= 4; n++) {
55620         for (uint32_t m = 1; m <= 2; m++) {
55621           GemmMicrokernelTester()
55622             .extended_weights(true)
55623             .mr(2)
55624             .nr(4)
55625             .kr(8)
55626             .sr(1)
55627             .m(m)
55628             .n(n)
55629             .k(k)
55630             .cm_stride(7)
55631             .iterations(1)
55632             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55633         }
55634       }
55635     }
55636   }
55637 
TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2,strided_cm)55638   TEST(QS8_GEMM_XW_MINMAX_FP32_2X4C8__WASMSIMD_DOT16X2, strided_cm) {
55639     GemmMicrokernelTester()
55640       .extended_weights(true)
55641       .mr(2)
55642       .nr(4)
55643       .kr(8)
55644       .sr(1)
55645       .m(2)
55646       .n(4)
55647       .k(8)
55648       .cm_stride(7)
55649       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_2x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55650   }
55651 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
55652 
55653 
55654 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_eq_8)55655   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_eq_8) {
55656     GemmMicrokernelTester()
55657       .extended_weights(true)
55658       .mr(3)
55659       .nr(4)
55660       .kr(2)
55661       .sr(1)
55662       .m(3)
55663       .n(4)
55664       .k(8)
55665       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55666   }
55667 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,strided_cn)55668   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, strided_cn) {
55669     GemmMicrokernelTester()
55670       .extended_weights(true)
55671       .mr(3)
55672       .nr(4)
55673       .kr(2)
55674       .sr(1)
55675       .m(3)
55676       .n(4)
55677       .k(8)
55678       .cn_stride(7)
55679       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55680   }
55681 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_eq_8_strided_a)55682   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
55683     GemmMicrokernelTester()
55684       .extended_weights(true)
55685       .mr(3)
55686       .nr(4)
55687       .kr(2)
55688       .sr(1)
55689       .m(3)
55690       .n(4)
55691       .k(8)
55692       .a_stride(11)
55693       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55694   }
55695 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile)55696   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile) {
55697     for (uint32_t n = 1; n <= 4; n++) {
55698       for (uint32_t m = 1; m <= 3; m++) {
55699         GemmMicrokernelTester()
55700           .extended_weights(true)
55701           .mr(3)
55702           .nr(4)
55703           .kr(2)
55704           .sr(1)
55705           .m(m)
55706           .n(n)
55707           .k(8)
55708           .iterations(1)
55709           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55710       }
55711     }
55712   }
55713 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_m)55714   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
55715     for (uint32_t m = 1; m <= 3; m++) {
55716       GemmMicrokernelTester()
55717         .extended_weights(true)
55718         .mr(3)
55719         .nr(4)
55720         .kr(2)
55721         .sr(1)
55722         .m(m)
55723         .n(4)
55724         .k(8)
55725         .iterations(1)
55726         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55727     }
55728   }
55729 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_n)55730   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
55731     for (uint32_t n = 1; n <= 4; n++) {
55732       GemmMicrokernelTester()
55733         .extended_weights(true)
55734         .mr(3)
55735         .nr(4)
55736         .kr(2)
55737         .sr(1)
55738         .m(3)
55739         .n(n)
55740         .k(8)
55741         .iterations(1)
55742         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55743     }
55744   }
55745 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_lt_8)55746   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_lt_8) {
55747     for (size_t k = 1; k < 8; k++) {
55748       GemmMicrokernelTester()
55749         .extended_weights(true)
55750         .mr(3)
55751         .nr(4)
55752         .kr(2)
55753         .sr(1)
55754         .m(3)
55755         .n(4)
55756         .k(k)
55757         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55758     }
55759   }
55760 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_lt_8_strided_a)55761   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
55762     for (size_t k = 1; k < 8; k++) {
55763       GemmMicrokernelTester()
55764         .extended_weights(true)
55765         .mr(3)
55766         .nr(4)
55767         .kr(2)
55768         .sr(1)
55769         .m(3)
55770         .n(4)
55771         .k(k)
55772         .a_stride(11)
55773         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55774     }
55775   }
55776 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_lt_8_subtile)55777   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_lt_8_subtile) {
55778     for (size_t k = 1; k < 8; k++) {
55779       for (uint32_t n = 1; n <= 4; n++) {
55780         for (uint32_t m = 1; m <= 3; m++) {
55781           GemmMicrokernelTester()
55782             .extended_weights(true)
55783             .mr(3)
55784             .nr(4)
55785             .kr(2)
55786             .sr(1)
55787             .m(m)
55788             .n(n)
55789             .k(k)
55790             .iterations(1)
55791             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55792         }
55793       }
55794     }
55795   }
55796 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_gt_8)55797   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_gt_8) {
55798     for (size_t k = 9; k < 16; k++) {
55799       GemmMicrokernelTester()
55800         .extended_weights(true)
55801         .mr(3)
55802         .nr(4)
55803         .kr(2)
55804         .sr(1)
55805         .m(3)
55806         .n(4)
55807         .k(k)
55808         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55809     }
55810   }
55811 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_gt_8_strided_a)55812   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
55813     for (size_t k = 9; k < 16; k++) {
55814       GemmMicrokernelTester()
55815         .extended_weights(true)
55816         .mr(3)
55817         .nr(4)
55818         .kr(2)
55819         .sr(1)
55820         .m(3)
55821         .n(4)
55822         .k(k)
55823         .a_stride(19)
55824         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55825     }
55826   }
55827 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_gt_8_subtile)55828   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_gt_8_subtile) {
55829     for (size_t k = 9; k < 16; k++) {
55830       for (uint32_t n = 1; n <= 4; n++) {
55831         for (uint32_t m = 1; m <= 3; m++) {
55832           GemmMicrokernelTester()
55833             .extended_weights(true)
55834             .mr(3)
55835             .nr(4)
55836             .kr(2)
55837             .sr(1)
55838             .m(m)
55839             .n(n)
55840             .k(k)
55841             .iterations(1)
55842             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55843         }
55844       }
55845     }
55846   }
55847 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_div_8)55848   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_div_8) {
55849     for (size_t k = 16; k <= 80; k += 8) {
55850       GemmMicrokernelTester()
55851         .extended_weights(true)
55852         .mr(3)
55853         .nr(4)
55854         .kr(2)
55855         .sr(1)
55856         .m(3)
55857         .n(4)
55858         .k(k)
55859         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55860     }
55861   }
55862 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_div_8_strided_a)55863   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_div_8_strided_a) {
55864     for (size_t k = 16; k <= 80; k += 8) {
55865       GemmMicrokernelTester()
55866         .extended_weights(true)
55867         .mr(3)
55868         .nr(4)
55869         .kr(2)
55870         .sr(1)
55871         .m(3)
55872         .n(4)
55873         .k(k)
55874         .a_stride(83)
55875         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55876     }
55877   }
55878 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,k_div_8_subtile)55879   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, k_div_8_subtile) {
55880     for (size_t k = 16; k <= 80; k += 8) {
55881       for (uint32_t n = 1; n <= 4; n++) {
55882         for (uint32_t m = 1; m <= 3; m++) {
55883           GemmMicrokernelTester()
55884             .extended_weights(true)
55885             .mr(3)
55886             .nr(4)
55887             .kr(2)
55888             .sr(1)
55889             .m(m)
55890             .n(n)
55891             .k(k)
55892             .iterations(1)
55893             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55894         }
55895       }
55896     }
55897   }
55898 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_gt_4)55899   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_gt_4) {
55900     for (uint32_t n = 5; n < 8; n++) {
55901       for (size_t k = 1; k <= 40; k += 9) {
55902         GemmMicrokernelTester()
55903           .extended_weights(true)
55904           .mr(3)
55905           .nr(4)
55906           .kr(2)
55907           .sr(1)
55908           .m(3)
55909           .n(n)
55910           .k(k)
55911           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55912       }
55913     }
55914   }
55915 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_cn)55916   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
55917     for (uint32_t n = 5; n < 8; n++) {
55918       for (size_t k = 1; k <= 40; k += 9) {
55919         GemmMicrokernelTester()
55920           .extended_weights(true)
55921           .mr(3)
55922           .nr(4)
55923           .kr(2)
55924           .sr(1)
55925           .m(3)
55926           .n(n)
55927           .k(k)
55928           .cn_stride(7)
55929           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55930       }
55931     }
55932   }
55933 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_a)55934   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
55935     for (uint32_t n = 5; n < 8; n++) {
55936       for (size_t k = 1; k <= 40; k += 9) {
55937         GemmMicrokernelTester()
55938           .extended_weights(true)
55939           .mr(3)
55940           .nr(4)
55941           .kr(2)
55942           .sr(1)
55943           .m(3)
55944           .n(n)
55945           .k(k)
55946           .a_stride(43)
55947           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55948       }
55949     }
55950   }
55951 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_gt_4_subtile)55952   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_gt_4_subtile) {
55953     for (uint32_t n = 5; n < 8; n++) {
55954       for (size_t k = 1; k <= 40; k += 9) {
55955         for (uint32_t m = 1; m <= 3; m++) {
55956           GemmMicrokernelTester()
55957             .extended_weights(true)
55958             .mr(3)
55959             .nr(4)
55960             .kr(2)
55961             .sr(1)
55962             .m(m)
55963             .n(n)
55964             .k(k)
55965             .iterations(1)
55966             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55967         }
55968       }
55969     }
55970   }
55971 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_div_4)55972   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_div_4) {
55973     for (uint32_t n = 8; n <= 12; n += 4) {
55974       for (size_t k = 1; k <= 40; k += 9) {
55975         GemmMicrokernelTester()
55976           .extended_weights(true)
55977           .mr(3)
55978           .nr(4)
55979           .kr(2)
55980           .sr(1)
55981           .m(3)
55982           .n(n)
55983           .k(k)
55984           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
55985       }
55986     }
55987   }
55988 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_div_4_strided_cn)55989   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
55990     for (uint32_t n = 8; n <= 12; n += 4) {
55991       for (size_t k = 1; k <= 40; k += 9) {
55992         GemmMicrokernelTester()
55993           .extended_weights(true)
55994           .mr(3)
55995           .nr(4)
55996           .kr(2)
55997           .sr(1)
55998           .m(3)
55999           .n(n)
56000           .k(k)
56001           .cn_stride(7)
56002           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56003       }
56004     }
56005   }
56006 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_div_4_strided_a)56007   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_div_4_strided_a) {
56008     for (uint32_t n = 8; n <= 12; n += 4) {
56009       for (size_t k = 1; k <= 40; k += 9) {
56010         GemmMicrokernelTester()
56011           .extended_weights(true)
56012           .mr(3)
56013           .nr(4)
56014           .kr(2)
56015           .sr(1)
56016           .m(3)
56017           .n(n)
56018           .k(k)
56019           .a_stride(43)
56020           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56021       }
56022     }
56023   }
56024 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,n_div_4_subtile)56025   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, n_div_4_subtile) {
56026     for (uint32_t n = 8; n <= 12; n += 4) {
56027       for (size_t k = 1; k <= 40; k += 9) {
56028         for (uint32_t m = 1; m <= 3; m++) {
56029           GemmMicrokernelTester()
56030             .extended_weights(true)
56031             .mr(3)
56032             .nr(4)
56033             .kr(2)
56034             .sr(1)
56035             .m(m)
56036             .n(n)
56037             .k(k)
56038             .iterations(1)
56039             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56040         }
56041       }
56042     }
56043   }
56044 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,strided_cm_subtile)56045   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, strided_cm_subtile) {
56046     for (size_t k = 1; k <= 40; k += 9) {
56047       for (uint32_t n = 1; n <= 4; n++) {
56048         for (uint32_t m = 1; m <= 3; m++) {
56049           GemmMicrokernelTester()
56050             .extended_weights(true)
56051             .mr(3)
56052             .nr(4)
56053             .kr(2)
56054             .sr(1)
56055             .m(m)
56056             .n(n)
56057             .k(k)
56058             .cm_stride(7)
56059             .iterations(1)
56060             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56061         }
56062       }
56063     }
56064   }
56065 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2,strided_cm)56066   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C2__WASMSIMD_DOT16X2, strided_cm) {
56067     GemmMicrokernelTester()
56068       .extended_weights(true)
56069       .mr(3)
56070       .nr(4)
56071       .kr(2)
56072       .sr(1)
56073       .m(3)
56074       .n(4)
56075       .k(8)
56076       .cm_stride(7)
56077       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56078   }
56079 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
56080 
56081 
56082 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_eq_8)56083   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_eq_8) {
56084     GemmMicrokernelTester()
56085       .extended_weights(true)
56086       .mr(3)
56087       .nr(4)
56088       .kr(8)
56089       .sr(1)
56090       .m(3)
56091       .n(4)
56092       .k(8)
56093       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56094   }
56095 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,strided_cn)56096   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, strided_cn) {
56097     GemmMicrokernelTester()
56098       .extended_weights(true)
56099       .mr(3)
56100       .nr(4)
56101       .kr(8)
56102       .sr(1)
56103       .m(3)
56104       .n(4)
56105       .k(8)
56106       .cn_stride(7)
56107       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56108   }
56109 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_eq_8_strided_a)56110   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
56111     GemmMicrokernelTester()
56112       .extended_weights(true)
56113       .mr(3)
56114       .nr(4)
56115       .kr(8)
56116       .sr(1)
56117       .m(3)
56118       .n(4)
56119       .k(8)
56120       .a_stride(11)
56121       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56122   }
56123 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile)56124   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile) {
56125     for (uint32_t n = 1; n <= 4; n++) {
56126       for (uint32_t m = 1; m <= 3; m++) {
56127         GemmMicrokernelTester()
56128           .extended_weights(true)
56129           .mr(3)
56130           .nr(4)
56131           .kr(8)
56132           .sr(1)
56133           .m(m)
56134           .n(n)
56135           .k(8)
56136           .iterations(1)
56137           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56138       }
56139     }
56140   }
56141 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_m)56142   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
56143     for (uint32_t m = 1; m <= 3; m++) {
56144       GemmMicrokernelTester()
56145         .extended_weights(true)
56146         .mr(3)
56147         .nr(4)
56148         .kr(8)
56149         .sr(1)
56150         .m(m)
56151         .n(4)
56152         .k(8)
56153         .iterations(1)
56154         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56155     }
56156   }
56157 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_n)56158   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
56159     for (uint32_t n = 1; n <= 4; n++) {
56160       GemmMicrokernelTester()
56161         .extended_weights(true)
56162         .mr(3)
56163         .nr(4)
56164         .kr(8)
56165         .sr(1)
56166         .m(3)
56167         .n(n)
56168         .k(8)
56169         .iterations(1)
56170         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56171     }
56172   }
56173 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_lt_8)56174   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_lt_8) {
56175     for (size_t k = 1; k < 8; k++) {
56176       GemmMicrokernelTester()
56177         .extended_weights(true)
56178         .mr(3)
56179         .nr(4)
56180         .kr(8)
56181         .sr(1)
56182         .m(3)
56183         .n(4)
56184         .k(k)
56185         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56186     }
56187   }
56188 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_lt_8_strided_a)56189   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
56190     for (size_t k = 1; k < 8; k++) {
56191       GemmMicrokernelTester()
56192         .extended_weights(true)
56193         .mr(3)
56194         .nr(4)
56195         .kr(8)
56196         .sr(1)
56197         .m(3)
56198         .n(4)
56199         .k(k)
56200         .a_stride(11)
56201         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56202     }
56203   }
56204 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_lt_8_subtile)56205   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_lt_8_subtile) {
56206     for (size_t k = 1; k < 8; k++) {
56207       for (uint32_t n = 1; n <= 4; n++) {
56208         for (uint32_t m = 1; m <= 3; m++) {
56209           GemmMicrokernelTester()
56210             .extended_weights(true)
56211             .mr(3)
56212             .nr(4)
56213             .kr(8)
56214             .sr(1)
56215             .m(m)
56216             .n(n)
56217             .k(k)
56218             .iterations(1)
56219             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56220         }
56221       }
56222     }
56223   }
56224 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_gt_8)56225   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_gt_8) {
56226     for (size_t k = 9; k < 16; k++) {
56227       GemmMicrokernelTester()
56228         .extended_weights(true)
56229         .mr(3)
56230         .nr(4)
56231         .kr(8)
56232         .sr(1)
56233         .m(3)
56234         .n(4)
56235         .k(k)
56236         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56237     }
56238   }
56239 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_gt_8_strided_a)56240   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
56241     for (size_t k = 9; k < 16; k++) {
56242       GemmMicrokernelTester()
56243         .extended_weights(true)
56244         .mr(3)
56245         .nr(4)
56246         .kr(8)
56247         .sr(1)
56248         .m(3)
56249         .n(4)
56250         .k(k)
56251         .a_stride(19)
56252         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56253     }
56254   }
56255 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_gt_8_subtile)56256   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_gt_8_subtile) {
56257     for (size_t k = 9; k < 16; k++) {
56258       for (uint32_t n = 1; n <= 4; n++) {
56259         for (uint32_t m = 1; m <= 3; m++) {
56260           GemmMicrokernelTester()
56261             .extended_weights(true)
56262             .mr(3)
56263             .nr(4)
56264             .kr(8)
56265             .sr(1)
56266             .m(m)
56267             .n(n)
56268             .k(k)
56269             .iterations(1)
56270             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56271         }
56272       }
56273     }
56274   }
56275 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_div_8)56276   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_div_8) {
56277     for (size_t k = 16; k <= 80; k += 8) {
56278       GemmMicrokernelTester()
56279         .extended_weights(true)
56280         .mr(3)
56281         .nr(4)
56282         .kr(8)
56283         .sr(1)
56284         .m(3)
56285         .n(4)
56286         .k(k)
56287         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56288     }
56289   }
56290 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_div_8_strided_a)56291   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_div_8_strided_a) {
56292     for (size_t k = 16; k <= 80; k += 8) {
56293       GemmMicrokernelTester()
56294         .extended_weights(true)
56295         .mr(3)
56296         .nr(4)
56297         .kr(8)
56298         .sr(1)
56299         .m(3)
56300         .n(4)
56301         .k(k)
56302         .a_stride(83)
56303         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56304     }
56305   }
56306 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,k_div_8_subtile)56307   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, k_div_8_subtile) {
56308     for (size_t k = 16; k <= 80; k += 8) {
56309       for (uint32_t n = 1; n <= 4; n++) {
56310         for (uint32_t m = 1; m <= 3; m++) {
56311           GemmMicrokernelTester()
56312             .extended_weights(true)
56313             .mr(3)
56314             .nr(4)
56315             .kr(8)
56316             .sr(1)
56317             .m(m)
56318             .n(n)
56319             .k(k)
56320             .iterations(1)
56321             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56322         }
56323       }
56324     }
56325   }
56326 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_gt_4)56327   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_gt_4) {
56328     for (uint32_t n = 5; n < 8; n++) {
56329       for (size_t k = 1; k <= 40; k += 9) {
56330         GemmMicrokernelTester()
56331           .extended_weights(true)
56332           .mr(3)
56333           .nr(4)
56334           .kr(8)
56335           .sr(1)
56336           .m(3)
56337           .n(n)
56338           .k(k)
56339           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56340       }
56341     }
56342   }
56343 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_cn)56344   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
56345     for (uint32_t n = 5; n < 8; n++) {
56346       for (size_t k = 1; k <= 40; k += 9) {
56347         GemmMicrokernelTester()
56348           .extended_weights(true)
56349           .mr(3)
56350           .nr(4)
56351           .kr(8)
56352           .sr(1)
56353           .m(3)
56354           .n(n)
56355           .k(k)
56356           .cn_stride(7)
56357           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56358       }
56359     }
56360   }
56361 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_a)56362   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
56363     for (uint32_t n = 5; n < 8; n++) {
56364       for (size_t k = 1; k <= 40; k += 9) {
56365         GemmMicrokernelTester()
56366           .extended_weights(true)
56367           .mr(3)
56368           .nr(4)
56369           .kr(8)
56370           .sr(1)
56371           .m(3)
56372           .n(n)
56373           .k(k)
56374           .a_stride(43)
56375           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56376       }
56377     }
56378   }
56379 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_gt_4_subtile)56380   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_gt_4_subtile) {
56381     for (uint32_t n = 5; n < 8; n++) {
56382       for (size_t k = 1; k <= 40; k += 9) {
56383         for (uint32_t m = 1; m <= 3; m++) {
56384           GemmMicrokernelTester()
56385             .extended_weights(true)
56386             .mr(3)
56387             .nr(4)
56388             .kr(8)
56389             .sr(1)
56390             .m(m)
56391             .n(n)
56392             .k(k)
56393             .iterations(1)
56394             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56395         }
56396       }
56397     }
56398   }
56399 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_div_4)56400   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_div_4) {
56401     for (uint32_t n = 8; n <= 12; n += 4) {
56402       for (size_t k = 1; k <= 40; k += 9) {
56403         GemmMicrokernelTester()
56404           .extended_weights(true)
56405           .mr(3)
56406           .nr(4)
56407           .kr(8)
56408           .sr(1)
56409           .m(3)
56410           .n(n)
56411           .k(k)
56412           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56413       }
56414     }
56415   }
56416 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_div_4_strided_cn)56417   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
56418     for (uint32_t n = 8; n <= 12; n += 4) {
56419       for (size_t k = 1; k <= 40; k += 9) {
56420         GemmMicrokernelTester()
56421           .extended_weights(true)
56422           .mr(3)
56423           .nr(4)
56424           .kr(8)
56425           .sr(1)
56426           .m(3)
56427           .n(n)
56428           .k(k)
56429           .cn_stride(7)
56430           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56431       }
56432     }
56433   }
56434 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_div_4_strided_a)56435   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_div_4_strided_a) {
56436     for (uint32_t n = 8; n <= 12; n += 4) {
56437       for (size_t k = 1; k <= 40; k += 9) {
56438         GemmMicrokernelTester()
56439           .extended_weights(true)
56440           .mr(3)
56441           .nr(4)
56442           .kr(8)
56443           .sr(1)
56444           .m(3)
56445           .n(n)
56446           .k(k)
56447           .a_stride(43)
56448           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56449       }
56450     }
56451   }
56452 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,n_div_4_subtile)56453   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, n_div_4_subtile) {
56454     for (uint32_t n = 8; n <= 12; n += 4) {
56455       for (size_t k = 1; k <= 40; k += 9) {
56456         for (uint32_t m = 1; m <= 3; m++) {
56457           GemmMicrokernelTester()
56458             .extended_weights(true)
56459             .mr(3)
56460             .nr(4)
56461             .kr(8)
56462             .sr(1)
56463             .m(m)
56464             .n(n)
56465             .k(k)
56466             .iterations(1)
56467             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56468         }
56469       }
56470     }
56471   }
56472 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,strided_cm_subtile)56473   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, strided_cm_subtile) {
56474     for (size_t k = 1; k <= 40; k += 9) {
56475       for (uint32_t n = 1; n <= 4; n++) {
56476         for (uint32_t m = 1; m <= 3; m++) {
56477           GemmMicrokernelTester()
56478             .extended_weights(true)
56479             .mr(3)
56480             .nr(4)
56481             .kr(8)
56482             .sr(1)
56483             .m(m)
56484             .n(n)
56485             .k(k)
56486             .cm_stride(7)
56487             .iterations(1)
56488             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56489         }
56490       }
56491     }
56492   }
56493 
TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2,strided_cm)56494   TEST(QS8_GEMM_XW_MINMAX_FP32_3X4C8__WASMSIMD_DOT16X2, strided_cm) {
56495     GemmMicrokernelTester()
56496       .extended_weights(true)
56497       .mr(3)
56498       .nr(4)
56499       .kr(8)
56500       .sr(1)
56501       .m(3)
56502       .n(4)
56503       .k(8)
56504       .cm_stride(7)
56505       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_3x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56506   }
56507 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
56508 
56509 
56510 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_eq_8)56511   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_eq_8) {
56512     GemmMicrokernelTester()
56513       .extended_weights(true)
56514       .mr(4)
56515       .nr(4)
56516       .kr(2)
56517       .sr(1)
56518       .m(4)
56519       .n(4)
56520       .k(8)
56521       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56522   }
56523 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,strided_cn)56524   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, strided_cn) {
56525     GemmMicrokernelTester()
56526       .extended_weights(true)
56527       .mr(4)
56528       .nr(4)
56529       .kr(2)
56530       .sr(1)
56531       .m(4)
56532       .n(4)
56533       .k(8)
56534       .cn_stride(7)
56535       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56536   }
56537 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_eq_8_strided_a)56538   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
56539     GemmMicrokernelTester()
56540       .extended_weights(true)
56541       .mr(4)
56542       .nr(4)
56543       .kr(2)
56544       .sr(1)
56545       .m(4)
56546       .n(4)
56547       .k(8)
56548       .a_stride(11)
56549       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56550   }
56551 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile)56552   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile) {
56553     for (uint32_t n = 1; n <= 4; n++) {
56554       for (uint32_t m = 1; m <= 4; m++) {
56555         GemmMicrokernelTester()
56556           .extended_weights(true)
56557           .mr(4)
56558           .nr(4)
56559           .kr(2)
56560           .sr(1)
56561           .m(m)
56562           .n(n)
56563           .k(8)
56564           .iterations(1)
56565           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56566       }
56567     }
56568   }
56569 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_m)56570   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
56571     for (uint32_t m = 1; m <= 4; m++) {
56572       GemmMicrokernelTester()
56573         .extended_weights(true)
56574         .mr(4)
56575         .nr(4)
56576         .kr(2)
56577         .sr(1)
56578         .m(m)
56579         .n(4)
56580         .k(8)
56581         .iterations(1)
56582         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56583     }
56584   }
56585 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_eq_8_subtile_n)56586   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
56587     for (uint32_t n = 1; n <= 4; n++) {
56588       GemmMicrokernelTester()
56589         .extended_weights(true)
56590         .mr(4)
56591         .nr(4)
56592         .kr(2)
56593         .sr(1)
56594         .m(4)
56595         .n(n)
56596         .k(8)
56597         .iterations(1)
56598         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56599     }
56600   }
56601 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_lt_8)56602   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_lt_8) {
56603     for (size_t k = 1; k < 8; k++) {
56604       GemmMicrokernelTester()
56605         .extended_weights(true)
56606         .mr(4)
56607         .nr(4)
56608         .kr(2)
56609         .sr(1)
56610         .m(4)
56611         .n(4)
56612         .k(k)
56613         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56614     }
56615   }
56616 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_lt_8_strided_a)56617   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
56618     for (size_t k = 1; k < 8; k++) {
56619       GemmMicrokernelTester()
56620         .extended_weights(true)
56621         .mr(4)
56622         .nr(4)
56623         .kr(2)
56624         .sr(1)
56625         .m(4)
56626         .n(4)
56627         .k(k)
56628         .a_stride(11)
56629         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56630     }
56631   }
56632 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_lt_8_subtile)56633   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_lt_8_subtile) {
56634     for (size_t k = 1; k < 8; k++) {
56635       for (uint32_t n = 1; n <= 4; n++) {
56636         for (uint32_t m = 1; m <= 4; m++) {
56637           GemmMicrokernelTester()
56638             .extended_weights(true)
56639             .mr(4)
56640             .nr(4)
56641             .kr(2)
56642             .sr(1)
56643             .m(m)
56644             .n(n)
56645             .k(k)
56646             .iterations(1)
56647             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56648         }
56649       }
56650     }
56651   }
56652 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_gt_8)56653   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_gt_8) {
56654     for (size_t k = 9; k < 16; k++) {
56655       GemmMicrokernelTester()
56656         .extended_weights(true)
56657         .mr(4)
56658         .nr(4)
56659         .kr(2)
56660         .sr(1)
56661         .m(4)
56662         .n(4)
56663         .k(k)
56664         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56665     }
56666   }
56667 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_gt_8_strided_a)56668   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
56669     for (size_t k = 9; k < 16; k++) {
56670       GemmMicrokernelTester()
56671         .extended_weights(true)
56672         .mr(4)
56673         .nr(4)
56674         .kr(2)
56675         .sr(1)
56676         .m(4)
56677         .n(4)
56678         .k(k)
56679         .a_stride(19)
56680         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56681     }
56682   }
56683 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_gt_8_subtile)56684   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_gt_8_subtile) {
56685     for (size_t k = 9; k < 16; k++) {
56686       for (uint32_t n = 1; n <= 4; n++) {
56687         for (uint32_t m = 1; m <= 4; m++) {
56688           GemmMicrokernelTester()
56689             .extended_weights(true)
56690             .mr(4)
56691             .nr(4)
56692             .kr(2)
56693             .sr(1)
56694             .m(m)
56695             .n(n)
56696             .k(k)
56697             .iterations(1)
56698             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56699         }
56700       }
56701     }
56702   }
56703 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_div_8)56704   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_div_8) {
56705     for (size_t k = 16; k <= 80; k += 8) {
56706       GemmMicrokernelTester()
56707         .extended_weights(true)
56708         .mr(4)
56709         .nr(4)
56710         .kr(2)
56711         .sr(1)
56712         .m(4)
56713         .n(4)
56714         .k(k)
56715         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56716     }
56717   }
56718 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_div_8_strided_a)56719   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_div_8_strided_a) {
56720     for (size_t k = 16; k <= 80; k += 8) {
56721       GemmMicrokernelTester()
56722         .extended_weights(true)
56723         .mr(4)
56724         .nr(4)
56725         .kr(2)
56726         .sr(1)
56727         .m(4)
56728         .n(4)
56729         .k(k)
56730         .a_stride(83)
56731         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56732     }
56733   }
56734 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,k_div_8_subtile)56735   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, k_div_8_subtile) {
56736     for (size_t k = 16; k <= 80; k += 8) {
56737       for (uint32_t n = 1; n <= 4; n++) {
56738         for (uint32_t m = 1; m <= 4; m++) {
56739           GemmMicrokernelTester()
56740             .extended_weights(true)
56741             .mr(4)
56742             .nr(4)
56743             .kr(2)
56744             .sr(1)
56745             .m(m)
56746             .n(n)
56747             .k(k)
56748             .iterations(1)
56749             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56750         }
56751       }
56752     }
56753   }
56754 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_gt_4)56755   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_gt_4) {
56756     for (uint32_t n = 5; n < 8; n++) {
56757       for (size_t k = 1; k <= 40; k += 9) {
56758         GemmMicrokernelTester()
56759           .extended_weights(true)
56760           .mr(4)
56761           .nr(4)
56762           .kr(2)
56763           .sr(1)
56764           .m(4)
56765           .n(n)
56766           .k(k)
56767           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56768       }
56769     }
56770   }
56771 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_cn)56772   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
56773     for (uint32_t n = 5; n < 8; n++) {
56774       for (size_t k = 1; k <= 40; k += 9) {
56775         GemmMicrokernelTester()
56776           .extended_weights(true)
56777           .mr(4)
56778           .nr(4)
56779           .kr(2)
56780           .sr(1)
56781           .m(4)
56782           .n(n)
56783           .k(k)
56784           .cn_stride(7)
56785           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56786       }
56787     }
56788   }
56789 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_gt_4_strided_a)56790   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
56791     for (uint32_t n = 5; n < 8; n++) {
56792       for (size_t k = 1; k <= 40; k += 9) {
56793         GemmMicrokernelTester()
56794           .extended_weights(true)
56795           .mr(4)
56796           .nr(4)
56797           .kr(2)
56798           .sr(1)
56799           .m(4)
56800           .n(n)
56801           .k(k)
56802           .a_stride(43)
56803           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56804       }
56805     }
56806   }
56807 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_gt_4_subtile)56808   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_gt_4_subtile) {
56809     for (uint32_t n = 5; n < 8; n++) {
56810       for (size_t k = 1; k <= 40; k += 9) {
56811         for (uint32_t m = 1; m <= 4; m++) {
56812           GemmMicrokernelTester()
56813             .extended_weights(true)
56814             .mr(4)
56815             .nr(4)
56816             .kr(2)
56817             .sr(1)
56818             .m(m)
56819             .n(n)
56820             .k(k)
56821             .iterations(1)
56822             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56823         }
56824       }
56825     }
56826   }
56827 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_div_4)56828   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_div_4) {
56829     for (uint32_t n = 8; n <= 12; n += 4) {
56830       for (size_t k = 1; k <= 40; k += 9) {
56831         GemmMicrokernelTester()
56832           .extended_weights(true)
56833           .mr(4)
56834           .nr(4)
56835           .kr(2)
56836           .sr(1)
56837           .m(4)
56838           .n(n)
56839           .k(k)
56840           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56841       }
56842     }
56843   }
56844 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_div_4_strided_cn)56845   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
56846     for (uint32_t n = 8; n <= 12; n += 4) {
56847       for (size_t k = 1; k <= 40; k += 9) {
56848         GemmMicrokernelTester()
56849           .extended_weights(true)
56850           .mr(4)
56851           .nr(4)
56852           .kr(2)
56853           .sr(1)
56854           .m(4)
56855           .n(n)
56856           .k(k)
56857           .cn_stride(7)
56858           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56859       }
56860     }
56861   }
56862 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_div_4_strided_a)56863   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_div_4_strided_a) {
56864     for (uint32_t n = 8; n <= 12; n += 4) {
56865       for (size_t k = 1; k <= 40; k += 9) {
56866         GemmMicrokernelTester()
56867           .extended_weights(true)
56868           .mr(4)
56869           .nr(4)
56870           .kr(2)
56871           .sr(1)
56872           .m(4)
56873           .n(n)
56874           .k(k)
56875           .a_stride(43)
56876           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56877       }
56878     }
56879   }
56880 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,n_div_4_subtile)56881   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, n_div_4_subtile) {
56882     for (uint32_t n = 8; n <= 12; n += 4) {
56883       for (size_t k = 1; k <= 40; k += 9) {
56884         for (uint32_t m = 1; m <= 4; m++) {
56885           GemmMicrokernelTester()
56886             .extended_weights(true)
56887             .mr(4)
56888             .nr(4)
56889             .kr(2)
56890             .sr(1)
56891             .m(m)
56892             .n(n)
56893             .k(k)
56894             .iterations(1)
56895             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56896         }
56897       }
56898     }
56899   }
56900 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,strided_cm_subtile)56901   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, strided_cm_subtile) {
56902     for (size_t k = 1; k <= 40; k += 9) {
56903       for (uint32_t n = 1; n <= 4; n++) {
56904         for (uint32_t m = 1; m <= 4; m++) {
56905           GemmMicrokernelTester()
56906             .extended_weights(true)
56907             .mr(4)
56908             .nr(4)
56909             .kr(2)
56910             .sr(1)
56911             .m(m)
56912             .n(n)
56913             .k(k)
56914             .cm_stride(7)
56915             .iterations(1)
56916             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56917         }
56918       }
56919     }
56920   }
56921 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2,strided_cm)56922   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C2__WASMSIMD_DOT16X2, strided_cm) {
56923     GemmMicrokernelTester()
56924       .extended_weights(true)
56925       .mr(4)
56926       .nr(4)
56927       .kr(2)
56928       .sr(1)
56929       .m(4)
56930       .n(4)
56931       .k(8)
56932       .cm_stride(7)
56933       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c2__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56934   }
56935 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
56936 
56937 
56938 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_eq_8)56939   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_eq_8) {
56940     GemmMicrokernelTester()
56941       .extended_weights(true)
56942       .mr(4)
56943       .nr(4)
56944       .kr(8)
56945       .sr(1)
56946       .m(4)
56947       .n(4)
56948       .k(8)
56949       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56950   }
56951 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,strided_cn)56952   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, strided_cn) {
56953     GemmMicrokernelTester()
56954       .extended_weights(true)
56955       .mr(4)
56956       .nr(4)
56957       .kr(8)
56958       .sr(1)
56959       .m(4)
56960       .n(4)
56961       .k(8)
56962       .cn_stride(7)
56963       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56964   }
56965 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_eq_8_strided_a)56966   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_eq_8_strided_a) {
56967     GemmMicrokernelTester()
56968       .extended_weights(true)
56969       .mr(4)
56970       .nr(4)
56971       .kr(8)
56972       .sr(1)
56973       .m(4)
56974       .n(4)
56975       .k(8)
56976       .a_stride(11)
56977       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56978   }
56979 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile)56980   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile) {
56981     for (uint32_t n = 1; n <= 4; n++) {
56982       for (uint32_t m = 1; m <= 4; m++) {
56983         GemmMicrokernelTester()
56984           .extended_weights(true)
56985           .mr(4)
56986           .nr(4)
56987           .kr(8)
56988           .sr(1)
56989           .m(m)
56990           .n(n)
56991           .k(8)
56992           .iterations(1)
56993           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
56994       }
56995     }
56996   }
56997 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_m)56998   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_m) {
56999     for (uint32_t m = 1; m <= 4; m++) {
57000       GemmMicrokernelTester()
57001         .extended_weights(true)
57002         .mr(4)
57003         .nr(4)
57004         .kr(8)
57005         .sr(1)
57006         .m(m)
57007         .n(4)
57008         .k(8)
57009         .iterations(1)
57010         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57011     }
57012   }
57013 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_eq_8_subtile_n)57014   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_eq_8_subtile_n) {
57015     for (uint32_t n = 1; n <= 4; n++) {
57016       GemmMicrokernelTester()
57017         .extended_weights(true)
57018         .mr(4)
57019         .nr(4)
57020         .kr(8)
57021         .sr(1)
57022         .m(4)
57023         .n(n)
57024         .k(8)
57025         .iterations(1)
57026         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57027     }
57028   }
57029 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_lt_8)57030   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_lt_8) {
57031     for (size_t k = 1; k < 8; k++) {
57032       GemmMicrokernelTester()
57033         .extended_weights(true)
57034         .mr(4)
57035         .nr(4)
57036         .kr(8)
57037         .sr(1)
57038         .m(4)
57039         .n(4)
57040         .k(k)
57041         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57042     }
57043   }
57044 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_lt_8_strided_a)57045   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_lt_8_strided_a) {
57046     for (size_t k = 1; k < 8; k++) {
57047       GemmMicrokernelTester()
57048         .extended_weights(true)
57049         .mr(4)
57050         .nr(4)
57051         .kr(8)
57052         .sr(1)
57053         .m(4)
57054         .n(4)
57055         .k(k)
57056         .a_stride(11)
57057         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57058     }
57059   }
57060 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_lt_8_subtile)57061   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_lt_8_subtile) {
57062     for (size_t k = 1; k < 8; k++) {
57063       for (uint32_t n = 1; n <= 4; n++) {
57064         for (uint32_t m = 1; m <= 4; m++) {
57065           GemmMicrokernelTester()
57066             .extended_weights(true)
57067             .mr(4)
57068             .nr(4)
57069             .kr(8)
57070             .sr(1)
57071             .m(m)
57072             .n(n)
57073             .k(k)
57074             .iterations(1)
57075             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57076         }
57077       }
57078     }
57079   }
57080 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_gt_8)57081   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_gt_8) {
57082     for (size_t k = 9; k < 16; k++) {
57083       GemmMicrokernelTester()
57084         .extended_weights(true)
57085         .mr(4)
57086         .nr(4)
57087         .kr(8)
57088         .sr(1)
57089         .m(4)
57090         .n(4)
57091         .k(k)
57092         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57093     }
57094   }
57095 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_gt_8_strided_a)57096   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_gt_8_strided_a) {
57097     for (size_t k = 9; k < 16; k++) {
57098       GemmMicrokernelTester()
57099         .extended_weights(true)
57100         .mr(4)
57101         .nr(4)
57102         .kr(8)
57103         .sr(1)
57104         .m(4)
57105         .n(4)
57106         .k(k)
57107         .a_stride(19)
57108         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57109     }
57110   }
57111 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_gt_8_subtile)57112   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_gt_8_subtile) {
57113     for (size_t k = 9; k < 16; k++) {
57114       for (uint32_t n = 1; n <= 4; n++) {
57115         for (uint32_t m = 1; m <= 4; m++) {
57116           GemmMicrokernelTester()
57117             .extended_weights(true)
57118             .mr(4)
57119             .nr(4)
57120             .kr(8)
57121             .sr(1)
57122             .m(m)
57123             .n(n)
57124             .k(k)
57125             .iterations(1)
57126             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57127         }
57128       }
57129     }
57130   }
57131 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_div_8)57132   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_div_8) {
57133     for (size_t k = 16; k <= 80; k += 8) {
57134       GemmMicrokernelTester()
57135         .extended_weights(true)
57136         .mr(4)
57137         .nr(4)
57138         .kr(8)
57139         .sr(1)
57140         .m(4)
57141         .n(4)
57142         .k(k)
57143         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57144     }
57145   }
57146 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_div_8_strided_a)57147   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_div_8_strided_a) {
57148     for (size_t k = 16; k <= 80; k += 8) {
57149       GemmMicrokernelTester()
57150         .extended_weights(true)
57151         .mr(4)
57152         .nr(4)
57153         .kr(8)
57154         .sr(1)
57155         .m(4)
57156         .n(4)
57157         .k(k)
57158         .a_stride(83)
57159         .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57160     }
57161   }
57162 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,k_div_8_subtile)57163   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, k_div_8_subtile) {
57164     for (size_t k = 16; k <= 80; k += 8) {
57165       for (uint32_t n = 1; n <= 4; n++) {
57166         for (uint32_t m = 1; m <= 4; m++) {
57167           GemmMicrokernelTester()
57168             .extended_weights(true)
57169             .mr(4)
57170             .nr(4)
57171             .kr(8)
57172             .sr(1)
57173             .m(m)
57174             .n(n)
57175             .k(k)
57176             .iterations(1)
57177             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57178         }
57179       }
57180     }
57181   }
57182 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_gt_4)57183   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_gt_4) {
57184     for (uint32_t n = 5; n < 8; n++) {
57185       for (size_t k = 1; k <= 40; k += 9) {
57186         GemmMicrokernelTester()
57187           .extended_weights(true)
57188           .mr(4)
57189           .nr(4)
57190           .kr(8)
57191           .sr(1)
57192           .m(4)
57193           .n(n)
57194           .k(k)
57195           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57196       }
57197     }
57198   }
57199 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_cn)57200   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_cn) {
57201     for (uint32_t n = 5; n < 8; n++) {
57202       for (size_t k = 1; k <= 40; k += 9) {
57203         GemmMicrokernelTester()
57204           .extended_weights(true)
57205           .mr(4)
57206           .nr(4)
57207           .kr(8)
57208           .sr(1)
57209           .m(4)
57210           .n(n)
57211           .k(k)
57212           .cn_stride(7)
57213           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57214       }
57215     }
57216   }
57217 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_gt_4_strided_a)57218   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_gt_4_strided_a) {
57219     for (uint32_t n = 5; n < 8; n++) {
57220       for (size_t k = 1; k <= 40; k += 9) {
57221         GemmMicrokernelTester()
57222           .extended_weights(true)
57223           .mr(4)
57224           .nr(4)
57225           .kr(8)
57226           .sr(1)
57227           .m(4)
57228           .n(n)
57229           .k(k)
57230           .a_stride(43)
57231           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57232       }
57233     }
57234   }
57235 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_gt_4_subtile)57236   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_gt_4_subtile) {
57237     for (uint32_t n = 5; n < 8; n++) {
57238       for (size_t k = 1; k <= 40; k += 9) {
57239         for (uint32_t m = 1; m <= 4; m++) {
57240           GemmMicrokernelTester()
57241             .extended_weights(true)
57242             .mr(4)
57243             .nr(4)
57244             .kr(8)
57245             .sr(1)
57246             .m(m)
57247             .n(n)
57248             .k(k)
57249             .iterations(1)
57250             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57251         }
57252       }
57253     }
57254   }
57255 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_div_4)57256   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_div_4) {
57257     for (uint32_t n = 8; n <= 12; n += 4) {
57258       for (size_t k = 1; k <= 40; k += 9) {
57259         GemmMicrokernelTester()
57260           .extended_weights(true)
57261           .mr(4)
57262           .nr(4)
57263           .kr(8)
57264           .sr(1)
57265           .m(4)
57266           .n(n)
57267           .k(k)
57268           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57269       }
57270     }
57271   }
57272 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_div_4_strided_cn)57273   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_div_4_strided_cn) {
57274     for (uint32_t n = 8; n <= 12; n += 4) {
57275       for (size_t k = 1; k <= 40; k += 9) {
57276         GemmMicrokernelTester()
57277           .extended_weights(true)
57278           .mr(4)
57279           .nr(4)
57280           .kr(8)
57281           .sr(1)
57282           .m(4)
57283           .n(n)
57284           .k(k)
57285           .cn_stride(7)
57286           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57287       }
57288     }
57289   }
57290 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_div_4_strided_a)57291   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_div_4_strided_a) {
57292     for (uint32_t n = 8; n <= 12; n += 4) {
57293       for (size_t k = 1; k <= 40; k += 9) {
57294         GemmMicrokernelTester()
57295           .extended_weights(true)
57296           .mr(4)
57297           .nr(4)
57298           .kr(8)
57299           .sr(1)
57300           .m(4)
57301           .n(n)
57302           .k(k)
57303           .a_stride(43)
57304           .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57305       }
57306     }
57307   }
57308 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,n_div_4_subtile)57309   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, n_div_4_subtile) {
57310     for (uint32_t n = 8; n <= 12; n += 4) {
57311       for (size_t k = 1; k <= 40; k += 9) {
57312         for (uint32_t m = 1; m <= 4; m++) {
57313           GemmMicrokernelTester()
57314             .extended_weights(true)
57315             .mr(4)
57316             .nr(4)
57317             .kr(8)
57318             .sr(1)
57319             .m(m)
57320             .n(n)
57321             .k(k)
57322             .iterations(1)
57323             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57324         }
57325       }
57326     }
57327   }
57328 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,strided_cm_subtile)57329   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, strided_cm_subtile) {
57330     for (size_t k = 1; k <= 40; k += 9) {
57331       for (uint32_t n = 1; n <= 4; n++) {
57332         for (uint32_t m = 1; m <= 4; m++) {
57333           GemmMicrokernelTester()
57334             .extended_weights(true)
57335             .mr(4)
57336             .nr(4)
57337             .kr(8)
57338             .sr(1)
57339             .m(m)
57340             .n(n)
57341             .k(k)
57342             .cm_stride(7)
57343             .iterations(1)
57344             .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57345         }
57346       }
57347     }
57348   }
57349 
TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2,strided_cm)57350   TEST(QS8_GEMM_XW_MINMAX_FP32_4X4C8__WASMSIMD_DOT16X2, strided_cm) {
57351     GemmMicrokernelTester()
57352       .extended_weights(true)
57353       .mr(4)
57354       .nr(4)
57355       .kr(8)
57356       .sr(1)
57357       .m(4)
57358       .n(4)
57359       .k(8)
57360       .cm_stride(7)
57361       .Test(xnn_qs8_gemm_xw_minmax_fp32_ukernel_4x4c8__wasmsimd_dot16x2, xnn_init_qs8_conv_minmax_fp32_wasmsimd_params, xnn_qs8_requantize_fp32);
57362   }
57363 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
57364 
57365 
57366 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_eq_1)57367   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_eq_1) {
57368     GemmMicrokernelTester()
57369       .mr(1)
57370       .nr(2)
57371       .kr(1)
57372       .sr(1)
57373       .m(1)
57374       .n(2)
57375       .k(1)
57376       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57377   }
57378 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,strided_cn)57379   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, strided_cn) {
57380     GemmMicrokernelTester()
57381       .mr(1)
57382       .nr(2)
57383       .kr(1)
57384       .sr(1)
57385       .m(1)
57386       .n(2)
57387       .k(1)
57388       .cn_stride(5)
57389       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57390   }
57391 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_eq_1_strided_a)57392   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_eq_1_strided_a) {
57393     GemmMicrokernelTester()
57394       .mr(1)
57395       .nr(2)
57396       .kr(1)
57397       .sr(1)
57398       .m(1)
57399       .n(2)
57400       .k(1)
57401       .a_stride(3)
57402       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57403   }
57404 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_eq_1_subtile)57405   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_eq_1_subtile) {
57406     for (uint32_t n = 1; n <= 2; n++) {
57407       for (uint32_t m = 1; m <= 1; m++) {
57408         GemmMicrokernelTester()
57409           .mr(1)
57410           .nr(2)
57411           .kr(1)
57412           .sr(1)
57413           .m(m)
57414           .n(n)
57415           .k(1)
57416           .iterations(1)
57417           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57418       }
57419     }
57420   }
57421 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_eq_1_subtile_m)57422   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_eq_1_subtile_m) {
57423     for (uint32_t m = 1; m <= 1; m++) {
57424       GemmMicrokernelTester()
57425         .mr(1)
57426         .nr(2)
57427         .kr(1)
57428         .sr(1)
57429         .m(m)
57430         .n(2)
57431         .k(1)
57432         .iterations(1)
57433         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57434     }
57435   }
57436 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_eq_1_subtile_n)57437   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_eq_1_subtile_n) {
57438     for (uint32_t n = 1; n <= 2; n++) {
57439       GemmMicrokernelTester()
57440         .mr(1)
57441         .nr(2)
57442         .kr(1)
57443         .sr(1)
57444         .m(1)
57445         .n(n)
57446         .k(1)
57447         .iterations(1)
57448         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57449     }
57450   }
57451 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_gt_1)57452   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_gt_1) {
57453     for (size_t k = 2; k < 10; k++) {
57454       GemmMicrokernelTester()
57455         .mr(1)
57456         .nr(2)
57457         .kr(1)
57458         .sr(1)
57459         .m(1)
57460         .n(2)
57461         .k(k)
57462         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57463     }
57464   }
57465 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_gt_1_strided_a)57466   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_gt_1_strided_a) {
57467     for (size_t k = 2; k < 10; k++) {
57468       GemmMicrokernelTester()
57469         .mr(1)
57470         .nr(2)
57471         .kr(1)
57472         .sr(1)
57473         .m(1)
57474         .n(2)
57475         .k(k)
57476         .a_stride(11)
57477         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57478     }
57479   }
57480 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,k_gt_1_subtile)57481   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, k_gt_1_subtile) {
57482     for (size_t k = 2; k < 10; k++) {
57483       for (uint32_t n = 1; n <= 2; n++) {
57484         for (uint32_t m = 1; m <= 1; m++) {
57485           GemmMicrokernelTester()
57486             .mr(1)
57487             .nr(2)
57488             .kr(1)
57489             .sr(1)
57490             .m(m)
57491             .n(n)
57492             .k(k)
57493             .iterations(1)
57494             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57495         }
57496       }
57497     }
57498   }
57499 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_gt_2)57500   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_gt_2) {
57501     for (uint32_t n = 3; n < 4; n++) {
57502       for (size_t k = 1; k <= 5; k += 2) {
57503         GemmMicrokernelTester()
57504           .mr(1)
57505           .nr(2)
57506           .kr(1)
57507           .sr(1)
57508           .m(1)
57509           .n(n)
57510           .k(k)
57511           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57512       }
57513     }
57514   }
57515 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_gt_2_strided_cn)57516   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_gt_2_strided_cn) {
57517     for (uint32_t n = 3; n < 4; n++) {
57518       for (size_t k = 1; k <= 5; k += 2) {
57519         GemmMicrokernelTester()
57520           .mr(1)
57521           .nr(2)
57522           .kr(1)
57523           .sr(1)
57524           .m(1)
57525           .n(n)
57526           .k(k)
57527           .cn_stride(5)
57528           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57529       }
57530     }
57531   }
57532 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_gt_2_strided_a)57533   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_gt_2_strided_a) {
57534     for (uint32_t n = 3; n < 4; n++) {
57535       for (size_t k = 1; k <= 5; k += 2) {
57536         GemmMicrokernelTester()
57537           .mr(1)
57538           .nr(2)
57539           .kr(1)
57540           .sr(1)
57541           .m(1)
57542           .n(n)
57543           .k(k)
57544           .a_stride(7)
57545           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57546       }
57547     }
57548   }
57549 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_gt_2_subtile)57550   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_gt_2_subtile) {
57551     for (uint32_t n = 3; n < 4; n++) {
57552       for (size_t k = 1; k <= 5; k += 2) {
57553         for (uint32_t m = 1; m <= 1; m++) {
57554           GemmMicrokernelTester()
57555             .mr(1)
57556             .nr(2)
57557             .kr(1)
57558             .sr(1)
57559             .m(m)
57560             .n(n)
57561             .k(k)
57562             .iterations(1)
57563             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57564         }
57565       }
57566     }
57567   }
57568 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_div_2)57569   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_div_2) {
57570     for (uint32_t n = 4; n <= 6; n += 2) {
57571       for (size_t k = 1; k <= 5; k += 2) {
57572         GemmMicrokernelTester()
57573           .mr(1)
57574           .nr(2)
57575           .kr(1)
57576           .sr(1)
57577           .m(1)
57578           .n(n)
57579           .k(k)
57580           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57581       }
57582     }
57583   }
57584 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_div_2_strided_cn)57585   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_div_2_strided_cn) {
57586     for (uint32_t n = 4; n <= 6; n += 2) {
57587       for (size_t k = 1; k <= 5; k += 2) {
57588         GemmMicrokernelTester()
57589           .mr(1)
57590           .nr(2)
57591           .kr(1)
57592           .sr(1)
57593           .m(1)
57594           .n(n)
57595           .k(k)
57596           .cn_stride(5)
57597           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57598       }
57599     }
57600   }
57601 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_div_2_strided_a)57602   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_div_2_strided_a) {
57603     for (uint32_t n = 4; n <= 6; n += 2) {
57604       for (size_t k = 1; k <= 5; k += 2) {
57605         GemmMicrokernelTester()
57606           .mr(1)
57607           .nr(2)
57608           .kr(1)
57609           .sr(1)
57610           .m(1)
57611           .n(n)
57612           .k(k)
57613           .a_stride(7)
57614           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57615       }
57616     }
57617   }
57618 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,n_div_2_subtile)57619   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, n_div_2_subtile) {
57620     for (uint32_t n = 4; n <= 6; n += 2) {
57621       for (size_t k = 1; k <= 5; k += 2) {
57622         for (uint32_t m = 1; m <= 1; m++) {
57623           GemmMicrokernelTester()
57624             .mr(1)
57625             .nr(2)
57626             .kr(1)
57627             .sr(1)
57628             .m(m)
57629             .n(n)
57630             .k(k)
57631             .iterations(1)
57632             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57633         }
57634       }
57635     }
57636   }
57637 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,strided_cm_subtile)57638   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, strided_cm_subtile) {
57639     for (size_t k = 1; k <= 5; k += 2) {
57640       for (uint32_t n = 1; n <= 2; n++) {
57641         for (uint32_t m = 1; m <= 1; m++) {
57642           GemmMicrokernelTester()
57643             .mr(1)
57644             .nr(2)
57645             .kr(1)
57646             .sr(1)
57647             .m(m)
57648             .n(n)
57649             .k(k)
57650             .cm_stride(5)
57651             .iterations(1)
57652             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57653         }
57654       }
57655     }
57656   }
57657 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,qmin)57658   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, qmin) {
57659     GemmMicrokernelTester()
57660       .mr(1)
57661       .nr(2)
57662       .kr(1)
57663       .sr(1)
57664       .m(1)
57665       .n(2)
57666       .k(1)
57667       .qmin(128)
57668       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57669   }
57670 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,qmax)57671   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, qmax) {
57672     GemmMicrokernelTester()
57673       .mr(1)
57674       .nr(2)
57675       .kr(1)
57676       .sr(1)
57677       .m(1)
57678       .n(2)
57679       .k(1)
57680       .qmax(128)
57681       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57682   }
57683 
TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC,strided_cm)57684   TEST(QS8_GEMM_MINMAX_FP32_1X2__WASM_FMAGIC, strided_cm) {
57685     GemmMicrokernelTester()
57686       .mr(1)
57687       .nr(2)
57688       .kr(1)
57689       .sr(1)
57690       .m(1)
57691       .n(2)
57692       .k(1)
57693       .cm_stride(5)
57694       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57695   }
57696 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
57697 
57698 
57699 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_eq_1)57700   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_eq_1) {
57701     GemmMicrokernelTester()
57702       .mr(1)
57703       .nr(4)
57704       .kr(1)
57705       .sr(1)
57706       .m(1)
57707       .n(4)
57708       .k(1)
57709       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57710   }
57711 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,strided_cn)57712   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, strided_cn) {
57713     GemmMicrokernelTester()
57714       .mr(1)
57715       .nr(4)
57716       .kr(1)
57717       .sr(1)
57718       .m(1)
57719       .n(4)
57720       .k(1)
57721       .cn_stride(7)
57722       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57723   }
57724 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_eq_1_strided_a)57725   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_eq_1_strided_a) {
57726     GemmMicrokernelTester()
57727       .mr(1)
57728       .nr(4)
57729       .kr(1)
57730       .sr(1)
57731       .m(1)
57732       .n(4)
57733       .k(1)
57734       .a_stride(3)
57735       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57736   }
57737 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_eq_1_subtile)57738   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_eq_1_subtile) {
57739     for (uint32_t n = 1; n <= 4; n++) {
57740       for (uint32_t m = 1; m <= 1; m++) {
57741         GemmMicrokernelTester()
57742           .mr(1)
57743           .nr(4)
57744           .kr(1)
57745           .sr(1)
57746           .m(m)
57747           .n(n)
57748           .k(1)
57749           .iterations(1)
57750           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57751       }
57752     }
57753   }
57754 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_eq_1_subtile_m)57755   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_eq_1_subtile_m) {
57756     for (uint32_t m = 1; m <= 1; m++) {
57757       GemmMicrokernelTester()
57758         .mr(1)
57759         .nr(4)
57760         .kr(1)
57761         .sr(1)
57762         .m(m)
57763         .n(4)
57764         .k(1)
57765         .iterations(1)
57766         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57767     }
57768   }
57769 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_eq_1_subtile_n)57770   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_eq_1_subtile_n) {
57771     for (uint32_t n = 1; n <= 4; n++) {
57772       GemmMicrokernelTester()
57773         .mr(1)
57774         .nr(4)
57775         .kr(1)
57776         .sr(1)
57777         .m(1)
57778         .n(n)
57779         .k(1)
57780         .iterations(1)
57781         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57782     }
57783   }
57784 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_gt_1)57785   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_gt_1) {
57786     for (size_t k = 2; k < 10; k++) {
57787       GemmMicrokernelTester()
57788         .mr(1)
57789         .nr(4)
57790         .kr(1)
57791         .sr(1)
57792         .m(1)
57793         .n(4)
57794         .k(k)
57795         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57796     }
57797   }
57798 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_gt_1_strided_a)57799   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_gt_1_strided_a) {
57800     for (size_t k = 2; k < 10; k++) {
57801       GemmMicrokernelTester()
57802         .mr(1)
57803         .nr(4)
57804         .kr(1)
57805         .sr(1)
57806         .m(1)
57807         .n(4)
57808         .k(k)
57809         .a_stride(11)
57810         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57811     }
57812   }
57813 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,k_gt_1_subtile)57814   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, k_gt_1_subtile) {
57815     for (size_t k = 2; k < 10; k++) {
57816       for (uint32_t n = 1; n <= 4; n++) {
57817         for (uint32_t m = 1; m <= 1; m++) {
57818           GemmMicrokernelTester()
57819             .mr(1)
57820             .nr(4)
57821             .kr(1)
57822             .sr(1)
57823             .m(m)
57824             .n(n)
57825             .k(k)
57826             .iterations(1)
57827             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57828         }
57829       }
57830     }
57831   }
57832 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_gt_4)57833   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_gt_4) {
57834     for (uint32_t n = 5; n < 8; n++) {
57835       for (size_t k = 1; k <= 5; k += 2) {
57836         GemmMicrokernelTester()
57837           .mr(1)
57838           .nr(4)
57839           .kr(1)
57840           .sr(1)
57841           .m(1)
57842           .n(n)
57843           .k(k)
57844           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57845       }
57846     }
57847   }
57848 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_gt_4_strided_cn)57849   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_gt_4_strided_cn) {
57850     for (uint32_t n = 5; n < 8; n++) {
57851       for (size_t k = 1; k <= 5; k += 2) {
57852         GemmMicrokernelTester()
57853           .mr(1)
57854           .nr(4)
57855           .kr(1)
57856           .sr(1)
57857           .m(1)
57858           .n(n)
57859           .k(k)
57860           .cn_stride(7)
57861           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57862       }
57863     }
57864   }
57865 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_gt_4_strided_a)57866   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_gt_4_strided_a) {
57867     for (uint32_t n = 5; n < 8; n++) {
57868       for (size_t k = 1; k <= 5; k += 2) {
57869         GemmMicrokernelTester()
57870           .mr(1)
57871           .nr(4)
57872           .kr(1)
57873           .sr(1)
57874           .m(1)
57875           .n(n)
57876           .k(k)
57877           .a_stride(7)
57878           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57879       }
57880     }
57881   }
57882 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_gt_4_subtile)57883   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_gt_4_subtile) {
57884     for (uint32_t n = 5; n < 8; n++) {
57885       for (size_t k = 1; k <= 5; k += 2) {
57886         for (uint32_t m = 1; m <= 1; m++) {
57887           GemmMicrokernelTester()
57888             .mr(1)
57889             .nr(4)
57890             .kr(1)
57891             .sr(1)
57892             .m(m)
57893             .n(n)
57894             .k(k)
57895             .iterations(1)
57896             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57897         }
57898       }
57899     }
57900   }
57901 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_div_4)57902   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_div_4) {
57903     for (uint32_t n = 8; n <= 12; n += 4) {
57904       for (size_t k = 1; k <= 5; k += 2) {
57905         GemmMicrokernelTester()
57906           .mr(1)
57907           .nr(4)
57908           .kr(1)
57909           .sr(1)
57910           .m(1)
57911           .n(n)
57912           .k(k)
57913           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57914       }
57915     }
57916   }
57917 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_div_4_strided_cn)57918   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_div_4_strided_cn) {
57919     for (uint32_t n = 8; n <= 12; n += 4) {
57920       for (size_t k = 1; k <= 5; k += 2) {
57921         GemmMicrokernelTester()
57922           .mr(1)
57923           .nr(4)
57924           .kr(1)
57925           .sr(1)
57926           .m(1)
57927           .n(n)
57928           .k(k)
57929           .cn_stride(7)
57930           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57931       }
57932     }
57933   }
57934 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_div_4_strided_a)57935   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_div_4_strided_a) {
57936     for (uint32_t n = 8; n <= 12; n += 4) {
57937       for (size_t k = 1; k <= 5; k += 2) {
57938         GemmMicrokernelTester()
57939           .mr(1)
57940           .nr(4)
57941           .kr(1)
57942           .sr(1)
57943           .m(1)
57944           .n(n)
57945           .k(k)
57946           .a_stride(7)
57947           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57948       }
57949     }
57950   }
57951 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,n_div_4_subtile)57952   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, n_div_4_subtile) {
57953     for (uint32_t n = 8; n <= 12; n += 4) {
57954       for (size_t k = 1; k <= 5; k += 2) {
57955         for (uint32_t m = 1; m <= 1; m++) {
57956           GemmMicrokernelTester()
57957             .mr(1)
57958             .nr(4)
57959             .kr(1)
57960             .sr(1)
57961             .m(m)
57962             .n(n)
57963             .k(k)
57964             .iterations(1)
57965             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57966         }
57967       }
57968     }
57969   }
57970 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,strided_cm_subtile)57971   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, strided_cm_subtile) {
57972     for (size_t k = 1; k <= 5; k += 2) {
57973       for (uint32_t n = 1; n <= 4; n++) {
57974         for (uint32_t m = 1; m <= 1; m++) {
57975           GemmMicrokernelTester()
57976             .mr(1)
57977             .nr(4)
57978             .kr(1)
57979             .sr(1)
57980             .m(m)
57981             .n(n)
57982             .k(k)
57983             .cm_stride(7)
57984             .iterations(1)
57985             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
57986         }
57987       }
57988     }
57989   }
57990 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,qmin)57991   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, qmin) {
57992     GemmMicrokernelTester()
57993       .mr(1)
57994       .nr(4)
57995       .kr(1)
57996       .sr(1)
57997       .m(1)
57998       .n(4)
57999       .k(1)
58000       .qmin(128)
58001       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58002   }
58003 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,qmax)58004   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, qmax) {
58005     GemmMicrokernelTester()
58006       .mr(1)
58007       .nr(4)
58008       .kr(1)
58009       .sr(1)
58010       .m(1)
58011       .n(4)
58012       .k(1)
58013       .qmax(128)
58014       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58015   }
58016 
TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC,strided_cm)58017   TEST(QS8_GEMM_MINMAX_FP32_1X4__WASM_FMAGIC, strided_cm) {
58018     GemmMicrokernelTester()
58019       .mr(1)
58020       .nr(4)
58021       .kr(1)
58022       .sr(1)
58023       .m(1)
58024       .n(4)
58025       .k(1)
58026       .cm_stride(7)
58027       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58028   }
58029 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
58030 
58031 
58032 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_eq_1)58033   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_eq_1) {
58034     GemmMicrokernelTester()
58035       .mr(2)
58036       .nr(2)
58037       .kr(1)
58038       .sr(1)
58039       .m(2)
58040       .n(2)
58041       .k(1)
58042       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58043   }
58044 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,strided_cn)58045   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, strided_cn) {
58046     GemmMicrokernelTester()
58047       .mr(2)
58048       .nr(2)
58049       .kr(1)
58050       .sr(1)
58051       .m(2)
58052       .n(2)
58053       .k(1)
58054       .cn_stride(5)
58055       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58056   }
58057 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_eq_1_strided_a)58058   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_eq_1_strided_a) {
58059     GemmMicrokernelTester()
58060       .mr(2)
58061       .nr(2)
58062       .kr(1)
58063       .sr(1)
58064       .m(2)
58065       .n(2)
58066       .k(1)
58067       .a_stride(3)
58068       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58069   }
58070 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_eq_1_subtile)58071   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_eq_1_subtile) {
58072     for (uint32_t n = 1; n <= 2; n++) {
58073       for (uint32_t m = 1; m <= 2; m++) {
58074         GemmMicrokernelTester()
58075           .mr(2)
58076           .nr(2)
58077           .kr(1)
58078           .sr(1)
58079           .m(m)
58080           .n(n)
58081           .k(1)
58082           .iterations(1)
58083           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58084       }
58085     }
58086   }
58087 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_eq_1_subtile_m)58088   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_eq_1_subtile_m) {
58089     for (uint32_t m = 1; m <= 2; m++) {
58090       GemmMicrokernelTester()
58091         .mr(2)
58092         .nr(2)
58093         .kr(1)
58094         .sr(1)
58095         .m(m)
58096         .n(2)
58097         .k(1)
58098         .iterations(1)
58099         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58100     }
58101   }
58102 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_eq_1_subtile_n)58103   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_eq_1_subtile_n) {
58104     for (uint32_t n = 1; n <= 2; n++) {
58105       GemmMicrokernelTester()
58106         .mr(2)
58107         .nr(2)
58108         .kr(1)
58109         .sr(1)
58110         .m(2)
58111         .n(n)
58112         .k(1)
58113         .iterations(1)
58114         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58115     }
58116   }
58117 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_gt_1)58118   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_gt_1) {
58119     for (size_t k = 2; k < 10; k++) {
58120       GemmMicrokernelTester()
58121         .mr(2)
58122         .nr(2)
58123         .kr(1)
58124         .sr(1)
58125         .m(2)
58126         .n(2)
58127         .k(k)
58128         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58129     }
58130   }
58131 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_gt_1_strided_a)58132   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_gt_1_strided_a) {
58133     for (size_t k = 2; k < 10; k++) {
58134       GemmMicrokernelTester()
58135         .mr(2)
58136         .nr(2)
58137         .kr(1)
58138         .sr(1)
58139         .m(2)
58140         .n(2)
58141         .k(k)
58142         .a_stride(11)
58143         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58144     }
58145   }
58146 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,k_gt_1_subtile)58147   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, k_gt_1_subtile) {
58148     for (size_t k = 2; k < 10; k++) {
58149       for (uint32_t n = 1; n <= 2; n++) {
58150         for (uint32_t m = 1; m <= 2; m++) {
58151           GemmMicrokernelTester()
58152             .mr(2)
58153             .nr(2)
58154             .kr(1)
58155             .sr(1)
58156             .m(m)
58157             .n(n)
58158             .k(k)
58159             .iterations(1)
58160             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58161         }
58162       }
58163     }
58164   }
58165 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_gt_2)58166   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_gt_2) {
58167     for (uint32_t n = 3; n < 4; n++) {
58168       for (size_t k = 1; k <= 5; k += 2) {
58169         GemmMicrokernelTester()
58170           .mr(2)
58171           .nr(2)
58172           .kr(1)
58173           .sr(1)
58174           .m(2)
58175           .n(n)
58176           .k(k)
58177           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58178       }
58179     }
58180   }
58181 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_gt_2_strided_cn)58182   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_gt_2_strided_cn) {
58183     for (uint32_t n = 3; n < 4; n++) {
58184       for (size_t k = 1; k <= 5; k += 2) {
58185         GemmMicrokernelTester()
58186           .mr(2)
58187           .nr(2)
58188           .kr(1)
58189           .sr(1)
58190           .m(2)
58191           .n(n)
58192           .k(k)
58193           .cn_stride(5)
58194           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58195       }
58196     }
58197   }
58198 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_gt_2_strided_a)58199   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_gt_2_strided_a) {
58200     for (uint32_t n = 3; n < 4; n++) {
58201       for (size_t k = 1; k <= 5; k += 2) {
58202         GemmMicrokernelTester()
58203           .mr(2)
58204           .nr(2)
58205           .kr(1)
58206           .sr(1)
58207           .m(2)
58208           .n(n)
58209           .k(k)
58210           .a_stride(7)
58211           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58212       }
58213     }
58214   }
58215 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_gt_2_subtile)58216   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_gt_2_subtile) {
58217     for (uint32_t n = 3; n < 4; n++) {
58218       for (size_t k = 1; k <= 5; k += 2) {
58219         for (uint32_t m = 1; m <= 2; m++) {
58220           GemmMicrokernelTester()
58221             .mr(2)
58222             .nr(2)
58223             .kr(1)
58224             .sr(1)
58225             .m(m)
58226             .n(n)
58227             .k(k)
58228             .iterations(1)
58229             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58230         }
58231       }
58232     }
58233   }
58234 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_div_2)58235   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_div_2) {
58236     for (uint32_t n = 4; n <= 6; n += 2) {
58237       for (size_t k = 1; k <= 5; k += 2) {
58238         GemmMicrokernelTester()
58239           .mr(2)
58240           .nr(2)
58241           .kr(1)
58242           .sr(1)
58243           .m(2)
58244           .n(n)
58245           .k(k)
58246           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58247       }
58248     }
58249   }
58250 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_div_2_strided_cn)58251   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_div_2_strided_cn) {
58252     for (uint32_t n = 4; n <= 6; n += 2) {
58253       for (size_t k = 1; k <= 5; k += 2) {
58254         GemmMicrokernelTester()
58255           .mr(2)
58256           .nr(2)
58257           .kr(1)
58258           .sr(1)
58259           .m(2)
58260           .n(n)
58261           .k(k)
58262           .cn_stride(5)
58263           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58264       }
58265     }
58266   }
58267 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_div_2_strided_a)58268   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_div_2_strided_a) {
58269     for (uint32_t n = 4; n <= 6; n += 2) {
58270       for (size_t k = 1; k <= 5; k += 2) {
58271         GemmMicrokernelTester()
58272           .mr(2)
58273           .nr(2)
58274           .kr(1)
58275           .sr(1)
58276           .m(2)
58277           .n(n)
58278           .k(k)
58279           .a_stride(7)
58280           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58281       }
58282     }
58283   }
58284 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,n_div_2_subtile)58285   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, n_div_2_subtile) {
58286     for (uint32_t n = 4; n <= 6; n += 2) {
58287       for (size_t k = 1; k <= 5; k += 2) {
58288         for (uint32_t m = 1; m <= 2; m++) {
58289           GemmMicrokernelTester()
58290             .mr(2)
58291             .nr(2)
58292             .kr(1)
58293             .sr(1)
58294             .m(m)
58295             .n(n)
58296             .k(k)
58297             .iterations(1)
58298             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58299         }
58300       }
58301     }
58302   }
58303 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,strided_cm_subtile)58304   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, strided_cm_subtile) {
58305     for (size_t k = 1; k <= 5; k += 2) {
58306       for (uint32_t n = 1; n <= 2; n++) {
58307         for (uint32_t m = 1; m <= 2; m++) {
58308           GemmMicrokernelTester()
58309             .mr(2)
58310             .nr(2)
58311             .kr(1)
58312             .sr(1)
58313             .m(m)
58314             .n(n)
58315             .k(k)
58316             .cm_stride(5)
58317             .iterations(1)
58318             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58319         }
58320       }
58321     }
58322   }
58323 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,qmin)58324   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, qmin) {
58325     GemmMicrokernelTester()
58326       .mr(2)
58327       .nr(2)
58328       .kr(1)
58329       .sr(1)
58330       .m(2)
58331       .n(2)
58332       .k(1)
58333       .qmin(128)
58334       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58335   }
58336 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,qmax)58337   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, qmax) {
58338     GemmMicrokernelTester()
58339       .mr(2)
58340       .nr(2)
58341       .kr(1)
58342       .sr(1)
58343       .m(2)
58344       .n(2)
58345       .k(1)
58346       .qmax(128)
58347       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58348   }
58349 
TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC,strided_cm)58350   TEST(QS8_GEMM_MINMAX_FP32_2X2__WASM_FMAGIC, strided_cm) {
58351     GemmMicrokernelTester()
58352       .mr(2)
58353       .nr(2)
58354       .kr(1)
58355       .sr(1)
58356       .m(2)
58357       .n(2)
58358       .k(1)
58359       .cm_stride(5)
58360       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58361   }
58362 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
58363 
58364 
58365 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_eq_1)58366   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_eq_1) {
58367     GemmMicrokernelTester()
58368       .mr(2)
58369       .nr(4)
58370       .kr(1)
58371       .sr(1)
58372       .m(2)
58373       .n(4)
58374       .k(1)
58375       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58376   }
58377 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,strided_cn)58378   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, strided_cn) {
58379     GemmMicrokernelTester()
58380       .mr(2)
58381       .nr(4)
58382       .kr(1)
58383       .sr(1)
58384       .m(2)
58385       .n(4)
58386       .k(1)
58387       .cn_stride(7)
58388       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58389   }
58390 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_eq_1_strided_a)58391   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_eq_1_strided_a) {
58392     GemmMicrokernelTester()
58393       .mr(2)
58394       .nr(4)
58395       .kr(1)
58396       .sr(1)
58397       .m(2)
58398       .n(4)
58399       .k(1)
58400       .a_stride(3)
58401       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58402   }
58403 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_eq_1_subtile)58404   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_eq_1_subtile) {
58405     for (uint32_t n = 1; n <= 4; n++) {
58406       for (uint32_t m = 1; m <= 2; m++) {
58407         GemmMicrokernelTester()
58408           .mr(2)
58409           .nr(4)
58410           .kr(1)
58411           .sr(1)
58412           .m(m)
58413           .n(n)
58414           .k(1)
58415           .iterations(1)
58416           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58417       }
58418     }
58419   }
58420 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_eq_1_subtile_m)58421   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_eq_1_subtile_m) {
58422     for (uint32_t m = 1; m <= 2; m++) {
58423       GemmMicrokernelTester()
58424         .mr(2)
58425         .nr(4)
58426         .kr(1)
58427         .sr(1)
58428         .m(m)
58429         .n(4)
58430         .k(1)
58431         .iterations(1)
58432         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58433     }
58434   }
58435 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_eq_1_subtile_n)58436   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_eq_1_subtile_n) {
58437     for (uint32_t n = 1; n <= 4; n++) {
58438       GemmMicrokernelTester()
58439         .mr(2)
58440         .nr(4)
58441         .kr(1)
58442         .sr(1)
58443         .m(2)
58444         .n(n)
58445         .k(1)
58446         .iterations(1)
58447         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58448     }
58449   }
58450 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_gt_1)58451   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_gt_1) {
58452     for (size_t k = 2; k < 10; k++) {
58453       GemmMicrokernelTester()
58454         .mr(2)
58455         .nr(4)
58456         .kr(1)
58457         .sr(1)
58458         .m(2)
58459         .n(4)
58460         .k(k)
58461         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58462     }
58463   }
58464 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_gt_1_strided_a)58465   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_gt_1_strided_a) {
58466     for (size_t k = 2; k < 10; k++) {
58467       GemmMicrokernelTester()
58468         .mr(2)
58469         .nr(4)
58470         .kr(1)
58471         .sr(1)
58472         .m(2)
58473         .n(4)
58474         .k(k)
58475         .a_stride(11)
58476         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58477     }
58478   }
58479 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,k_gt_1_subtile)58480   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, k_gt_1_subtile) {
58481     for (size_t k = 2; k < 10; k++) {
58482       for (uint32_t n = 1; n <= 4; n++) {
58483         for (uint32_t m = 1; m <= 2; m++) {
58484           GemmMicrokernelTester()
58485             .mr(2)
58486             .nr(4)
58487             .kr(1)
58488             .sr(1)
58489             .m(m)
58490             .n(n)
58491             .k(k)
58492             .iterations(1)
58493             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58494         }
58495       }
58496     }
58497   }
58498 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_gt_4)58499   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_gt_4) {
58500     for (uint32_t n = 5; n < 8; n++) {
58501       for (size_t k = 1; k <= 5; k += 2) {
58502         GemmMicrokernelTester()
58503           .mr(2)
58504           .nr(4)
58505           .kr(1)
58506           .sr(1)
58507           .m(2)
58508           .n(n)
58509           .k(k)
58510           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58511       }
58512     }
58513   }
58514 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_gt_4_strided_cn)58515   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_gt_4_strided_cn) {
58516     for (uint32_t n = 5; n < 8; n++) {
58517       for (size_t k = 1; k <= 5; k += 2) {
58518         GemmMicrokernelTester()
58519           .mr(2)
58520           .nr(4)
58521           .kr(1)
58522           .sr(1)
58523           .m(2)
58524           .n(n)
58525           .k(k)
58526           .cn_stride(7)
58527           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58528       }
58529     }
58530   }
58531 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_gt_4_strided_a)58532   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_gt_4_strided_a) {
58533     for (uint32_t n = 5; n < 8; n++) {
58534       for (size_t k = 1; k <= 5; k += 2) {
58535         GemmMicrokernelTester()
58536           .mr(2)
58537           .nr(4)
58538           .kr(1)
58539           .sr(1)
58540           .m(2)
58541           .n(n)
58542           .k(k)
58543           .a_stride(7)
58544           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58545       }
58546     }
58547   }
58548 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_gt_4_subtile)58549   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_gt_4_subtile) {
58550     for (uint32_t n = 5; n < 8; n++) {
58551       for (size_t k = 1; k <= 5; k += 2) {
58552         for (uint32_t m = 1; m <= 2; m++) {
58553           GemmMicrokernelTester()
58554             .mr(2)
58555             .nr(4)
58556             .kr(1)
58557             .sr(1)
58558             .m(m)
58559             .n(n)
58560             .k(k)
58561             .iterations(1)
58562             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58563         }
58564       }
58565     }
58566   }
58567 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_div_4)58568   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_div_4) {
58569     for (uint32_t n = 8; n <= 12; n += 4) {
58570       for (size_t k = 1; k <= 5; k += 2) {
58571         GemmMicrokernelTester()
58572           .mr(2)
58573           .nr(4)
58574           .kr(1)
58575           .sr(1)
58576           .m(2)
58577           .n(n)
58578           .k(k)
58579           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58580       }
58581     }
58582   }
58583 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_div_4_strided_cn)58584   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_div_4_strided_cn) {
58585     for (uint32_t n = 8; n <= 12; n += 4) {
58586       for (size_t k = 1; k <= 5; k += 2) {
58587         GemmMicrokernelTester()
58588           .mr(2)
58589           .nr(4)
58590           .kr(1)
58591           .sr(1)
58592           .m(2)
58593           .n(n)
58594           .k(k)
58595           .cn_stride(7)
58596           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58597       }
58598     }
58599   }
58600 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_div_4_strided_a)58601   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_div_4_strided_a) {
58602     for (uint32_t n = 8; n <= 12; n += 4) {
58603       for (size_t k = 1; k <= 5; k += 2) {
58604         GemmMicrokernelTester()
58605           .mr(2)
58606           .nr(4)
58607           .kr(1)
58608           .sr(1)
58609           .m(2)
58610           .n(n)
58611           .k(k)
58612           .a_stride(7)
58613           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58614       }
58615     }
58616   }
58617 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,n_div_4_subtile)58618   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, n_div_4_subtile) {
58619     for (uint32_t n = 8; n <= 12; n += 4) {
58620       for (size_t k = 1; k <= 5; k += 2) {
58621         for (uint32_t m = 1; m <= 2; m++) {
58622           GemmMicrokernelTester()
58623             .mr(2)
58624             .nr(4)
58625             .kr(1)
58626             .sr(1)
58627             .m(m)
58628             .n(n)
58629             .k(k)
58630             .iterations(1)
58631             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58632         }
58633       }
58634     }
58635   }
58636 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,strided_cm_subtile)58637   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, strided_cm_subtile) {
58638     for (size_t k = 1; k <= 5; k += 2) {
58639       for (uint32_t n = 1; n <= 4; n++) {
58640         for (uint32_t m = 1; m <= 2; m++) {
58641           GemmMicrokernelTester()
58642             .mr(2)
58643             .nr(4)
58644             .kr(1)
58645             .sr(1)
58646             .m(m)
58647             .n(n)
58648             .k(k)
58649             .cm_stride(7)
58650             .iterations(1)
58651             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58652         }
58653       }
58654     }
58655   }
58656 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,qmin)58657   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, qmin) {
58658     GemmMicrokernelTester()
58659       .mr(2)
58660       .nr(4)
58661       .kr(1)
58662       .sr(1)
58663       .m(2)
58664       .n(4)
58665       .k(1)
58666       .qmin(128)
58667       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58668   }
58669 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,qmax)58670   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, qmax) {
58671     GemmMicrokernelTester()
58672       .mr(2)
58673       .nr(4)
58674       .kr(1)
58675       .sr(1)
58676       .m(2)
58677       .n(4)
58678       .k(1)
58679       .qmax(128)
58680       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58681   }
58682 
TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC,strided_cm)58683   TEST(QS8_GEMM_MINMAX_FP32_2X4__WASM_FMAGIC, strided_cm) {
58684     GemmMicrokernelTester()
58685       .mr(2)
58686       .nr(4)
58687       .kr(1)
58688       .sr(1)
58689       .m(2)
58690       .n(4)
58691       .k(1)
58692       .cm_stride(7)
58693       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58694   }
58695 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
58696 
58697 
58698 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_eq_1)58699   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_eq_1) {
58700     GemmMicrokernelTester()
58701       .mr(4)
58702       .nr(2)
58703       .kr(1)
58704       .sr(1)
58705       .m(4)
58706       .n(2)
58707       .k(1)
58708       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58709   }
58710 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,strided_cn)58711   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, strided_cn) {
58712     GemmMicrokernelTester()
58713       .mr(4)
58714       .nr(2)
58715       .kr(1)
58716       .sr(1)
58717       .m(4)
58718       .n(2)
58719       .k(1)
58720       .cn_stride(5)
58721       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58722   }
58723 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_eq_1_strided_a)58724   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_eq_1_strided_a) {
58725     GemmMicrokernelTester()
58726       .mr(4)
58727       .nr(2)
58728       .kr(1)
58729       .sr(1)
58730       .m(4)
58731       .n(2)
58732       .k(1)
58733       .a_stride(3)
58734       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58735   }
58736 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_eq_1_subtile)58737   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_eq_1_subtile) {
58738     for (uint32_t n = 1; n <= 2; n++) {
58739       for (uint32_t m = 1; m <= 4; m++) {
58740         GemmMicrokernelTester()
58741           .mr(4)
58742           .nr(2)
58743           .kr(1)
58744           .sr(1)
58745           .m(m)
58746           .n(n)
58747           .k(1)
58748           .iterations(1)
58749           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58750       }
58751     }
58752   }
58753 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_eq_1_subtile_m)58754   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_eq_1_subtile_m) {
58755     for (uint32_t m = 1; m <= 4; m++) {
58756       GemmMicrokernelTester()
58757         .mr(4)
58758         .nr(2)
58759         .kr(1)
58760         .sr(1)
58761         .m(m)
58762         .n(2)
58763         .k(1)
58764         .iterations(1)
58765         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58766     }
58767   }
58768 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_eq_1_subtile_n)58769   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_eq_1_subtile_n) {
58770     for (uint32_t n = 1; n <= 2; n++) {
58771       GemmMicrokernelTester()
58772         .mr(4)
58773         .nr(2)
58774         .kr(1)
58775         .sr(1)
58776         .m(4)
58777         .n(n)
58778         .k(1)
58779         .iterations(1)
58780         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58781     }
58782   }
58783 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_gt_1)58784   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_gt_1) {
58785     for (size_t k = 2; k < 10; k++) {
58786       GemmMicrokernelTester()
58787         .mr(4)
58788         .nr(2)
58789         .kr(1)
58790         .sr(1)
58791         .m(4)
58792         .n(2)
58793         .k(k)
58794         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58795     }
58796   }
58797 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_gt_1_strided_a)58798   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_gt_1_strided_a) {
58799     for (size_t k = 2; k < 10; k++) {
58800       GemmMicrokernelTester()
58801         .mr(4)
58802         .nr(2)
58803         .kr(1)
58804         .sr(1)
58805         .m(4)
58806         .n(2)
58807         .k(k)
58808         .a_stride(11)
58809         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58810     }
58811   }
58812 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,k_gt_1_subtile)58813   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, k_gt_1_subtile) {
58814     for (size_t k = 2; k < 10; k++) {
58815       for (uint32_t n = 1; n <= 2; n++) {
58816         for (uint32_t m = 1; m <= 4; m++) {
58817           GemmMicrokernelTester()
58818             .mr(4)
58819             .nr(2)
58820             .kr(1)
58821             .sr(1)
58822             .m(m)
58823             .n(n)
58824             .k(k)
58825             .iterations(1)
58826             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58827         }
58828       }
58829     }
58830   }
58831 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_gt_2)58832   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_gt_2) {
58833     for (uint32_t n = 3; n < 4; n++) {
58834       for (size_t k = 1; k <= 5; k += 2) {
58835         GemmMicrokernelTester()
58836           .mr(4)
58837           .nr(2)
58838           .kr(1)
58839           .sr(1)
58840           .m(4)
58841           .n(n)
58842           .k(k)
58843           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58844       }
58845     }
58846   }
58847 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_gt_2_strided_cn)58848   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_gt_2_strided_cn) {
58849     for (uint32_t n = 3; n < 4; n++) {
58850       for (size_t k = 1; k <= 5; k += 2) {
58851         GemmMicrokernelTester()
58852           .mr(4)
58853           .nr(2)
58854           .kr(1)
58855           .sr(1)
58856           .m(4)
58857           .n(n)
58858           .k(k)
58859           .cn_stride(5)
58860           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58861       }
58862     }
58863   }
58864 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_gt_2_strided_a)58865   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_gt_2_strided_a) {
58866     for (uint32_t n = 3; n < 4; n++) {
58867       for (size_t k = 1; k <= 5; k += 2) {
58868         GemmMicrokernelTester()
58869           .mr(4)
58870           .nr(2)
58871           .kr(1)
58872           .sr(1)
58873           .m(4)
58874           .n(n)
58875           .k(k)
58876           .a_stride(7)
58877           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58878       }
58879     }
58880   }
58881 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_gt_2_subtile)58882   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_gt_2_subtile) {
58883     for (uint32_t n = 3; n < 4; n++) {
58884       for (size_t k = 1; k <= 5; k += 2) {
58885         for (uint32_t m = 1; m <= 4; m++) {
58886           GemmMicrokernelTester()
58887             .mr(4)
58888             .nr(2)
58889             .kr(1)
58890             .sr(1)
58891             .m(m)
58892             .n(n)
58893             .k(k)
58894             .iterations(1)
58895             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58896         }
58897       }
58898     }
58899   }
58900 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_div_2)58901   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_div_2) {
58902     for (uint32_t n = 4; n <= 6; n += 2) {
58903       for (size_t k = 1; k <= 5; k += 2) {
58904         GemmMicrokernelTester()
58905           .mr(4)
58906           .nr(2)
58907           .kr(1)
58908           .sr(1)
58909           .m(4)
58910           .n(n)
58911           .k(k)
58912           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58913       }
58914     }
58915   }
58916 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_div_2_strided_cn)58917   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_div_2_strided_cn) {
58918     for (uint32_t n = 4; n <= 6; n += 2) {
58919       for (size_t k = 1; k <= 5; k += 2) {
58920         GemmMicrokernelTester()
58921           .mr(4)
58922           .nr(2)
58923           .kr(1)
58924           .sr(1)
58925           .m(4)
58926           .n(n)
58927           .k(k)
58928           .cn_stride(5)
58929           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58930       }
58931     }
58932   }
58933 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_div_2_strided_a)58934   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_div_2_strided_a) {
58935     for (uint32_t n = 4; n <= 6; n += 2) {
58936       for (size_t k = 1; k <= 5; k += 2) {
58937         GemmMicrokernelTester()
58938           .mr(4)
58939           .nr(2)
58940           .kr(1)
58941           .sr(1)
58942           .m(4)
58943           .n(n)
58944           .k(k)
58945           .a_stride(7)
58946           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58947       }
58948     }
58949   }
58950 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,n_div_2_subtile)58951   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, n_div_2_subtile) {
58952     for (uint32_t n = 4; n <= 6; n += 2) {
58953       for (size_t k = 1; k <= 5; k += 2) {
58954         for (uint32_t m = 1; m <= 4; m++) {
58955           GemmMicrokernelTester()
58956             .mr(4)
58957             .nr(2)
58958             .kr(1)
58959             .sr(1)
58960             .m(m)
58961             .n(n)
58962             .k(k)
58963             .iterations(1)
58964             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58965         }
58966       }
58967     }
58968   }
58969 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,strided_cm_subtile)58970   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, strided_cm_subtile) {
58971     for (size_t k = 1; k <= 5; k += 2) {
58972       for (uint32_t n = 1; n <= 2; n++) {
58973         for (uint32_t m = 1; m <= 4; m++) {
58974           GemmMicrokernelTester()
58975             .mr(4)
58976             .nr(2)
58977             .kr(1)
58978             .sr(1)
58979             .m(m)
58980             .n(n)
58981             .k(k)
58982             .cm_stride(5)
58983             .iterations(1)
58984             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
58985         }
58986       }
58987     }
58988   }
58989 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,qmin)58990   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, qmin) {
58991     GemmMicrokernelTester()
58992       .mr(4)
58993       .nr(2)
58994       .kr(1)
58995       .sr(1)
58996       .m(4)
58997       .n(2)
58998       .k(1)
58999       .qmin(128)
59000       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59001   }
59002 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,qmax)59003   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, qmax) {
59004     GemmMicrokernelTester()
59005       .mr(4)
59006       .nr(2)
59007       .kr(1)
59008       .sr(1)
59009       .m(4)
59010       .n(2)
59011       .k(1)
59012       .qmax(128)
59013       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59014   }
59015 
TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC,strided_cm)59016   TEST(QS8_GEMM_MINMAX_FP32_4X2__WASM_FMAGIC, strided_cm) {
59017     GemmMicrokernelTester()
59018       .mr(4)
59019       .nr(2)
59020       .kr(1)
59021       .sr(1)
59022       .m(4)
59023       .n(2)
59024       .k(1)
59025       .cm_stride(5)
59026       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59027   }
59028 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
59029 
59030 
59031 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_eq_1)59032   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_eq_1) {
59033     GemmMicrokernelTester()
59034       .mr(4)
59035       .nr(4)
59036       .kr(1)
59037       .sr(1)
59038       .m(4)
59039       .n(4)
59040       .k(1)
59041       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59042   }
59043 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,strided_cn)59044   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, strided_cn) {
59045     GemmMicrokernelTester()
59046       .mr(4)
59047       .nr(4)
59048       .kr(1)
59049       .sr(1)
59050       .m(4)
59051       .n(4)
59052       .k(1)
59053       .cn_stride(7)
59054       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59055   }
59056 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_eq_1_strided_a)59057   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_eq_1_strided_a) {
59058     GemmMicrokernelTester()
59059       .mr(4)
59060       .nr(4)
59061       .kr(1)
59062       .sr(1)
59063       .m(4)
59064       .n(4)
59065       .k(1)
59066       .a_stride(3)
59067       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59068   }
59069 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_eq_1_subtile)59070   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_eq_1_subtile) {
59071     for (uint32_t n = 1; n <= 4; n++) {
59072       for (uint32_t m = 1; m <= 4; m++) {
59073         GemmMicrokernelTester()
59074           .mr(4)
59075           .nr(4)
59076           .kr(1)
59077           .sr(1)
59078           .m(m)
59079           .n(n)
59080           .k(1)
59081           .iterations(1)
59082           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59083       }
59084     }
59085   }
59086 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_eq_1_subtile_m)59087   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_eq_1_subtile_m) {
59088     for (uint32_t m = 1; m <= 4; m++) {
59089       GemmMicrokernelTester()
59090         .mr(4)
59091         .nr(4)
59092         .kr(1)
59093         .sr(1)
59094         .m(m)
59095         .n(4)
59096         .k(1)
59097         .iterations(1)
59098         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59099     }
59100   }
59101 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_eq_1_subtile_n)59102   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_eq_1_subtile_n) {
59103     for (uint32_t n = 1; n <= 4; n++) {
59104       GemmMicrokernelTester()
59105         .mr(4)
59106         .nr(4)
59107         .kr(1)
59108         .sr(1)
59109         .m(4)
59110         .n(n)
59111         .k(1)
59112         .iterations(1)
59113         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59114     }
59115   }
59116 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_gt_1)59117   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_gt_1) {
59118     for (size_t k = 2; k < 10; k++) {
59119       GemmMicrokernelTester()
59120         .mr(4)
59121         .nr(4)
59122         .kr(1)
59123         .sr(1)
59124         .m(4)
59125         .n(4)
59126         .k(k)
59127         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59128     }
59129   }
59130 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_gt_1_strided_a)59131   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_gt_1_strided_a) {
59132     for (size_t k = 2; k < 10; k++) {
59133       GemmMicrokernelTester()
59134         .mr(4)
59135         .nr(4)
59136         .kr(1)
59137         .sr(1)
59138         .m(4)
59139         .n(4)
59140         .k(k)
59141         .a_stride(11)
59142         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59143     }
59144   }
59145 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,k_gt_1_subtile)59146   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, k_gt_1_subtile) {
59147     for (size_t k = 2; k < 10; k++) {
59148       for (uint32_t n = 1; n <= 4; n++) {
59149         for (uint32_t m = 1; m <= 4; m++) {
59150           GemmMicrokernelTester()
59151             .mr(4)
59152             .nr(4)
59153             .kr(1)
59154             .sr(1)
59155             .m(m)
59156             .n(n)
59157             .k(k)
59158             .iterations(1)
59159             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59160         }
59161       }
59162     }
59163   }
59164 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_gt_4)59165   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_gt_4) {
59166     for (uint32_t n = 5; n < 8; n++) {
59167       for (size_t k = 1; k <= 5; k += 2) {
59168         GemmMicrokernelTester()
59169           .mr(4)
59170           .nr(4)
59171           .kr(1)
59172           .sr(1)
59173           .m(4)
59174           .n(n)
59175           .k(k)
59176           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59177       }
59178     }
59179   }
59180 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_gt_4_strided_cn)59181   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_gt_4_strided_cn) {
59182     for (uint32_t n = 5; n < 8; n++) {
59183       for (size_t k = 1; k <= 5; k += 2) {
59184         GemmMicrokernelTester()
59185           .mr(4)
59186           .nr(4)
59187           .kr(1)
59188           .sr(1)
59189           .m(4)
59190           .n(n)
59191           .k(k)
59192           .cn_stride(7)
59193           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59194       }
59195     }
59196   }
59197 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_gt_4_strided_a)59198   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_gt_4_strided_a) {
59199     for (uint32_t n = 5; n < 8; n++) {
59200       for (size_t k = 1; k <= 5; k += 2) {
59201         GemmMicrokernelTester()
59202           .mr(4)
59203           .nr(4)
59204           .kr(1)
59205           .sr(1)
59206           .m(4)
59207           .n(n)
59208           .k(k)
59209           .a_stride(7)
59210           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59211       }
59212     }
59213   }
59214 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_gt_4_subtile)59215   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_gt_4_subtile) {
59216     for (uint32_t n = 5; n < 8; n++) {
59217       for (size_t k = 1; k <= 5; k += 2) {
59218         for (uint32_t m = 1; m <= 4; m++) {
59219           GemmMicrokernelTester()
59220             .mr(4)
59221             .nr(4)
59222             .kr(1)
59223             .sr(1)
59224             .m(m)
59225             .n(n)
59226             .k(k)
59227             .iterations(1)
59228             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59229         }
59230       }
59231     }
59232   }
59233 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_div_4)59234   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_div_4) {
59235     for (uint32_t n = 8; n <= 12; n += 4) {
59236       for (size_t k = 1; k <= 5; k += 2) {
59237         GemmMicrokernelTester()
59238           .mr(4)
59239           .nr(4)
59240           .kr(1)
59241           .sr(1)
59242           .m(4)
59243           .n(n)
59244           .k(k)
59245           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59246       }
59247     }
59248   }
59249 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_div_4_strided_cn)59250   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_div_4_strided_cn) {
59251     for (uint32_t n = 8; n <= 12; n += 4) {
59252       for (size_t k = 1; k <= 5; k += 2) {
59253         GemmMicrokernelTester()
59254           .mr(4)
59255           .nr(4)
59256           .kr(1)
59257           .sr(1)
59258           .m(4)
59259           .n(n)
59260           .k(k)
59261           .cn_stride(7)
59262           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59263       }
59264     }
59265   }
59266 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_div_4_strided_a)59267   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_div_4_strided_a) {
59268     for (uint32_t n = 8; n <= 12; n += 4) {
59269       for (size_t k = 1; k <= 5; k += 2) {
59270         GemmMicrokernelTester()
59271           .mr(4)
59272           .nr(4)
59273           .kr(1)
59274           .sr(1)
59275           .m(4)
59276           .n(n)
59277           .k(k)
59278           .a_stride(7)
59279           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59280       }
59281     }
59282   }
59283 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,n_div_4_subtile)59284   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, n_div_4_subtile) {
59285     for (uint32_t n = 8; n <= 12; n += 4) {
59286       for (size_t k = 1; k <= 5; k += 2) {
59287         for (uint32_t m = 1; m <= 4; m++) {
59288           GemmMicrokernelTester()
59289             .mr(4)
59290             .nr(4)
59291             .kr(1)
59292             .sr(1)
59293             .m(m)
59294             .n(n)
59295             .k(k)
59296             .iterations(1)
59297             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59298         }
59299       }
59300     }
59301   }
59302 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,strided_cm_subtile)59303   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, strided_cm_subtile) {
59304     for (size_t k = 1; k <= 5; k += 2) {
59305       for (uint32_t n = 1; n <= 4; n++) {
59306         for (uint32_t m = 1; m <= 4; m++) {
59307           GemmMicrokernelTester()
59308             .mr(4)
59309             .nr(4)
59310             .kr(1)
59311             .sr(1)
59312             .m(m)
59313             .n(n)
59314             .k(k)
59315             .cm_stride(7)
59316             .iterations(1)
59317             .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59318         }
59319       }
59320     }
59321   }
59322 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,qmin)59323   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, qmin) {
59324     GemmMicrokernelTester()
59325       .mr(4)
59326       .nr(4)
59327       .kr(1)
59328       .sr(1)
59329       .m(4)
59330       .n(4)
59331       .k(1)
59332       .qmin(128)
59333       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59334   }
59335 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,qmax)59336   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, qmax) {
59337     GemmMicrokernelTester()
59338       .mr(4)
59339       .nr(4)
59340       .kr(1)
59341       .sr(1)
59342       .m(4)
59343       .n(4)
59344       .k(1)
59345       .qmax(128)
59346       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59347   }
59348 
TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC,strided_cm)59349   TEST(QS8_GEMM_MINMAX_FP32_4X4__WASM_FMAGIC, strided_cm) {
59350     GemmMicrokernelTester()
59351       .mr(4)
59352       .nr(4)
59353       .kr(1)
59354       .sr(1)
59355       .m(4)
59356       .n(4)
59357       .k(1)
59358       .cm_stride(7)
59359       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__wasm_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
59360   }
59361 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
59362 
59363 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_eq_1)59364 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_eq_1) {
59365   GemmMicrokernelTester()
59366     .mr(1)
59367     .nr(2)
59368     .kr(1)
59369     .sr(1)
59370     .m(1)
59371     .n(2)
59372     .k(1)
59373     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59374 }
59375 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,strided_cn)59376 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, strided_cn) {
59377   GemmMicrokernelTester()
59378     .mr(1)
59379     .nr(2)
59380     .kr(1)
59381     .sr(1)
59382     .m(1)
59383     .n(2)
59384     .k(1)
59385     .cn_stride(5)
59386     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59387 }
59388 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_eq_1_strided_a)59389 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_eq_1_strided_a) {
59390   GemmMicrokernelTester()
59391     .mr(1)
59392     .nr(2)
59393     .kr(1)
59394     .sr(1)
59395     .m(1)
59396     .n(2)
59397     .k(1)
59398     .a_stride(3)
59399     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59400 }
59401 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_eq_1_subtile)59402 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_eq_1_subtile) {
59403   for (uint32_t n = 1; n <= 2; n++) {
59404     for (uint32_t m = 1; m <= 1; m++) {
59405       GemmMicrokernelTester()
59406         .mr(1)
59407         .nr(2)
59408         .kr(1)
59409         .sr(1)
59410         .m(m)
59411         .n(n)
59412         .k(1)
59413         .iterations(1)
59414         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59415     }
59416   }
59417 }
59418 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_eq_1_subtile_m)59419 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_eq_1_subtile_m) {
59420   for (uint32_t m = 1; m <= 1; m++) {
59421     GemmMicrokernelTester()
59422       .mr(1)
59423       .nr(2)
59424       .kr(1)
59425       .sr(1)
59426       .m(m)
59427       .n(2)
59428       .k(1)
59429       .iterations(1)
59430       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59431   }
59432 }
59433 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_eq_1_subtile_n)59434 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_eq_1_subtile_n) {
59435   for (uint32_t n = 1; n <= 2; n++) {
59436     GemmMicrokernelTester()
59437       .mr(1)
59438       .nr(2)
59439       .kr(1)
59440       .sr(1)
59441       .m(1)
59442       .n(n)
59443       .k(1)
59444       .iterations(1)
59445       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59446   }
59447 }
59448 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_gt_1)59449 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_gt_1) {
59450   for (size_t k = 2; k < 10; k++) {
59451     GemmMicrokernelTester()
59452       .mr(1)
59453       .nr(2)
59454       .kr(1)
59455       .sr(1)
59456       .m(1)
59457       .n(2)
59458       .k(k)
59459       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59460   }
59461 }
59462 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_gt_1_strided_a)59463 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_gt_1_strided_a) {
59464   for (size_t k = 2; k < 10; k++) {
59465     GemmMicrokernelTester()
59466       .mr(1)
59467       .nr(2)
59468       .kr(1)
59469       .sr(1)
59470       .m(1)
59471       .n(2)
59472       .k(k)
59473       .a_stride(11)
59474       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59475   }
59476 }
59477 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,k_gt_1_subtile)59478 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, k_gt_1_subtile) {
59479   for (size_t k = 2; k < 10; k++) {
59480     for (uint32_t n = 1; n <= 2; n++) {
59481       for (uint32_t m = 1; m <= 1; m++) {
59482         GemmMicrokernelTester()
59483           .mr(1)
59484           .nr(2)
59485           .kr(1)
59486           .sr(1)
59487           .m(m)
59488           .n(n)
59489           .k(k)
59490           .iterations(1)
59491           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59492       }
59493     }
59494   }
59495 }
59496 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_gt_2)59497 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_gt_2) {
59498   for (uint32_t n = 3; n < 4; n++) {
59499     for (size_t k = 1; k <= 5; k += 2) {
59500       GemmMicrokernelTester()
59501         .mr(1)
59502         .nr(2)
59503         .kr(1)
59504         .sr(1)
59505         .m(1)
59506         .n(n)
59507         .k(k)
59508         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59509     }
59510   }
59511 }
59512 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_gt_2_strided_cn)59513 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_gt_2_strided_cn) {
59514   for (uint32_t n = 3; n < 4; n++) {
59515     for (size_t k = 1; k <= 5; k += 2) {
59516       GemmMicrokernelTester()
59517         .mr(1)
59518         .nr(2)
59519         .kr(1)
59520         .sr(1)
59521         .m(1)
59522         .n(n)
59523         .k(k)
59524         .cn_stride(5)
59525         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59526     }
59527   }
59528 }
59529 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_gt_2_strided_a)59530 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_gt_2_strided_a) {
59531   for (uint32_t n = 3; n < 4; n++) {
59532     for (size_t k = 1; k <= 5; k += 2) {
59533       GemmMicrokernelTester()
59534         .mr(1)
59535         .nr(2)
59536         .kr(1)
59537         .sr(1)
59538         .m(1)
59539         .n(n)
59540         .k(k)
59541         .a_stride(7)
59542         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59543     }
59544   }
59545 }
59546 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_gt_2_subtile)59547 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_gt_2_subtile) {
59548   for (uint32_t n = 3; n < 4; n++) {
59549     for (size_t k = 1; k <= 5; k += 2) {
59550       for (uint32_t m = 1; m <= 1; m++) {
59551         GemmMicrokernelTester()
59552           .mr(1)
59553           .nr(2)
59554           .kr(1)
59555           .sr(1)
59556           .m(m)
59557           .n(n)
59558           .k(k)
59559           .iterations(1)
59560           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59561       }
59562     }
59563   }
59564 }
59565 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_div_2)59566 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_div_2) {
59567   for (uint32_t n = 4; n <= 6; n += 2) {
59568     for (size_t k = 1; k <= 5; k += 2) {
59569       GemmMicrokernelTester()
59570         .mr(1)
59571         .nr(2)
59572         .kr(1)
59573         .sr(1)
59574         .m(1)
59575         .n(n)
59576         .k(k)
59577         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59578     }
59579   }
59580 }
59581 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_div_2_strided_cn)59582 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_div_2_strided_cn) {
59583   for (uint32_t n = 4; n <= 6; n += 2) {
59584     for (size_t k = 1; k <= 5; k += 2) {
59585       GemmMicrokernelTester()
59586         .mr(1)
59587         .nr(2)
59588         .kr(1)
59589         .sr(1)
59590         .m(1)
59591         .n(n)
59592         .k(k)
59593         .cn_stride(5)
59594         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59595     }
59596   }
59597 }
59598 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_div_2_strided_a)59599 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_div_2_strided_a) {
59600   for (uint32_t n = 4; n <= 6; n += 2) {
59601     for (size_t k = 1; k <= 5; k += 2) {
59602       GemmMicrokernelTester()
59603         .mr(1)
59604         .nr(2)
59605         .kr(1)
59606         .sr(1)
59607         .m(1)
59608         .n(n)
59609         .k(k)
59610         .a_stride(7)
59611         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59612     }
59613   }
59614 }
59615 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,n_div_2_subtile)59616 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, n_div_2_subtile) {
59617   for (uint32_t n = 4; n <= 6; n += 2) {
59618     for (size_t k = 1; k <= 5; k += 2) {
59619       for (uint32_t m = 1; m <= 1; m++) {
59620         GemmMicrokernelTester()
59621           .mr(1)
59622           .nr(2)
59623           .kr(1)
59624           .sr(1)
59625           .m(m)
59626           .n(n)
59627           .k(k)
59628           .iterations(1)
59629           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59630       }
59631     }
59632   }
59633 }
59634 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,strided_cm_subtile)59635 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, strided_cm_subtile) {
59636   for (size_t k = 1; k <= 5; k += 2) {
59637     for (uint32_t n = 1; n <= 2; n++) {
59638       for (uint32_t m = 1; m <= 1; m++) {
59639         GemmMicrokernelTester()
59640           .mr(1)
59641           .nr(2)
59642           .kr(1)
59643           .sr(1)
59644           .m(m)
59645           .n(n)
59646           .k(k)
59647           .cm_stride(5)
59648           .iterations(1)
59649           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59650       }
59651     }
59652   }
59653 }
59654 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,qmin)59655 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, qmin) {
59656   GemmMicrokernelTester()
59657     .mr(1)
59658     .nr(2)
59659     .kr(1)
59660     .sr(1)
59661     .m(1)
59662     .n(2)
59663     .k(1)
59664     .qmin(128)
59665     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59666 }
59667 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,qmax)59668 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, qmax) {
59669   GemmMicrokernelTester()
59670     .mr(1)
59671     .nr(2)
59672     .kr(1)
59673     .sr(1)
59674     .m(1)
59675     .n(2)
59676     .k(1)
59677     .qmax(128)
59678     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59679 }
59680 
TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC,strided_cm)59681 TEST(QS8_GEMM_MINMAX_FP32_1X2__SCALAR_IMAGIC, strided_cm) {
59682   GemmMicrokernelTester()
59683     .mr(1)
59684     .nr(2)
59685     .kr(1)
59686     .sr(1)
59687     .m(1)
59688     .n(2)
59689     .k(1)
59690     .cm_stride(5)
59691     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59692 }
59693 
59694 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_eq_1)59695 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_eq_1) {
59696   GemmMicrokernelTester()
59697     .mr(1)
59698     .nr(4)
59699     .kr(1)
59700     .sr(1)
59701     .m(1)
59702     .n(4)
59703     .k(1)
59704     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59705 }
59706 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,strided_cn)59707 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, strided_cn) {
59708   GemmMicrokernelTester()
59709     .mr(1)
59710     .nr(4)
59711     .kr(1)
59712     .sr(1)
59713     .m(1)
59714     .n(4)
59715     .k(1)
59716     .cn_stride(7)
59717     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59718 }
59719 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_eq_1_strided_a)59720 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_eq_1_strided_a) {
59721   GemmMicrokernelTester()
59722     .mr(1)
59723     .nr(4)
59724     .kr(1)
59725     .sr(1)
59726     .m(1)
59727     .n(4)
59728     .k(1)
59729     .a_stride(3)
59730     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59731 }
59732 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_eq_1_subtile)59733 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_eq_1_subtile) {
59734   for (uint32_t n = 1; n <= 4; n++) {
59735     for (uint32_t m = 1; m <= 1; m++) {
59736       GemmMicrokernelTester()
59737         .mr(1)
59738         .nr(4)
59739         .kr(1)
59740         .sr(1)
59741         .m(m)
59742         .n(n)
59743         .k(1)
59744         .iterations(1)
59745         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59746     }
59747   }
59748 }
59749 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_eq_1_subtile_m)59750 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_eq_1_subtile_m) {
59751   for (uint32_t m = 1; m <= 1; m++) {
59752     GemmMicrokernelTester()
59753       .mr(1)
59754       .nr(4)
59755       .kr(1)
59756       .sr(1)
59757       .m(m)
59758       .n(4)
59759       .k(1)
59760       .iterations(1)
59761       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59762   }
59763 }
59764 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_eq_1_subtile_n)59765 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_eq_1_subtile_n) {
59766   for (uint32_t n = 1; n <= 4; n++) {
59767     GemmMicrokernelTester()
59768       .mr(1)
59769       .nr(4)
59770       .kr(1)
59771       .sr(1)
59772       .m(1)
59773       .n(n)
59774       .k(1)
59775       .iterations(1)
59776       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59777   }
59778 }
59779 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_gt_1)59780 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_gt_1) {
59781   for (size_t k = 2; k < 10; k++) {
59782     GemmMicrokernelTester()
59783       .mr(1)
59784       .nr(4)
59785       .kr(1)
59786       .sr(1)
59787       .m(1)
59788       .n(4)
59789       .k(k)
59790       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59791   }
59792 }
59793 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_gt_1_strided_a)59794 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_gt_1_strided_a) {
59795   for (size_t k = 2; k < 10; k++) {
59796     GemmMicrokernelTester()
59797       .mr(1)
59798       .nr(4)
59799       .kr(1)
59800       .sr(1)
59801       .m(1)
59802       .n(4)
59803       .k(k)
59804       .a_stride(11)
59805       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59806   }
59807 }
59808 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,k_gt_1_subtile)59809 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, k_gt_1_subtile) {
59810   for (size_t k = 2; k < 10; k++) {
59811     for (uint32_t n = 1; n <= 4; n++) {
59812       for (uint32_t m = 1; m <= 1; m++) {
59813         GemmMicrokernelTester()
59814           .mr(1)
59815           .nr(4)
59816           .kr(1)
59817           .sr(1)
59818           .m(m)
59819           .n(n)
59820           .k(k)
59821           .iterations(1)
59822           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59823       }
59824     }
59825   }
59826 }
59827 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_gt_4)59828 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_gt_4) {
59829   for (uint32_t n = 5; n < 8; n++) {
59830     for (size_t k = 1; k <= 5; k += 2) {
59831       GemmMicrokernelTester()
59832         .mr(1)
59833         .nr(4)
59834         .kr(1)
59835         .sr(1)
59836         .m(1)
59837         .n(n)
59838         .k(k)
59839         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59840     }
59841   }
59842 }
59843 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_gt_4_strided_cn)59844 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_gt_4_strided_cn) {
59845   for (uint32_t n = 5; n < 8; n++) {
59846     for (size_t k = 1; k <= 5; k += 2) {
59847       GemmMicrokernelTester()
59848         .mr(1)
59849         .nr(4)
59850         .kr(1)
59851         .sr(1)
59852         .m(1)
59853         .n(n)
59854         .k(k)
59855         .cn_stride(7)
59856         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59857     }
59858   }
59859 }
59860 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_gt_4_strided_a)59861 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_gt_4_strided_a) {
59862   for (uint32_t n = 5; n < 8; n++) {
59863     for (size_t k = 1; k <= 5; k += 2) {
59864       GemmMicrokernelTester()
59865         .mr(1)
59866         .nr(4)
59867         .kr(1)
59868         .sr(1)
59869         .m(1)
59870         .n(n)
59871         .k(k)
59872         .a_stride(7)
59873         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59874     }
59875   }
59876 }
59877 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_gt_4_subtile)59878 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_gt_4_subtile) {
59879   for (uint32_t n = 5; n < 8; n++) {
59880     for (size_t k = 1; k <= 5; k += 2) {
59881       for (uint32_t m = 1; m <= 1; m++) {
59882         GemmMicrokernelTester()
59883           .mr(1)
59884           .nr(4)
59885           .kr(1)
59886           .sr(1)
59887           .m(m)
59888           .n(n)
59889           .k(k)
59890           .iterations(1)
59891           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59892       }
59893     }
59894   }
59895 }
59896 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_div_4)59897 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_div_4) {
59898   for (uint32_t n = 8; n <= 12; n += 4) {
59899     for (size_t k = 1; k <= 5; k += 2) {
59900       GemmMicrokernelTester()
59901         .mr(1)
59902         .nr(4)
59903         .kr(1)
59904         .sr(1)
59905         .m(1)
59906         .n(n)
59907         .k(k)
59908         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59909     }
59910   }
59911 }
59912 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_div_4_strided_cn)59913 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_div_4_strided_cn) {
59914   for (uint32_t n = 8; n <= 12; n += 4) {
59915     for (size_t k = 1; k <= 5; k += 2) {
59916       GemmMicrokernelTester()
59917         .mr(1)
59918         .nr(4)
59919         .kr(1)
59920         .sr(1)
59921         .m(1)
59922         .n(n)
59923         .k(k)
59924         .cn_stride(7)
59925         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59926     }
59927   }
59928 }
59929 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_div_4_strided_a)59930 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_div_4_strided_a) {
59931   for (uint32_t n = 8; n <= 12; n += 4) {
59932     for (size_t k = 1; k <= 5; k += 2) {
59933       GemmMicrokernelTester()
59934         .mr(1)
59935         .nr(4)
59936         .kr(1)
59937         .sr(1)
59938         .m(1)
59939         .n(n)
59940         .k(k)
59941         .a_stride(7)
59942         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59943     }
59944   }
59945 }
59946 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,n_div_4_subtile)59947 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, n_div_4_subtile) {
59948   for (uint32_t n = 8; n <= 12; n += 4) {
59949     for (size_t k = 1; k <= 5; k += 2) {
59950       for (uint32_t m = 1; m <= 1; m++) {
59951         GemmMicrokernelTester()
59952           .mr(1)
59953           .nr(4)
59954           .kr(1)
59955           .sr(1)
59956           .m(m)
59957           .n(n)
59958           .k(k)
59959           .iterations(1)
59960           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59961       }
59962     }
59963   }
59964 }
59965 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,strided_cm_subtile)59966 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, strided_cm_subtile) {
59967   for (size_t k = 1; k <= 5; k += 2) {
59968     for (uint32_t n = 1; n <= 4; n++) {
59969       for (uint32_t m = 1; m <= 1; m++) {
59970         GemmMicrokernelTester()
59971           .mr(1)
59972           .nr(4)
59973           .kr(1)
59974           .sr(1)
59975           .m(m)
59976           .n(n)
59977           .k(k)
59978           .cm_stride(7)
59979           .iterations(1)
59980           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59981       }
59982     }
59983   }
59984 }
59985 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,qmin)59986 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, qmin) {
59987   GemmMicrokernelTester()
59988     .mr(1)
59989     .nr(4)
59990     .kr(1)
59991     .sr(1)
59992     .m(1)
59993     .n(4)
59994     .k(1)
59995     .qmin(128)
59996     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
59997 }
59998 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,qmax)59999 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, qmax) {
60000   GemmMicrokernelTester()
60001     .mr(1)
60002     .nr(4)
60003     .kr(1)
60004     .sr(1)
60005     .m(1)
60006     .n(4)
60007     .k(1)
60008     .qmax(128)
60009     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60010 }
60011 
TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC,strided_cm)60012 TEST(QS8_GEMM_MINMAX_FP32_1X4__SCALAR_IMAGIC, strided_cm) {
60013   GemmMicrokernelTester()
60014     .mr(1)
60015     .nr(4)
60016     .kr(1)
60017     .sr(1)
60018     .m(1)
60019     .n(4)
60020     .k(1)
60021     .cm_stride(7)
60022     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_1x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60023 }
60024 
60025 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_eq_1)60026 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_eq_1) {
60027   GemmMicrokernelTester()
60028     .mr(2)
60029     .nr(2)
60030     .kr(1)
60031     .sr(1)
60032     .m(2)
60033     .n(2)
60034     .k(1)
60035     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60036 }
60037 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,strided_cn)60038 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, strided_cn) {
60039   GemmMicrokernelTester()
60040     .mr(2)
60041     .nr(2)
60042     .kr(1)
60043     .sr(1)
60044     .m(2)
60045     .n(2)
60046     .k(1)
60047     .cn_stride(5)
60048     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60049 }
60050 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_eq_1_strided_a)60051 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_eq_1_strided_a) {
60052   GemmMicrokernelTester()
60053     .mr(2)
60054     .nr(2)
60055     .kr(1)
60056     .sr(1)
60057     .m(2)
60058     .n(2)
60059     .k(1)
60060     .a_stride(3)
60061     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60062 }
60063 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_eq_1_subtile)60064 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_eq_1_subtile) {
60065   for (uint32_t n = 1; n <= 2; n++) {
60066     for (uint32_t m = 1; m <= 2; m++) {
60067       GemmMicrokernelTester()
60068         .mr(2)
60069         .nr(2)
60070         .kr(1)
60071         .sr(1)
60072         .m(m)
60073         .n(n)
60074         .k(1)
60075         .iterations(1)
60076         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60077     }
60078   }
60079 }
60080 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_eq_1_subtile_m)60081 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_eq_1_subtile_m) {
60082   for (uint32_t m = 1; m <= 2; m++) {
60083     GemmMicrokernelTester()
60084       .mr(2)
60085       .nr(2)
60086       .kr(1)
60087       .sr(1)
60088       .m(m)
60089       .n(2)
60090       .k(1)
60091       .iterations(1)
60092       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60093   }
60094 }
60095 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_eq_1_subtile_n)60096 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_eq_1_subtile_n) {
60097   for (uint32_t n = 1; n <= 2; n++) {
60098     GemmMicrokernelTester()
60099       .mr(2)
60100       .nr(2)
60101       .kr(1)
60102       .sr(1)
60103       .m(2)
60104       .n(n)
60105       .k(1)
60106       .iterations(1)
60107       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60108   }
60109 }
60110 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_gt_1)60111 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_gt_1) {
60112   for (size_t k = 2; k < 10; k++) {
60113     GemmMicrokernelTester()
60114       .mr(2)
60115       .nr(2)
60116       .kr(1)
60117       .sr(1)
60118       .m(2)
60119       .n(2)
60120       .k(k)
60121       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60122   }
60123 }
60124 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_gt_1_strided_a)60125 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_gt_1_strided_a) {
60126   for (size_t k = 2; k < 10; k++) {
60127     GemmMicrokernelTester()
60128       .mr(2)
60129       .nr(2)
60130       .kr(1)
60131       .sr(1)
60132       .m(2)
60133       .n(2)
60134       .k(k)
60135       .a_stride(11)
60136       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60137   }
60138 }
60139 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,k_gt_1_subtile)60140 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, k_gt_1_subtile) {
60141   for (size_t k = 2; k < 10; k++) {
60142     for (uint32_t n = 1; n <= 2; n++) {
60143       for (uint32_t m = 1; m <= 2; m++) {
60144         GemmMicrokernelTester()
60145           .mr(2)
60146           .nr(2)
60147           .kr(1)
60148           .sr(1)
60149           .m(m)
60150           .n(n)
60151           .k(k)
60152           .iterations(1)
60153           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60154       }
60155     }
60156   }
60157 }
60158 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_gt_2)60159 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_gt_2) {
60160   for (uint32_t n = 3; n < 4; n++) {
60161     for (size_t k = 1; k <= 5; k += 2) {
60162       GemmMicrokernelTester()
60163         .mr(2)
60164         .nr(2)
60165         .kr(1)
60166         .sr(1)
60167         .m(2)
60168         .n(n)
60169         .k(k)
60170         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60171     }
60172   }
60173 }
60174 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_gt_2_strided_cn)60175 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_gt_2_strided_cn) {
60176   for (uint32_t n = 3; n < 4; n++) {
60177     for (size_t k = 1; k <= 5; k += 2) {
60178       GemmMicrokernelTester()
60179         .mr(2)
60180         .nr(2)
60181         .kr(1)
60182         .sr(1)
60183         .m(2)
60184         .n(n)
60185         .k(k)
60186         .cn_stride(5)
60187         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60188     }
60189   }
60190 }
60191 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_gt_2_strided_a)60192 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_gt_2_strided_a) {
60193   for (uint32_t n = 3; n < 4; n++) {
60194     for (size_t k = 1; k <= 5; k += 2) {
60195       GemmMicrokernelTester()
60196         .mr(2)
60197         .nr(2)
60198         .kr(1)
60199         .sr(1)
60200         .m(2)
60201         .n(n)
60202         .k(k)
60203         .a_stride(7)
60204         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60205     }
60206   }
60207 }
60208 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_gt_2_subtile)60209 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_gt_2_subtile) {
60210   for (uint32_t n = 3; n < 4; n++) {
60211     for (size_t k = 1; k <= 5; k += 2) {
60212       for (uint32_t m = 1; m <= 2; m++) {
60213         GemmMicrokernelTester()
60214           .mr(2)
60215           .nr(2)
60216           .kr(1)
60217           .sr(1)
60218           .m(m)
60219           .n(n)
60220           .k(k)
60221           .iterations(1)
60222           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60223       }
60224     }
60225   }
60226 }
60227 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_div_2)60228 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_div_2) {
60229   for (uint32_t n = 4; n <= 6; n += 2) {
60230     for (size_t k = 1; k <= 5; k += 2) {
60231       GemmMicrokernelTester()
60232         .mr(2)
60233         .nr(2)
60234         .kr(1)
60235         .sr(1)
60236         .m(2)
60237         .n(n)
60238         .k(k)
60239         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60240     }
60241   }
60242 }
60243 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_div_2_strided_cn)60244 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_div_2_strided_cn) {
60245   for (uint32_t n = 4; n <= 6; n += 2) {
60246     for (size_t k = 1; k <= 5; k += 2) {
60247       GemmMicrokernelTester()
60248         .mr(2)
60249         .nr(2)
60250         .kr(1)
60251         .sr(1)
60252         .m(2)
60253         .n(n)
60254         .k(k)
60255         .cn_stride(5)
60256         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60257     }
60258   }
60259 }
60260 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_div_2_strided_a)60261 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_div_2_strided_a) {
60262   for (uint32_t n = 4; n <= 6; n += 2) {
60263     for (size_t k = 1; k <= 5; k += 2) {
60264       GemmMicrokernelTester()
60265         .mr(2)
60266         .nr(2)
60267         .kr(1)
60268         .sr(1)
60269         .m(2)
60270         .n(n)
60271         .k(k)
60272         .a_stride(7)
60273         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60274     }
60275   }
60276 }
60277 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,n_div_2_subtile)60278 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, n_div_2_subtile) {
60279   for (uint32_t n = 4; n <= 6; n += 2) {
60280     for (size_t k = 1; k <= 5; k += 2) {
60281       for (uint32_t m = 1; m <= 2; m++) {
60282         GemmMicrokernelTester()
60283           .mr(2)
60284           .nr(2)
60285           .kr(1)
60286           .sr(1)
60287           .m(m)
60288           .n(n)
60289           .k(k)
60290           .iterations(1)
60291           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60292       }
60293     }
60294   }
60295 }
60296 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,strided_cm_subtile)60297 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, strided_cm_subtile) {
60298   for (size_t k = 1; k <= 5; k += 2) {
60299     for (uint32_t n = 1; n <= 2; n++) {
60300       for (uint32_t m = 1; m <= 2; m++) {
60301         GemmMicrokernelTester()
60302           .mr(2)
60303           .nr(2)
60304           .kr(1)
60305           .sr(1)
60306           .m(m)
60307           .n(n)
60308           .k(k)
60309           .cm_stride(5)
60310           .iterations(1)
60311           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60312       }
60313     }
60314   }
60315 }
60316 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,qmin)60317 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, qmin) {
60318   GemmMicrokernelTester()
60319     .mr(2)
60320     .nr(2)
60321     .kr(1)
60322     .sr(1)
60323     .m(2)
60324     .n(2)
60325     .k(1)
60326     .qmin(128)
60327     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60328 }
60329 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,qmax)60330 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, qmax) {
60331   GemmMicrokernelTester()
60332     .mr(2)
60333     .nr(2)
60334     .kr(1)
60335     .sr(1)
60336     .m(2)
60337     .n(2)
60338     .k(1)
60339     .qmax(128)
60340     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60341 }
60342 
TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC,strided_cm)60343 TEST(QS8_GEMM_MINMAX_FP32_2X2__SCALAR_IMAGIC, strided_cm) {
60344   GemmMicrokernelTester()
60345     .mr(2)
60346     .nr(2)
60347     .kr(1)
60348     .sr(1)
60349     .m(2)
60350     .n(2)
60351     .k(1)
60352     .cm_stride(5)
60353     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x2__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60354 }
60355 
60356 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_eq_1)60357 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_eq_1) {
60358   GemmMicrokernelTester()
60359     .mr(2)
60360     .nr(4)
60361     .kr(1)
60362     .sr(1)
60363     .m(2)
60364     .n(4)
60365     .k(1)
60366     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60367 }
60368 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,strided_cn)60369 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, strided_cn) {
60370   GemmMicrokernelTester()
60371     .mr(2)
60372     .nr(4)
60373     .kr(1)
60374     .sr(1)
60375     .m(2)
60376     .n(4)
60377     .k(1)
60378     .cn_stride(7)
60379     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60380 }
60381 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_eq_1_strided_a)60382 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_eq_1_strided_a) {
60383   GemmMicrokernelTester()
60384     .mr(2)
60385     .nr(4)
60386     .kr(1)
60387     .sr(1)
60388     .m(2)
60389     .n(4)
60390     .k(1)
60391     .a_stride(3)
60392     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60393 }
60394 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_eq_1_subtile)60395 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_eq_1_subtile) {
60396   for (uint32_t n = 1; n <= 4; n++) {
60397     for (uint32_t m = 1; m <= 2; m++) {
60398       GemmMicrokernelTester()
60399         .mr(2)
60400         .nr(4)
60401         .kr(1)
60402         .sr(1)
60403         .m(m)
60404         .n(n)
60405         .k(1)
60406         .iterations(1)
60407         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60408     }
60409   }
60410 }
60411 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_eq_1_subtile_m)60412 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_eq_1_subtile_m) {
60413   for (uint32_t m = 1; m <= 2; m++) {
60414     GemmMicrokernelTester()
60415       .mr(2)
60416       .nr(4)
60417       .kr(1)
60418       .sr(1)
60419       .m(m)
60420       .n(4)
60421       .k(1)
60422       .iterations(1)
60423       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60424   }
60425 }
60426 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_eq_1_subtile_n)60427 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_eq_1_subtile_n) {
60428   for (uint32_t n = 1; n <= 4; n++) {
60429     GemmMicrokernelTester()
60430       .mr(2)
60431       .nr(4)
60432       .kr(1)
60433       .sr(1)
60434       .m(2)
60435       .n(n)
60436       .k(1)
60437       .iterations(1)
60438       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60439   }
60440 }
60441 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_gt_1)60442 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_gt_1) {
60443   for (size_t k = 2; k < 10; k++) {
60444     GemmMicrokernelTester()
60445       .mr(2)
60446       .nr(4)
60447       .kr(1)
60448       .sr(1)
60449       .m(2)
60450       .n(4)
60451       .k(k)
60452       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60453   }
60454 }
60455 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_gt_1_strided_a)60456 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_gt_1_strided_a) {
60457   for (size_t k = 2; k < 10; k++) {
60458     GemmMicrokernelTester()
60459       .mr(2)
60460       .nr(4)
60461       .kr(1)
60462       .sr(1)
60463       .m(2)
60464       .n(4)
60465       .k(k)
60466       .a_stride(11)
60467       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60468   }
60469 }
60470 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,k_gt_1_subtile)60471 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, k_gt_1_subtile) {
60472   for (size_t k = 2; k < 10; k++) {
60473     for (uint32_t n = 1; n <= 4; n++) {
60474       for (uint32_t m = 1; m <= 2; m++) {
60475         GemmMicrokernelTester()
60476           .mr(2)
60477           .nr(4)
60478           .kr(1)
60479           .sr(1)
60480           .m(m)
60481           .n(n)
60482           .k(k)
60483           .iterations(1)
60484           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60485       }
60486     }
60487   }
60488 }
60489 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_gt_4)60490 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_gt_4) {
60491   for (uint32_t n = 5; n < 8; n++) {
60492     for (size_t k = 1; k <= 5; k += 2) {
60493       GemmMicrokernelTester()
60494         .mr(2)
60495         .nr(4)
60496         .kr(1)
60497         .sr(1)
60498         .m(2)
60499         .n(n)
60500         .k(k)
60501         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60502     }
60503   }
60504 }
60505 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_gt_4_strided_cn)60506 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_gt_4_strided_cn) {
60507   for (uint32_t n = 5; n < 8; n++) {
60508     for (size_t k = 1; k <= 5; k += 2) {
60509       GemmMicrokernelTester()
60510         .mr(2)
60511         .nr(4)
60512         .kr(1)
60513         .sr(1)
60514         .m(2)
60515         .n(n)
60516         .k(k)
60517         .cn_stride(7)
60518         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60519     }
60520   }
60521 }
60522 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_gt_4_strided_a)60523 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_gt_4_strided_a) {
60524   for (uint32_t n = 5; n < 8; n++) {
60525     for (size_t k = 1; k <= 5; k += 2) {
60526       GemmMicrokernelTester()
60527         .mr(2)
60528         .nr(4)
60529         .kr(1)
60530         .sr(1)
60531         .m(2)
60532         .n(n)
60533         .k(k)
60534         .a_stride(7)
60535         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60536     }
60537   }
60538 }
60539 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_gt_4_subtile)60540 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_gt_4_subtile) {
60541   for (uint32_t n = 5; n < 8; n++) {
60542     for (size_t k = 1; k <= 5; k += 2) {
60543       for (uint32_t m = 1; m <= 2; m++) {
60544         GemmMicrokernelTester()
60545           .mr(2)
60546           .nr(4)
60547           .kr(1)
60548           .sr(1)
60549           .m(m)
60550           .n(n)
60551           .k(k)
60552           .iterations(1)
60553           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60554       }
60555     }
60556   }
60557 }
60558 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_div_4)60559 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_div_4) {
60560   for (uint32_t n = 8; n <= 12; n += 4) {
60561     for (size_t k = 1; k <= 5; k += 2) {
60562       GemmMicrokernelTester()
60563         .mr(2)
60564         .nr(4)
60565         .kr(1)
60566         .sr(1)
60567         .m(2)
60568         .n(n)
60569         .k(k)
60570         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60571     }
60572   }
60573 }
60574 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_div_4_strided_cn)60575 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_div_4_strided_cn) {
60576   for (uint32_t n = 8; n <= 12; n += 4) {
60577     for (size_t k = 1; k <= 5; k += 2) {
60578       GemmMicrokernelTester()
60579         .mr(2)
60580         .nr(4)
60581         .kr(1)
60582         .sr(1)
60583         .m(2)
60584         .n(n)
60585         .k(k)
60586         .cn_stride(7)
60587         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60588     }
60589   }
60590 }
60591 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_div_4_strided_a)60592 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_div_4_strided_a) {
60593   for (uint32_t n = 8; n <= 12; n += 4) {
60594     for (size_t k = 1; k <= 5; k += 2) {
60595       GemmMicrokernelTester()
60596         .mr(2)
60597         .nr(4)
60598         .kr(1)
60599         .sr(1)
60600         .m(2)
60601         .n(n)
60602         .k(k)
60603         .a_stride(7)
60604         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60605     }
60606   }
60607 }
60608 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,n_div_4_subtile)60609 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, n_div_4_subtile) {
60610   for (uint32_t n = 8; n <= 12; n += 4) {
60611     for (size_t k = 1; k <= 5; k += 2) {
60612       for (uint32_t m = 1; m <= 2; m++) {
60613         GemmMicrokernelTester()
60614           .mr(2)
60615           .nr(4)
60616           .kr(1)
60617           .sr(1)
60618           .m(m)
60619           .n(n)
60620           .k(k)
60621           .iterations(1)
60622           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60623       }
60624     }
60625   }
60626 }
60627 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,strided_cm_subtile)60628 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, strided_cm_subtile) {
60629   for (size_t k = 1; k <= 5; k += 2) {
60630     for (uint32_t n = 1; n <= 4; n++) {
60631       for (uint32_t m = 1; m <= 2; m++) {
60632         GemmMicrokernelTester()
60633           .mr(2)
60634           .nr(4)
60635           .kr(1)
60636           .sr(1)
60637           .m(m)
60638           .n(n)
60639           .k(k)
60640           .cm_stride(7)
60641           .iterations(1)
60642           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60643       }
60644     }
60645   }
60646 }
60647 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,qmin)60648 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, qmin) {
60649   GemmMicrokernelTester()
60650     .mr(2)
60651     .nr(4)
60652     .kr(1)
60653     .sr(1)
60654     .m(2)
60655     .n(4)
60656     .k(1)
60657     .qmin(128)
60658     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60659 }
60660 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,qmax)60661 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, qmax) {
60662   GemmMicrokernelTester()
60663     .mr(2)
60664     .nr(4)
60665     .kr(1)
60666     .sr(1)
60667     .m(2)
60668     .n(4)
60669     .k(1)
60670     .qmax(128)
60671     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60672 }
60673 
TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC,strided_cm)60674 TEST(QS8_GEMM_MINMAX_FP32_2X4__SCALAR_IMAGIC, strided_cm) {
60675   GemmMicrokernelTester()
60676     .mr(2)
60677     .nr(4)
60678     .kr(1)
60679     .sr(1)
60680     .m(2)
60681     .n(4)
60682     .k(1)
60683     .cm_stride(7)
60684     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_2x4__scalar_imagic, xnn_init_qs8_conv_minmax_fp32_scalar_imagic_params, xnn_qs8_requantize_fp32);
60685 }
60686 
60687 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_eq_1)60688 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_eq_1) {
60689   GemmMicrokernelTester()
60690     .mr(3)
60691     .nr(2)
60692     .kr(1)
60693     .sr(1)
60694     .m(3)
60695     .n(2)
60696     .k(1)
60697     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60698 }
60699 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,strided_cn)60700 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, strided_cn) {
60701   GemmMicrokernelTester()
60702     .mr(3)
60703     .nr(2)
60704     .kr(1)
60705     .sr(1)
60706     .m(3)
60707     .n(2)
60708     .k(1)
60709     .cn_stride(5)
60710     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60711 }
60712 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_eq_1_strided_a)60713 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_eq_1_strided_a) {
60714   GemmMicrokernelTester()
60715     .mr(3)
60716     .nr(2)
60717     .kr(1)
60718     .sr(1)
60719     .m(3)
60720     .n(2)
60721     .k(1)
60722     .a_stride(3)
60723     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60724 }
60725 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_eq_1_subtile)60726 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_eq_1_subtile) {
60727   for (uint32_t n = 1; n <= 2; n++) {
60728     for (uint32_t m = 1; m <= 3; m++) {
60729       GemmMicrokernelTester()
60730         .mr(3)
60731         .nr(2)
60732         .kr(1)
60733         .sr(1)
60734         .m(m)
60735         .n(n)
60736         .k(1)
60737         .iterations(1)
60738         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60739     }
60740   }
60741 }
60742 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_eq_1_subtile_m)60743 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_eq_1_subtile_m) {
60744   for (uint32_t m = 1; m <= 3; m++) {
60745     GemmMicrokernelTester()
60746       .mr(3)
60747       .nr(2)
60748       .kr(1)
60749       .sr(1)
60750       .m(m)
60751       .n(2)
60752       .k(1)
60753       .iterations(1)
60754       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60755   }
60756 }
60757 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_eq_1_subtile_n)60758 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_eq_1_subtile_n) {
60759   for (uint32_t n = 1; n <= 2; n++) {
60760     GemmMicrokernelTester()
60761       .mr(3)
60762       .nr(2)
60763       .kr(1)
60764       .sr(1)
60765       .m(3)
60766       .n(n)
60767       .k(1)
60768       .iterations(1)
60769       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60770   }
60771 }
60772 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_gt_1)60773 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_gt_1) {
60774   for (size_t k = 2; k < 10; k++) {
60775     GemmMicrokernelTester()
60776       .mr(3)
60777       .nr(2)
60778       .kr(1)
60779       .sr(1)
60780       .m(3)
60781       .n(2)
60782       .k(k)
60783       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60784   }
60785 }
60786 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_gt_1_strided_a)60787 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_gt_1_strided_a) {
60788   for (size_t k = 2; k < 10; k++) {
60789     GemmMicrokernelTester()
60790       .mr(3)
60791       .nr(2)
60792       .kr(1)
60793       .sr(1)
60794       .m(3)
60795       .n(2)
60796       .k(k)
60797       .a_stride(11)
60798       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60799   }
60800 }
60801 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,k_gt_1_subtile)60802 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, k_gt_1_subtile) {
60803   for (size_t k = 2; k < 10; k++) {
60804     for (uint32_t n = 1; n <= 2; n++) {
60805       for (uint32_t m = 1; m <= 3; m++) {
60806         GemmMicrokernelTester()
60807           .mr(3)
60808           .nr(2)
60809           .kr(1)
60810           .sr(1)
60811           .m(m)
60812           .n(n)
60813           .k(k)
60814           .iterations(1)
60815           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60816       }
60817     }
60818   }
60819 }
60820 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_gt_2)60821 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_gt_2) {
60822   for (uint32_t n = 3; n < 4; n++) {
60823     for (size_t k = 1; k <= 5; k += 2) {
60824       GemmMicrokernelTester()
60825         .mr(3)
60826         .nr(2)
60827         .kr(1)
60828         .sr(1)
60829         .m(3)
60830         .n(n)
60831         .k(k)
60832         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60833     }
60834   }
60835 }
60836 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_gt_2_strided_cn)60837 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_gt_2_strided_cn) {
60838   for (uint32_t n = 3; n < 4; n++) {
60839     for (size_t k = 1; k <= 5; k += 2) {
60840       GemmMicrokernelTester()
60841         .mr(3)
60842         .nr(2)
60843         .kr(1)
60844         .sr(1)
60845         .m(3)
60846         .n(n)
60847         .k(k)
60848         .cn_stride(5)
60849         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60850     }
60851   }
60852 }
60853 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_gt_2_strided_a)60854 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_gt_2_strided_a) {
60855   for (uint32_t n = 3; n < 4; n++) {
60856     for (size_t k = 1; k <= 5; k += 2) {
60857       GemmMicrokernelTester()
60858         .mr(3)
60859         .nr(2)
60860         .kr(1)
60861         .sr(1)
60862         .m(3)
60863         .n(n)
60864         .k(k)
60865         .a_stride(7)
60866         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60867     }
60868   }
60869 }
60870 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_gt_2_subtile)60871 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_gt_2_subtile) {
60872   for (uint32_t n = 3; n < 4; n++) {
60873     for (size_t k = 1; k <= 5; k += 2) {
60874       for (uint32_t m = 1; m <= 3; m++) {
60875         GemmMicrokernelTester()
60876           .mr(3)
60877           .nr(2)
60878           .kr(1)
60879           .sr(1)
60880           .m(m)
60881           .n(n)
60882           .k(k)
60883           .iterations(1)
60884           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60885       }
60886     }
60887   }
60888 }
60889 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_div_2)60890 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_div_2) {
60891   for (uint32_t n = 4; n <= 6; n += 2) {
60892     for (size_t k = 1; k <= 5; k += 2) {
60893       GemmMicrokernelTester()
60894         .mr(3)
60895         .nr(2)
60896         .kr(1)
60897         .sr(1)
60898         .m(3)
60899         .n(n)
60900         .k(k)
60901         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60902     }
60903   }
60904 }
60905 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_div_2_strided_cn)60906 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_div_2_strided_cn) {
60907   for (uint32_t n = 4; n <= 6; n += 2) {
60908     for (size_t k = 1; k <= 5; k += 2) {
60909       GemmMicrokernelTester()
60910         .mr(3)
60911         .nr(2)
60912         .kr(1)
60913         .sr(1)
60914         .m(3)
60915         .n(n)
60916         .k(k)
60917         .cn_stride(5)
60918         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60919     }
60920   }
60921 }
60922 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_div_2_strided_a)60923 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_div_2_strided_a) {
60924   for (uint32_t n = 4; n <= 6; n += 2) {
60925     for (size_t k = 1; k <= 5; k += 2) {
60926       GemmMicrokernelTester()
60927         .mr(3)
60928         .nr(2)
60929         .kr(1)
60930         .sr(1)
60931         .m(3)
60932         .n(n)
60933         .k(k)
60934         .a_stride(7)
60935         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60936     }
60937   }
60938 }
60939 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,n_div_2_subtile)60940 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, n_div_2_subtile) {
60941   for (uint32_t n = 4; n <= 6; n += 2) {
60942     for (size_t k = 1; k <= 5; k += 2) {
60943       for (uint32_t m = 1; m <= 3; m++) {
60944         GemmMicrokernelTester()
60945           .mr(3)
60946           .nr(2)
60947           .kr(1)
60948           .sr(1)
60949           .m(m)
60950           .n(n)
60951           .k(k)
60952           .iterations(1)
60953           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60954       }
60955     }
60956   }
60957 }
60958 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,strided_cm_subtile)60959 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, strided_cm_subtile) {
60960   for (size_t k = 1; k <= 5; k += 2) {
60961     for (uint32_t n = 1; n <= 2; n++) {
60962       for (uint32_t m = 1; m <= 3; m++) {
60963         GemmMicrokernelTester()
60964           .mr(3)
60965           .nr(2)
60966           .kr(1)
60967           .sr(1)
60968           .m(m)
60969           .n(n)
60970           .k(k)
60971           .cm_stride(5)
60972           .iterations(1)
60973           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60974       }
60975     }
60976   }
60977 }
60978 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,qmin)60979 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, qmin) {
60980   GemmMicrokernelTester()
60981     .mr(3)
60982     .nr(2)
60983     .kr(1)
60984     .sr(1)
60985     .m(3)
60986     .n(2)
60987     .k(1)
60988     .qmin(128)
60989     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
60990 }
60991 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,qmax)60992 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, qmax) {
60993   GemmMicrokernelTester()
60994     .mr(3)
60995     .nr(2)
60996     .kr(1)
60997     .sr(1)
60998     .m(3)
60999     .n(2)
61000     .k(1)
61001     .qmax(128)
61002     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61003 }
61004 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC,strided_cm)61005 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_FMAGIC, strided_cm) {
61006   GemmMicrokernelTester()
61007     .mr(3)
61008     .nr(2)
61009     .kr(1)
61010     .sr(1)
61011     .m(3)
61012     .n(2)
61013     .k(1)
61014     .cm_stride(5)
61015     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61016 }
61017 
61018 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_eq_1)61019 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_eq_1) {
61020   GemmMicrokernelTester()
61021     .mr(3)
61022     .nr(2)
61023     .kr(1)
61024     .sr(1)
61025     .m(3)
61026     .n(2)
61027     .k(1)
61028     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61029 }
61030 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,strided_cn)61031 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, strided_cn) {
61032   GemmMicrokernelTester()
61033     .mr(3)
61034     .nr(2)
61035     .kr(1)
61036     .sr(1)
61037     .m(3)
61038     .n(2)
61039     .k(1)
61040     .cn_stride(5)
61041     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61042 }
61043 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_eq_1_strided_a)61044 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_eq_1_strided_a) {
61045   GemmMicrokernelTester()
61046     .mr(3)
61047     .nr(2)
61048     .kr(1)
61049     .sr(1)
61050     .m(3)
61051     .n(2)
61052     .k(1)
61053     .a_stride(3)
61054     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61055 }
61056 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_eq_1_subtile)61057 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_eq_1_subtile) {
61058   for (uint32_t n = 1; n <= 2; n++) {
61059     for (uint32_t m = 1; m <= 3; m++) {
61060       GemmMicrokernelTester()
61061         .mr(3)
61062         .nr(2)
61063         .kr(1)
61064         .sr(1)
61065         .m(m)
61066         .n(n)
61067         .k(1)
61068         .iterations(1)
61069         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61070     }
61071   }
61072 }
61073 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_eq_1_subtile_m)61074 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_eq_1_subtile_m) {
61075   for (uint32_t m = 1; m <= 3; m++) {
61076     GemmMicrokernelTester()
61077       .mr(3)
61078       .nr(2)
61079       .kr(1)
61080       .sr(1)
61081       .m(m)
61082       .n(2)
61083       .k(1)
61084       .iterations(1)
61085       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61086   }
61087 }
61088 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_eq_1_subtile_n)61089 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_eq_1_subtile_n) {
61090   for (uint32_t n = 1; n <= 2; n++) {
61091     GemmMicrokernelTester()
61092       .mr(3)
61093       .nr(2)
61094       .kr(1)
61095       .sr(1)
61096       .m(3)
61097       .n(n)
61098       .k(1)
61099       .iterations(1)
61100       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61101   }
61102 }
61103 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_gt_1)61104 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_gt_1) {
61105   for (size_t k = 2; k < 10; k++) {
61106     GemmMicrokernelTester()
61107       .mr(3)
61108       .nr(2)
61109       .kr(1)
61110       .sr(1)
61111       .m(3)
61112       .n(2)
61113       .k(k)
61114       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61115   }
61116 }
61117 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_gt_1_strided_a)61118 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_gt_1_strided_a) {
61119   for (size_t k = 2; k < 10; k++) {
61120     GemmMicrokernelTester()
61121       .mr(3)
61122       .nr(2)
61123       .kr(1)
61124       .sr(1)
61125       .m(3)
61126       .n(2)
61127       .k(k)
61128       .a_stride(11)
61129       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61130   }
61131 }
61132 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,k_gt_1_subtile)61133 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, k_gt_1_subtile) {
61134   for (size_t k = 2; k < 10; k++) {
61135     for (uint32_t n = 1; n <= 2; n++) {
61136       for (uint32_t m = 1; m <= 3; m++) {
61137         GemmMicrokernelTester()
61138           .mr(3)
61139           .nr(2)
61140           .kr(1)
61141           .sr(1)
61142           .m(m)
61143           .n(n)
61144           .k(k)
61145           .iterations(1)
61146           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61147       }
61148     }
61149   }
61150 }
61151 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_gt_2)61152 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_gt_2) {
61153   for (uint32_t n = 3; n < 4; n++) {
61154     for (size_t k = 1; k <= 5; k += 2) {
61155       GemmMicrokernelTester()
61156         .mr(3)
61157         .nr(2)
61158         .kr(1)
61159         .sr(1)
61160         .m(3)
61161         .n(n)
61162         .k(k)
61163         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61164     }
61165   }
61166 }
61167 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_gt_2_strided_cn)61168 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_gt_2_strided_cn) {
61169   for (uint32_t n = 3; n < 4; n++) {
61170     for (size_t k = 1; k <= 5; k += 2) {
61171       GemmMicrokernelTester()
61172         .mr(3)
61173         .nr(2)
61174         .kr(1)
61175         .sr(1)
61176         .m(3)
61177         .n(n)
61178         .k(k)
61179         .cn_stride(5)
61180         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61181     }
61182   }
61183 }
61184 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_gt_2_strided_a)61185 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_gt_2_strided_a) {
61186   for (uint32_t n = 3; n < 4; n++) {
61187     for (size_t k = 1; k <= 5; k += 2) {
61188       GemmMicrokernelTester()
61189         .mr(3)
61190         .nr(2)
61191         .kr(1)
61192         .sr(1)
61193         .m(3)
61194         .n(n)
61195         .k(k)
61196         .a_stride(7)
61197         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61198     }
61199   }
61200 }
61201 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_gt_2_subtile)61202 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_gt_2_subtile) {
61203   for (uint32_t n = 3; n < 4; n++) {
61204     for (size_t k = 1; k <= 5; k += 2) {
61205       for (uint32_t m = 1; m <= 3; m++) {
61206         GemmMicrokernelTester()
61207           .mr(3)
61208           .nr(2)
61209           .kr(1)
61210           .sr(1)
61211           .m(m)
61212           .n(n)
61213           .k(k)
61214           .iterations(1)
61215           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61216       }
61217     }
61218   }
61219 }
61220 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_div_2)61221 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_div_2) {
61222   for (uint32_t n = 4; n <= 6; n += 2) {
61223     for (size_t k = 1; k <= 5; k += 2) {
61224       GemmMicrokernelTester()
61225         .mr(3)
61226         .nr(2)
61227         .kr(1)
61228         .sr(1)
61229         .m(3)
61230         .n(n)
61231         .k(k)
61232         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61233     }
61234   }
61235 }
61236 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_div_2_strided_cn)61237 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_div_2_strided_cn) {
61238   for (uint32_t n = 4; n <= 6; n += 2) {
61239     for (size_t k = 1; k <= 5; k += 2) {
61240       GemmMicrokernelTester()
61241         .mr(3)
61242         .nr(2)
61243         .kr(1)
61244         .sr(1)
61245         .m(3)
61246         .n(n)
61247         .k(k)
61248         .cn_stride(5)
61249         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61250     }
61251   }
61252 }
61253 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_div_2_strided_a)61254 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_div_2_strided_a) {
61255   for (uint32_t n = 4; n <= 6; n += 2) {
61256     for (size_t k = 1; k <= 5; k += 2) {
61257       GemmMicrokernelTester()
61258         .mr(3)
61259         .nr(2)
61260         .kr(1)
61261         .sr(1)
61262         .m(3)
61263         .n(n)
61264         .k(k)
61265         .a_stride(7)
61266         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61267     }
61268   }
61269 }
61270 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,n_div_2_subtile)61271 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, n_div_2_subtile) {
61272   for (uint32_t n = 4; n <= 6; n += 2) {
61273     for (size_t k = 1; k <= 5; k += 2) {
61274       for (uint32_t m = 1; m <= 3; m++) {
61275         GemmMicrokernelTester()
61276           .mr(3)
61277           .nr(2)
61278           .kr(1)
61279           .sr(1)
61280           .m(m)
61281           .n(n)
61282           .k(k)
61283           .iterations(1)
61284           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61285       }
61286     }
61287   }
61288 }
61289 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,strided_cm_subtile)61290 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, strided_cm_subtile) {
61291   for (size_t k = 1; k <= 5; k += 2) {
61292     for (uint32_t n = 1; n <= 2; n++) {
61293       for (uint32_t m = 1; m <= 3; m++) {
61294         GemmMicrokernelTester()
61295           .mr(3)
61296           .nr(2)
61297           .kr(1)
61298           .sr(1)
61299           .m(m)
61300           .n(n)
61301           .k(k)
61302           .cm_stride(5)
61303           .iterations(1)
61304           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61305       }
61306     }
61307   }
61308 }
61309 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,qmin)61310 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, qmin) {
61311   GemmMicrokernelTester()
61312     .mr(3)
61313     .nr(2)
61314     .kr(1)
61315     .sr(1)
61316     .m(3)
61317     .n(2)
61318     .k(1)
61319     .qmin(128)
61320     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61321 }
61322 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,qmax)61323 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, qmax) {
61324   GemmMicrokernelTester()
61325     .mr(3)
61326     .nr(2)
61327     .kr(1)
61328     .sr(1)
61329     .m(3)
61330     .n(2)
61331     .k(1)
61332     .qmax(128)
61333     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61334 }
61335 
TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF,strided_cm)61336 TEST(QS8_GEMM_MINMAX_FP32_3X2__SCALAR_LRINTF, strided_cm) {
61337   GemmMicrokernelTester()
61338     .mr(3)
61339     .nr(2)
61340     .kr(1)
61341     .sr(1)
61342     .m(3)
61343     .n(2)
61344     .k(1)
61345     .cm_stride(5)
61346     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61347 }
61348 
61349 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_eq_1)61350 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_eq_1) {
61351   GemmMicrokernelTester()
61352     .mr(3)
61353     .nr(4)
61354     .kr(1)
61355     .sr(1)
61356     .m(3)
61357     .n(4)
61358     .k(1)
61359     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61360 }
61361 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,strided_cn)61362 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, strided_cn) {
61363   GemmMicrokernelTester()
61364     .mr(3)
61365     .nr(4)
61366     .kr(1)
61367     .sr(1)
61368     .m(3)
61369     .n(4)
61370     .k(1)
61371     .cn_stride(7)
61372     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61373 }
61374 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_eq_1_strided_a)61375 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_eq_1_strided_a) {
61376   GemmMicrokernelTester()
61377     .mr(3)
61378     .nr(4)
61379     .kr(1)
61380     .sr(1)
61381     .m(3)
61382     .n(4)
61383     .k(1)
61384     .a_stride(3)
61385     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61386 }
61387 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_eq_1_subtile)61388 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_eq_1_subtile) {
61389   for (uint32_t n = 1; n <= 4; n++) {
61390     for (uint32_t m = 1; m <= 3; m++) {
61391       GemmMicrokernelTester()
61392         .mr(3)
61393         .nr(4)
61394         .kr(1)
61395         .sr(1)
61396         .m(m)
61397         .n(n)
61398         .k(1)
61399         .iterations(1)
61400         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61401     }
61402   }
61403 }
61404 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_eq_1_subtile_m)61405 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_eq_1_subtile_m) {
61406   for (uint32_t m = 1; m <= 3; m++) {
61407     GemmMicrokernelTester()
61408       .mr(3)
61409       .nr(4)
61410       .kr(1)
61411       .sr(1)
61412       .m(m)
61413       .n(4)
61414       .k(1)
61415       .iterations(1)
61416       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61417   }
61418 }
61419 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_eq_1_subtile_n)61420 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_eq_1_subtile_n) {
61421   for (uint32_t n = 1; n <= 4; n++) {
61422     GemmMicrokernelTester()
61423       .mr(3)
61424       .nr(4)
61425       .kr(1)
61426       .sr(1)
61427       .m(3)
61428       .n(n)
61429       .k(1)
61430       .iterations(1)
61431       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61432   }
61433 }
61434 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_gt_1)61435 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_gt_1) {
61436   for (size_t k = 2; k < 10; k++) {
61437     GemmMicrokernelTester()
61438       .mr(3)
61439       .nr(4)
61440       .kr(1)
61441       .sr(1)
61442       .m(3)
61443       .n(4)
61444       .k(k)
61445       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61446   }
61447 }
61448 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_gt_1_strided_a)61449 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_gt_1_strided_a) {
61450   for (size_t k = 2; k < 10; k++) {
61451     GemmMicrokernelTester()
61452       .mr(3)
61453       .nr(4)
61454       .kr(1)
61455       .sr(1)
61456       .m(3)
61457       .n(4)
61458       .k(k)
61459       .a_stride(11)
61460       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61461   }
61462 }
61463 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,k_gt_1_subtile)61464 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, k_gt_1_subtile) {
61465   for (size_t k = 2; k < 10; k++) {
61466     for (uint32_t n = 1; n <= 4; n++) {
61467       for (uint32_t m = 1; m <= 3; m++) {
61468         GemmMicrokernelTester()
61469           .mr(3)
61470           .nr(4)
61471           .kr(1)
61472           .sr(1)
61473           .m(m)
61474           .n(n)
61475           .k(k)
61476           .iterations(1)
61477           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61478       }
61479     }
61480   }
61481 }
61482 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_gt_4)61483 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_gt_4) {
61484   for (uint32_t n = 5; n < 8; n++) {
61485     for (size_t k = 1; k <= 5; k += 2) {
61486       GemmMicrokernelTester()
61487         .mr(3)
61488         .nr(4)
61489         .kr(1)
61490         .sr(1)
61491         .m(3)
61492         .n(n)
61493         .k(k)
61494         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61495     }
61496   }
61497 }
61498 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_gt_4_strided_cn)61499 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_gt_4_strided_cn) {
61500   for (uint32_t n = 5; n < 8; n++) {
61501     for (size_t k = 1; k <= 5; k += 2) {
61502       GemmMicrokernelTester()
61503         .mr(3)
61504         .nr(4)
61505         .kr(1)
61506         .sr(1)
61507         .m(3)
61508         .n(n)
61509         .k(k)
61510         .cn_stride(7)
61511         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61512     }
61513   }
61514 }
61515 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_gt_4_strided_a)61516 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_gt_4_strided_a) {
61517   for (uint32_t n = 5; n < 8; n++) {
61518     for (size_t k = 1; k <= 5; k += 2) {
61519       GemmMicrokernelTester()
61520         .mr(3)
61521         .nr(4)
61522         .kr(1)
61523         .sr(1)
61524         .m(3)
61525         .n(n)
61526         .k(k)
61527         .a_stride(7)
61528         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61529     }
61530   }
61531 }
61532 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_gt_4_subtile)61533 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_gt_4_subtile) {
61534   for (uint32_t n = 5; n < 8; n++) {
61535     for (size_t k = 1; k <= 5; k += 2) {
61536       for (uint32_t m = 1; m <= 3; m++) {
61537         GemmMicrokernelTester()
61538           .mr(3)
61539           .nr(4)
61540           .kr(1)
61541           .sr(1)
61542           .m(m)
61543           .n(n)
61544           .k(k)
61545           .iterations(1)
61546           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61547       }
61548     }
61549   }
61550 }
61551 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_div_4)61552 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_div_4) {
61553   for (uint32_t n = 8; n <= 12; n += 4) {
61554     for (size_t k = 1; k <= 5; k += 2) {
61555       GemmMicrokernelTester()
61556         .mr(3)
61557         .nr(4)
61558         .kr(1)
61559         .sr(1)
61560         .m(3)
61561         .n(n)
61562         .k(k)
61563         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61564     }
61565   }
61566 }
61567 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_div_4_strided_cn)61568 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_div_4_strided_cn) {
61569   for (uint32_t n = 8; n <= 12; n += 4) {
61570     for (size_t k = 1; k <= 5; k += 2) {
61571       GemmMicrokernelTester()
61572         .mr(3)
61573         .nr(4)
61574         .kr(1)
61575         .sr(1)
61576         .m(3)
61577         .n(n)
61578         .k(k)
61579         .cn_stride(7)
61580         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61581     }
61582   }
61583 }
61584 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_div_4_strided_a)61585 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_div_4_strided_a) {
61586   for (uint32_t n = 8; n <= 12; n += 4) {
61587     for (size_t k = 1; k <= 5; k += 2) {
61588       GemmMicrokernelTester()
61589         .mr(3)
61590         .nr(4)
61591         .kr(1)
61592         .sr(1)
61593         .m(3)
61594         .n(n)
61595         .k(k)
61596         .a_stride(7)
61597         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61598     }
61599   }
61600 }
61601 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,n_div_4_subtile)61602 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, n_div_4_subtile) {
61603   for (uint32_t n = 8; n <= 12; n += 4) {
61604     for (size_t k = 1; k <= 5; k += 2) {
61605       for (uint32_t m = 1; m <= 3; m++) {
61606         GemmMicrokernelTester()
61607           .mr(3)
61608           .nr(4)
61609           .kr(1)
61610           .sr(1)
61611           .m(m)
61612           .n(n)
61613           .k(k)
61614           .iterations(1)
61615           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61616       }
61617     }
61618   }
61619 }
61620 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,strided_cm_subtile)61621 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, strided_cm_subtile) {
61622   for (size_t k = 1; k <= 5; k += 2) {
61623     for (uint32_t n = 1; n <= 4; n++) {
61624       for (uint32_t m = 1; m <= 3; m++) {
61625         GemmMicrokernelTester()
61626           .mr(3)
61627           .nr(4)
61628           .kr(1)
61629           .sr(1)
61630           .m(m)
61631           .n(n)
61632           .k(k)
61633           .cm_stride(7)
61634           .iterations(1)
61635           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61636       }
61637     }
61638   }
61639 }
61640 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,qmin)61641 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, qmin) {
61642   GemmMicrokernelTester()
61643     .mr(3)
61644     .nr(4)
61645     .kr(1)
61646     .sr(1)
61647     .m(3)
61648     .n(4)
61649     .k(1)
61650     .qmin(128)
61651     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61652 }
61653 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,qmax)61654 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, qmax) {
61655   GemmMicrokernelTester()
61656     .mr(3)
61657     .nr(4)
61658     .kr(1)
61659     .sr(1)
61660     .m(3)
61661     .n(4)
61662     .k(1)
61663     .qmax(128)
61664     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61665 }
61666 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC,strided_cm)61667 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_FMAGIC, strided_cm) {
61668   GemmMicrokernelTester()
61669     .mr(3)
61670     .nr(4)
61671     .kr(1)
61672     .sr(1)
61673     .m(3)
61674     .n(4)
61675     .k(1)
61676     .cm_stride(7)
61677     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
61678 }
61679 
61680 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_eq_1)61681 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_eq_1) {
61682   GemmMicrokernelTester()
61683     .mr(3)
61684     .nr(4)
61685     .kr(1)
61686     .sr(1)
61687     .m(3)
61688     .n(4)
61689     .k(1)
61690     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61691 }
61692 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,strided_cn)61693 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, strided_cn) {
61694   GemmMicrokernelTester()
61695     .mr(3)
61696     .nr(4)
61697     .kr(1)
61698     .sr(1)
61699     .m(3)
61700     .n(4)
61701     .k(1)
61702     .cn_stride(7)
61703     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61704 }
61705 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_eq_1_strided_a)61706 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_eq_1_strided_a) {
61707   GemmMicrokernelTester()
61708     .mr(3)
61709     .nr(4)
61710     .kr(1)
61711     .sr(1)
61712     .m(3)
61713     .n(4)
61714     .k(1)
61715     .a_stride(3)
61716     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61717 }
61718 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_eq_1_subtile)61719 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_eq_1_subtile) {
61720   for (uint32_t n = 1; n <= 4; n++) {
61721     for (uint32_t m = 1; m <= 3; m++) {
61722       GemmMicrokernelTester()
61723         .mr(3)
61724         .nr(4)
61725         .kr(1)
61726         .sr(1)
61727         .m(m)
61728         .n(n)
61729         .k(1)
61730         .iterations(1)
61731         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61732     }
61733   }
61734 }
61735 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_eq_1_subtile_m)61736 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_eq_1_subtile_m) {
61737   for (uint32_t m = 1; m <= 3; m++) {
61738     GemmMicrokernelTester()
61739       .mr(3)
61740       .nr(4)
61741       .kr(1)
61742       .sr(1)
61743       .m(m)
61744       .n(4)
61745       .k(1)
61746       .iterations(1)
61747       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61748   }
61749 }
61750 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_eq_1_subtile_n)61751 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_eq_1_subtile_n) {
61752   for (uint32_t n = 1; n <= 4; n++) {
61753     GemmMicrokernelTester()
61754       .mr(3)
61755       .nr(4)
61756       .kr(1)
61757       .sr(1)
61758       .m(3)
61759       .n(n)
61760       .k(1)
61761       .iterations(1)
61762       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61763   }
61764 }
61765 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_gt_1)61766 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_gt_1) {
61767   for (size_t k = 2; k < 10; k++) {
61768     GemmMicrokernelTester()
61769       .mr(3)
61770       .nr(4)
61771       .kr(1)
61772       .sr(1)
61773       .m(3)
61774       .n(4)
61775       .k(k)
61776       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61777   }
61778 }
61779 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_gt_1_strided_a)61780 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_gt_1_strided_a) {
61781   for (size_t k = 2; k < 10; k++) {
61782     GemmMicrokernelTester()
61783       .mr(3)
61784       .nr(4)
61785       .kr(1)
61786       .sr(1)
61787       .m(3)
61788       .n(4)
61789       .k(k)
61790       .a_stride(11)
61791       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61792   }
61793 }
61794 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,k_gt_1_subtile)61795 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, k_gt_1_subtile) {
61796   for (size_t k = 2; k < 10; k++) {
61797     for (uint32_t n = 1; n <= 4; n++) {
61798       for (uint32_t m = 1; m <= 3; m++) {
61799         GemmMicrokernelTester()
61800           .mr(3)
61801           .nr(4)
61802           .kr(1)
61803           .sr(1)
61804           .m(m)
61805           .n(n)
61806           .k(k)
61807           .iterations(1)
61808           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61809       }
61810     }
61811   }
61812 }
61813 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_gt_4)61814 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_gt_4) {
61815   for (uint32_t n = 5; n < 8; n++) {
61816     for (size_t k = 1; k <= 5; k += 2) {
61817       GemmMicrokernelTester()
61818         .mr(3)
61819         .nr(4)
61820         .kr(1)
61821         .sr(1)
61822         .m(3)
61823         .n(n)
61824         .k(k)
61825         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61826     }
61827   }
61828 }
61829 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_gt_4_strided_cn)61830 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_gt_4_strided_cn) {
61831   for (uint32_t n = 5; n < 8; n++) {
61832     for (size_t k = 1; k <= 5; k += 2) {
61833       GemmMicrokernelTester()
61834         .mr(3)
61835         .nr(4)
61836         .kr(1)
61837         .sr(1)
61838         .m(3)
61839         .n(n)
61840         .k(k)
61841         .cn_stride(7)
61842         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61843     }
61844   }
61845 }
61846 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_gt_4_strided_a)61847 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_gt_4_strided_a) {
61848   for (uint32_t n = 5; n < 8; n++) {
61849     for (size_t k = 1; k <= 5; k += 2) {
61850       GemmMicrokernelTester()
61851         .mr(3)
61852         .nr(4)
61853         .kr(1)
61854         .sr(1)
61855         .m(3)
61856         .n(n)
61857         .k(k)
61858         .a_stride(7)
61859         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61860     }
61861   }
61862 }
61863 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_gt_4_subtile)61864 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_gt_4_subtile) {
61865   for (uint32_t n = 5; n < 8; n++) {
61866     for (size_t k = 1; k <= 5; k += 2) {
61867       for (uint32_t m = 1; m <= 3; m++) {
61868         GemmMicrokernelTester()
61869           .mr(3)
61870           .nr(4)
61871           .kr(1)
61872           .sr(1)
61873           .m(m)
61874           .n(n)
61875           .k(k)
61876           .iterations(1)
61877           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61878       }
61879     }
61880   }
61881 }
61882 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_div_4)61883 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_div_4) {
61884   for (uint32_t n = 8; n <= 12; n += 4) {
61885     for (size_t k = 1; k <= 5; k += 2) {
61886       GemmMicrokernelTester()
61887         .mr(3)
61888         .nr(4)
61889         .kr(1)
61890         .sr(1)
61891         .m(3)
61892         .n(n)
61893         .k(k)
61894         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61895     }
61896   }
61897 }
61898 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_div_4_strided_cn)61899 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_div_4_strided_cn) {
61900   for (uint32_t n = 8; n <= 12; n += 4) {
61901     for (size_t k = 1; k <= 5; k += 2) {
61902       GemmMicrokernelTester()
61903         .mr(3)
61904         .nr(4)
61905         .kr(1)
61906         .sr(1)
61907         .m(3)
61908         .n(n)
61909         .k(k)
61910         .cn_stride(7)
61911         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61912     }
61913   }
61914 }
61915 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_div_4_strided_a)61916 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_div_4_strided_a) {
61917   for (uint32_t n = 8; n <= 12; n += 4) {
61918     for (size_t k = 1; k <= 5; k += 2) {
61919       GemmMicrokernelTester()
61920         .mr(3)
61921         .nr(4)
61922         .kr(1)
61923         .sr(1)
61924         .m(3)
61925         .n(n)
61926         .k(k)
61927         .a_stride(7)
61928         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61929     }
61930   }
61931 }
61932 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,n_div_4_subtile)61933 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, n_div_4_subtile) {
61934   for (uint32_t n = 8; n <= 12; n += 4) {
61935     for (size_t k = 1; k <= 5; k += 2) {
61936       for (uint32_t m = 1; m <= 3; m++) {
61937         GemmMicrokernelTester()
61938           .mr(3)
61939           .nr(4)
61940           .kr(1)
61941           .sr(1)
61942           .m(m)
61943           .n(n)
61944           .k(k)
61945           .iterations(1)
61946           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61947       }
61948     }
61949   }
61950 }
61951 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,strided_cm_subtile)61952 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, strided_cm_subtile) {
61953   for (size_t k = 1; k <= 5; k += 2) {
61954     for (uint32_t n = 1; n <= 4; n++) {
61955       for (uint32_t m = 1; m <= 3; m++) {
61956         GemmMicrokernelTester()
61957           .mr(3)
61958           .nr(4)
61959           .kr(1)
61960           .sr(1)
61961           .m(m)
61962           .n(n)
61963           .k(k)
61964           .cm_stride(7)
61965           .iterations(1)
61966           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61967       }
61968     }
61969   }
61970 }
61971 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,qmin)61972 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, qmin) {
61973   GemmMicrokernelTester()
61974     .mr(3)
61975     .nr(4)
61976     .kr(1)
61977     .sr(1)
61978     .m(3)
61979     .n(4)
61980     .k(1)
61981     .qmin(128)
61982     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61983 }
61984 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,qmax)61985 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, qmax) {
61986   GemmMicrokernelTester()
61987     .mr(3)
61988     .nr(4)
61989     .kr(1)
61990     .sr(1)
61991     .m(3)
61992     .n(4)
61993     .k(1)
61994     .qmax(128)
61995     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
61996 }
61997 
TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF,strided_cm)61998 TEST(QS8_GEMM_MINMAX_FP32_3X4__SCALAR_LRINTF, strided_cm) {
61999   GemmMicrokernelTester()
62000     .mr(3)
62001     .nr(4)
62002     .kr(1)
62003     .sr(1)
62004     .m(3)
62005     .n(4)
62006     .k(1)
62007     .cm_stride(7)
62008     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_3x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62009 }
62010 
62011 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_eq_1)62012 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_eq_1) {
62013   GemmMicrokernelTester()
62014     .mr(4)
62015     .nr(2)
62016     .kr(1)
62017     .sr(1)
62018     .m(4)
62019     .n(2)
62020     .k(1)
62021     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62022 }
62023 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,strided_cn)62024 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, strided_cn) {
62025   GemmMicrokernelTester()
62026     .mr(4)
62027     .nr(2)
62028     .kr(1)
62029     .sr(1)
62030     .m(4)
62031     .n(2)
62032     .k(1)
62033     .cn_stride(5)
62034     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62035 }
62036 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_eq_1_strided_a)62037 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_eq_1_strided_a) {
62038   GemmMicrokernelTester()
62039     .mr(4)
62040     .nr(2)
62041     .kr(1)
62042     .sr(1)
62043     .m(4)
62044     .n(2)
62045     .k(1)
62046     .a_stride(3)
62047     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62048 }
62049 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_eq_1_subtile)62050 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_eq_1_subtile) {
62051   for (uint32_t n = 1; n <= 2; n++) {
62052     for (uint32_t m = 1; m <= 4; m++) {
62053       GemmMicrokernelTester()
62054         .mr(4)
62055         .nr(2)
62056         .kr(1)
62057         .sr(1)
62058         .m(m)
62059         .n(n)
62060         .k(1)
62061         .iterations(1)
62062         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62063     }
62064   }
62065 }
62066 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_eq_1_subtile_m)62067 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_eq_1_subtile_m) {
62068   for (uint32_t m = 1; m <= 4; m++) {
62069     GemmMicrokernelTester()
62070       .mr(4)
62071       .nr(2)
62072       .kr(1)
62073       .sr(1)
62074       .m(m)
62075       .n(2)
62076       .k(1)
62077       .iterations(1)
62078       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62079   }
62080 }
62081 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_eq_1_subtile_n)62082 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_eq_1_subtile_n) {
62083   for (uint32_t n = 1; n <= 2; n++) {
62084     GemmMicrokernelTester()
62085       .mr(4)
62086       .nr(2)
62087       .kr(1)
62088       .sr(1)
62089       .m(4)
62090       .n(n)
62091       .k(1)
62092       .iterations(1)
62093       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62094   }
62095 }
62096 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_gt_1)62097 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_gt_1) {
62098   for (size_t k = 2; k < 10; k++) {
62099     GemmMicrokernelTester()
62100       .mr(4)
62101       .nr(2)
62102       .kr(1)
62103       .sr(1)
62104       .m(4)
62105       .n(2)
62106       .k(k)
62107       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62108   }
62109 }
62110 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_gt_1_strided_a)62111 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_gt_1_strided_a) {
62112   for (size_t k = 2; k < 10; k++) {
62113     GemmMicrokernelTester()
62114       .mr(4)
62115       .nr(2)
62116       .kr(1)
62117       .sr(1)
62118       .m(4)
62119       .n(2)
62120       .k(k)
62121       .a_stride(11)
62122       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62123   }
62124 }
62125 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,k_gt_1_subtile)62126 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, k_gt_1_subtile) {
62127   for (size_t k = 2; k < 10; k++) {
62128     for (uint32_t n = 1; n <= 2; n++) {
62129       for (uint32_t m = 1; m <= 4; m++) {
62130         GemmMicrokernelTester()
62131           .mr(4)
62132           .nr(2)
62133           .kr(1)
62134           .sr(1)
62135           .m(m)
62136           .n(n)
62137           .k(k)
62138           .iterations(1)
62139           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62140       }
62141     }
62142   }
62143 }
62144 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_gt_2)62145 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_gt_2) {
62146   for (uint32_t n = 3; n < 4; n++) {
62147     for (size_t k = 1; k <= 5; k += 2) {
62148       GemmMicrokernelTester()
62149         .mr(4)
62150         .nr(2)
62151         .kr(1)
62152         .sr(1)
62153         .m(4)
62154         .n(n)
62155         .k(k)
62156         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62157     }
62158   }
62159 }
62160 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_gt_2_strided_cn)62161 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_gt_2_strided_cn) {
62162   for (uint32_t n = 3; n < 4; n++) {
62163     for (size_t k = 1; k <= 5; k += 2) {
62164       GemmMicrokernelTester()
62165         .mr(4)
62166         .nr(2)
62167         .kr(1)
62168         .sr(1)
62169         .m(4)
62170         .n(n)
62171         .k(k)
62172         .cn_stride(5)
62173         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62174     }
62175   }
62176 }
62177 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_gt_2_strided_a)62178 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_gt_2_strided_a) {
62179   for (uint32_t n = 3; n < 4; n++) {
62180     for (size_t k = 1; k <= 5; k += 2) {
62181       GemmMicrokernelTester()
62182         .mr(4)
62183         .nr(2)
62184         .kr(1)
62185         .sr(1)
62186         .m(4)
62187         .n(n)
62188         .k(k)
62189         .a_stride(7)
62190         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62191     }
62192   }
62193 }
62194 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_gt_2_subtile)62195 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_gt_2_subtile) {
62196   for (uint32_t n = 3; n < 4; n++) {
62197     for (size_t k = 1; k <= 5; k += 2) {
62198       for (uint32_t m = 1; m <= 4; m++) {
62199         GemmMicrokernelTester()
62200           .mr(4)
62201           .nr(2)
62202           .kr(1)
62203           .sr(1)
62204           .m(m)
62205           .n(n)
62206           .k(k)
62207           .iterations(1)
62208           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62209       }
62210     }
62211   }
62212 }
62213 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_div_2)62214 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_div_2) {
62215   for (uint32_t n = 4; n <= 6; n += 2) {
62216     for (size_t k = 1; k <= 5; k += 2) {
62217       GemmMicrokernelTester()
62218         .mr(4)
62219         .nr(2)
62220         .kr(1)
62221         .sr(1)
62222         .m(4)
62223         .n(n)
62224         .k(k)
62225         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62226     }
62227   }
62228 }
62229 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_div_2_strided_cn)62230 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_div_2_strided_cn) {
62231   for (uint32_t n = 4; n <= 6; n += 2) {
62232     for (size_t k = 1; k <= 5; k += 2) {
62233       GemmMicrokernelTester()
62234         .mr(4)
62235         .nr(2)
62236         .kr(1)
62237         .sr(1)
62238         .m(4)
62239         .n(n)
62240         .k(k)
62241         .cn_stride(5)
62242         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62243     }
62244   }
62245 }
62246 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_div_2_strided_a)62247 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_div_2_strided_a) {
62248   for (uint32_t n = 4; n <= 6; n += 2) {
62249     for (size_t k = 1; k <= 5; k += 2) {
62250       GemmMicrokernelTester()
62251         .mr(4)
62252         .nr(2)
62253         .kr(1)
62254         .sr(1)
62255         .m(4)
62256         .n(n)
62257         .k(k)
62258         .a_stride(7)
62259         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62260     }
62261   }
62262 }
62263 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,n_div_2_subtile)62264 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, n_div_2_subtile) {
62265   for (uint32_t n = 4; n <= 6; n += 2) {
62266     for (size_t k = 1; k <= 5; k += 2) {
62267       for (uint32_t m = 1; m <= 4; m++) {
62268         GemmMicrokernelTester()
62269           .mr(4)
62270           .nr(2)
62271           .kr(1)
62272           .sr(1)
62273           .m(m)
62274           .n(n)
62275           .k(k)
62276           .iterations(1)
62277           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62278       }
62279     }
62280   }
62281 }
62282 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,strided_cm_subtile)62283 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, strided_cm_subtile) {
62284   for (size_t k = 1; k <= 5; k += 2) {
62285     for (uint32_t n = 1; n <= 2; n++) {
62286       for (uint32_t m = 1; m <= 4; m++) {
62287         GemmMicrokernelTester()
62288           .mr(4)
62289           .nr(2)
62290           .kr(1)
62291           .sr(1)
62292           .m(m)
62293           .n(n)
62294           .k(k)
62295           .cm_stride(5)
62296           .iterations(1)
62297           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62298       }
62299     }
62300   }
62301 }
62302 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,qmin)62303 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, qmin) {
62304   GemmMicrokernelTester()
62305     .mr(4)
62306     .nr(2)
62307     .kr(1)
62308     .sr(1)
62309     .m(4)
62310     .n(2)
62311     .k(1)
62312     .qmin(128)
62313     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62314 }
62315 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,qmax)62316 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, qmax) {
62317   GemmMicrokernelTester()
62318     .mr(4)
62319     .nr(2)
62320     .kr(1)
62321     .sr(1)
62322     .m(4)
62323     .n(2)
62324     .k(1)
62325     .qmax(128)
62326     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62327 }
62328 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC,strided_cm)62329 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_FMAGIC, strided_cm) {
62330   GemmMicrokernelTester()
62331     .mr(4)
62332     .nr(2)
62333     .kr(1)
62334     .sr(1)
62335     .m(4)
62336     .n(2)
62337     .k(1)
62338     .cm_stride(5)
62339     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62340 }
62341 
62342 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_eq_1)62343 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_eq_1) {
62344   GemmMicrokernelTester()
62345     .mr(4)
62346     .nr(2)
62347     .kr(1)
62348     .sr(1)
62349     .m(4)
62350     .n(2)
62351     .k(1)
62352     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62353 }
62354 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,strided_cn)62355 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, strided_cn) {
62356   GemmMicrokernelTester()
62357     .mr(4)
62358     .nr(2)
62359     .kr(1)
62360     .sr(1)
62361     .m(4)
62362     .n(2)
62363     .k(1)
62364     .cn_stride(5)
62365     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62366 }
62367 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_eq_1_strided_a)62368 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_eq_1_strided_a) {
62369   GemmMicrokernelTester()
62370     .mr(4)
62371     .nr(2)
62372     .kr(1)
62373     .sr(1)
62374     .m(4)
62375     .n(2)
62376     .k(1)
62377     .a_stride(3)
62378     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62379 }
62380 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_eq_1_subtile)62381 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_eq_1_subtile) {
62382   for (uint32_t n = 1; n <= 2; n++) {
62383     for (uint32_t m = 1; m <= 4; m++) {
62384       GemmMicrokernelTester()
62385         .mr(4)
62386         .nr(2)
62387         .kr(1)
62388         .sr(1)
62389         .m(m)
62390         .n(n)
62391         .k(1)
62392         .iterations(1)
62393         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62394     }
62395   }
62396 }
62397 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_eq_1_subtile_m)62398 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_eq_1_subtile_m) {
62399   for (uint32_t m = 1; m <= 4; m++) {
62400     GemmMicrokernelTester()
62401       .mr(4)
62402       .nr(2)
62403       .kr(1)
62404       .sr(1)
62405       .m(m)
62406       .n(2)
62407       .k(1)
62408       .iterations(1)
62409       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62410   }
62411 }
62412 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_eq_1_subtile_n)62413 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_eq_1_subtile_n) {
62414   for (uint32_t n = 1; n <= 2; n++) {
62415     GemmMicrokernelTester()
62416       .mr(4)
62417       .nr(2)
62418       .kr(1)
62419       .sr(1)
62420       .m(4)
62421       .n(n)
62422       .k(1)
62423       .iterations(1)
62424       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62425   }
62426 }
62427 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_gt_1)62428 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_gt_1) {
62429   for (size_t k = 2; k < 10; k++) {
62430     GemmMicrokernelTester()
62431       .mr(4)
62432       .nr(2)
62433       .kr(1)
62434       .sr(1)
62435       .m(4)
62436       .n(2)
62437       .k(k)
62438       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62439   }
62440 }
62441 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_gt_1_strided_a)62442 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_gt_1_strided_a) {
62443   for (size_t k = 2; k < 10; k++) {
62444     GemmMicrokernelTester()
62445       .mr(4)
62446       .nr(2)
62447       .kr(1)
62448       .sr(1)
62449       .m(4)
62450       .n(2)
62451       .k(k)
62452       .a_stride(11)
62453       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62454   }
62455 }
62456 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,k_gt_1_subtile)62457 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, k_gt_1_subtile) {
62458   for (size_t k = 2; k < 10; k++) {
62459     for (uint32_t n = 1; n <= 2; n++) {
62460       for (uint32_t m = 1; m <= 4; m++) {
62461         GemmMicrokernelTester()
62462           .mr(4)
62463           .nr(2)
62464           .kr(1)
62465           .sr(1)
62466           .m(m)
62467           .n(n)
62468           .k(k)
62469           .iterations(1)
62470           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62471       }
62472     }
62473   }
62474 }
62475 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_gt_2)62476 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_gt_2) {
62477   for (uint32_t n = 3; n < 4; n++) {
62478     for (size_t k = 1; k <= 5; k += 2) {
62479       GemmMicrokernelTester()
62480         .mr(4)
62481         .nr(2)
62482         .kr(1)
62483         .sr(1)
62484         .m(4)
62485         .n(n)
62486         .k(k)
62487         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62488     }
62489   }
62490 }
62491 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_gt_2_strided_cn)62492 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_gt_2_strided_cn) {
62493   for (uint32_t n = 3; n < 4; n++) {
62494     for (size_t k = 1; k <= 5; k += 2) {
62495       GemmMicrokernelTester()
62496         .mr(4)
62497         .nr(2)
62498         .kr(1)
62499         .sr(1)
62500         .m(4)
62501         .n(n)
62502         .k(k)
62503         .cn_stride(5)
62504         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62505     }
62506   }
62507 }
62508 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_gt_2_strided_a)62509 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_gt_2_strided_a) {
62510   for (uint32_t n = 3; n < 4; n++) {
62511     for (size_t k = 1; k <= 5; k += 2) {
62512       GemmMicrokernelTester()
62513         .mr(4)
62514         .nr(2)
62515         .kr(1)
62516         .sr(1)
62517         .m(4)
62518         .n(n)
62519         .k(k)
62520         .a_stride(7)
62521         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62522     }
62523   }
62524 }
62525 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_gt_2_subtile)62526 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_gt_2_subtile) {
62527   for (uint32_t n = 3; n < 4; n++) {
62528     for (size_t k = 1; k <= 5; k += 2) {
62529       for (uint32_t m = 1; m <= 4; m++) {
62530         GemmMicrokernelTester()
62531           .mr(4)
62532           .nr(2)
62533           .kr(1)
62534           .sr(1)
62535           .m(m)
62536           .n(n)
62537           .k(k)
62538           .iterations(1)
62539           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62540       }
62541     }
62542   }
62543 }
62544 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_div_2)62545 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_div_2) {
62546   for (uint32_t n = 4; n <= 6; n += 2) {
62547     for (size_t k = 1; k <= 5; k += 2) {
62548       GemmMicrokernelTester()
62549         .mr(4)
62550         .nr(2)
62551         .kr(1)
62552         .sr(1)
62553         .m(4)
62554         .n(n)
62555         .k(k)
62556         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62557     }
62558   }
62559 }
62560 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_div_2_strided_cn)62561 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_div_2_strided_cn) {
62562   for (uint32_t n = 4; n <= 6; n += 2) {
62563     for (size_t k = 1; k <= 5; k += 2) {
62564       GemmMicrokernelTester()
62565         .mr(4)
62566         .nr(2)
62567         .kr(1)
62568         .sr(1)
62569         .m(4)
62570         .n(n)
62571         .k(k)
62572         .cn_stride(5)
62573         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62574     }
62575   }
62576 }
62577 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_div_2_strided_a)62578 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_div_2_strided_a) {
62579   for (uint32_t n = 4; n <= 6; n += 2) {
62580     for (size_t k = 1; k <= 5; k += 2) {
62581       GemmMicrokernelTester()
62582         .mr(4)
62583         .nr(2)
62584         .kr(1)
62585         .sr(1)
62586         .m(4)
62587         .n(n)
62588         .k(k)
62589         .a_stride(7)
62590         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62591     }
62592   }
62593 }
62594 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,n_div_2_subtile)62595 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, n_div_2_subtile) {
62596   for (uint32_t n = 4; n <= 6; n += 2) {
62597     for (size_t k = 1; k <= 5; k += 2) {
62598       for (uint32_t m = 1; m <= 4; m++) {
62599         GemmMicrokernelTester()
62600           .mr(4)
62601           .nr(2)
62602           .kr(1)
62603           .sr(1)
62604           .m(m)
62605           .n(n)
62606           .k(k)
62607           .iterations(1)
62608           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62609       }
62610     }
62611   }
62612 }
62613 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,strided_cm_subtile)62614 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, strided_cm_subtile) {
62615   for (size_t k = 1; k <= 5; k += 2) {
62616     for (uint32_t n = 1; n <= 2; n++) {
62617       for (uint32_t m = 1; m <= 4; m++) {
62618         GemmMicrokernelTester()
62619           .mr(4)
62620           .nr(2)
62621           .kr(1)
62622           .sr(1)
62623           .m(m)
62624           .n(n)
62625           .k(k)
62626           .cm_stride(5)
62627           .iterations(1)
62628           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62629       }
62630     }
62631   }
62632 }
62633 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,qmin)62634 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, qmin) {
62635   GemmMicrokernelTester()
62636     .mr(4)
62637     .nr(2)
62638     .kr(1)
62639     .sr(1)
62640     .m(4)
62641     .n(2)
62642     .k(1)
62643     .qmin(128)
62644     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62645 }
62646 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,qmax)62647 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, qmax) {
62648   GemmMicrokernelTester()
62649     .mr(4)
62650     .nr(2)
62651     .kr(1)
62652     .sr(1)
62653     .m(4)
62654     .n(2)
62655     .k(1)
62656     .qmax(128)
62657     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62658 }
62659 
TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF,strided_cm)62660 TEST(QS8_GEMM_MINMAX_FP32_4X2__SCALAR_LRINTF, strided_cm) {
62661   GemmMicrokernelTester()
62662     .mr(4)
62663     .nr(2)
62664     .kr(1)
62665     .sr(1)
62666     .m(4)
62667     .n(2)
62668     .k(1)
62669     .cm_stride(5)
62670     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x2__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
62671 }
62672 
62673 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_eq_1)62674 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_eq_1) {
62675   GemmMicrokernelTester()
62676     .mr(4)
62677     .nr(4)
62678     .kr(1)
62679     .sr(1)
62680     .m(4)
62681     .n(4)
62682     .k(1)
62683     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62684 }
62685 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,strided_cn)62686 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, strided_cn) {
62687   GemmMicrokernelTester()
62688     .mr(4)
62689     .nr(4)
62690     .kr(1)
62691     .sr(1)
62692     .m(4)
62693     .n(4)
62694     .k(1)
62695     .cn_stride(7)
62696     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62697 }
62698 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_eq_1_strided_a)62699 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_eq_1_strided_a) {
62700   GemmMicrokernelTester()
62701     .mr(4)
62702     .nr(4)
62703     .kr(1)
62704     .sr(1)
62705     .m(4)
62706     .n(4)
62707     .k(1)
62708     .a_stride(3)
62709     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62710 }
62711 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_eq_1_subtile)62712 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_eq_1_subtile) {
62713   for (uint32_t n = 1; n <= 4; n++) {
62714     for (uint32_t m = 1; m <= 4; m++) {
62715       GemmMicrokernelTester()
62716         .mr(4)
62717         .nr(4)
62718         .kr(1)
62719         .sr(1)
62720         .m(m)
62721         .n(n)
62722         .k(1)
62723         .iterations(1)
62724         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62725     }
62726   }
62727 }
62728 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_eq_1_subtile_m)62729 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_eq_1_subtile_m) {
62730   for (uint32_t m = 1; m <= 4; m++) {
62731     GemmMicrokernelTester()
62732       .mr(4)
62733       .nr(4)
62734       .kr(1)
62735       .sr(1)
62736       .m(m)
62737       .n(4)
62738       .k(1)
62739       .iterations(1)
62740       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62741   }
62742 }
62743 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_eq_1_subtile_n)62744 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_eq_1_subtile_n) {
62745   for (uint32_t n = 1; n <= 4; n++) {
62746     GemmMicrokernelTester()
62747       .mr(4)
62748       .nr(4)
62749       .kr(1)
62750       .sr(1)
62751       .m(4)
62752       .n(n)
62753       .k(1)
62754       .iterations(1)
62755       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62756   }
62757 }
62758 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_gt_1)62759 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_gt_1) {
62760   for (size_t k = 2; k < 10; k++) {
62761     GemmMicrokernelTester()
62762       .mr(4)
62763       .nr(4)
62764       .kr(1)
62765       .sr(1)
62766       .m(4)
62767       .n(4)
62768       .k(k)
62769       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62770   }
62771 }
62772 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_gt_1_strided_a)62773 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_gt_1_strided_a) {
62774   for (size_t k = 2; k < 10; k++) {
62775     GemmMicrokernelTester()
62776       .mr(4)
62777       .nr(4)
62778       .kr(1)
62779       .sr(1)
62780       .m(4)
62781       .n(4)
62782       .k(k)
62783       .a_stride(11)
62784       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62785   }
62786 }
62787 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,k_gt_1_subtile)62788 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, k_gt_1_subtile) {
62789   for (size_t k = 2; k < 10; k++) {
62790     for (uint32_t n = 1; n <= 4; n++) {
62791       for (uint32_t m = 1; m <= 4; m++) {
62792         GemmMicrokernelTester()
62793           .mr(4)
62794           .nr(4)
62795           .kr(1)
62796           .sr(1)
62797           .m(m)
62798           .n(n)
62799           .k(k)
62800           .iterations(1)
62801           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62802       }
62803     }
62804   }
62805 }
62806 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_gt_4)62807 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_gt_4) {
62808   for (uint32_t n = 5; n < 8; n++) {
62809     for (size_t k = 1; k <= 5; k += 2) {
62810       GemmMicrokernelTester()
62811         .mr(4)
62812         .nr(4)
62813         .kr(1)
62814         .sr(1)
62815         .m(4)
62816         .n(n)
62817         .k(k)
62818         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62819     }
62820   }
62821 }
62822 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_gt_4_strided_cn)62823 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_gt_4_strided_cn) {
62824   for (uint32_t n = 5; n < 8; n++) {
62825     for (size_t k = 1; k <= 5; k += 2) {
62826       GemmMicrokernelTester()
62827         .mr(4)
62828         .nr(4)
62829         .kr(1)
62830         .sr(1)
62831         .m(4)
62832         .n(n)
62833         .k(k)
62834         .cn_stride(7)
62835         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62836     }
62837   }
62838 }
62839 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_gt_4_strided_a)62840 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_gt_4_strided_a) {
62841   for (uint32_t n = 5; n < 8; n++) {
62842     for (size_t k = 1; k <= 5; k += 2) {
62843       GemmMicrokernelTester()
62844         .mr(4)
62845         .nr(4)
62846         .kr(1)
62847         .sr(1)
62848         .m(4)
62849         .n(n)
62850         .k(k)
62851         .a_stride(7)
62852         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62853     }
62854   }
62855 }
62856 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_gt_4_subtile)62857 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_gt_4_subtile) {
62858   for (uint32_t n = 5; n < 8; n++) {
62859     for (size_t k = 1; k <= 5; k += 2) {
62860       for (uint32_t m = 1; m <= 4; m++) {
62861         GemmMicrokernelTester()
62862           .mr(4)
62863           .nr(4)
62864           .kr(1)
62865           .sr(1)
62866           .m(m)
62867           .n(n)
62868           .k(k)
62869           .iterations(1)
62870           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62871       }
62872     }
62873   }
62874 }
62875 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_div_4)62876 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_div_4) {
62877   for (uint32_t n = 8; n <= 12; n += 4) {
62878     for (size_t k = 1; k <= 5; k += 2) {
62879       GemmMicrokernelTester()
62880         .mr(4)
62881         .nr(4)
62882         .kr(1)
62883         .sr(1)
62884         .m(4)
62885         .n(n)
62886         .k(k)
62887         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62888     }
62889   }
62890 }
62891 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_div_4_strided_cn)62892 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_div_4_strided_cn) {
62893   for (uint32_t n = 8; n <= 12; n += 4) {
62894     for (size_t k = 1; k <= 5; k += 2) {
62895       GemmMicrokernelTester()
62896         .mr(4)
62897         .nr(4)
62898         .kr(1)
62899         .sr(1)
62900         .m(4)
62901         .n(n)
62902         .k(k)
62903         .cn_stride(7)
62904         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62905     }
62906   }
62907 }
62908 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_div_4_strided_a)62909 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_div_4_strided_a) {
62910   for (uint32_t n = 8; n <= 12; n += 4) {
62911     for (size_t k = 1; k <= 5; k += 2) {
62912       GemmMicrokernelTester()
62913         .mr(4)
62914         .nr(4)
62915         .kr(1)
62916         .sr(1)
62917         .m(4)
62918         .n(n)
62919         .k(k)
62920         .a_stride(7)
62921         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62922     }
62923   }
62924 }
62925 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,n_div_4_subtile)62926 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, n_div_4_subtile) {
62927   for (uint32_t n = 8; n <= 12; n += 4) {
62928     for (size_t k = 1; k <= 5; k += 2) {
62929       for (uint32_t m = 1; m <= 4; m++) {
62930         GemmMicrokernelTester()
62931           .mr(4)
62932           .nr(4)
62933           .kr(1)
62934           .sr(1)
62935           .m(m)
62936           .n(n)
62937           .k(k)
62938           .iterations(1)
62939           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62940       }
62941     }
62942   }
62943 }
62944 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,strided_cm_subtile)62945 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, strided_cm_subtile) {
62946   for (size_t k = 1; k <= 5; k += 2) {
62947     for (uint32_t n = 1; n <= 4; n++) {
62948       for (uint32_t m = 1; m <= 4; m++) {
62949         GemmMicrokernelTester()
62950           .mr(4)
62951           .nr(4)
62952           .kr(1)
62953           .sr(1)
62954           .m(m)
62955           .n(n)
62956           .k(k)
62957           .cm_stride(7)
62958           .iterations(1)
62959           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62960       }
62961     }
62962   }
62963 }
62964 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,qmin)62965 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, qmin) {
62966   GemmMicrokernelTester()
62967     .mr(4)
62968     .nr(4)
62969     .kr(1)
62970     .sr(1)
62971     .m(4)
62972     .n(4)
62973     .k(1)
62974     .qmin(128)
62975     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62976 }
62977 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,qmax)62978 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, qmax) {
62979   GemmMicrokernelTester()
62980     .mr(4)
62981     .nr(4)
62982     .kr(1)
62983     .sr(1)
62984     .m(4)
62985     .n(4)
62986     .k(1)
62987     .qmax(128)
62988     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
62989 }
62990 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC,strided_cm)62991 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_FMAGIC, strided_cm) {
62992   GemmMicrokernelTester()
62993     .mr(4)
62994     .nr(4)
62995     .kr(1)
62996     .sr(1)
62997     .m(4)
62998     .n(4)
62999     .k(1)
63000     .cm_stride(7)
63001     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_fmagic, xnn_init_qs8_conv_minmax_fp32_scalar_fmagic_params, xnn_qs8_requantize_fp32);
63002 }
63003 
63004 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_eq_1)63005 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_eq_1) {
63006   GemmMicrokernelTester()
63007     .mr(4)
63008     .nr(4)
63009     .kr(1)
63010     .sr(1)
63011     .m(4)
63012     .n(4)
63013     .k(1)
63014     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63015 }
63016 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,strided_cn)63017 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, strided_cn) {
63018   GemmMicrokernelTester()
63019     .mr(4)
63020     .nr(4)
63021     .kr(1)
63022     .sr(1)
63023     .m(4)
63024     .n(4)
63025     .k(1)
63026     .cn_stride(7)
63027     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63028 }
63029 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_eq_1_strided_a)63030 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_eq_1_strided_a) {
63031   GemmMicrokernelTester()
63032     .mr(4)
63033     .nr(4)
63034     .kr(1)
63035     .sr(1)
63036     .m(4)
63037     .n(4)
63038     .k(1)
63039     .a_stride(3)
63040     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63041 }
63042 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_eq_1_subtile)63043 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_eq_1_subtile) {
63044   for (uint32_t n = 1; n <= 4; n++) {
63045     for (uint32_t m = 1; m <= 4; m++) {
63046       GemmMicrokernelTester()
63047         .mr(4)
63048         .nr(4)
63049         .kr(1)
63050         .sr(1)
63051         .m(m)
63052         .n(n)
63053         .k(1)
63054         .iterations(1)
63055         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63056     }
63057   }
63058 }
63059 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_eq_1_subtile_m)63060 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_eq_1_subtile_m) {
63061   for (uint32_t m = 1; m <= 4; m++) {
63062     GemmMicrokernelTester()
63063       .mr(4)
63064       .nr(4)
63065       .kr(1)
63066       .sr(1)
63067       .m(m)
63068       .n(4)
63069       .k(1)
63070       .iterations(1)
63071       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63072   }
63073 }
63074 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_eq_1_subtile_n)63075 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_eq_1_subtile_n) {
63076   for (uint32_t n = 1; n <= 4; n++) {
63077     GemmMicrokernelTester()
63078       .mr(4)
63079       .nr(4)
63080       .kr(1)
63081       .sr(1)
63082       .m(4)
63083       .n(n)
63084       .k(1)
63085       .iterations(1)
63086       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63087   }
63088 }
63089 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_gt_1)63090 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_gt_1) {
63091   for (size_t k = 2; k < 10; k++) {
63092     GemmMicrokernelTester()
63093       .mr(4)
63094       .nr(4)
63095       .kr(1)
63096       .sr(1)
63097       .m(4)
63098       .n(4)
63099       .k(k)
63100       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63101   }
63102 }
63103 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_gt_1_strided_a)63104 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_gt_1_strided_a) {
63105   for (size_t k = 2; k < 10; k++) {
63106     GemmMicrokernelTester()
63107       .mr(4)
63108       .nr(4)
63109       .kr(1)
63110       .sr(1)
63111       .m(4)
63112       .n(4)
63113       .k(k)
63114       .a_stride(11)
63115       .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63116   }
63117 }
63118 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,k_gt_1_subtile)63119 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, k_gt_1_subtile) {
63120   for (size_t k = 2; k < 10; k++) {
63121     for (uint32_t n = 1; n <= 4; n++) {
63122       for (uint32_t m = 1; m <= 4; m++) {
63123         GemmMicrokernelTester()
63124           .mr(4)
63125           .nr(4)
63126           .kr(1)
63127           .sr(1)
63128           .m(m)
63129           .n(n)
63130           .k(k)
63131           .iterations(1)
63132           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63133       }
63134     }
63135   }
63136 }
63137 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_gt_4)63138 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_gt_4) {
63139   for (uint32_t n = 5; n < 8; n++) {
63140     for (size_t k = 1; k <= 5; k += 2) {
63141       GemmMicrokernelTester()
63142         .mr(4)
63143         .nr(4)
63144         .kr(1)
63145         .sr(1)
63146         .m(4)
63147         .n(n)
63148         .k(k)
63149         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63150     }
63151   }
63152 }
63153 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_gt_4_strided_cn)63154 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_gt_4_strided_cn) {
63155   for (uint32_t n = 5; n < 8; n++) {
63156     for (size_t k = 1; k <= 5; k += 2) {
63157       GemmMicrokernelTester()
63158         .mr(4)
63159         .nr(4)
63160         .kr(1)
63161         .sr(1)
63162         .m(4)
63163         .n(n)
63164         .k(k)
63165         .cn_stride(7)
63166         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63167     }
63168   }
63169 }
63170 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_gt_4_strided_a)63171 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_gt_4_strided_a) {
63172   for (uint32_t n = 5; n < 8; n++) {
63173     for (size_t k = 1; k <= 5; k += 2) {
63174       GemmMicrokernelTester()
63175         .mr(4)
63176         .nr(4)
63177         .kr(1)
63178         .sr(1)
63179         .m(4)
63180         .n(n)
63181         .k(k)
63182         .a_stride(7)
63183         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63184     }
63185   }
63186 }
63187 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_gt_4_subtile)63188 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_gt_4_subtile) {
63189   for (uint32_t n = 5; n < 8; n++) {
63190     for (size_t k = 1; k <= 5; k += 2) {
63191       for (uint32_t m = 1; m <= 4; m++) {
63192         GemmMicrokernelTester()
63193           .mr(4)
63194           .nr(4)
63195           .kr(1)
63196           .sr(1)
63197           .m(m)
63198           .n(n)
63199           .k(k)
63200           .iterations(1)
63201           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63202       }
63203     }
63204   }
63205 }
63206 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_div_4)63207 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_div_4) {
63208   for (uint32_t n = 8; n <= 12; n += 4) {
63209     for (size_t k = 1; k <= 5; k += 2) {
63210       GemmMicrokernelTester()
63211         .mr(4)
63212         .nr(4)
63213         .kr(1)
63214         .sr(1)
63215         .m(4)
63216         .n(n)
63217         .k(k)
63218         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63219     }
63220   }
63221 }
63222 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_div_4_strided_cn)63223 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_div_4_strided_cn) {
63224   for (uint32_t n = 8; n <= 12; n += 4) {
63225     for (size_t k = 1; k <= 5; k += 2) {
63226       GemmMicrokernelTester()
63227         .mr(4)
63228         .nr(4)
63229         .kr(1)
63230         .sr(1)
63231         .m(4)
63232         .n(n)
63233         .k(k)
63234         .cn_stride(7)
63235         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63236     }
63237   }
63238 }
63239 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_div_4_strided_a)63240 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_div_4_strided_a) {
63241   for (uint32_t n = 8; n <= 12; n += 4) {
63242     for (size_t k = 1; k <= 5; k += 2) {
63243       GemmMicrokernelTester()
63244         .mr(4)
63245         .nr(4)
63246         .kr(1)
63247         .sr(1)
63248         .m(4)
63249         .n(n)
63250         .k(k)
63251         .a_stride(7)
63252         .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63253     }
63254   }
63255 }
63256 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,n_div_4_subtile)63257 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, n_div_4_subtile) {
63258   for (uint32_t n = 8; n <= 12; n += 4) {
63259     for (size_t k = 1; k <= 5; k += 2) {
63260       for (uint32_t m = 1; m <= 4; m++) {
63261         GemmMicrokernelTester()
63262           .mr(4)
63263           .nr(4)
63264           .kr(1)
63265           .sr(1)
63266           .m(m)
63267           .n(n)
63268           .k(k)
63269           .iterations(1)
63270           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63271       }
63272     }
63273   }
63274 }
63275 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,strided_cm_subtile)63276 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, strided_cm_subtile) {
63277   for (size_t k = 1; k <= 5; k += 2) {
63278     for (uint32_t n = 1; n <= 4; n++) {
63279       for (uint32_t m = 1; m <= 4; m++) {
63280         GemmMicrokernelTester()
63281           .mr(4)
63282           .nr(4)
63283           .kr(1)
63284           .sr(1)
63285           .m(m)
63286           .n(n)
63287           .k(k)
63288           .cm_stride(7)
63289           .iterations(1)
63290           .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63291       }
63292     }
63293   }
63294 }
63295 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,qmin)63296 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, qmin) {
63297   GemmMicrokernelTester()
63298     .mr(4)
63299     .nr(4)
63300     .kr(1)
63301     .sr(1)
63302     .m(4)
63303     .n(4)
63304     .k(1)
63305     .qmin(128)
63306     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63307 }
63308 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,qmax)63309 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, qmax) {
63310   GemmMicrokernelTester()
63311     .mr(4)
63312     .nr(4)
63313     .kr(1)
63314     .sr(1)
63315     .m(4)
63316     .n(4)
63317     .k(1)
63318     .qmax(128)
63319     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63320 }
63321 
TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF,strided_cm)63322 TEST(QS8_GEMM_MINMAX_FP32_4X4__SCALAR_LRINTF, strided_cm) {
63323   GemmMicrokernelTester()
63324     .mr(4)
63325     .nr(4)
63326     .kr(1)
63327     .sr(1)
63328     .m(4)
63329     .n(4)
63330     .k(1)
63331     .cm_stride(7)
63332     .Test(xnn_qs8_gemm_minmax_fp32_ukernel_4x4__scalar_lrintf, xnn_init_qs8_conv_minmax_fp32_scalar_lrintf_params, xnn_qs8_requantize_fp32);
63333 }
63334