xref: /aosp_15_r20/external/XNNPACK/test/f32-vmulcaddc-minmax.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1 // Copyright 2019 Google LLC
2 //
3 // This source code is licensed under the BSD-style license found in the
4 // LICENSE file in the root directory of this source tree.
5 //
6 // Auto-generated file. Do not edit!
7 //   Specification: test/f32-vmulcaddc-minmax.yaml
8 //   Generator: tools/generate-vmulcaddc-test.py
9 
10 
11 #include <gtest/gtest.h>
12 
13 #include <xnnpack/common.h>
14 #include <xnnpack/isa-checks.h>
15 
16 #include <xnnpack/vmulcaddc.h>
17 #include "vmulcaddc-microkernel-tester.h"
18 
19 
20 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,channels_eq_4)21   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, channels_eq_4) {
22     TEST_REQUIRES_ARM_NEON;
23     VMulCAddCMicrokernelTester()
24       .channel_tile(4)
25       .channels(4)
26       .rows(2)
27       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
28   }
29 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,channels_div_4)30   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, channels_div_4) {
31     TEST_REQUIRES_ARM_NEON;
32     for (size_t channels = 8; channels < 40; channels += 4) {
33       VMulCAddCMicrokernelTester()
34         .channel_tile(4)
35         .channels(channels)
36         .rows(2)
37         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
38     }
39   }
40 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,channels_lt_4)41   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, channels_lt_4) {
42     TEST_REQUIRES_ARM_NEON;
43     for (size_t channels = 1; channels < 4; channels++) {
44       VMulCAddCMicrokernelTester()
45         .channel_tile(4)
46         .channels(channels)
47         .rows(2)
48         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
49     }
50   }
51 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,channels_gt_4)52   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, channels_gt_4) {
53     TEST_REQUIRES_ARM_NEON;
54     for (size_t channels = 5; channels < 8; channels++) {
55       VMulCAddCMicrokernelTester()
56         .channel_tile(4)
57         .channels(channels)
58         .rows(2)
59         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
60     }
61   }
62 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,rows_lt_2)63   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, rows_lt_2) {
64     TEST_REQUIRES_ARM_NEON;
65     for (size_t rows = 1; rows < 2; rows++) {
66       for (size_t channels = 1; channels <= 20; channels += 3) {
67         VMulCAddCMicrokernelTester()
68           .channel_tile(4)
69           .channels(channels)
70           .rows(rows)
71           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
72       }
73     }
74   }
75 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,rows_div_2)76   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, rows_div_2) {
77     TEST_REQUIRES_ARM_NEON;
78     for (size_t rows = 4; rows <= 8; rows += 2) {
79       for (size_t channels = 1; channels <= 20; channels += 3) {
80         VMulCAddCMicrokernelTester()
81           .channel_tile(4)
82           .channels(channels)
83           .rows(rows)
84           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
85       }
86     }
87   }
88 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,rows_gt_2)89   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, rows_gt_2) {
90     TEST_REQUIRES_ARM_NEON;
91     for (size_t rows = 3; rows < 4; rows++) {
92       for (size_t channels = 1; channels <= 20; channels += 3) {
93         VMulCAddCMicrokernelTester()
94           .channel_tile(4)
95           .channels(channels)
96           .rows(rows)
97           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
98       }
99     }
100   }
101 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,input_stride)102   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, input_stride) {
103     TEST_REQUIRES_ARM_NEON;
104     for (size_t rows = 1; rows <= 6; rows += 1) {
105       for (size_t channels = 1; channels <= 20; channels += 3) {
106         VMulCAddCMicrokernelTester()
107           .channel_tile(4)
108           .channels(channels)
109           .rows(rows)
110           .input_stride(23)
111           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
112       }
113     }
114   }
115 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,output_stride)116   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, output_stride) {
117     TEST_REQUIRES_ARM_NEON;
118     for (size_t rows = 1; rows <= 6; rows += 1) {
119       for (size_t channels = 1; channels <= 20; channels += 3) {
120         VMulCAddCMicrokernelTester()
121           .channel_tile(4)
122           .channels(channels)
123           .rows(rows)
124           .output_stride(23)
125           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
126       }
127     }
128   }
129 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,inplace)130   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, inplace) {
131     TEST_REQUIRES_ARM_NEON;
132     for (size_t rows = 1; rows <= 6; rows += 1) {
133       for (size_t channels = 1; channels <= 20; channels += 3) {
134         VMulCAddCMicrokernelTester()
135           .channel_tile(4)
136           .channels(channels)
137           .rows(rows)
138           .inplace(true)
139           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
140       }
141     }
142   }
143 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,qmin)144   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, qmin) {
145     TEST_REQUIRES_ARM_NEON;
146     for (size_t rows = 1; rows <= 6; rows += 1) {
147       for (size_t channels = 1; channels <= 20; channels += 3) {
148         VMulCAddCMicrokernelTester()
149           .channel_tile(4)
150           .channels(channels)
151           .rows(rows)
152           .qmin(128)
153           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
154       }
155     }
156   }
157 
TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X,qmax)158   TEST(F32_VMULCADDC_MINMAX_C4__NEON_2X, qmax) {
159     TEST_REQUIRES_ARM_NEON;
160     for (size_t rows = 1; rows <= 6; rows += 1) {
161       for (size_t channels = 1; channels <= 20; channels += 3) {
162         VMulCAddCMicrokernelTester()
163           .channel_tile(4)
164           .channels(channels)
165           .rows(rows)
166           .qmax(128)
167           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neon_2x, xnn_init_f32_minmax_scalar_params);
168       }
169     }
170   }
171 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
172 
173 
174 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,channels_eq_4)175   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, channels_eq_4) {
176     TEST_REQUIRES_ARM_NEON_FMA;
177     VMulCAddCMicrokernelTester()
178       .channel_tile(4)
179       .channels(4)
180       .rows(2)
181       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
182   }
183 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,channels_div_4)184   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, channels_div_4) {
185     TEST_REQUIRES_ARM_NEON_FMA;
186     for (size_t channels = 8; channels < 40; channels += 4) {
187       VMulCAddCMicrokernelTester()
188         .channel_tile(4)
189         .channels(channels)
190         .rows(2)
191         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
192     }
193   }
194 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,channels_lt_4)195   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, channels_lt_4) {
196     TEST_REQUIRES_ARM_NEON_FMA;
197     for (size_t channels = 1; channels < 4; channels++) {
198       VMulCAddCMicrokernelTester()
199         .channel_tile(4)
200         .channels(channels)
201         .rows(2)
202         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
203     }
204   }
205 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,channels_gt_4)206   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, channels_gt_4) {
207     TEST_REQUIRES_ARM_NEON_FMA;
208     for (size_t channels = 5; channels < 8; channels++) {
209       VMulCAddCMicrokernelTester()
210         .channel_tile(4)
211         .channels(channels)
212         .rows(2)
213         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
214     }
215   }
216 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,rows_lt_2)217   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, rows_lt_2) {
218     TEST_REQUIRES_ARM_NEON_FMA;
219     for (size_t rows = 1; rows < 2; rows++) {
220       for (size_t channels = 1; channels <= 20; channels += 3) {
221         VMulCAddCMicrokernelTester()
222           .channel_tile(4)
223           .channels(channels)
224           .rows(rows)
225           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
226       }
227     }
228   }
229 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,rows_div_2)230   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, rows_div_2) {
231     TEST_REQUIRES_ARM_NEON_FMA;
232     for (size_t rows = 4; rows <= 8; rows += 2) {
233       for (size_t channels = 1; channels <= 20; channels += 3) {
234         VMulCAddCMicrokernelTester()
235           .channel_tile(4)
236           .channels(channels)
237           .rows(rows)
238           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
239       }
240     }
241   }
242 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,rows_gt_2)243   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, rows_gt_2) {
244     TEST_REQUIRES_ARM_NEON_FMA;
245     for (size_t rows = 3; rows < 4; rows++) {
246       for (size_t channels = 1; channels <= 20; channels += 3) {
247         VMulCAddCMicrokernelTester()
248           .channel_tile(4)
249           .channels(channels)
250           .rows(rows)
251           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
252       }
253     }
254   }
255 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,input_stride)256   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, input_stride) {
257     TEST_REQUIRES_ARM_NEON_FMA;
258     for (size_t rows = 1; rows <= 6; rows += 1) {
259       for (size_t channels = 1; channels <= 20; channels += 3) {
260         VMulCAddCMicrokernelTester()
261           .channel_tile(4)
262           .channels(channels)
263           .rows(rows)
264           .input_stride(23)
265           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
266       }
267     }
268   }
269 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,output_stride)270   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, output_stride) {
271     TEST_REQUIRES_ARM_NEON_FMA;
272     for (size_t rows = 1; rows <= 6; rows += 1) {
273       for (size_t channels = 1; channels <= 20; channels += 3) {
274         VMulCAddCMicrokernelTester()
275           .channel_tile(4)
276           .channels(channels)
277           .rows(rows)
278           .output_stride(23)
279           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
280       }
281     }
282   }
283 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,inplace)284   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, inplace) {
285     TEST_REQUIRES_ARM_NEON_FMA;
286     for (size_t rows = 1; rows <= 6; rows += 1) {
287       for (size_t channels = 1; channels <= 20; channels += 3) {
288         VMulCAddCMicrokernelTester()
289           .channel_tile(4)
290           .channels(channels)
291           .rows(rows)
292           .inplace(true)
293           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
294       }
295     }
296   }
297 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,qmin)298   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, qmin) {
299     TEST_REQUIRES_ARM_NEON_FMA;
300     for (size_t rows = 1; rows <= 6; rows += 1) {
301       for (size_t channels = 1; channels <= 20; channels += 3) {
302         VMulCAddCMicrokernelTester()
303           .channel_tile(4)
304           .channels(channels)
305           .rows(rows)
306           .qmin(128)
307           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
308       }
309     }
310   }
311 
TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X,qmax)312   TEST(F32_VMULCADDC_MINMAX_C4__NEONFMA_2X, qmax) {
313     TEST_REQUIRES_ARM_NEON_FMA;
314     for (size_t rows = 1; rows <= 6; rows += 1) {
315       for (size_t channels = 1; channels <= 20; channels += 3) {
316         VMulCAddCMicrokernelTester()
317           .channel_tile(4)
318           .channels(channels)
319           .rows(rows)
320           .qmax(128)
321           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__neonfma_2x, xnn_init_f32_minmax_scalar_params);
322       }
323     }
324   }
325 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
326 
327 
328 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,channels_eq_8)329   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, channels_eq_8) {
330     TEST_REQUIRES_ARM_NEON;
331     VMulCAddCMicrokernelTester()
332       .channel_tile(8)
333       .channels(8)
334       .rows(2)
335       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
336   }
337 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,channels_div_8)338   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, channels_div_8) {
339     TEST_REQUIRES_ARM_NEON;
340     for (size_t channels = 16; channels < 80; channels += 8) {
341       VMulCAddCMicrokernelTester()
342         .channel_tile(8)
343         .channels(channels)
344         .rows(2)
345         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
346     }
347   }
348 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,channels_lt_8)349   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, channels_lt_8) {
350     TEST_REQUIRES_ARM_NEON;
351     for (size_t channels = 1; channels < 8; channels++) {
352       VMulCAddCMicrokernelTester()
353         .channel_tile(8)
354         .channels(channels)
355         .rows(2)
356         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
357     }
358   }
359 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,channels_gt_8)360   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, channels_gt_8) {
361     TEST_REQUIRES_ARM_NEON;
362     for (size_t channels = 9; channels < 16; channels++) {
363       VMulCAddCMicrokernelTester()
364         .channel_tile(8)
365         .channels(channels)
366         .rows(2)
367         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
368     }
369   }
370 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,rows_lt_2)371   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, rows_lt_2) {
372     TEST_REQUIRES_ARM_NEON;
373     for (size_t rows = 1; rows < 2; rows++) {
374       for (size_t channels = 1; channels <= 40; channels += 7) {
375         VMulCAddCMicrokernelTester()
376           .channel_tile(8)
377           .channels(channels)
378           .rows(rows)
379           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
380       }
381     }
382   }
383 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,rows_div_2)384   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, rows_div_2) {
385     TEST_REQUIRES_ARM_NEON;
386     for (size_t rows = 4; rows <= 8; rows += 2) {
387       for (size_t channels = 1; channels <= 40; channels += 7) {
388         VMulCAddCMicrokernelTester()
389           .channel_tile(8)
390           .channels(channels)
391           .rows(rows)
392           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
393       }
394     }
395   }
396 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,rows_gt_2)397   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, rows_gt_2) {
398     TEST_REQUIRES_ARM_NEON;
399     for (size_t rows = 3; rows < 4; rows++) {
400       for (size_t channels = 1; channels <= 40; channels += 7) {
401         VMulCAddCMicrokernelTester()
402           .channel_tile(8)
403           .channels(channels)
404           .rows(rows)
405           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
406       }
407     }
408   }
409 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,input_stride)410   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, input_stride) {
411     TEST_REQUIRES_ARM_NEON;
412     for (size_t rows = 1; rows <= 6; rows += 1) {
413       for (size_t channels = 1; channels <= 40; channels += 7) {
414         VMulCAddCMicrokernelTester()
415           .channel_tile(8)
416           .channels(channels)
417           .rows(rows)
418           .input_stride(43)
419           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
420       }
421     }
422   }
423 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,output_stride)424   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, output_stride) {
425     TEST_REQUIRES_ARM_NEON;
426     for (size_t rows = 1; rows <= 6; rows += 1) {
427       for (size_t channels = 1; channels <= 40; channels += 7) {
428         VMulCAddCMicrokernelTester()
429           .channel_tile(8)
430           .channels(channels)
431           .rows(rows)
432           .output_stride(43)
433           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
434       }
435     }
436   }
437 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,inplace)438   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, inplace) {
439     TEST_REQUIRES_ARM_NEON;
440     for (size_t rows = 1; rows <= 6; rows += 1) {
441       for (size_t channels = 1; channels <= 40; channels += 7) {
442         VMulCAddCMicrokernelTester()
443           .channel_tile(8)
444           .channels(channels)
445           .rows(rows)
446           .inplace(true)
447           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
448       }
449     }
450   }
451 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,qmin)452   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, qmin) {
453     TEST_REQUIRES_ARM_NEON;
454     for (size_t rows = 1; rows <= 6; rows += 1) {
455       for (size_t channels = 1; channels <= 40; channels += 7) {
456         VMulCAddCMicrokernelTester()
457           .channel_tile(8)
458           .channels(channels)
459           .rows(rows)
460           .qmin(128)
461           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
462       }
463     }
464   }
465 
TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X,qmax)466   TEST(F32_VMULCADDC_MINMAX_C8__NEON_2X, qmax) {
467     TEST_REQUIRES_ARM_NEON;
468     for (size_t rows = 1; rows <= 6; rows += 1) {
469       for (size_t channels = 1; channels <= 40; channels += 7) {
470         VMulCAddCMicrokernelTester()
471           .channel_tile(8)
472           .channels(channels)
473           .rows(rows)
474           .qmax(128)
475           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neon_2x, xnn_init_f32_minmax_scalar_params);
476       }
477     }
478   }
479 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
480 
481 
482 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,channels_eq_8)483   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, channels_eq_8) {
484     TEST_REQUIRES_ARM_NEON_FMA;
485     VMulCAddCMicrokernelTester()
486       .channel_tile(8)
487       .channels(8)
488       .rows(2)
489       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
490   }
491 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,channels_div_8)492   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, channels_div_8) {
493     TEST_REQUIRES_ARM_NEON_FMA;
494     for (size_t channels = 16; channels < 80; channels += 8) {
495       VMulCAddCMicrokernelTester()
496         .channel_tile(8)
497         .channels(channels)
498         .rows(2)
499         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
500     }
501   }
502 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,channels_lt_8)503   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, channels_lt_8) {
504     TEST_REQUIRES_ARM_NEON_FMA;
505     for (size_t channels = 1; channels < 8; channels++) {
506       VMulCAddCMicrokernelTester()
507         .channel_tile(8)
508         .channels(channels)
509         .rows(2)
510         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
511     }
512   }
513 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,channels_gt_8)514   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, channels_gt_8) {
515     TEST_REQUIRES_ARM_NEON_FMA;
516     for (size_t channels = 9; channels < 16; channels++) {
517       VMulCAddCMicrokernelTester()
518         .channel_tile(8)
519         .channels(channels)
520         .rows(2)
521         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
522     }
523   }
524 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,rows_lt_2)525   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, rows_lt_2) {
526     TEST_REQUIRES_ARM_NEON_FMA;
527     for (size_t rows = 1; rows < 2; rows++) {
528       for (size_t channels = 1; channels <= 40; channels += 7) {
529         VMulCAddCMicrokernelTester()
530           .channel_tile(8)
531           .channels(channels)
532           .rows(rows)
533           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
534       }
535     }
536   }
537 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,rows_div_2)538   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, rows_div_2) {
539     TEST_REQUIRES_ARM_NEON_FMA;
540     for (size_t rows = 4; rows <= 8; rows += 2) {
541       for (size_t channels = 1; channels <= 40; channels += 7) {
542         VMulCAddCMicrokernelTester()
543           .channel_tile(8)
544           .channels(channels)
545           .rows(rows)
546           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
547       }
548     }
549   }
550 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,rows_gt_2)551   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, rows_gt_2) {
552     TEST_REQUIRES_ARM_NEON_FMA;
553     for (size_t rows = 3; rows < 4; rows++) {
554       for (size_t channels = 1; channels <= 40; channels += 7) {
555         VMulCAddCMicrokernelTester()
556           .channel_tile(8)
557           .channels(channels)
558           .rows(rows)
559           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
560       }
561     }
562   }
563 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,input_stride)564   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, input_stride) {
565     TEST_REQUIRES_ARM_NEON_FMA;
566     for (size_t rows = 1; rows <= 6; rows += 1) {
567       for (size_t channels = 1; channels <= 40; channels += 7) {
568         VMulCAddCMicrokernelTester()
569           .channel_tile(8)
570           .channels(channels)
571           .rows(rows)
572           .input_stride(43)
573           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
574       }
575     }
576   }
577 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,output_stride)578   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, output_stride) {
579     TEST_REQUIRES_ARM_NEON_FMA;
580     for (size_t rows = 1; rows <= 6; rows += 1) {
581       for (size_t channels = 1; channels <= 40; channels += 7) {
582         VMulCAddCMicrokernelTester()
583           .channel_tile(8)
584           .channels(channels)
585           .rows(rows)
586           .output_stride(43)
587           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
588       }
589     }
590   }
591 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,inplace)592   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, inplace) {
593     TEST_REQUIRES_ARM_NEON_FMA;
594     for (size_t rows = 1; rows <= 6; rows += 1) {
595       for (size_t channels = 1; channels <= 40; channels += 7) {
596         VMulCAddCMicrokernelTester()
597           .channel_tile(8)
598           .channels(channels)
599           .rows(rows)
600           .inplace(true)
601           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
602       }
603     }
604   }
605 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,qmin)606   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, qmin) {
607     TEST_REQUIRES_ARM_NEON_FMA;
608     for (size_t rows = 1; rows <= 6; rows += 1) {
609       for (size_t channels = 1; channels <= 40; channels += 7) {
610         VMulCAddCMicrokernelTester()
611           .channel_tile(8)
612           .channels(channels)
613           .rows(rows)
614           .qmin(128)
615           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
616       }
617     }
618   }
619 
TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X,qmax)620   TEST(F32_VMULCADDC_MINMAX_C8__NEONFMA_2X, qmax) {
621     TEST_REQUIRES_ARM_NEON_FMA;
622     for (size_t rows = 1; rows <= 6; rows += 1) {
623       for (size_t channels = 1; channels <= 40; channels += 7) {
624         VMulCAddCMicrokernelTester()
625           .channel_tile(8)
626           .channels(channels)
627           .rows(rows)
628           .qmax(128)
629           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__neonfma_2x, xnn_init_f32_minmax_scalar_params);
630       }
631     }
632   }
633 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
634 
635 
636 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,channels_eq_4)637   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, channels_eq_4) {
638     TEST_REQUIRES_X86_SSE;
639     VMulCAddCMicrokernelTester()
640       .channel_tile(4)
641       .channels(4)
642       .rows(2)
643       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
644   }
645 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,channels_div_4)646   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, channels_div_4) {
647     TEST_REQUIRES_X86_SSE;
648     for (size_t channels = 8; channels < 40; channels += 4) {
649       VMulCAddCMicrokernelTester()
650         .channel_tile(4)
651         .channels(channels)
652         .rows(2)
653         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
654     }
655   }
656 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,channels_lt_4)657   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, channels_lt_4) {
658     TEST_REQUIRES_X86_SSE;
659     for (size_t channels = 1; channels < 4; channels++) {
660       VMulCAddCMicrokernelTester()
661         .channel_tile(4)
662         .channels(channels)
663         .rows(2)
664         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
665     }
666   }
667 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,channels_gt_4)668   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, channels_gt_4) {
669     TEST_REQUIRES_X86_SSE;
670     for (size_t channels = 5; channels < 8; channels++) {
671       VMulCAddCMicrokernelTester()
672         .channel_tile(4)
673         .channels(channels)
674         .rows(2)
675         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
676     }
677   }
678 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,rows_lt_2)679   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, rows_lt_2) {
680     TEST_REQUIRES_X86_SSE;
681     for (size_t rows = 1; rows < 2; rows++) {
682       for (size_t channels = 1; channels <= 20; channels += 3) {
683         VMulCAddCMicrokernelTester()
684           .channel_tile(4)
685           .channels(channels)
686           .rows(rows)
687           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
688       }
689     }
690   }
691 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,rows_div_2)692   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, rows_div_2) {
693     TEST_REQUIRES_X86_SSE;
694     for (size_t rows = 4; rows <= 8; rows += 2) {
695       for (size_t channels = 1; channels <= 20; channels += 3) {
696         VMulCAddCMicrokernelTester()
697           .channel_tile(4)
698           .channels(channels)
699           .rows(rows)
700           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
701       }
702     }
703   }
704 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,rows_gt_2)705   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, rows_gt_2) {
706     TEST_REQUIRES_X86_SSE;
707     for (size_t rows = 3; rows < 4; rows++) {
708       for (size_t channels = 1; channels <= 20; channels += 3) {
709         VMulCAddCMicrokernelTester()
710           .channel_tile(4)
711           .channels(channels)
712           .rows(rows)
713           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
714       }
715     }
716   }
717 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,input_stride)718   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, input_stride) {
719     TEST_REQUIRES_X86_SSE;
720     for (size_t rows = 1; rows <= 6; rows += 1) {
721       for (size_t channels = 1; channels <= 20; channels += 3) {
722         VMulCAddCMicrokernelTester()
723           .channel_tile(4)
724           .channels(channels)
725           .rows(rows)
726           .input_stride(23)
727           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
728       }
729     }
730   }
731 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,output_stride)732   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, output_stride) {
733     TEST_REQUIRES_X86_SSE;
734     for (size_t rows = 1; rows <= 6; rows += 1) {
735       for (size_t channels = 1; channels <= 20; channels += 3) {
736         VMulCAddCMicrokernelTester()
737           .channel_tile(4)
738           .channels(channels)
739           .rows(rows)
740           .output_stride(23)
741           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
742       }
743     }
744   }
745 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,inplace)746   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, inplace) {
747     TEST_REQUIRES_X86_SSE;
748     for (size_t rows = 1; rows <= 6; rows += 1) {
749       for (size_t channels = 1; channels <= 20; channels += 3) {
750         VMulCAddCMicrokernelTester()
751           .channel_tile(4)
752           .channels(channels)
753           .rows(rows)
754           .inplace(true)
755           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
756       }
757     }
758   }
759 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,qmin)760   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, qmin) {
761     TEST_REQUIRES_X86_SSE;
762     for (size_t rows = 1; rows <= 6; rows += 1) {
763       for (size_t channels = 1; channels <= 20; channels += 3) {
764         VMulCAddCMicrokernelTester()
765           .channel_tile(4)
766           .channels(channels)
767           .rows(rows)
768           .qmin(128)
769           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
770       }
771     }
772   }
773 
TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X,qmax)774   TEST(F32_VMULCADDC_MINMAX_C4__SSE_2X, qmax) {
775     TEST_REQUIRES_X86_SSE;
776     for (size_t rows = 1; rows <= 6; rows += 1) {
777       for (size_t channels = 1; channels <= 20; channels += 3) {
778         VMulCAddCMicrokernelTester()
779           .channel_tile(4)
780           .channels(channels)
781           .rows(rows)
782           .qmax(128)
783           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__sse_2x, xnn_init_f32_minmax_sse_params);
784       }
785     }
786   }
787 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
788 
789 
790 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,channels_eq_8)791   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, channels_eq_8) {
792     TEST_REQUIRES_X86_SSE;
793     VMulCAddCMicrokernelTester()
794       .channel_tile(8)
795       .channels(8)
796       .rows(2)
797       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
798   }
799 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,channels_div_8)800   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, channels_div_8) {
801     TEST_REQUIRES_X86_SSE;
802     for (size_t channels = 16; channels < 80; channels += 8) {
803       VMulCAddCMicrokernelTester()
804         .channel_tile(8)
805         .channels(channels)
806         .rows(2)
807         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
808     }
809   }
810 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,channels_lt_8)811   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, channels_lt_8) {
812     TEST_REQUIRES_X86_SSE;
813     for (size_t channels = 1; channels < 8; channels++) {
814       VMulCAddCMicrokernelTester()
815         .channel_tile(8)
816         .channels(channels)
817         .rows(2)
818         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
819     }
820   }
821 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,channels_gt_8)822   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, channels_gt_8) {
823     TEST_REQUIRES_X86_SSE;
824     for (size_t channels = 9; channels < 16; channels++) {
825       VMulCAddCMicrokernelTester()
826         .channel_tile(8)
827         .channels(channels)
828         .rows(2)
829         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
830     }
831   }
832 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,rows_lt_2)833   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, rows_lt_2) {
834     TEST_REQUIRES_X86_SSE;
835     for (size_t rows = 1; rows < 2; rows++) {
836       for (size_t channels = 1; channels <= 40; channels += 7) {
837         VMulCAddCMicrokernelTester()
838           .channel_tile(8)
839           .channels(channels)
840           .rows(rows)
841           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
842       }
843     }
844   }
845 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,rows_div_2)846   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, rows_div_2) {
847     TEST_REQUIRES_X86_SSE;
848     for (size_t rows = 4; rows <= 8; rows += 2) {
849       for (size_t channels = 1; channels <= 40; channels += 7) {
850         VMulCAddCMicrokernelTester()
851           .channel_tile(8)
852           .channels(channels)
853           .rows(rows)
854           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
855       }
856     }
857   }
858 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,rows_gt_2)859   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, rows_gt_2) {
860     TEST_REQUIRES_X86_SSE;
861     for (size_t rows = 3; rows < 4; rows++) {
862       for (size_t channels = 1; channels <= 40; channels += 7) {
863         VMulCAddCMicrokernelTester()
864           .channel_tile(8)
865           .channels(channels)
866           .rows(rows)
867           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
868       }
869     }
870   }
871 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,input_stride)872   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, input_stride) {
873     TEST_REQUIRES_X86_SSE;
874     for (size_t rows = 1; rows <= 6; rows += 1) {
875       for (size_t channels = 1; channels <= 40; channels += 7) {
876         VMulCAddCMicrokernelTester()
877           .channel_tile(8)
878           .channels(channels)
879           .rows(rows)
880           .input_stride(43)
881           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
882       }
883     }
884   }
885 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,output_stride)886   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, output_stride) {
887     TEST_REQUIRES_X86_SSE;
888     for (size_t rows = 1; rows <= 6; rows += 1) {
889       for (size_t channels = 1; channels <= 40; channels += 7) {
890         VMulCAddCMicrokernelTester()
891           .channel_tile(8)
892           .channels(channels)
893           .rows(rows)
894           .output_stride(43)
895           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
896       }
897     }
898   }
899 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,inplace)900   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, inplace) {
901     TEST_REQUIRES_X86_SSE;
902     for (size_t rows = 1; rows <= 6; rows += 1) {
903       for (size_t channels = 1; channels <= 40; channels += 7) {
904         VMulCAddCMicrokernelTester()
905           .channel_tile(8)
906           .channels(channels)
907           .rows(rows)
908           .inplace(true)
909           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
910       }
911     }
912   }
913 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,qmin)914   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, qmin) {
915     TEST_REQUIRES_X86_SSE;
916     for (size_t rows = 1; rows <= 6; rows += 1) {
917       for (size_t channels = 1; channels <= 40; channels += 7) {
918         VMulCAddCMicrokernelTester()
919           .channel_tile(8)
920           .channels(channels)
921           .rows(rows)
922           .qmin(128)
923           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
924       }
925     }
926   }
927 
TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X,qmax)928   TEST(F32_VMULCADDC_MINMAX_C8__SSE_2X, qmax) {
929     TEST_REQUIRES_X86_SSE;
930     for (size_t rows = 1; rows <= 6; rows += 1) {
931       for (size_t channels = 1; channels <= 40; channels += 7) {
932         VMulCAddCMicrokernelTester()
933           .channel_tile(8)
934           .channels(channels)
935           .rows(rows)
936           .qmax(128)
937           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__sse_2x, xnn_init_f32_minmax_sse_params);
938       }
939     }
940   }
941 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
942 
943 
944 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,channels_eq_4)945   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, channels_eq_4) {
946     VMulCAddCMicrokernelTester()
947       .channel_tile(4)
948       .channels(4)
949       .rows(2)
950       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
951   }
952 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,channels_div_4)953   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, channels_div_4) {
954     for (size_t channels = 8; channels < 40; channels += 4) {
955       VMulCAddCMicrokernelTester()
956         .channel_tile(4)
957         .channels(channels)
958         .rows(2)
959         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
960     }
961   }
962 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,channels_lt_4)963   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, channels_lt_4) {
964     for (size_t channels = 1; channels < 4; channels++) {
965       VMulCAddCMicrokernelTester()
966         .channel_tile(4)
967         .channels(channels)
968         .rows(2)
969         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
970     }
971   }
972 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,channels_gt_4)973   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, channels_gt_4) {
974     for (size_t channels = 5; channels < 8; channels++) {
975       VMulCAddCMicrokernelTester()
976         .channel_tile(4)
977         .channels(channels)
978         .rows(2)
979         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
980     }
981   }
982 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,rows_lt_2)983   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, rows_lt_2) {
984     for (size_t rows = 1; rows < 2; rows++) {
985       for (size_t channels = 1; channels <= 20; channels += 3) {
986         VMulCAddCMicrokernelTester()
987           .channel_tile(4)
988           .channels(channels)
989           .rows(rows)
990           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
991       }
992     }
993   }
994 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,rows_div_2)995   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, rows_div_2) {
996     for (size_t rows = 4; rows <= 8; rows += 2) {
997       for (size_t channels = 1; channels <= 20; channels += 3) {
998         VMulCAddCMicrokernelTester()
999           .channel_tile(4)
1000           .channels(channels)
1001           .rows(rows)
1002           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1003       }
1004     }
1005   }
1006 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,rows_gt_2)1007   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, rows_gt_2) {
1008     for (size_t rows = 3; rows < 4; rows++) {
1009       for (size_t channels = 1; channels <= 20; channels += 3) {
1010         VMulCAddCMicrokernelTester()
1011           .channel_tile(4)
1012           .channels(channels)
1013           .rows(rows)
1014           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1015       }
1016     }
1017   }
1018 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,input_stride)1019   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, input_stride) {
1020     for (size_t rows = 1; rows <= 6; rows += 1) {
1021       for (size_t channels = 1; channels <= 20; channels += 3) {
1022         VMulCAddCMicrokernelTester()
1023           .channel_tile(4)
1024           .channels(channels)
1025           .rows(rows)
1026           .input_stride(23)
1027           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1028       }
1029     }
1030   }
1031 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,output_stride)1032   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, output_stride) {
1033     for (size_t rows = 1; rows <= 6; rows += 1) {
1034       for (size_t channels = 1; channels <= 20; channels += 3) {
1035         VMulCAddCMicrokernelTester()
1036           .channel_tile(4)
1037           .channels(channels)
1038           .rows(rows)
1039           .output_stride(23)
1040           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1041       }
1042     }
1043   }
1044 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,inplace)1045   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, inplace) {
1046     for (size_t rows = 1; rows <= 6; rows += 1) {
1047       for (size_t channels = 1; channels <= 20; channels += 3) {
1048         VMulCAddCMicrokernelTester()
1049           .channel_tile(4)
1050           .channels(channels)
1051           .rows(rows)
1052           .inplace(true)
1053           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1054       }
1055     }
1056   }
1057 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,qmin)1058   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, qmin) {
1059     for (size_t rows = 1; rows <= 6; rows += 1) {
1060       for (size_t channels = 1; channels <= 20; channels += 3) {
1061         VMulCAddCMicrokernelTester()
1062           .channel_tile(4)
1063           .channels(channels)
1064           .rows(rows)
1065           .qmin(128)
1066           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1067       }
1068     }
1069   }
1070 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X,qmax)1071   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_ARM_2X, qmax) {
1072     for (size_t rows = 1; rows <= 6; rows += 1) {
1073       for (size_t channels = 1; channels <= 20; channels += 3) {
1074         VMulCAddCMicrokernelTester()
1075           .channel_tile(4)
1076           .channels(channels)
1077           .rows(rows)
1078           .qmax(128)
1079           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1080       }
1081     }
1082   }
1083 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1084 
1085 
1086 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,channels_eq_4)1087   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, channels_eq_4) {
1088     VMulCAddCMicrokernelTester()
1089       .channel_tile(4)
1090       .channels(4)
1091       .rows(2)
1092       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1093   }
1094 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,channels_div_4)1095   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, channels_div_4) {
1096     for (size_t channels = 8; channels < 40; channels += 4) {
1097       VMulCAddCMicrokernelTester()
1098         .channel_tile(4)
1099         .channels(channels)
1100         .rows(2)
1101         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1102     }
1103   }
1104 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,channels_lt_4)1105   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, channels_lt_4) {
1106     for (size_t channels = 1; channels < 4; channels++) {
1107       VMulCAddCMicrokernelTester()
1108         .channel_tile(4)
1109         .channels(channels)
1110         .rows(2)
1111         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1112     }
1113   }
1114 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,channels_gt_4)1115   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, channels_gt_4) {
1116     for (size_t channels = 5; channels < 8; channels++) {
1117       VMulCAddCMicrokernelTester()
1118         .channel_tile(4)
1119         .channels(channels)
1120         .rows(2)
1121         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1122     }
1123   }
1124 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,rows_lt_2)1125   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, rows_lt_2) {
1126     for (size_t rows = 1; rows < 2; rows++) {
1127       for (size_t channels = 1; channels <= 20; channels += 3) {
1128         VMulCAddCMicrokernelTester()
1129           .channel_tile(4)
1130           .channels(channels)
1131           .rows(rows)
1132           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1133       }
1134     }
1135   }
1136 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,rows_div_2)1137   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, rows_div_2) {
1138     for (size_t rows = 4; rows <= 8; rows += 2) {
1139       for (size_t channels = 1; channels <= 20; channels += 3) {
1140         VMulCAddCMicrokernelTester()
1141           .channel_tile(4)
1142           .channels(channels)
1143           .rows(rows)
1144           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1145       }
1146     }
1147   }
1148 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,rows_gt_2)1149   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, rows_gt_2) {
1150     for (size_t rows = 3; rows < 4; rows++) {
1151       for (size_t channels = 1; channels <= 20; channels += 3) {
1152         VMulCAddCMicrokernelTester()
1153           .channel_tile(4)
1154           .channels(channels)
1155           .rows(rows)
1156           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1157       }
1158     }
1159   }
1160 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,input_stride)1161   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, input_stride) {
1162     for (size_t rows = 1; rows <= 6; rows += 1) {
1163       for (size_t channels = 1; channels <= 20; channels += 3) {
1164         VMulCAddCMicrokernelTester()
1165           .channel_tile(4)
1166           .channels(channels)
1167           .rows(rows)
1168           .input_stride(23)
1169           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1170       }
1171     }
1172   }
1173 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,output_stride)1174   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, output_stride) {
1175     for (size_t rows = 1; rows <= 6; rows += 1) {
1176       for (size_t channels = 1; channels <= 20; channels += 3) {
1177         VMulCAddCMicrokernelTester()
1178           .channel_tile(4)
1179           .channels(channels)
1180           .rows(rows)
1181           .output_stride(23)
1182           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1183       }
1184     }
1185   }
1186 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,inplace)1187   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, inplace) {
1188     for (size_t rows = 1; rows <= 6; rows += 1) {
1189       for (size_t channels = 1; channels <= 20; channels += 3) {
1190         VMulCAddCMicrokernelTester()
1191           .channel_tile(4)
1192           .channels(channels)
1193           .rows(rows)
1194           .inplace(true)
1195           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1196       }
1197     }
1198   }
1199 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,qmin)1200   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, qmin) {
1201     for (size_t rows = 1; rows <= 6; rows += 1) {
1202       for (size_t channels = 1; channels <= 20; channels += 3) {
1203         VMulCAddCMicrokernelTester()
1204           .channel_tile(4)
1205           .channels(channels)
1206           .rows(rows)
1207           .qmin(128)
1208           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1209       }
1210     }
1211   }
1212 
TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X,qmax)1213   TEST(F32_VMULCADDC_MINMAX_C4__WASMSIMD_X86_2X, qmax) {
1214     for (size_t rows = 1; rows <= 6; rows += 1) {
1215       for (size_t channels = 1; channels <= 20; channels += 3) {
1216         VMulCAddCMicrokernelTester()
1217           .channel_tile(4)
1218           .channels(channels)
1219           .rows(rows)
1220           .qmax(128)
1221           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1222       }
1223     }
1224   }
1225 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1226 
1227 
1228 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,channels_eq_8)1229   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, channels_eq_8) {
1230     VMulCAddCMicrokernelTester()
1231       .channel_tile(8)
1232       .channels(8)
1233       .rows(2)
1234       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1235   }
1236 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,channels_div_8)1237   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, channels_div_8) {
1238     for (size_t channels = 16; channels < 80; channels += 8) {
1239       VMulCAddCMicrokernelTester()
1240         .channel_tile(8)
1241         .channels(channels)
1242         .rows(2)
1243         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1244     }
1245   }
1246 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,channels_lt_8)1247   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, channels_lt_8) {
1248     for (size_t channels = 1; channels < 8; channels++) {
1249       VMulCAddCMicrokernelTester()
1250         .channel_tile(8)
1251         .channels(channels)
1252         .rows(2)
1253         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1254     }
1255   }
1256 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,channels_gt_8)1257   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, channels_gt_8) {
1258     for (size_t channels = 9; channels < 16; channels++) {
1259       VMulCAddCMicrokernelTester()
1260         .channel_tile(8)
1261         .channels(channels)
1262         .rows(2)
1263         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1264     }
1265   }
1266 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,rows_lt_2)1267   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, rows_lt_2) {
1268     for (size_t rows = 1; rows < 2; rows++) {
1269       for (size_t channels = 1; channels <= 40; channels += 7) {
1270         VMulCAddCMicrokernelTester()
1271           .channel_tile(8)
1272           .channels(channels)
1273           .rows(rows)
1274           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1275       }
1276     }
1277   }
1278 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,rows_div_2)1279   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, rows_div_2) {
1280     for (size_t rows = 4; rows <= 8; rows += 2) {
1281       for (size_t channels = 1; channels <= 40; channels += 7) {
1282         VMulCAddCMicrokernelTester()
1283           .channel_tile(8)
1284           .channels(channels)
1285           .rows(rows)
1286           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1287       }
1288     }
1289   }
1290 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,rows_gt_2)1291   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, rows_gt_2) {
1292     for (size_t rows = 3; rows < 4; rows++) {
1293       for (size_t channels = 1; channels <= 40; channels += 7) {
1294         VMulCAddCMicrokernelTester()
1295           .channel_tile(8)
1296           .channels(channels)
1297           .rows(rows)
1298           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1299       }
1300     }
1301   }
1302 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,input_stride)1303   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, input_stride) {
1304     for (size_t rows = 1; rows <= 6; rows += 1) {
1305       for (size_t channels = 1; channels <= 40; channels += 7) {
1306         VMulCAddCMicrokernelTester()
1307           .channel_tile(8)
1308           .channels(channels)
1309           .rows(rows)
1310           .input_stride(43)
1311           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1312       }
1313     }
1314   }
1315 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,output_stride)1316   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, output_stride) {
1317     for (size_t rows = 1; rows <= 6; rows += 1) {
1318       for (size_t channels = 1; channels <= 40; channels += 7) {
1319         VMulCAddCMicrokernelTester()
1320           .channel_tile(8)
1321           .channels(channels)
1322           .rows(rows)
1323           .output_stride(43)
1324           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1325       }
1326     }
1327   }
1328 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,inplace)1329   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, inplace) {
1330     for (size_t rows = 1; rows <= 6; rows += 1) {
1331       for (size_t channels = 1; channels <= 40; channels += 7) {
1332         VMulCAddCMicrokernelTester()
1333           .channel_tile(8)
1334           .channels(channels)
1335           .rows(rows)
1336           .inplace(true)
1337           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1338       }
1339     }
1340   }
1341 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,qmin)1342   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, qmin) {
1343     for (size_t rows = 1; rows <= 6; rows += 1) {
1344       for (size_t channels = 1; channels <= 40; channels += 7) {
1345         VMulCAddCMicrokernelTester()
1346           .channel_tile(8)
1347           .channels(channels)
1348           .rows(rows)
1349           .qmin(128)
1350           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1351       }
1352     }
1353   }
1354 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X,qmax)1355   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_ARM_2X, qmax) {
1356     for (size_t rows = 1; rows <= 6; rows += 1) {
1357       for (size_t channels = 1; channels <= 40; channels += 7) {
1358         VMulCAddCMicrokernelTester()
1359           .channel_tile(8)
1360           .channels(channels)
1361           .rows(rows)
1362           .qmax(128)
1363           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_arm_2x, xnn_init_f32_minmax_wasmsimd_params);
1364       }
1365     }
1366   }
1367 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1368 
1369 
1370 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,channels_eq_8)1371   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, channels_eq_8) {
1372     VMulCAddCMicrokernelTester()
1373       .channel_tile(8)
1374       .channels(8)
1375       .rows(2)
1376       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1377   }
1378 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,channels_div_8)1379   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, channels_div_8) {
1380     for (size_t channels = 16; channels < 80; channels += 8) {
1381       VMulCAddCMicrokernelTester()
1382         .channel_tile(8)
1383         .channels(channels)
1384         .rows(2)
1385         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1386     }
1387   }
1388 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,channels_lt_8)1389   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, channels_lt_8) {
1390     for (size_t channels = 1; channels < 8; channels++) {
1391       VMulCAddCMicrokernelTester()
1392         .channel_tile(8)
1393         .channels(channels)
1394         .rows(2)
1395         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1396     }
1397   }
1398 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,channels_gt_8)1399   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, channels_gt_8) {
1400     for (size_t channels = 9; channels < 16; channels++) {
1401       VMulCAddCMicrokernelTester()
1402         .channel_tile(8)
1403         .channels(channels)
1404         .rows(2)
1405         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1406     }
1407   }
1408 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,rows_lt_2)1409   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, rows_lt_2) {
1410     for (size_t rows = 1; rows < 2; rows++) {
1411       for (size_t channels = 1; channels <= 40; channels += 7) {
1412         VMulCAddCMicrokernelTester()
1413           .channel_tile(8)
1414           .channels(channels)
1415           .rows(rows)
1416           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1417       }
1418     }
1419   }
1420 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,rows_div_2)1421   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, rows_div_2) {
1422     for (size_t rows = 4; rows <= 8; rows += 2) {
1423       for (size_t channels = 1; channels <= 40; channels += 7) {
1424         VMulCAddCMicrokernelTester()
1425           .channel_tile(8)
1426           .channels(channels)
1427           .rows(rows)
1428           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1429       }
1430     }
1431   }
1432 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,rows_gt_2)1433   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, rows_gt_2) {
1434     for (size_t rows = 3; rows < 4; rows++) {
1435       for (size_t channels = 1; channels <= 40; channels += 7) {
1436         VMulCAddCMicrokernelTester()
1437           .channel_tile(8)
1438           .channels(channels)
1439           .rows(rows)
1440           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1441       }
1442     }
1443   }
1444 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,input_stride)1445   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, input_stride) {
1446     for (size_t rows = 1; rows <= 6; rows += 1) {
1447       for (size_t channels = 1; channels <= 40; channels += 7) {
1448         VMulCAddCMicrokernelTester()
1449           .channel_tile(8)
1450           .channels(channels)
1451           .rows(rows)
1452           .input_stride(43)
1453           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1454       }
1455     }
1456   }
1457 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,output_stride)1458   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, output_stride) {
1459     for (size_t rows = 1; rows <= 6; rows += 1) {
1460       for (size_t channels = 1; channels <= 40; channels += 7) {
1461         VMulCAddCMicrokernelTester()
1462           .channel_tile(8)
1463           .channels(channels)
1464           .rows(rows)
1465           .output_stride(43)
1466           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1467       }
1468     }
1469   }
1470 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,inplace)1471   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, inplace) {
1472     for (size_t rows = 1; rows <= 6; rows += 1) {
1473       for (size_t channels = 1; channels <= 40; channels += 7) {
1474         VMulCAddCMicrokernelTester()
1475           .channel_tile(8)
1476           .channels(channels)
1477           .rows(rows)
1478           .inplace(true)
1479           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1480       }
1481     }
1482   }
1483 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,qmin)1484   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, qmin) {
1485     for (size_t rows = 1; rows <= 6; rows += 1) {
1486       for (size_t channels = 1; channels <= 40; channels += 7) {
1487         VMulCAddCMicrokernelTester()
1488           .channel_tile(8)
1489           .channels(channels)
1490           .rows(rows)
1491           .qmin(128)
1492           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1493       }
1494     }
1495   }
1496 
TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X,qmax)1497   TEST(F32_VMULCADDC_MINMAX_C8__WASMSIMD_X86_2X, qmax) {
1498     for (size_t rows = 1; rows <= 6; rows += 1) {
1499       for (size_t channels = 1; channels <= 40; channels += 7) {
1500         VMulCAddCMicrokernelTester()
1501           .channel_tile(8)
1502           .channels(channels)
1503           .rows(rows)
1504           .qmax(128)
1505           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmsimd_x86_2x, xnn_init_f32_minmax_wasmsimd_params);
1506       }
1507     }
1508   }
1509 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
1510 
1511 
1512 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,channels_eq_4)1513   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, channels_eq_4) {
1514     VMulCAddCMicrokernelTester()
1515       .channel_tile(4)
1516       .channels(4)
1517       .rows(2)
1518       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1519   }
1520 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,channels_div_4)1521   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, channels_div_4) {
1522     for (size_t channels = 8; channels < 40; channels += 4) {
1523       VMulCAddCMicrokernelTester()
1524         .channel_tile(4)
1525         .channels(channels)
1526         .rows(2)
1527         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1528     }
1529   }
1530 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,channels_lt_4)1531   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, channels_lt_4) {
1532     for (size_t channels = 1; channels < 4; channels++) {
1533       VMulCAddCMicrokernelTester()
1534         .channel_tile(4)
1535         .channels(channels)
1536         .rows(2)
1537         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1538     }
1539   }
1540 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,channels_gt_4)1541   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, channels_gt_4) {
1542     for (size_t channels = 5; channels < 8; channels++) {
1543       VMulCAddCMicrokernelTester()
1544         .channel_tile(4)
1545         .channels(channels)
1546         .rows(2)
1547         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1548     }
1549   }
1550 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,rows_lt_2)1551   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, rows_lt_2) {
1552     for (size_t rows = 1; rows < 2; rows++) {
1553       for (size_t channels = 1; channels <= 20; channels += 3) {
1554         VMulCAddCMicrokernelTester()
1555           .channel_tile(4)
1556           .channels(channels)
1557           .rows(rows)
1558           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1559       }
1560     }
1561   }
1562 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,rows_div_2)1563   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, rows_div_2) {
1564     for (size_t rows = 4; rows <= 8; rows += 2) {
1565       for (size_t channels = 1; channels <= 20; channels += 3) {
1566         VMulCAddCMicrokernelTester()
1567           .channel_tile(4)
1568           .channels(channels)
1569           .rows(rows)
1570           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1571       }
1572     }
1573   }
1574 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,rows_gt_2)1575   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, rows_gt_2) {
1576     for (size_t rows = 3; rows < 4; rows++) {
1577       for (size_t channels = 1; channels <= 20; channels += 3) {
1578         VMulCAddCMicrokernelTester()
1579           .channel_tile(4)
1580           .channels(channels)
1581           .rows(rows)
1582           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1583       }
1584     }
1585   }
1586 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,input_stride)1587   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, input_stride) {
1588     for (size_t rows = 1; rows <= 6; rows += 1) {
1589       for (size_t channels = 1; channels <= 20; channels += 3) {
1590         VMulCAddCMicrokernelTester()
1591           .channel_tile(4)
1592           .channels(channels)
1593           .rows(rows)
1594           .input_stride(23)
1595           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1596       }
1597     }
1598   }
1599 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,output_stride)1600   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, output_stride) {
1601     for (size_t rows = 1; rows <= 6; rows += 1) {
1602       for (size_t channels = 1; channels <= 20; channels += 3) {
1603         VMulCAddCMicrokernelTester()
1604           .channel_tile(4)
1605           .channels(channels)
1606           .rows(rows)
1607           .output_stride(23)
1608           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1609       }
1610     }
1611   }
1612 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,inplace)1613   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, inplace) {
1614     for (size_t rows = 1; rows <= 6; rows += 1) {
1615       for (size_t channels = 1; channels <= 20; channels += 3) {
1616         VMulCAddCMicrokernelTester()
1617           .channel_tile(4)
1618           .channels(channels)
1619           .rows(rows)
1620           .inplace(true)
1621           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1622       }
1623     }
1624   }
1625 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,qmin)1626   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, qmin) {
1627     for (size_t rows = 1; rows <= 6; rows += 1) {
1628       for (size_t channels = 1; channels <= 20; channels += 3) {
1629         VMulCAddCMicrokernelTester()
1630           .channel_tile(4)
1631           .channels(channels)
1632           .rows(rows)
1633           .qmin(128)
1634           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1635       }
1636     }
1637   }
1638 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X,qmax)1639   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_FMA_2X, qmax) {
1640     for (size_t rows = 1; rows <= 6; rows += 1) {
1641       for (size_t channels = 1; channels <= 20; channels += 3) {
1642         VMulCAddCMicrokernelTester()
1643           .channel_tile(4)
1644           .channels(channels)
1645           .rows(rows)
1646           .qmax(128)
1647           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1648       }
1649     }
1650   }
1651 #endif  // XNN_ARCH_WASMRELAXEDSIMD
1652 
1653 
1654 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,channels_eq_4)1655   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, channels_eq_4) {
1656     VMulCAddCMicrokernelTester()
1657       .channel_tile(4)
1658       .channels(4)
1659       .rows(2)
1660       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1661   }
1662 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,channels_div_4)1663   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, channels_div_4) {
1664     for (size_t channels = 8; channels < 40; channels += 4) {
1665       VMulCAddCMicrokernelTester()
1666         .channel_tile(4)
1667         .channels(channels)
1668         .rows(2)
1669         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1670     }
1671   }
1672 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,channels_lt_4)1673   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, channels_lt_4) {
1674     for (size_t channels = 1; channels < 4; channels++) {
1675       VMulCAddCMicrokernelTester()
1676         .channel_tile(4)
1677         .channels(channels)
1678         .rows(2)
1679         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1680     }
1681   }
1682 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,channels_gt_4)1683   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, channels_gt_4) {
1684     for (size_t channels = 5; channels < 8; channels++) {
1685       VMulCAddCMicrokernelTester()
1686         .channel_tile(4)
1687         .channels(channels)
1688         .rows(2)
1689         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1690     }
1691   }
1692 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,rows_lt_2)1693   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, rows_lt_2) {
1694     for (size_t rows = 1; rows < 2; rows++) {
1695       for (size_t channels = 1; channels <= 20; channels += 3) {
1696         VMulCAddCMicrokernelTester()
1697           .channel_tile(4)
1698           .channels(channels)
1699           .rows(rows)
1700           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1701       }
1702     }
1703   }
1704 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,rows_div_2)1705   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, rows_div_2) {
1706     for (size_t rows = 4; rows <= 8; rows += 2) {
1707       for (size_t channels = 1; channels <= 20; channels += 3) {
1708         VMulCAddCMicrokernelTester()
1709           .channel_tile(4)
1710           .channels(channels)
1711           .rows(rows)
1712           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1713       }
1714     }
1715   }
1716 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,rows_gt_2)1717   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, rows_gt_2) {
1718     for (size_t rows = 3; rows < 4; rows++) {
1719       for (size_t channels = 1; channels <= 20; channels += 3) {
1720         VMulCAddCMicrokernelTester()
1721           .channel_tile(4)
1722           .channels(channels)
1723           .rows(rows)
1724           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1725       }
1726     }
1727   }
1728 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,input_stride)1729   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, input_stride) {
1730     for (size_t rows = 1; rows <= 6; rows += 1) {
1731       for (size_t channels = 1; channels <= 20; channels += 3) {
1732         VMulCAddCMicrokernelTester()
1733           .channel_tile(4)
1734           .channels(channels)
1735           .rows(rows)
1736           .input_stride(23)
1737           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1738       }
1739     }
1740   }
1741 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,output_stride)1742   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, output_stride) {
1743     for (size_t rows = 1; rows <= 6; rows += 1) {
1744       for (size_t channels = 1; channels <= 20; channels += 3) {
1745         VMulCAddCMicrokernelTester()
1746           .channel_tile(4)
1747           .channels(channels)
1748           .rows(rows)
1749           .output_stride(23)
1750           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1751       }
1752     }
1753   }
1754 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,inplace)1755   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, inplace) {
1756     for (size_t rows = 1; rows <= 6; rows += 1) {
1757       for (size_t channels = 1; channels <= 20; channels += 3) {
1758         VMulCAddCMicrokernelTester()
1759           .channel_tile(4)
1760           .channels(channels)
1761           .rows(rows)
1762           .inplace(true)
1763           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1764       }
1765     }
1766   }
1767 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,qmin)1768   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, qmin) {
1769     for (size_t rows = 1; rows <= 6; rows += 1) {
1770       for (size_t channels = 1; channels <= 20; channels += 3) {
1771         VMulCAddCMicrokernelTester()
1772           .channel_tile(4)
1773           .channels(channels)
1774           .rows(rows)
1775           .qmin(128)
1776           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1777       }
1778     }
1779   }
1780 
TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X,qmax)1781   TEST(F32_VMULCADDC_MINMAX_C4__WASMRELAXEDSIMD_2X, qmax) {
1782     for (size_t rows = 1; rows <= 6; rows += 1) {
1783       for (size_t channels = 1; channels <= 20; channels += 3) {
1784         VMulCAddCMicrokernelTester()
1785           .channel_tile(4)
1786           .channels(channels)
1787           .rows(rows)
1788           .qmax(128)
1789           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1790       }
1791     }
1792   }
1793 #endif  // XNN_ARCH_WASMRELAXEDSIMD
1794 
1795 
1796 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,channels_eq_8)1797   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, channels_eq_8) {
1798     VMulCAddCMicrokernelTester()
1799       .channel_tile(8)
1800       .channels(8)
1801       .rows(2)
1802       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1803   }
1804 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,channels_div_8)1805   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, channels_div_8) {
1806     for (size_t channels = 16; channels < 80; channels += 8) {
1807       VMulCAddCMicrokernelTester()
1808         .channel_tile(8)
1809         .channels(channels)
1810         .rows(2)
1811         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1812     }
1813   }
1814 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,channels_lt_8)1815   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, channels_lt_8) {
1816     for (size_t channels = 1; channels < 8; channels++) {
1817       VMulCAddCMicrokernelTester()
1818         .channel_tile(8)
1819         .channels(channels)
1820         .rows(2)
1821         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1822     }
1823   }
1824 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,channels_gt_8)1825   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, channels_gt_8) {
1826     for (size_t channels = 9; channels < 16; channels++) {
1827       VMulCAddCMicrokernelTester()
1828         .channel_tile(8)
1829         .channels(channels)
1830         .rows(2)
1831         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1832     }
1833   }
1834 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,rows_lt_2)1835   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, rows_lt_2) {
1836     for (size_t rows = 1; rows < 2; rows++) {
1837       for (size_t channels = 1; channels <= 40; channels += 7) {
1838         VMulCAddCMicrokernelTester()
1839           .channel_tile(8)
1840           .channels(channels)
1841           .rows(rows)
1842           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1843       }
1844     }
1845   }
1846 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,rows_div_2)1847   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, rows_div_2) {
1848     for (size_t rows = 4; rows <= 8; rows += 2) {
1849       for (size_t channels = 1; channels <= 40; channels += 7) {
1850         VMulCAddCMicrokernelTester()
1851           .channel_tile(8)
1852           .channels(channels)
1853           .rows(rows)
1854           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1855       }
1856     }
1857   }
1858 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,rows_gt_2)1859   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, rows_gt_2) {
1860     for (size_t rows = 3; rows < 4; rows++) {
1861       for (size_t channels = 1; channels <= 40; channels += 7) {
1862         VMulCAddCMicrokernelTester()
1863           .channel_tile(8)
1864           .channels(channels)
1865           .rows(rows)
1866           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1867       }
1868     }
1869   }
1870 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,input_stride)1871   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, input_stride) {
1872     for (size_t rows = 1; rows <= 6; rows += 1) {
1873       for (size_t channels = 1; channels <= 40; channels += 7) {
1874         VMulCAddCMicrokernelTester()
1875           .channel_tile(8)
1876           .channels(channels)
1877           .rows(rows)
1878           .input_stride(43)
1879           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1880       }
1881     }
1882   }
1883 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,output_stride)1884   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, output_stride) {
1885     for (size_t rows = 1; rows <= 6; rows += 1) {
1886       for (size_t channels = 1; channels <= 40; channels += 7) {
1887         VMulCAddCMicrokernelTester()
1888           .channel_tile(8)
1889           .channels(channels)
1890           .rows(rows)
1891           .output_stride(43)
1892           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1893       }
1894     }
1895   }
1896 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,inplace)1897   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, inplace) {
1898     for (size_t rows = 1; rows <= 6; rows += 1) {
1899       for (size_t channels = 1; channels <= 40; channels += 7) {
1900         VMulCAddCMicrokernelTester()
1901           .channel_tile(8)
1902           .channels(channels)
1903           .rows(rows)
1904           .inplace(true)
1905           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1906       }
1907     }
1908   }
1909 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,qmin)1910   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, qmin) {
1911     for (size_t rows = 1; rows <= 6; rows += 1) {
1912       for (size_t channels = 1; channels <= 40; channels += 7) {
1913         VMulCAddCMicrokernelTester()
1914           .channel_tile(8)
1915           .channels(channels)
1916           .rows(rows)
1917           .qmin(128)
1918           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1919       }
1920     }
1921   }
1922 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X,qmax)1923   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_FMA_2X, qmax) {
1924     for (size_t rows = 1; rows <= 6; rows += 1) {
1925       for (size_t channels = 1; channels <= 40; channels += 7) {
1926         VMulCAddCMicrokernelTester()
1927           .channel_tile(8)
1928           .channels(channels)
1929           .rows(rows)
1930           .qmax(128)
1931           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_fma_2x, xnn_init_f32_minmax_wasmsimd_params);
1932       }
1933     }
1934   }
1935 #endif  // XNN_ARCH_WASMRELAXEDSIMD
1936 
1937 
1938 #if XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,channels_eq_8)1939   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, channels_eq_8) {
1940     VMulCAddCMicrokernelTester()
1941       .channel_tile(8)
1942       .channels(8)
1943       .rows(2)
1944       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1945   }
1946 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,channels_div_8)1947   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, channels_div_8) {
1948     for (size_t channels = 16; channels < 80; channels += 8) {
1949       VMulCAddCMicrokernelTester()
1950         .channel_tile(8)
1951         .channels(channels)
1952         .rows(2)
1953         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1954     }
1955   }
1956 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,channels_lt_8)1957   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, channels_lt_8) {
1958     for (size_t channels = 1; channels < 8; channels++) {
1959       VMulCAddCMicrokernelTester()
1960         .channel_tile(8)
1961         .channels(channels)
1962         .rows(2)
1963         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1964     }
1965   }
1966 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,channels_gt_8)1967   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, channels_gt_8) {
1968     for (size_t channels = 9; channels < 16; channels++) {
1969       VMulCAddCMicrokernelTester()
1970         .channel_tile(8)
1971         .channels(channels)
1972         .rows(2)
1973         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1974     }
1975   }
1976 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,rows_lt_2)1977   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, rows_lt_2) {
1978     for (size_t rows = 1; rows < 2; rows++) {
1979       for (size_t channels = 1; channels <= 40; channels += 7) {
1980         VMulCAddCMicrokernelTester()
1981           .channel_tile(8)
1982           .channels(channels)
1983           .rows(rows)
1984           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1985       }
1986     }
1987   }
1988 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,rows_div_2)1989   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, rows_div_2) {
1990     for (size_t rows = 4; rows <= 8; rows += 2) {
1991       for (size_t channels = 1; channels <= 40; channels += 7) {
1992         VMulCAddCMicrokernelTester()
1993           .channel_tile(8)
1994           .channels(channels)
1995           .rows(rows)
1996           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
1997       }
1998     }
1999   }
2000 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,rows_gt_2)2001   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, rows_gt_2) {
2002     for (size_t rows = 3; rows < 4; rows++) {
2003       for (size_t channels = 1; channels <= 40; channels += 7) {
2004         VMulCAddCMicrokernelTester()
2005           .channel_tile(8)
2006           .channels(channels)
2007           .rows(rows)
2008           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2009       }
2010     }
2011   }
2012 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,input_stride)2013   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, input_stride) {
2014     for (size_t rows = 1; rows <= 6; rows += 1) {
2015       for (size_t channels = 1; channels <= 40; channels += 7) {
2016         VMulCAddCMicrokernelTester()
2017           .channel_tile(8)
2018           .channels(channels)
2019           .rows(rows)
2020           .input_stride(43)
2021           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2022       }
2023     }
2024   }
2025 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,output_stride)2026   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, output_stride) {
2027     for (size_t rows = 1; rows <= 6; rows += 1) {
2028       for (size_t channels = 1; channels <= 40; channels += 7) {
2029         VMulCAddCMicrokernelTester()
2030           .channel_tile(8)
2031           .channels(channels)
2032           .rows(rows)
2033           .output_stride(43)
2034           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2035       }
2036     }
2037   }
2038 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,inplace)2039   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, inplace) {
2040     for (size_t rows = 1; rows <= 6; rows += 1) {
2041       for (size_t channels = 1; channels <= 40; channels += 7) {
2042         VMulCAddCMicrokernelTester()
2043           .channel_tile(8)
2044           .channels(channels)
2045           .rows(rows)
2046           .inplace(true)
2047           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2048       }
2049     }
2050   }
2051 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,qmin)2052   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, qmin) {
2053     for (size_t rows = 1; rows <= 6; rows += 1) {
2054       for (size_t channels = 1; channels <= 40; channels += 7) {
2055         VMulCAddCMicrokernelTester()
2056           .channel_tile(8)
2057           .channels(channels)
2058           .rows(rows)
2059           .qmin(128)
2060           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2061       }
2062     }
2063   }
2064 
TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X,qmax)2065   TEST(F32_VMULCADDC_MINMAX_C8__WASMRELAXEDSIMD_2X, qmax) {
2066     for (size_t rows = 1; rows <= 6; rows += 1) {
2067       for (size_t channels = 1; channels <= 40; channels += 7) {
2068         VMulCAddCMicrokernelTester()
2069           .channel_tile(8)
2070           .channels(channels)
2071           .rows(rows)
2072           .qmax(128)
2073           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c8__wasmrelaxedsimd_2x, xnn_init_f32_minmax_wasmsimd_params);
2074       }
2075     }
2076   }
2077 #endif  // XNN_ARCH_WASMRELAXEDSIMD
2078 
2079 
2080 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,channels_eq_1)2081   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, channels_eq_1) {
2082     VMulCAddCMicrokernelTester()
2083       .channel_tile(1)
2084       .channels(1)
2085       .rows(2)
2086       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2087   }
2088 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,channels_gt_1)2089   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, channels_gt_1) {
2090     for (size_t channels = 2; channels < 10; channels++) {
2091       VMulCAddCMicrokernelTester()
2092         .channel_tile(1)
2093         .channels(channels)
2094         .rows(2)
2095         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2096     }
2097   }
2098 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,rows_lt_2)2099   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, rows_lt_2) {
2100     for (size_t rows = 1; rows < 2; rows++) {
2101       for (size_t channels = 1; channels <= 5; channels += 1) {
2102         VMulCAddCMicrokernelTester()
2103           .channel_tile(1)
2104           .channels(channels)
2105           .rows(rows)
2106           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2107       }
2108     }
2109   }
2110 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,rows_div_2)2111   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, rows_div_2) {
2112     for (size_t rows = 4; rows <= 8; rows += 2) {
2113       for (size_t channels = 1; channels <= 5; channels += 1) {
2114         VMulCAddCMicrokernelTester()
2115           .channel_tile(1)
2116           .channels(channels)
2117           .rows(rows)
2118           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2119       }
2120     }
2121   }
2122 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,rows_gt_2)2123   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, rows_gt_2) {
2124     for (size_t rows = 3; rows < 4; rows++) {
2125       for (size_t channels = 1; channels <= 5; channels += 1) {
2126         VMulCAddCMicrokernelTester()
2127           .channel_tile(1)
2128           .channels(channels)
2129           .rows(rows)
2130           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2131       }
2132     }
2133   }
2134 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,input_stride)2135   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, input_stride) {
2136     for (size_t rows = 1; rows <= 6; rows += 1) {
2137       for (size_t channels = 1; channels <= 5; channels += 1) {
2138         VMulCAddCMicrokernelTester()
2139           .channel_tile(1)
2140           .channels(channels)
2141           .rows(rows)
2142           .input_stride(7)
2143           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2144       }
2145     }
2146   }
2147 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,output_stride)2148   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, output_stride) {
2149     for (size_t rows = 1; rows <= 6; rows += 1) {
2150       for (size_t channels = 1; channels <= 5; channels += 1) {
2151         VMulCAddCMicrokernelTester()
2152           .channel_tile(1)
2153           .channels(channels)
2154           .rows(rows)
2155           .output_stride(7)
2156           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2157       }
2158     }
2159   }
2160 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,inplace)2161   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, inplace) {
2162     for (size_t rows = 1; rows <= 6; rows += 1) {
2163       for (size_t channels = 1; channels <= 5; channels += 1) {
2164         VMulCAddCMicrokernelTester()
2165           .channel_tile(1)
2166           .channels(channels)
2167           .rows(rows)
2168           .inplace(true)
2169           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2170       }
2171     }
2172   }
2173 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,qmin)2174   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, qmin) {
2175     for (size_t rows = 1; rows <= 6; rows += 1) {
2176       for (size_t channels = 1; channels <= 5; channels += 1) {
2177         VMulCAddCMicrokernelTester()
2178           .channel_tile(1)
2179           .channels(channels)
2180           .rows(rows)
2181           .qmin(128)
2182           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2183       }
2184     }
2185   }
2186 
TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X,qmax)2187   TEST(F32_VMULCADDC_MINMAX_C1__WASM_2X, qmax) {
2188     for (size_t rows = 1; rows <= 6; rows += 1) {
2189       for (size_t channels = 1; channels <= 5; channels += 1) {
2190         VMulCAddCMicrokernelTester()
2191           .channel_tile(1)
2192           .channels(channels)
2193           .rows(rows)
2194           .qmax(128)
2195           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__wasm_2x, xnn_init_f32_minmax_scalar_params);
2196       }
2197     }
2198   }
2199 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2200 
2201 
2202 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,channels_eq_2)2203   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, channels_eq_2) {
2204     VMulCAddCMicrokernelTester()
2205       .channel_tile(2)
2206       .channels(2)
2207       .rows(2)
2208       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2209   }
2210 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,channels_div_2)2211   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, channels_div_2) {
2212     for (size_t channels = 4; channels < 20; channels += 2) {
2213       VMulCAddCMicrokernelTester()
2214         .channel_tile(2)
2215         .channels(channels)
2216         .rows(2)
2217         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2218     }
2219   }
2220 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,channels_lt_2)2221   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, channels_lt_2) {
2222     for (size_t channels = 1; channels < 2; channels++) {
2223       VMulCAddCMicrokernelTester()
2224         .channel_tile(2)
2225         .channels(channels)
2226         .rows(2)
2227         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2228     }
2229   }
2230 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,channels_gt_2)2231   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, channels_gt_2) {
2232     for (size_t channels = 3; channels < 4; channels++) {
2233       VMulCAddCMicrokernelTester()
2234         .channel_tile(2)
2235         .channels(channels)
2236         .rows(2)
2237         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2238     }
2239   }
2240 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,rows_lt_2)2241   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, rows_lt_2) {
2242     for (size_t rows = 1; rows < 2; rows++) {
2243       for (size_t channels = 1; channels <= 10; channels += 1) {
2244         VMulCAddCMicrokernelTester()
2245           .channel_tile(2)
2246           .channels(channels)
2247           .rows(rows)
2248           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2249       }
2250     }
2251   }
2252 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,rows_div_2)2253   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, rows_div_2) {
2254     for (size_t rows = 4; rows <= 8; rows += 2) {
2255       for (size_t channels = 1; channels <= 10; channels += 1) {
2256         VMulCAddCMicrokernelTester()
2257           .channel_tile(2)
2258           .channels(channels)
2259           .rows(rows)
2260           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2261       }
2262     }
2263   }
2264 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,rows_gt_2)2265   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, rows_gt_2) {
2266     for (size_t rows = 3; rows < 4; rows++) {
2267       for (size_t channels = 1; channels <= 10; channels += 1) {
2268         VMulCAddCMicrokernelTester()
2269           .channel_tile(2)
2270           .channels(channels)
2271           .rows(rows)
2272           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2273       }
2274     }
2275   }
2276 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,input_stride)2277   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, input_stride) {
2278     for (size_t rows = 1; rows <= 6; rows += 1) {
2279       for (size_t channels = 1; channels <= 10; channels += 1) {
2280         VMulCAddCMicrokernelTester()
2281           .channel_tile(2)
2282           .channels(channels)
2283           .rows(rows)
2284           .input_stride(13)
2285           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2286       }
2287     }
2288   }
2289 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,output_stride)2290   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, output_stride) {
2291     for (size_t rows = 1; rows <= 6; rows += 1) {
2292       for (size_t channels = 1; channels <= 10; channels += 1) {
2293         VMulCAddCMicrokernelTester()
2294           .channel_tile(2)
2295           .channels(channels)
2296           .rows(rows)
2297           .output_stride(13)
2298           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2299       }
2300     }
2301   }
2302 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,inplace)2303   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, inplace) {
2304     for (size_t rows = 1; rows <= 6; rows += 1) {
2305       for (size_t channels = 1; channels <= 10; channels += 1) {
2306         VMulCAddCMicrokernelTester()
2307           .channel_tile(2)
2308           .channels(channels)
2309           .rows(rows)
2310           .inplace(true)
2311           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2312       }
2313     }
2314   }
2315 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,qmin)2316   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, qmin) {
2317     for (size_t rows = 1; rows <= 6; rows += 1) {
2318       for (size_t channels = 1; channels <= 10; channels += 1) {
2319         VMulCAddCMicrokernelTester()
2320           .channel_tile(2)
2321           .channels(channels)
2322           .rows(rows)
2323           .qmin(128)
2324           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2325       }
2326     }
2327   }
2328 
TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X,qmax)2329   TEST(F32_VMULCADDC_MINMAX_C2__WASM_2X, qmax) {
2330     for (size_t rows = 1; rows <= 6; rows += 1) {
2331       for (size_t channels = 1; channels <= 10; channels += 1) {
2332         VMulCAddCMicrokernelTester()
2333           .channel_tile(2)
2334           .channels(channels)
2335           .rows(rows)
2336           .qmax(128)
2337           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__wasm_2x, xnn_init_f32_minmax_scalar_params);
2338       }
2339     }
2340   }
2341 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2342 
2343 
2344 #if XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,channels_eq_4)2345   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, channels_eq_4) {
2346     VMulCAddCMicrokernelTester()
2347       .channel_tile(4)
2348       .channels(4)
2349       .rows(2)
2350       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2351   }
2352 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,channels_div_4)2353   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, channels_div_4) {
2354     for (size_t channels = 8; channels < 40; channels += 4) {
2355       VMulCAddCMicrokernelTester()
2356         .channel_tile(4)
2357         .channels(channels)
2358         .rows(2)
2359         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2360     }
2361   }
2362 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,channels_lt_4)2363   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, channels_lt_4) {
2364     for (size_t channels = 1; channels < 4; channels++) {
2365       VMulCAddCMicrokernelTester()
2366         .channel_tile(4)
2367         .channels(channels)
2368         .rows(2)
2369         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2370     }
2371   }
2372 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,channels_gt_4)2373   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, channels_gt_4) {
2374     for (size_t channels = 5; channels < 8; channels++) {
2375       VMulCAddCMicrokernelTester()
2376         .channel_tile(4)
2377         .channels(channels)
2378         .rows(2)
2379         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2380     }
2381   }
2382 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,rows_lt_2)2383   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, rows_lt_2) {
2384     for (size_t rows = 1; rows < 2; rows++) {
2385       for (size_t channels = 1; channels <= 20; channels += 3) {
2386         VMulCAddCMicrokernelTester()
2387           .channel_tile(4)
2388           .channels(channels)
2389           .rows(rows)
2390           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2391       }
2392     }
2393   }
2394 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,rows_div_2)2395   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, rows_div_2) {
2396     for (size_t rows = 4; rows <= 8; rows += 2) {
2397       for (size_t channels = 1; channels <= 20; channels += 3) {
2398         VMulCAddCMicrokernelTester()
2399           .channel_tile(4)
2400           .channels(channels)
2401           .rows(rows)
2402           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2403       }
2404     }
2405   }
2406 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,rows_gt_2)2407   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, rows_gt_2) {
2408     for (size_t rows = 3; rows < 4; rows++) {
2409       for (size_t channels = 1; channels <= 20; channels += 3) {
2410         VMulCAddCMicrokernelTester()
2411           .channel_tile(4)
2412           .channels(channels)
2413           .rows(rows)
2414           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2415       }
2416     }
2417   }
2418 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,input_stride)2419   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, input_stride) {
2420     for (size_t rows = 1; rows <= 6; rows += 1) {
2421       for (size_t channels = 1; channels <= 20; channels += 3) {
2422         VMulCAddCMicrokernelTester()
2423           .channel_tile(4)
2424           .channels(channels)
2425           .rows(rows)
2426           .input_stride(23)
2427           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2428       }
2429     }
2430   }
2431 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,output_stride)2432   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, output_stride) {
2433     for (size_t rows = 1; rows <= 6; rows += 1) {
2434       for (size_t channels = 1; channels <= 20; channels += 3) {
2435         VMulCAddCMicrokernelTester()
2436           .channel_tile(4)
2437           .channels(channels)
2438           .rows(rows)
2439           .output_stride(23)
2440           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2441       }
2442     }
2443   }
2444 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,inplace)2445   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, inplace) {
2446     for (size_t rows = 1; rows <= 6; rows += 1) {
2447       for (size_t channels = 1; channels <= 20; channels += 3) {
2448         VMulCAddCMicrokernelTester()
2449           .channel_tile(4)
2450           .channels(channels)
2451           .rows(rows)
2452           .inplace(true)
2453           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2454       }
2455     }
2456   }
2457 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,qmin)2458   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, qmin) {
2459     for (size_t rows = 1; rows <= 6; rows += 1) {
2460       for (size_t channels = 1; channels <= 20; channels += 3) {
2461         VMulCAddCMicrokernelTester()
2462           .channel_tile(4)
2463           .channels(channels)
2464           .rows(rows)
2465           .qmin(128)
2466           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2467       }
2468     }
2469   }
2470 
TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X,qmax)2471   TEST(F32_VMULCADDC_MINMAX_C4__WASM_2X, qmax) {
2472     for (size_t rows = 1; rows <= 6; rows += 1) {
2473       for (size_t channels = 1; channels <= 20; channels += 3) {
2474         VMulCAddCMicrokernelTester()
2475           .channel_tile(4)
2476           .channels(channels)
2477           .rows(rows)
2478           .qmax(128)
2479           .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__wasm_2x, xnn_init_f32_minmax_scalar_params);
2480       }
2481     }
2482   }
2483 #endif  // XNN_ARCH_WASM || XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2484 
2485 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,channels_eq_1)2486 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, channels_eq_1) {
2487   VMulCAddCMicrokernelTester()
2488     .channel_tile(1)
2489     .channels(1)
2490     .rows(2)
2491     .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2492 }
2493 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,channels_gt_1)2494 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, channels_gt_1) {
2495   for (size_t channels = 2; channels < 10; channels++) {
2496     VMulCAddCMicrokernelTester()
2497       .channel_tile(1)
2498       .channels(channels)
2499       .rows(2)
2500       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2501   }
2502 }
2503 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,rows_lt_2)2504 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, rows_lt_2) {
2505   for (size_t rows = 1; rows < 2; rows++) {
2506     for (size_t channels = 1; channels <= 5; channels += 1) {
2507       VMulCAddCMicrokernelTester()
2508         .channel_tile(1)
2509         .channels(channels)
2510         .rows(rows)
2511         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2512     }
2513   }
2514 }
2515 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,rows_div_2)2516 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, rows_div_2) {
2517   for (size_t rows = 4; rows <= 8; rows += 2) {
2518     for (size_t channels = 1; channels <= 5; channels += 1) {
2519       VMulCAddCMicrokernelTester()
2520         .channel_tile(1)
2521         .channels(channels)
2522         .rows(rows)
2523         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2524     }
2525   }
2526 }
2527 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,rows_gt_2)2528 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, rows_gt_2) {
2529   for (size_t rows = 3; rows < 4; rows++) {
2530     for (size_t channels = 1; channels <= 5; channels += 1) {
2531       VMulCAddCMicrokernelTester()
2532         .channel_tile(1)
2533         .channels(channels)
2534         .rows(rows)
2535         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2536     }
2537   }
2538 }
2539 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,input_stride)2540 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, input_stride) {
2541   for (size_t rows = 1; rows <= 6; rows += 1) {
2542     for (size_t channels = 1; channels <= 5; channels += 1) {
2543       VMulCAddCMicrokernelTester()
2544         .channel_tile(1)
2545         .channels(channels)
2546         .rows(rows)
2547         .input_stride(7)
2548         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2549     }
2550   }
2551 }
2552 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,output_stride)2553 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, output_stride) {
2554   for (size_t rows = 1; rows <= 6; rows += 1) {
2555     for (size_t channels = 1; channels <= 5; channels += 1) {
2556       VMulCAddCMicrokernelTester()
2557         .channel_tile(1)
2558         .channels(channels)
2559         .rows(rows)
2560         .output_stride(7)
2561         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2562     }
2563   }
2564 }
2565 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,inplace)2566 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, inplace) {
2567   for (size_t rows = 1; rows <= 6; rows += 1) {
2568     for (size_t channels = 1; channels <= 5; channels += 1) {
2569       VMulCAddCMicrokernelTester()
2570         .channel_tile(1)
2571         .channels(channels)
2572         .rows(rows)
2573         .inplace(true)
2574         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2575     }
2576   }
2577 }
2578 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,qmin)2579 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, qmin) {
2580   for (size_t rows = 1; rows <= 6; rows += 1) {
2581     for (size_t channels = 1; channels <= 5; channels += 1) {
2582       VMulCAddCMicrokernelTester()
2583         .channel_tile(1)
2584         .channels(channels)
2585         .rows(rows)
2586         .qmin(128)
2587         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2588     }
2589   }
2590 }
2591 
TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X,qmax)2592 TEST(F32_VMULCADDC_MINMAX_C1__SCALAR_2X, qmax) {
2593   for (size_t rows = 1; rows <= 6; rows += 1) {
2594     for (size_t channels = 1; channels <= 5; channels += 1) {
2595       VMulCAddCMicrokernelTester()
2596         .channel_tile(1)
2597         .channels(channels)
2598         .rows(rows)
2599         .qmax(128)
2600         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c1__scalar_2x, xnn_init_f32_minmax_scalar_params);
2601     }
2602   }
2603 }
2604 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,channels_eq_2)2605 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, channels_eq_2) {
2606   VMulCAddCMicrokernelTester()
2607     .channel_tile(2)
2608     .channels(2)
2609     .rows(2)
2610     .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2611 }
2612 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,channels_div_2)2613 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, channels_div_2) {
2614   for (size_t channels = 4; channels < 20; channels += 2) {
2615     VMulCAddCMicrokernelTester()
2616       .channel_tile(2)
2617       .channels(channels)
2618       .rows(2)
2619       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2620   }
2621 }
2622 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,channels_lt_2)2623 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, channels_lt_2) {
2624   for (size_t channels = 1; channels < 2; channels++) {
2625     VMulCAddCMicrokernelTester()
2626       .channel_tile(2)
2627       .channels(channels)
2628       .rows(2)
2629       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2630   }
2631 }
2632 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,channels_gt_2)2633 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, channels_gt_2) {
2634   for (size_t channels = 3; channels < 4; channels++) {
2635     VMulCAddCMicrokernelTester()
2636       .channel_tile(2)
2637       .channels(channels)
2638       .rows(2)
2639       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2640   }
2641 }
2642 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,rows_lt_2)2643 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, rows_lt_2) {
2644   for (size_t rows = 1; rows < 2; rows++) {
2645     for (size_t channels = 1; channels <= 10; channels += 1) {
2646       VMulCAddCMicrokernelTester()
2647         .channel_tile(2)
2648         .channels(channels)
2649         .rows(rows)
2650         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2651     }
2652   }
2653 }
2654 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,rows_div_2)2655 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, rows_div_2) {
2656   for (size_t rows = 4; rows <= 8; rows += 2) {
2657     for (size_t channels = 1; channels <= 10; channels += 1) {
2658       VMulCAddCMicrokernelTester()
2659         .channel_tile(2)
2660         .channels(channels)
2661         .rows(rows)
2662         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2663     }
2664   }
2665 }
2666 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,rows_gt_2)2667 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, rows_gt_2) {
2668   for (size_t rows = 3; rows < 4; rows++) {
2669     for (size_t channels = 1; channels <= 10; channels += 1) {
2670       VMulCAddCMicrokernelTester()
2671         .channel_tile(2)
2672         .channels(channels)
2673         .rows(rows)
2674         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2675     }
2676   }
2677 }
2678 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,input_stride)2679 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, input_stride) {
2680   for (size_t rows = 1; rows <= 6; rows += 1) {
2681     for (size_t channels = 1; channels <= 10; channels += 1) {
2682       VMulCAddCMicrokernelTester()
2683         .channel_tile(2)
2684         .channels(channels)
2685         .rows(rows)
2686         .input_stride(13)
2687         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2688     }
2689   }
2690 }
2691 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,output_stride)2692 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, output_stride) {
2693   for (size_t rows = 1; rows <= 6; rows += 1) {
2694     for (size_t channels = 1; channels <= 10; channels += 1) {
2695       VMulCAddCMicrokernelTester()
2696         .channel_tile(2)
2697         .channels(channels)
2698         .rows(rows)
2699         .output_stride(13)
2700         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2701     }
2702   }
2703 }
2704 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,inplace)2705 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, inplace) {
2706   for (size_t rows = 1; rows <= 6; rows += 1) {
2707     for (size_t channels = 1; channels <= 10; channels += 1) {
2708       VMulCAddCMicrokernelTester()
2709         .channel_tile(2)
2710         .channels(channels)
2711         .rows(rows)
2712         .inplace(true)
2713         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2714     }
2715   }
2716 }
2717 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,qmin)2718 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, qmin) {
2719   for (size_t rows = 1; rows <= 6; rows += 1) {
2720     for (size_t channels = 1; channels <= 10; channels += 1) {
2721       VMulCAddCMicrokernelTester()
2722         .channel_tile(2)
2723         .channels(channels)
2724         .rows(rows)
2725         .qmin(128)
2726         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2727     }
2728   }
2729 }
2730 
TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X,qmax)2731 TEST(F32_VMULCADDC_MINMAX_C2__SCALAR_2X, qmax) {
2732   for (size_t rows = 1; rows <= 6; rows += 1) {
2733     for (size_t channels = 1; channels <= 10; channels += 1) {
2734       VMulCAddCMicrokernelTester()
2735         .channel_tile(2)
2736         .channels(channels)
2737         .rows(rows)
2738         .qmax(128)
2739         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c2__scalar_2x, xnn_init_f32_minmax_scalar_params);
2740     }
2741   }
2742 }
2743 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,channels_eq_4)2744 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, channels_eq_4) {
2745   VMulCAddCMicrokernelTester()
2746     .channel_tile(4)
2747     .channels(4)
2748     .rows(2)
2749     .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2750 }
2751 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,channels_div_4)2752 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, channels_div_4) {
2753   for (size_t channels = 8; channels < 40; channels += 4) {
2754     VMulCAddCMicrokernelTester()
2755       .channel_tile(4)
2756       .channels(channels)
2757       .rows(2)
2758       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2759   }
2760 }
2761 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,channels_lt_4)2762 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, channels_lt_4) {
2763   for (size_t channels = 1; channels < 4; channels++) {
2764     VMulCAddCMicrokernelTester()
2765       .channel_tile(4)
2766       .channels(channels)
2767       .rows(2)
2768       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2769   }
2770 }
2771 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,channels_gt_4)2772 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, channels_gt_4) {
2773   for (size_t channels = 5; channels < 8; channels++) {
2774     VMulCAddCMicrokernelTester()
2775       .channel_tile(4)
2776       .channels(channels)
2777       .rows(2)
2778       .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2779   }
2780 }
2781 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,rows_lt_2)2782 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, rows_lt_2) {
2783   for (size_t rows = 1; rows < 2; rows++) {
2784     for (size_t channels = 1; channels <= 20; channels += 3) {
2785       VMulCAddCMicrokernelTester()
2786         .channel_tile(4)
2787         .channels(channels)
2788         .rows(rows)
2789         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2790     }
2791   }
2792 }
2793 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,rows_div_2)2794 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, rows_div_2) {
2795   for (size_t rows = 4; rows <= 8; rows += 2) {
2796     for (size_t channels = 1; channels <= 20; channels += 3) {
2797       VMulCAddCMicrokernelTester()
2798         .channel_tile(4)
2799         .channels(channels)
2800         .rows(rows)
2801         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2802     }
2803   }
2804 }
2805 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,rows_gt_2)2806 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, rows_gt_2) {
2807   for (size_t rows = 3; rows < 4; rows++) {
2808     for (size_t channels = 1; channels <= 20; channels += 3) {
2809       VMulCAddCMicrokernelTester()
2810         .channel_tile(4)
2811         .channels(channels)
2812         .rows(rows)
2813         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2814     }
2815   }
2816 }
2817 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,input_stride)2818 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, input_stride) {
2819   for (size_t rows = 1; rows <= 6; rows += 1) {
2820     for (size_t channels = 1; channels <= 20; channels += 3) {
2821       VMulCAddCMicrokernelTester()
2822         .channel_tile(4)
2823         .channels(channels)
2824         .rows(rows)
2825         .input_stride(23)
2826         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2827     }
2828   }
2829 }
2830 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,output_stride)2831 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, output_stride) {
2832   for (size_t rows = 1; rows <= 6; rows += 1) {
2833     for (size_t channels = 1; channels <= 20; channels += 3) {
2834       VMulCAddCMicrokernelTester()
2835         .channel_tile(4)
2836         .channels(channels)
2837         .rows(rows)
2838         .output_stride(23)
2839         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2840     }
2841   }
2842 }
2843 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,inplace)2844 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, inplace) {
2845   for (size_t rows = 1; rows <= 6; rows += 1) {
2846     for (size_t channels = 1; channels <= 20; channels += 3) {
2847       VMulCAddCMicrokernelTester()
2848         .channel_tile(4)
2849         .channels(channels)
2850         .rows(rows)
2851         .inplace(true)
2852         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2853     }
2854   }
2855 }
2856 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,qmin)2857 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, qmin) {
2858   for (size_t rows = 1; rows <= 6; rows += 1) {
2859     for (size_t channels = 1; channels <= 20; channels += 3) {
2860       VMulCAddCMicrokernelTester()
2861         .channel_tile(4)
2862         .channels(channels)
2863         .rows(rows)
2864         .qmin(128)
2865         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2866     }
2867   }
2868 }
2869 
TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X,qmax)2870 TEST(F32_VMULCADDC_MINMAX_C4__SCALAR_2X, qmax) {
2871   for (size_t rows = 1; rows <= 6; rows += 1) {
2872     for (size_t channels = 1; channels <= 20; channels += 3) {
2873       VMulCAddCMicrokernelTester()
2874         .channel_tile(4)
2875         .channels(channels)
2876         .rows(rows)
2877         .qmax(128)
2878         .Test(xnn_f32_vmulcaddc_minmax_ukernel_c4__scalar_2x, xnn_init_f32_minmax_scalar_params);
2879     }
2880   }
2881 }