xref: /aosp_15_r20/external/XNNPACK/test/u8-maxpool-minmax.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1 // Copyright (c) Facebook, Inc. and its affiliates.
2 // All rights reserved.
3 //
4 // Copyright 2019 Google LLC
5 //
6 // This source code is licensed under the BSD-style license found in the
7 // LICENSE file in the root directory of this source tree.
8 //
9 // Auto-generated file. Do not edit!
10 //   Specification: test/u8-maxpool-minmax.yaml
11 //   Generator: tools/generate-maxpool-test.py
12 
13 
14 #include <gtest/gtest.h>
15 
16 #include <xnnpack/common.h>
17 #include <xnnpack/isa-checks.h>
18 
19 #include <xnnpack/maxpool.h>
20 #include "maxpool-microkernel-tester.h"
21 
22 
23 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile)24   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile) {
25     TEST_REQUIRES_ARM_NEON;
26     MaxPoolMicrokernelTester()
27       .pooling_elements(9)
28       .pooling_tile(9, 8)
29       .channels(16)
30       .qmin(std::numeric_limits<uint8_t>::min())
31       .qmax(std::numeric_limits<uint8_t>::max())
32       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
33   }
34 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_input_offset)35   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
36     TEST_REQUIRES_ARM_NEON;
37     MaxPoolMicrokernelTester()
38       .pooling_elements(9)
39       .pooling_tile(9, 8)
40       .channels(16)
41       .input_offset(19)
42       .qmin(std::numeric_limits<uint8_t>::min())
43       .qmax(std::numeric_limits<uint8_t>::max())
44       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
45   }
46 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmin)47   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmin) {
48     TEST_REQUIRES_ARM_NEON;
49     MaxPoolMicrokernelTester()
50       .pooling_elements(9)
51       .pooling_tile(9, 8)
52       .channels(16)
53       .qmin(64)
54       .qmax(std::numeric_limits<uint8_t>::max())
55       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
56   }
57 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmax)58   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmax) {
59     TEST_REQUIRES_ARM_NEON;
60     MaxPoolMicrokernelTester()
61       .pooling_elements(9)
62       .pooling_tile(9, 8)
63       .channels(16)
64       .qmin(std::numeric_limits<uint8_t>::min())
65       .qmax(192)
66       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
67   }
68 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_subtile)69   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_subtile) {
70     TEST_REQUIRES_ARM_NEON;
71     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
72       MaxPoolMicrokernelTester()
73         .pooling_elements(pooling_elements)
74         .pooling_tile(9, 8)
75         .channels(16)
76         .qmin(std::numeric_limits<uint8_t>::min())
77         .qmax(std::numeric_limits<uint8_t>::max())
78         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
79     }
80   }
81 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_subtile_with_input_offset)82   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_subtile_with_input_offset) {
83     TEST_REQUIRES_ARM_NEON;
84     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
85       MaxPoolMicrokernelTester()
86         .pooling_elements(pooling_elements)
87         .pooling_tile(9, 8)
88         .channels(16)
89         .input_offset(19)
90         .qmin(std::numeric_limits<uint8_t>::min())
91         .qmax(std::numeric_limits<uint8_t>::max())
92         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
93     }
94   }
95 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile)96   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile) {
97     TEST_REQUIRES_ARM_NEON;
98     for (size_t channels = 32; channels < 128; channels += 16) {
99       MaxPoolMicrokernelTester()
100         .pooling_elements(9)
101         .pooling_tile(9, 8)
102         .channels(channels)
103         .qmin(std::numeric_limits<uint8_t>::min())
104         .qmax(std::numeric_limits<uint8_t>::max())
105         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
106     }
107   }
108 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_input_offset)109   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_input_offset) {
110     TEST_REQUIRES_ARM_NEON;
111     for (size_t channels = 32; channels < 128; channels += 16) {
112       MaxPoolMicrokernelTester()
113         .pooling_elements(9)
114         .pooling_tile(9, 8)
115         .channels(channels)
116         .input_offset(131)
117         .qmin(std::numeric_limits<uint8_t>::min())
118         .qmax(std::numeric_limits<uint8_t>::max())
119         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
120     }
121   }
122 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_qmin)123   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_qmin) {
124     TEST_REQUIRES_ARM_NEON;
125     for (size_t channels = 32; channels < 128; channels += 16) {
126       MaxPoolMicrokernelTester()
127         .pooling_elements(9)
128         .pooling_tile(9, 8)
129         .channels(channels)
130         .qmin(64)
131         .qmax(std::numeric_limits<uint8_t>::max())
132         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
133     }
134   }
135 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_qmax)136   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_qmax) {
137     TEST_REQUIRES_ARM_NEON;
138     for (size_t channels = 32; channels < 128; channels += 16) {
139       MaxPoolMicrokernelTester()
140         .pooling_elements(9)
141         .pooling_tile(9, 8)
142         .channels(channels)
143         .qmin(std::numeric_limits<uint8_t>::min())
144         .qmax(192)
145         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
146     }
147   }
148 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_subtile)149   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_subtile) {
150     TEST_REQUIRES_ARM_NEON;
151     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
152       for (size_t channels = 32; channels < 128; channels += 16) {
153         MaxPoolMicrokernelTester()
154           .pooling_elements(pooling_elements)
155           .pooling_tile(9, 8)
156           .channels(channels)
157           .qmin(std::numeric_limits<uint8_t>::min())
158           .qmax(std::numeric_limits<uint8_t>::max())
159           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
160       }
161     }
162   }
163 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_subtile_with_input_offset)164   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_subtile_with_input_offset) {
165     TEST_REQUIRES_ARM_NEON;
166     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
167       for (size_t channels = 32; channels < 128; channels += 16) {
168         MaxPoolMicrokernelTester()
169           .pooling_elements(pooling_elements)
170           .pooling_tile(9, 8)
171           .channels(channels)
172           .input_offset(131)
173           .qmin(std::numeric_limits<uint8_t>::min())
174           .qmax(std::numeric_limits<uint8_t>::max())
175           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
176       }
177     }
178   }
179 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile)180   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile) {
181     TEST_REQUIRES_ARM_NEON;
182     for (size_t channels = 1; channels < 16; channels++) {
183       MaxPoolMicrokernelTester()
184         .pooling_elements(9)
185         .pooling_tile(9, 8)
186         .channels(channels)
187         .qmin(std::numeric_limits<uint8_t>::min())
188         .qmax(std::numeric_limits<uint8_t>::max())
189         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
190     }
191   }
192 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_input_offset)193   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
194     TEST_REQUIRES_ARM_NEON;
195     for (size_t channels = 1; channels < 16; channels++) {
196       MaxPoolMicrokernelTester()
197         .pooling_elements(9)
198         .pooling_tile(9, 8)
199         .channels(channels)
200         .input_offset(17)
201         .qmin(std::numeric_limits<uint8_t>::min())
202         .qmax(std::numeric_limits<uint8_t>::max())
203         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
204     }
205   }
206 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmin)207   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmin) {
208     TEST_REQUIRES_ARM_NEON;
209     for (size_t channels = 1; channels < 16; channels++) {
210       MaxPoolMicrokernelTester()
211         .pooling_elements(9)
212         .pooling_tile(9, 8)
213         .channels(channels)
214         .qmin(64)
215         .qmax(std::numeric_limits<uint8_t>::max())
216         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
217     }
218   }
219 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmax)220   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmax) {
221     TEST_REQUIRES_ARM_NEON;
222     for (size_t channels = 1; channels < 16; channels++) {
223       MaxPoolMicrokernelTester()
224         .pooling_elements(9)
225         .pooling_tile(9, 8)
226         .channels(channels)
227         .qmin(std::numeric_limits<uint8_t>::min())
228         .qmax(192)
229         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
230     }
231   }
232 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_subtile)233   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_subtile) {
234     TEST_REQUIRES_ARM_NEON;
235     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
236       for (size_t channels = 1; channels < 16; channels++) {
237         MaxPoolMicrokernelTester()
238           .pooling_elements(pooling_elements)
239           .pooling_tile(9, 8)
240           .channels(channels)
241           .qmin(std::numeric_limits<uint8_t>::min())
242           .qmax(std::numeric_limits<uint8_t>::max())
243           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
244       }
245     }
246   }
247 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_subtile_with_input_offset)248   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_subtile_with_input_offset) {
249     TEST_REQUIRES_ARM_NEON;
250     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
251       for (size_t channels = 1; channels < 16; channels++) {
252         MaxPoolMicrokernelTester()
253           .pooling_elements(pooling_elements)
254           .pooling_tile(9, 8)
255           .channels(channels)
256           .input_offset(17)
257           .qmin(std::numeric_limits<uint8_t>::min())
258           .qmax(std::numeric_limits<uint8_t>::max())
259           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
260       }
261     }
262   }
263 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile)264   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile) {
265     TEST_REQUIRES_ARM_NEON;
266     for (size_t channels = 17; channels < 32; channels++) {
267       MaxPoolMicrokernelTester()
268         .pooling_elements(9)
269         .pooling_tile(9, 8)
270         .channels(channels)
271         .qmin(std::numeric_limits<uint8_t>::min())
272         .qmax(std::numeric_limits<uint8_t>::max())
273         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
274     }
275   }
276 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_input_offset)277   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
278     TEST_REQUIRES_ARM_NEON;
279     for (size_t channels = 17; channels < 32; channels++) {
280       MaxPoolMicrokernelTester()
281         .pooling_elements(9)
282         .pooling_tile(9, 8)
283         .channels(channels)
284         .input_offset(37)
285         .qmin(std::numeric_limits<uint8_t>::min())
286         .qmax(std::numeric_limits<uint8_t>::max())
287         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
288     }
289   }
290 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmin)291   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmin) {
292     TEST_REQUIRES_ARM_NEON;
293     for (size_t channels = 17; channels < 32; channels++) {
294       MaxPoolMicrokernelTester()
295         .pooling_elements(9)
296         .pooling_tile(9, 8)
297         .channels(channels)
298         .qmin(64)
299         .qmax(std::numeric_limits<uint8_t>::max())
300         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
301     }
302   }
303 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmax)304   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmax) {
305     TEST_REQUIRES_ARM_NEON;
306     for (size_t channels = 17; channels < 32; channels++) {
307       MaxPoolMicrokernelTester()
308         .pooling_elements(9)
309         .pooling_tile(9, 8)
310         .channels(channels)
311         .qmin(std::numeric_limits<uint8_t>::min())
312         .qmax(192)
313         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
314     }
315   }
316 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_subtile)317   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_subtile) {
318     TEST_REQUIRES_ARM_NEON;
319     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
320       for (size_t channels = 17; channels < 32; channels++) {
321         MaxPoolMicrokernelTester()
322           .pooling_elements(pooling_elements)
323           .pooling_tile(9, 8)
324           .channels(channels)
325           .qmin(std::numeric_limits<uint8_t>::min())
326           .qmax(std::numeric_limits<uint8_t>::max())
327           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
328       }
329     }
330   }
331 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_subtile_with_input_offset)332   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_subtile_with_input_offset) {
333     TEST_REQUIRES_ARM_NEON;
334     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
335       for (size_t channels = 17; channels < 32; channels++) {
336         MaxPoolMicrokernelTester()
337           .pooling_elements(pooling_elements)
338           .pooling_tile(9, 8)
339           .channels(channels)
340           .input_offset(37)
341           .qmin(std::numeric_limits<uint8_t>::min())
342           .qmax(std::numeric_limits<uint8_t>::max())
343           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
344       }
345     }
346   }
347 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile)348   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile) {
349     TEST_REQUIRES_ARM_NEON;
350     MaxPoolMicrokernelTester()
351       .pooling_elements(17)
352       .pooling_tile(9, 8)
353       .channels(16)
354       .qmin(std::numeric_limits<uint8_t>::min())
355       .qmax(std::numeric_limits<uint8_t>::max())
356       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
357   }
358 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_input_offset)359   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
360     TEST_REQUIRES_ARM_NEON;
361     MaxPoolMicrokernelTester()
362       .pooling_elements(17)
363       .pooling_tile(9, 8)
364       .channels(16)
365       .input_offset(19)
366       .qmin(std::numeric_limits<uint8_t>::min())
367       .qmax(std::numeric_limits<uint8_t>::max())
368       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
369   }
370 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmin)371   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmin) {
372     TEST_REQUIRES_ARM_NEON;
373     MaxPoolMicrokernelTester()
374       .pooling_elements(17)
375       .pooling_tile(9, 8)
376       .channels(16)
377       .qmin(64)
378       .qmax(std::numeric_limits<uint8_t>::max())
379       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
380   }
381 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmax)382   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmax) {
383     TEST_REQUIRES_ARM_NEON;
384     MaxPoolMicrokernelTester()
385       .pooling_elements(17)
386       .pooling_tile(9, 8)
387       .channels(16)
388       .qmin(std::numeric_limits<uint8_t>::min())
389       .qmax(192)
390       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
391   }
392 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_subtile)393   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_subtile) {
394     TEST_REQUIRES_ARM_NEON;
395     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
396       MaxPoolMicrokernelTester()
397         .pooling_elements(pooling_elements)
398         .pooling_tile(9, 8)
399         .channels(16)
400         .qmin(std::numeric_limits<uint8_t>::min())
401         .qmax(std::numeric_limits<uint8_t>::max())
402         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
403     }
404   }
405 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_subtile_with_input_offset)406   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_subtile_with_input_offset) {
407     TEST_REQUIRES_ARM_NEON;
408     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
409       MaxPoolMicrokernelTester()
410         .pooling_elements(pooling_elements)
411         .pooling_tile(9, 8)
412         .channels(16)
413         .input_offset(19)
414         .qmin(std::numeric_limits<uint8_t>::min())
415         .qmax(std::numeric_limits<uint8_t>::max())
416         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
417     }
418   }
419 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile)420   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile) {
421     TEST_REQUIRES_ARM_NEON;
422     for (size_t channels = 32; channels < 128; channels += 16) {
423       MaxPoolMicrokernelTester()
424         .pooling_elements(17)
425         .pooling_tile(9, 8)
426         .channels(channels)
427         .qmin(std::numeric_limits<uint8_t>::min())
428         .qmax(std::numeric_limits<uint8_t>::max())
429         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
430     }
431   }
432 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_input_offset)433   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_input_offset) {
434     TEST_REQUIRES_ARM_NEON;
435     for (size_t channels = 32; channels < 128; channels += 16) {
436       MaxPoolMicrokernelTester()
437         .pooling_elements(17)
438         .pooling_tile(9, 8)
439         .channels(channels)
440         .input_offset(83)
441         .qmin(std::numeric_limits<uint8_t>::min())
442         .qmax(std::numeric_limits<uint8_t>::max())
443         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
444     }
445   }
446 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_qmin)447   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_qmin) {
448     TEST_REQUIRES_ARM_NEON;
449     for (size_t channels = 32; channels < 128; channels += 16) {
450       MaxPoolMicrokernelTester()
451         .pooling_elements(17)
452         .pooling_tile(9, 8)
453         .channels(channels)
454         .qmin(64)
455         .qmax(std::numeric_limits<uint8_t>::max())
456         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
457     }
458   }
459 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_qmax)460   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_qmax) {
461     TEST_REQUIRES_ARM_NEON;
462     for (size_t channels = 32; channels < 128; channels += 16) {
463       MaxPoolMicrokernelTester()
464         .pooling_elements(17)
465         .pooling_tile(9, 8)
466         .channels(channels)
467         .qmin(std::numeric_limits<uint8_t>::min())
468         .qmax(192)
469         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
470     }
471   }
472 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_subtile)473   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_subtile) {
474     TEST_REQUIRES_ARM_NEON;
475     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
476       for (size_t channels = 32; channels < 128; channels += 16) {
477         MaxPoolMicrokernelTester()
478           .pooling_elements(pooling_elements)
479           .pooling_tile(9, 8)
480           .channels(channels)
481           .qmin(std::numeric_limits<uint8_t>::min())
482           .qmax(std::numeric_limits<uint8_t>::max())
483           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
484       }
485     }
486   }
487 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_subtile_with_input_offset)488   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_subtile_with_input_offset) {
489     TEST_REQUIRES_ARM_NEON;
490     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
491       for (size_t channels = 32; channels < 128; channels += 16) {
492         MaxPoolMicrokernelTester()
493           .pooling_elements(pooling_elements)
494           .pooling_tile(9, 8)
495           .channels(channels)
496           .input_offset(131)
497           .qmin(std::numeric_limits<uint8_t>::min())
498           .qmax(std::numeric_limits<uint8_t>::max())
499           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
500       }
501     }
502   }
503 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile)504   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile) {
505     TEST_REQUIRES_ARM_NEON;
506     for (size_t channels = 1; channels < 16; channels++) {
507       MaxPoolMicrokernelTester()
508         .pooling_elements(17)
509         .pooling_tile(9, 8)
510         .channels(channels)
511         .qmin(std::numeric_limits<uint8_t>::min())
512         .qmax(std::numeric_limits<uint8_t>::max())
513         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
514     }
515   }
516 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_input_offset)517   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
518     TEST_REQUIRES_ARM_NEON;
519     for (size_t channels = 1; channels < 16; channels++) {
520       MaxPoolMicrokernelTester()
521         .pooling_elements(17)
522         .pooling_tile(9, 8)
523         .channels(channels)
524         .input_offset(17)
525         .qmin(std::numeric_limits<uint8_t>::min())
526         .qmax(std::numeric_limits<uint8_t>::max())
527         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
528     }
529   }
530 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmin)531   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmin) {
532     TEST_REQUIRES_ARM_NEON;
533     for (size_t channels = 1; channels < 16; channels++) {
534       MaxPoolMicrokernelTester()
535         .pooling_elements(17)
536         .pooling_tile(9, 8)
537         .channels(channels)
538         .qmin(64)
539         .qmax(std::numeric_limits<uint8_t>::max())
540         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
541     }
542   }
543 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmax)544   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmax) {
545     TEST_REQUIRES_ARM_NEON;
546     for (size_t channels = 1; channels < 16; channels++) {
547       MaxPoolMicrokernelTester()
548         .pooling_elements(17)
549         .pooling_tile(9, 8)
550         .channels(channels)
551         .qmin(std::numeric_limits<uint8_t>::min())
552         .qmax(192)
553         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
554     }
555   }
556 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_subtile)557   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_subtile) {
558     TEST_REQUIRES_ARM_NEON;
559     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
560       for (size_t channels = 1; channels < 16; channels++) {
561         MaxPoolMicrokernelTester()
562           .pooling_elements(pooling_elements)
563           .pooling_tile(9, 8)
564           .channels(channels)
565           .qmin(std::numeric_limits<uint8_t>::min())
566           .qmax(std::numeric_limits<uint8_t>::max())
567           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
568       }
569     }
570   }
571 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_subtile_with_input_offset)572   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_subtile_with_input_offset) {
573     TEST_REQUIRES_ARM_NEON;
574     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
575       for (size_t channels = 1; channels < 16; channels++) {
576         MaxPoolMicrokernelTester()
577           .pooling_elements(pooling_elements)
578           .pooling_tile(9, 8)
579           .channels(channels)
580           .input_offset(17)
581           .qmin(std::numeric_limits<uint8_t>::min())
582           .qmax(std::numeric_limits<uint8_t>::max())
583           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
584       }
585     }
586   }
587 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile)588   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile) {
589     TEST_REQUIRES_ARM_NEON;
590     for (size_t channels = 17; channels < 32; channels++) {
591       MaxPoolMicrokernelTester()
592         .pooling_elements(17)
593         .pooling_tile(9, 8)
594         .channels(channels)
595         .qmin(std::numeric_limits<uint8_t>::min())
596         .qmax(std::numeric_limits<uint8_t>::max())
597         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
598     }
599   }
600 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_input_offset)601   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
602     TEST_REQUIRES_ARM_NEON;
603     for (size_t channels = 17; channels < 32; channels++) {
604       MaxPoolMicrokernelTester()
605         .pooling_elements(17)
606         .pooling_tile(9, 8)
607         .channels(channels)
608         .input_offset(37)
609         .qmin(std::numeric_limits<uint8_t>::min())
610         .qmax(std::numeric_limits<uint8_t>::max())
611         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
612     }
613   }
614 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmin)615   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmin) {
616     TEST_REQUIRES_ARM_NEON;
617     for (size_t channels = 17; channels < 32; channels++) {
618       MaxPoolMicrokernelTester()
619         .pooling_elements(17)
620         .pooling_tile(9, 8)
621         .channels(channels)
622         .qmin(64)
623         .qmax(std::numeric_limits<uint8_t>::max())
624         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
625     }
626   }
627 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmax)628   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmax) {
629     TEST_REQUIRES_ARM_NEON;
630     for (size_t channels = 17; channels < 32; channels++) {
631       MaxPoolMicrokernelTester()
632         .pooling_elements(17)
633         .pooling_tile(9, 8)
634         .channels(channels)
635         .qmin(std::numeric_limits<uint8_t>::min())
636         .qmax(192)
637         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
638     }
639   }
640 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_subtile)641   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_subtile) {
642     TEST_REQUIRES_ARM_NEON;
643     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
644       for (size_t channels = 17; channels < 32; channels++) {
645         MaxPoolMicrokernelTester()
646           .pooling_elements(pooling_elements)
647           .pooling_tile(9, 8)
648           .channels(channels)
649           .qmin(std::numeric_limits<uint8_t>::min())
650           .qmax(std::numeric_limits<uint8_t>::max())
651           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
652       }
653     }
654   }
655 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_subtile_with_input_offset)656   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_subtile_with_input_offset) {
657     TEST_REQUIRES_ARM_NEON;
658     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
659       for (size_t channels = 17; channels < 32; channels++) {
660         MaxPoolMicrokernelTester()
661           .pooling_elements(pooling_elements)
662           .pooling_tile(9, 8)
663           .channels(channels)
664           .input_offset(37)
665           .qmin(std::numeric_limits<uint8_t>::min())
666           .qmax(std::numeric_limits<uint8_t>::max())
667           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
668       }
669     }
670   }
671 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass)672   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass) {
673     TEST_REQUIRES_ARM_NEON;
674     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
675       MaxPoolMicrokernelTester()
676         .pooling_elements(pooling_elements)
677         .pooling_tile(9, 8)
678         .channels(16)
679         .qmin(std::numeric_limits<uint8_t>::min())
680         .qmax(std::numeric_limits<uint8_t>::max())
681         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
682     }
683   }
684 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_input_offset)685   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_input_offset) {
686     TEST_REQUIRES_ARM_NEON;
687     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
688       MaxPoolMicrokernelTester()
689         .pooling_elements(pooling_elements)
690         .pooling_tile(9, 8)
691         .channels(16)
692         .input_offset(19)
693         .qmin(std::numeric_limits<uint8_t>::min())
694         .qmax(std::numeric_limits<uint8_t>::max())
695         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
696     }
697   }
698 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_qmin)699   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_qmin) {
700     TEST_REQUIRES_ARM_NEON;
701     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
702       MaxPoolMicrokernelTester()
703         .pooling_elements(pooling_elements)
704         .pooling_tile(9, 8)
705         .channels(16)
706         .qmin(64)
707         .qmax(std::numeric_limits<uint8_t>::max())
708         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
709     }
710   }
711 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_qmax)712   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_qmax) {
713     TEST_REQUIRES_ARM_NEON;
714     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
715       MaxPoolMicrokernelTester()
716         .pooling_elements(pooling_elements)
717         .pooling_tile(9, 8)
718         .channels(16)
719         .qmin(std::numeric_limits<uint8_t>::min())
720         .qmax(192)
721         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
722     }
723   }
724 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass)725   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass) {
726     TEST_REQUIRES_ARM_NEON;
727     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
728       for (size_t channels = 32; channels < 128; channels += 16) {
729         MaxPoolMicrokernelTester()
730           .pooling_elements(pooling_elements)
731           .pooling_tile(9, 8)
732           .channels(channels)
733           .qmin(std::numeric_limits<uint8_t>::min())
734           .qmax(std::numeric_limits<uint8_t>::max())
735           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
736       }
737     }
738   }
739 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_input_offset)740   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_input_offset) {
741     TEST_REQUIRES_ARM_NEON;
742     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
743       for (size_t channels = 32; channels < 128; channels += 16) {
744         MaxPoolMicrokernelTester()
745           .pooling_elements(pooling_elements)
746           .pooling_tile(9, 8)
747           .channels(channels)
748           .input_offset(131)
749           .qmin(std::numeric_limits<uint8_t>::min())
750           .qmax(std::numeric_limits<uint8_t>::max())
751           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
752       }
753     }
754   }
755 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_qmin)756   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_qmin) {
757     TEST_REQUIRES_ARM_NEON;
758     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
759       for (size_t channels = 32; channels < 128; channels += 16) {
760         MaxPoolMicrokernelTester()
761           .pooling_elements(pooling_elements)
762           .pooling_tile(9, 8)
763           .channels(channels)
764           .qmin(64)
765           .qmax(std::numeric_limits<uint8_t>::max())
766           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
767       }
768     }
769   }
770 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_qmax)771   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_qmax) {
772     TEST_REQUIRES_ARM_NEON;
773     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
774       for (size_t channels = 32; channels < 128; channels += 16) {
775         MaxPoolMicrokernelTester()
776           .pooling_elements(pooling_elements)
777           .pooling_tile(9, 8)
778           .channels(channels)
779           .qmin(std::numeric_limits<uint8_t>::min())
780           .qmax(192)
781           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
782       }
783     }
784   }
785 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass)786   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass) {
787     TEST_REQUIRES_ARM_NEON;
788     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
789       for (size_t channels = 1; channels < 16; channels++) {
790         MaxPoolMicrokernelTester()
791           .pooling_elements(pooling_elements)
792           .pooling_tile(9, 8)
793           .channels(channels)
794           .qmin(std::numeric_limits<uint8_t>::min())
795           .qmax(std::numeric_limits<uint8_t>::max())
796           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
797       }
798     }
799   }
800 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_input_offset)801   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_input_offset) {
802     TEST_REQUIRES_ARM_NEON;
803     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
804       for (size_t channels = 1; channels < 16; channels++) {
805         MaxPoolMicrokernelTester()
806           .pooling_elements(pooling_elements)
807           .pooling_tile(9, 8)
808           .channels(channels)
809           .input_offset(16)
810           .qmin(std::numeric_limits<uint8_t>::min())
811           .qmax(std::numeric_limits<uint8_t>::max())
812           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
813       }
814     }
815   }
816 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_qmin)817   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_qmin) {
818     TEST_REQUIRES_ARM_NEON;
819     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
820       for (size_t channels = 1; channels < 16; channels++) {
821         MaxPoolMicrokernelTester()
822           .pooling_elements(pooling_elements)
823           .pooling_tile(9, 8)
824           .channels(channels)
825           .qmin(64)
826           .qmax(std::numeric_limits<uint8_t>::max())
827           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
828       }
829     }
830   }
831 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_qmax)832   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_qmax) {
833     TEST_REQUIRES_ARM_NEON;
834     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
835       for (size_t channels = 1; channels < 16; channels++) {
836         MaxPoolMicrokernelTester()
837           .pooling_elements(pooling_elements)
838           .pooling_tile(9, 8)
839           .channels(channels)
840           .qmin(std::numeric_limits<uint8_t>::min())
841           .qmax(192)
842           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
843       }
844     }
845   }
846 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass)847   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass) {
848     TEST_REQUIRES_ARM_NEON;
849     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
850       for (size_t channels = 17; channels < 32; channels++) {
851         MaxPoolMicrokernelTester()
852           .pooling_elements(pooling_elements)
853           .pooling_tile(9, 8)
854           .channels(channels)
855           .qmin(std::numeric_limits<uint8_t>::min())
856           .qmax(std::numeric_limits<uint8_t>::max())
857           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
858       }
859     }
860   }
861 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_input_offset)862   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_input_offset) {
863     TEST_REQUIRES_ARM_NEON;
864     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
865       for (size_t channels = 17; channels < 32; channels++) {
866         MaxPoolMicrokernelTester()
867           .pooling_elements(pooling_elements)
868           .pooling_tile(9, 8)
869           .channels(channels)
870           .input_offset(37)
871           .qmin(std::numeric_limits<uint8_t>::min())
872           .qmax(std::numeric_limits<uint8_t>::max())
873           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
874       }
875     }
876   }
877 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_qmin)878   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_qmin) {
879     TEST_REQUIRES_ARM_NEON;
880     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
881       for (size_t channels = 17; channels < 32; channels++) {
882         MaxPoolMicrokernelTester()
883           .pooling_elements(pooling_elements)
884           .pooling_tile(9, 8)
885           .channels(channels)
886           .qmin(64)
887           .qmax(std::numeric_limits<uint8_t>::max())
888           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
889       }
890     }
891   }
892 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_qmax)893   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_qmax) {
894     TEST_REQUIRES_ARM_NEON;
895     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
896       for (size_t channels = 17; channels < 32; channels++) {
897         MaxPoolMicrokernelTester()
898           .pooling_elements(pooling_elements)
899           .pooling_tile(9, 8)
900           .channels(channels)
901           .qmin(std::numeric_limits<uint8_t>::min())
902           .qmax(192)
903           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
904       }
905     }
906   }
907 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels)908   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels) {
909     TEST_REQUIRES_ARM_NEON;
910     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
911       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
912         for (size_t channels = 1; channels <= 80; channels += 15) {
913           MaxPoolMicrokernelTester()
914             .output_pixels(output_pixels)
915             .pooling_elements(pooling_elements)
916             .pooling_tile(9, 8)
917             .channels(channels)
918             .qmin(std::numeric_limits<uint8_t>::min())
919             .qmax(std::numeric_limits<uint8_t>::max())
920             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
921         }
922       }
923     }
924   }
925 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_input_offset)926   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_input_offset) {
927     TEST_REQUIRES_ARM_NEON;
928     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
929       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
930         for (size_t channels = 1; channels <= 80; channels += 15) {
931           MaxPoolMicrokernelTester()
932             .output_pixels(output_pixels)
933             .pooling_elements(pooling_elements)
934             .pooling_tile(9, 8)
935             .channels(channels)
936             .input_offset(83)
937             .qmin(std::numeric_limits<uint8_t>::min())
938             .qmax(std::numeric_limits<uint8_t>::max())
939             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
940         }
941       }
942     }
943   }
944 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_qmin)945   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_qmin) {
946     TEST_REQUIRES_ARM_NEON;
947     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
948       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
949         for (size_t channels = 1; channels <= 80; channels += 15) {
950           MaxPoolMicrokernelTester()
951             .output_pixels(output_pixels)
952             .pooling_elements(pooling_elements)
953             .pooling_tile(9, 8)
954             .channels(channels)
955             .qmin(64)
956             .qmax(std::numeric_limits<uint8_t>::max())
957             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
958         }
959       }
960     }
961   }
962 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_qmax)963   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_qmax) {
964     TEST_REQUIRES_ARM_NEON;
965     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
966       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
967         for (size_t channels = 1; channels <= 80; channels += 15) {
968           MaxPoolMicrokernelTester()
969             .output_pixels(output_pixels)
970             .pooling_elements(pooling_elements)
971             .pooling_tile(9, 8)
972             .channels(channels)
973             .qmin(std::numeric_limits<uint8_t>::min())
974             .qmax(192)
975             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
976         }
977       }
978     }
979   }
980 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_output_stride)981   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_output_stride) {
982     TEST_REQUIRES_ARM_NEON;
983     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
984       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
985         for (size_t channels = 1; channels <= 80; channels += 15) {
986           MaxPoolMicrokernelTester()
987             .output_pixels(output_pixels)
988             .pooling_elements(pooling_elements)
989             .pooling_tile(9, 8)
990             .channels(channels)
991             .output_stride(83)
992             .qmin(std::numeric_limits<uint8_t>::min())
993             .qmax(std::numeric_limits<uint8_t>::max())
994             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
995         }
996       }
997     }
998   }
999 
TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_step)1000   TEST(U8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_step) {
1001     TEST_REQUIRES_ARM_NEON;
1002     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1003       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1004         for (size_t channels = 1; channels <= 80; channels += 15) {
1005           for (size_t step = 2; step <= pooling_elements; step++) {
1006             MaxPoolMicrokernelTester()
1007               .output_pixels(output_pixels)
1008               .pooling_elements(pooling_elements)
1009               .pooling_tile(9, 8)
1010               .step(step)
1011               .channels(channels)
1012               .output_stride(83)
1013               .qmin(std::numeric_limits<uint8_t>::min())
1014               .qmax(std::numeric_limits<uint8_t>::max())
1015               .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_u8_minmax_neon_params);
1016           }
1017         }
1018       }
1019     }
1020   }
1021 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1022 
1023 
1024 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile)1025   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile) {
1026     TEST_REQUIRES_X86_SSE2;
1027     MaxPoolMicrokernelTester()
1028       .pooling_elements(9)
1029       .pooling_tile(9, 8)
1030       .channels(16)
1031       .qmin(std::numeric_limits<uint8_t>::min())
1032       .qmax(std::numeric_limits<uint8_t>::max())
1033       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1034   }
1035 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_input_offset)1036   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
1037     TEST_REQUIRES_X86_SSE2;
1038     MaxPoolMicrokernelTester()
1039       .pooling_elements(9)
1040       .pooling_tile(9, 8)
1041       .channels(16)
1042       .input_offset(19)
1043       .qmin(std::numeric_limits<uint8_t>::min())
1044       .qmax(std::numeric_limits<uint8_t>::max())
1045       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1046   }
1047 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_qmin)1048   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_qmin) {
1049     TEST_REQUIRES_X86_SSE2;
1050     MaxPoolMicrokernelTester()
1051       .pooling_elements(9)
1052       .pooling_tile(9, 8)
1053       .channels(16)
1054       .qmin(64)
1055       .qmax(std::numeric_limits<uint8_t>::max())
1056       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1057   }
1058 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_qmax)1059   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_qmax) {
1060     TEST_REQUIRES_X86_SSE2;
1061     MaxPoolMicrokernelTester()
1062       .pooling_elements(9)
1063       .pooling_tile(9, 8)
1064       .channels(16)
1065       .qmin(std::numeric_limits<uint8_t>::min())
1066       .qmax(192)
1067       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1068   }
1069 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_subtile)1070   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_subtile) {
1071     TEST_REQUIRES_X86_SSE2;
1072     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1073       MaxPoolMicrokernelTester()
1074         .pooling_elements(pooling_elements)
1075         .pooling_tile(9, 8)
1076         .channels(16)
1077         .qmin(std::numeric_limits<uint8_t>::min())
1078         .qmax(std::numeric_limits<uint8_t>::max())
1079         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1080     }
1081   }
1082 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_subtile_with_input_offset)1083   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_subtile_with_input_offset) {
1084     TEST_REQUIRES_X86_SSE2;
1085     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1086       MaxPoolMicrokernelTester()
1087         .pooling_elements(pooling_elements)
1088         .pooling_tile(9, 8)
1089         .channels(16)
1090         .input_offset(19)
1091         .qmin(std::numeric_limits<uint8_t>::min())
1092         .qmax(std::numeric_limits<uint8_t>::max())
1093         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1094     }
1095   }
1096 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile)1097   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile) {
1098     TEST_REQUIRES_X86_SSE2;
1099     for (size_t channels = 32; channels < 128; channels += 16) {
1100       MaxPoolMicrokernelTester()
1101         .pooling_elements(9)
1102         .pooling_tile(9, 8)
1103         .channels(channels)
1104         .qmin(std::numeric_limits<uint8_t>::min())
1105         .qmax(std::numeric_limits<uint8_t>::max())
1106         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1107     }
1108   }
1109 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_input_offset)1110   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_input_offset) {
1111     TEST_REQUIRES_X86_SSE2;
1112     for (size_t channels = 32; channels < 128; channels += 16) {
1113       MaxPoolMicrokernelTester()
1114         .pooling_elements(9)
1115         .pooling_tile(9, 8)
1116         .channels(channels)
1117         .input_offset(131)
1118         .qmin(std::numeric_limits<uint8_t>::min())
1119         .qmax(std::numeric_limits<uint8_t>::max())
1120         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1121     }
1122   }
1123 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_qmin)1124   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_qmin) {
1125     TEST_REQUIRES_X86_SSE2;
1126     for (size_t channels = 32; channels < 128; channels += 16) {
1127       MaxPoolMicrokernelTester()
1128         .pooling_elements(9)
1129         .pooling_tile(9, 8)
1130         .channels(channels)
1131         .qmin(64)
1132         .qmax(std::numeric_limits<uint8_t>::max())
1133         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1134     }
1135   }
1136 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_qmax)1137   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_qmax) {
1138     TEST_REQUIRES_X86_SSE2;
1139     for (size_t channels = 32; channels < 128; channels += 16) {
1140       MaxPoolMicrokernelTester()
1141         .pooling_elements(9)
1142         .pooling_tile(9, 8)
1143         .channels(channels)
1144         .qmin(std::numeric_limits<uint8_t>::min())
1145         .qmax(192)
1146         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1147     }
1148   }
1149 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_subtile)1150   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_subtile) {
1151     TEST_REQUIRES_X86_SSE2;
1152     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1153       for (size_t channels = 32; channels < 128; channels += 16) {
1154         MaxPoolMicrokernelTester()
1155           .pooling_elements(pooling_elements)
1156           .pooling_tile(9, 8)
1157           .channels(channels)
1158           .qmin(std::numeric_limits<uint8_t>::min())
1159           .qmax(std::numeric_limits<uint8_t>::max())
1160           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1161       }
1162     }
1163   }
1164 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_subtile_with_input_offset)1165   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_subtile_with_input_offset) {
1166     TEST_REQUIRES_X86_SSE2;
1167     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1168       for (size_t channels = 32; channels < 128; channels += 16) {
1169         MaxPoolMicrokernelTester()
1170           .pooling_elements(pooling_elements)
1171           .pooling_tile(9, 8)
1172           .channels(channels)
1173           .input_offset(131)
1174           .qmin(std::numeric_limits<uint8_t>::min())
1175           .qmax(std::numeric_limits<uint8_t>::max())
1176           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1177       }
1178     }
1179   }
1180 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile)1181   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile) {
1182     TEST_REQUIRES_X86_SSE2;
1183     for (size_t channels = 1; channels < 16; channels++) {
1184       MaxPoolMicrokernelTester()
1185         .pooling_elements(9)
1186         .pooling_tile(9, 8)
1187         .channels(channels)
1188         .qmin(std::numeric_limits<uint8_t>::min())
1189         .qmax(std::numeric_limits<uint8_t>::max())
1190         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1191     }
1192   }
1193 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_input_offset)1194   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
1195     TEST_REQUIRES_X86_SSE2;
1196     for (size_t channels = 1; channels < 16; channels++) {
1197       MaxPoolMicrokernelTester()
1198         .pooling_elements(9)
1199         .pooling_tile(9, 8)
1200         .channels(channels)
1201         .input_offset(17)
1202         .qmin(std::numeric_limits<uint8_t>::min())
1203         .qmax(std::numeric_limits<uint8_t>::max())
1204         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1205     }
1206   }
1207 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_qmin)1208   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_qmin) {
1209     TEST_REQUIRES_X86_SSE2;
1210     for (size_t channels = 1; channels < 16; channels++) {
1211       MaxPoolMicrokernelTester()
1212         .pooling_elements(9)
1213         .pooling_tile(9, 8)
1214         .channels(channels)
1215         .qmin(64)
1216         .qmax(std::numeric_limits<uint8_t>::max())
1217         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1218     }
1219   }
1220 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_qmax)1221   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_qmax) {
1222     TEST_REQUIRES_X86_SSE2;
1223     for (size_t channels = 1; channels < 16; channels++) {
1224       MaxPoolMicrokernelTester()
1225         .pooling_elements(9)
1226         .pooling_tile(9, 8)
1227         .channels(channels)
1228         .qmin(std::numeric_limits<uint8_t>::min())
1229         .qmax(192)
1230         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1231     }
1232   }
1233 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_subtile)1234   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_subtile) {
1235     TEST_REQUIRES_X86_SSE2;
1236     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1237       for (size_t channels = 1; channels < 16; channels++) {
1238         MaxPoolMicrokernelTester()
1239           .pooling_elements(pooling_elements)
1240           .pooling_tile(9, 8)
1241           .channels(channels)
1242           .qmin(std::numeric_limits<uint8_t>::min())
1243           .qmax(std::numeric_limits<uint8_t>::max())
1244           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1245       }
1246     }
1247   }
1248 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_subtile_with_input_offset)1249   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_subtile_with_input_offset) {
1250     TEST_REQUIRES_X86_SSE2;
1251     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1252       for (size_t channels = 1; channels < 16; channels++) {
1253         MaxPoolMicrokernelTester()
1254           .pooling_elements(pooling_elements)
1255           .pooling_tile(9, 8)
1256           .channels(channels)
1257           .input_offset(17)
1258           .qmin(std::numeric_limits<uint8_t>::min())
1259           .qmax(std::numeric_limits<uint8_t>::max())
1260           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1261       }
1262     }
1263   }
1264 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile)1265   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile) {
1266     TEST_REQUIRES_X86_SSE2;
1267     for (size_t channels = 17; channels < 32; channels++) {
1268       MaxPoolMicrokernelTester()
1269         .pooling_elements(9)
1270         .pooling_tile(9, 8)
1271         .channels(channels)
1272         .qmin(std::numeric_limits<uint8_t>::min())
1273         .qmax(std::numeric_limits<uint8_t>::max())
1274         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1275     }
1276   }
1277 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_input_offset)1278   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
1279     TEST_REQUIRES_X86_SSE2;
1280     for (size_t channels = 17; channels < 32; channels++) {
1281       MaxPoolMicrokernelTester()
1282         .pooling_elements(9)
1283         .pooling_tile(9, 8)
1284         .channels(channels)
1285         .input_offset(37)
1286         .qmin(std::numeric_limits<uint8_t>::min())
1287         .qmax(std::numeric_limits<uint8_t>::max())
1288         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1289     }
1290   }
1291 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_qmin)1292   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_qmin) {
1293     TEST_REQUIRES_X86_SSE2;
1294     for (size_t channels = 17; channels < 32; channels++) {
1295       MaxPoolMicrokernelTester()
1296         .pooling_elements(9)
1297         .pooling_tile(9, 8)
1298         .channels(channels)
1299         .qmin(64)
1300         .qmax(std::numeric_limits<uint8_t>::max())
1301         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1302     }
1303   }
1304 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_qmax)1305   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_qmax) {
1306     TEST_REQUIRES_X86_SSE2;
1307     for (size_t channels = 17; channels < 32; channels++) {
1308       MaxPoolMicrokernelTester()
1309         .pooling_elements(9)
1310         .pooling_tile(9, 8)
1311         .channels(channels)
1312         .qmin(std::numeric_limits<uint8_t>::min())
1313         .qmax(192)
1314         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1315     }
1316   }
1317 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_subtile)1318   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_subtile) {
1319     TEST_REQUIRES_X86_SSE2;
1320     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1321       for (size_t channels = 17; channels < 32; channels++) {
1322         MaxPoolMicrokernelTester()
1323           .pooling_elements(pooling_elements)
1324           .pooling_tile(9, 8)
1325           .channels(channels)
1326           .qmin(std::numeric_limits<uint8_t>::min())
1327           .qmax(std::numeric_limits<uint8_t>::max())
1328           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1329       }
1330     }
1331   }
1332 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_subtile_with_input_offset)1333   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_subtile_with_input_offset) {
1334     TEST_REQUIRES_X86_SSE2;
1335     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
1336       for (size_t channels = 17; channels < 32; channels++) {
1337         MaxPoolMicrokernelTester()
1338           .pooling_elements(pooling_elements)
1339           .pooling_tile(9, 8)
1340           .channels(channels)
1341           .input_offset(37)
1342           .qmin(std::numeric_limits<uint8_t>::min())
1343           .qmax(std::numeric_limits<uint8_t>::max())
1344           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1345       }
1346     }
1347   }
1348 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile)1349   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile) {
1350     TEST_REQUIRES_X86_SSE2;
1351     MaxPoolMicrokernelTester()
1352       .pooling_elements(17)
1353       .pooling_tile(9, 8)
1354       .channels(16)
1355       .qmin(std::numeric_limits<uint8_t>::min())
1356       .qmax(std::numeric_limits<uint8_t>::max())
1357       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1358   }
1359 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_input_offset)1360   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
1361     TEST_REQUIRES_X86_SSE2;
1362     MaxPoolMicrokernelTester()
1363       .pooling_elements(17)
1364       .pooling_tile(9, 8)
1365       .channels(16)
1366       .input_offset(19)
1367       .qmin(std::numeric_limits<uint8_t>::min())
1368       .qmax(std::numeric_limits<uint8_t>::max())
1369       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1370   }
1371 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_qmin)1372   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_qmin) {
1373     TEST_REQUIRES_X86_SSE2;
1374     MaxPoolMicrokernelTester()
1375       .pooling_elements(17)
1376       .pooling_tile(9, 8)
1377       .channels(16)
1378       .qmin(64)
1379       .qmax(std::numeric_limits<uint8_t>::max())
1380       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1381   }
1382 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_qmax)1383   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_qmax) {
1384     TEST_REQUIRES_X86_SSE2;
1385     MaxPoolMicrokernelTester()
1386       .pooling_elements(17)
1387       .pooling_tile(9, 8)
1388       .channels(16)
1389       .qmin(std::numeric_limits<uint8_t>::min())
1390       .qmax(192)
1391       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1392   }
1393 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_subtile)1394   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_subtile) {
1395     TEST_REQUIRES_X86_SSE2;
1396     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1397       MaxPoolMicrokernelTester()
1398         .pooling_elements(pooling_elements)
1399         .pooling_tile(9, 8)
1400         .channels(16)
1401         .qmin(std::numeric_limits<uint8_t>::min())
1402         .qmax(std::numeric_limits<uint8_t>::max())
1403         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1404     }
1405   }
1406 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_subtile_with_input_offset)1407   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_subtile_with_input_offset) {
1408     TEST_REQUIRES_X86_SSE2;
1409     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1410       MaxPoolMicrokernelTester()
1411         .pooling_elements(pooling_elements)
1412         .pooling_tile(9, 8)
1413         .channels(16)
1414         .input_offset(19)
1415         .qmin(std::numeric_limits<uint8_t>::min())
1416         .qmax(std::numeric_limits<uint8_t>::max())
1417         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1418     }
1419   }
1420 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile)1421   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile) {
1422     TEST_REQUIRES_X86_SSE2;
1423     for (size_t channels = 32; channels < 128; channels += 16) {
1424       MaxPoolMicrokernelTester()
1425         .pooling_elements(17)
1426         .pooling_tile(9, 8)
1427         .channels(channels)
1428         .qmin(std::numeric_limits<uint8_t>::min())
1429         .qmax(std::numeric_limits<uint8_t>::max())
1430         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1431     }
1432   }
1433 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_input_offset)1434   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_input_offset) {
1435     TEST_REQUIRES_X86_SSE2;
1436     for (size_t channels = 32; channels < 128; channels += 16) {
1437       MaxPoolMicrokernelTester()
1438         .pooling_elements(17)
1439         .pooling_tile(9, 8)
1440         .channels(channels)
1441         .input_offset(83)
1442         .qmin(std::numeric_limits<uint8_t>::min())
1443         .qmax(std::numeric_limits<uint8_t>::max())
1444         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1445     }
1446   }
1447 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_qmin)1448   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_qmin) {
1449     TEST_REQUIRES_X86_SSE2;
1450     for (size_t channels = 32; channels < 128; channels += 16) {
1451       MaxPoolMicrokernelTester()
1452         .pooling_elements(17)
1453         .pooling_tile(9, 8)
1454         .channels(channels)
1455         .qmin(64)
1456         .qmax(std::numeric_limits<uint8_t>::max())
1457         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1458     }
1459   }
1460 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_qmax)1461   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_qmax) {
1462     TEST_REQUIRES_X86_SSE2;
1463     for (size_t channels = 32; channels < 128; channels += 16) {
1464       MaxPoolMicrokernelTester()
1465         .pooling_elements(17)
1466         .pooling_tile(9, 8)
1467         .channels(channels)
1468         .qmin(std::numeric_limits<uint8_t>::min())
1469         .qmax(192)
1470         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1471     }
1472   }
1473 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_subtile)1474   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_subtile) {
1475     TEST_REQUIRES_X86_SSE2;
1476     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1477       for (size_t channels = 32; channels < 128; channels += 16) {
1478         MaxPoolMicrokernelTester()
1479           .pooling_elements(pooling_elements)
1480           .pooling_tile(9, 8)
1481           .channels(channels)
1482           .qmin(std::numeric_limits<uint8_t>::min())
1483           .qmax(std::numeric_limits<uint8_t>::max())
1484           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1485       }
1486     }
1487   }
1488 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_subtile_with_input_offset)1489   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_subtile_with_input_offset) {
1490     TEST_REQUIRES_X86_SSE2;
1491     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1492       for (size_t channels = 32; channels < 128; channels += 16) {
1493         MaxPoolMicrokernelTester()
1494           .pooling_elements(pooling_elements)
1495           .pooling_tile(9, 8)
1496           .channels(channels)
1497           .input_offset(131)
1498           .qmin(std::numeric_limits<uint8_t>::min())
1499           .qmax(std::numeric_limits<uint8_t>::max())
1500           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1501       }
1502     }
1503   }
1504 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile)1505   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile) {
1506     TEST_REQUIRES_X86_SSE2;
1507     for (size_t channels = 1; channels < 16; channels++) {
1508       MaxPoolMicrokernelTester()
1509         .pooling_elements(17)
1510         .pooling_tile(9, 8)
1511         .channels(channels)
1512         .qmin(std::numeric_limits<uint8_t>::min())
1513         .qmax(std::numeric_limits<uint8_t>::max())
1514         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1515     }
1516   }
1517 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_input_offset)1518   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
1519     TEST_REQUIRES_X86_SSE2;
1520     for (size_t channels = 1; channels < 16; channels++) {
1521       MaxPoolMicrokernelTester()
1522         .pooling_elements(17)
1523         .pooling_tile(9, 8)
1524         .channels(channels)
1525         .input_offset(17)
1526         .qmin(std::numeric_limits<uint8_t>::min())
1527         .qmax(std::numeric_limits<uint8_t>::max())
1528         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1529     }
1530   }
1531 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_qmin)1532   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_qmin) {
1533     TEST_REQUIRES_X86_SSE2;
1534     for (size_t channels = 1; channels < 16; channels++) {
1535       MaxPoolMicrokernelTester()
1536         .pooling_elements(17)
1537         .pooling_tile(9, 8)
1538         .channels(channels)
1539         .qmin(64)
1540         .qmax(std::numeric_limits<uint8_t>::max())
1541         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1542     }
1543   }
1544 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_qmax)1545   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_qmax) {
1546     TEST_REQUIRES_X86_SSE2;
1547     for (size_t channels = 1; channels < 16; channels++) {
1548       MaxPoolMicrokernelTester()
1549         .pooling_elements(17)
1550         .pooling_tile(9, 8)
1551         .channels(channels)
1552         .qmin(std::numeric_limits<uint8_t>::min())
1553         .qmax(192)
1554         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1555     }
1556   }
1557 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_subtile)1558   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_subtile) {
1559     TEST_REQUIRES_X86_SSE2;
1560     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1561       for (size_t channels = 1; channels < 16; channels++) {
1562         MaxPoolMicrokernelTester()
1563           .pooling_elements(pooling_elements)
1564           .pooling_tile(9, 8)
1565           .channels(channels)
1566           .qmin(std::numeric_limits<uint8_t>::min())
1567           .qmax(std::numeric_limits<uint8_t>::max())
1568           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1569       }
1570     }
1571   }
1572 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_subtile_with_input_offset)1573   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_subtile_with_input_offset) {
1574     TEST_REQUIRES_X86_SSE2;
1575     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1576       for (size_t channels = 1; channels < 16; channels++) {
1577         MaxPoolMicrokernelTester()
1578           .pooling_elements(pooling_elements)
1579           .pooling_tile(9, 8)
1580           .channels(channels)
1581           .input_offset(17)
1582           .qmin(std::numeric_limits<uint8_t>::min())
1583           .qmax(std::numeric_limits<uint8_t>::max())
1584           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1585       }
1586     }
1587   }
1588 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile)1589   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile) {
1590     TEST_REQUIRES_X86_SSE2;
1591     for (size_t channels = 17; channels < 32; channels++) {
1592       MaxPoolMicrokernelTester()
1593         .pooling_elements(17)
1594         .pooling_tile(9, 8)
1595         .channels(channels)
1596         .qmin(std::numeric_limits<uint8_t>::min())
1597         .qmax(std::numeric_limits<uint8_t>::max())
1598         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1599     }
1600   }
1601 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_input_offset)1602   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
1603     TEST_REQUIRES_X86_SSE2;
1604     for (size_t channels = 17; channels < 32; channels++) {
1605       MaxPoolMicrokernelTester()
1606         .pooling_elements(17)
1607         .pooling_tile(9, 8)
1608         .channels(channels)
1609         .input_offset(37)
1610         .qmin(std::numeric_limits<uint8_t>::min())
1611         .qmax(std::numeric_limits<uint8_t>::max())
1612         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1613     }
1614   }
1615 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_qmin)1616   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_qmin) {
1617     TEST_REQUIRES_X86_SSE2;
1618     for (size_t channels = 17; channels < 32; channels++) {
1619       MaxPoolMicrokernelTester()
1620         .pooling_elements(17)
1621         .pooling_tile(9, 8)
1622         .channels(channels)
1623         .qmin(64)
1624         .qmax(std::numeric_limits<uint8_t>::max())
1625         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1626     }
1627   }
1628 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_qmax)1629   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_qmax) {
1630     TEST_REQUIRES_X86_SSE2;
1631     for (size_t channels = 17; channels < 32; channels++) {
1632       MaxPoolMicrokernelTester()
1633         .pooling_elements(17)
1634         .pooling_tile(9, 8)
1635         .channels(channels)
1636         .qmin(std::numeric_limits<uint8_t>::min())
1637         .qmax(192)
1638         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1639     }
1640   }
1641 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_subtile)1642   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_subtile) {
1643     TEST_REQUIRES_X86_SSE2;
1644     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1645       for (size_t channels = 17; channels < 32; channels++) {
1646         MaxPoolMicrokernelTester()
1647           .pooling_elements(pooling_elements)
1648           .pooling_tile(9, 8)
1649           .channels(channels)
1650           .qmin(std::numeric_limits<uint8_t>::min())
1651           .qmax(std::numeric_limits<uint8_t>::max())
1652           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1653       }
1654     }
1655   }
1656 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_subtile_with_input_offset)1657   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_subtile_with_input_offset) {
1658     TEST_REQUIRES_X86_SSE2;
1659     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
1660       for (size_t channels = 17; channels < 32; channels++) {
1661         MaxPoolMicrokernelTester()
1662           .pooling_elements(pooling_elements)
1663           .pooling_tile(9, 8)
1664           .channels(channels)
1665           .input_offset(37)
1666           .qmin(std::numeric_limits<uint8_t>::min())
1667           .qmax(std::numeric_limits<uint8_t>::max())
1668           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1669       }
1670     }
1671   }
1672 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass)1673   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass) {
1674     TEST_REQUIRES_X86_SSE2;
1675     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1676       MaxPoolMicrokernelTester()
1677         .pooling_elements(pooling_elements)
1678         .pooling_tile(9, 8)
1679         .channels(16)
1680         .qmin(std::numeric_limits<uint8_t>::min())
1681         .qmax(std::numeric_limits<uint8_t>::max())
1682         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1683     }
1684   }
1685 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_input_offset)1686   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_input_offset) {
1687     TEST_REQUIRES_X86_SSE2;
1688     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1689       MaxPoolMicrokernelTester()
1690         .pooling_elements(pooling_elements)
1691         .pooling_tile(9, 8)
1692         .channels(16)
1693         .input_offset(19)
1694         .qmin(std::numeric_limits<uint8_t>::min())
1695         .qmax(std::numeric_limits<uint8_t>::max())
1696         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1697     }
1698   }
1699 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_qmin)1700   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_qmin) {
1701     TEST_REQUIRES_X86_SSE2;
1702     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1703       MaxPoolMicrokernelTester()
1704         .pooling_elements(pooling_elements)
1705         .pooling_tile(9, 8)
1706         .channels(16)
1707         .qmin(64)
1708         .qmax(std::numeric_limits<uint8_t>::max())
1709         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1710     }
1711   }
1712 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_qmax)1713   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_qmax) {
1714     TEST_REQUIRES_X86_SSE2;
1715     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1716       MaxPoolMicrokernelTester()
1717         .pooling_elements(pooling_elements)
1718         .pooling_tile(9, 8)
1719         .channels(16)
1720         .qmin(std::numeric_limits<uint8_t>::min())
1721         .qmax(192)
1722         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1723     }
1724   }
1725 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass)1726   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass) {
1727     TEST_REQUIRES_X86_SSE2;
1728     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1729       for (size_t channels = 32; channels < 128; channels += 16) {
1730         MaxPoolMicrokernelTester()
1731           .pooling_elements(pooling_elements)
1732           .pooling_tile(9, 8)
1733           .channels(channels)
1734           .qmin(std::numeric_limits<uint8_t>::min())
1735           .qmax(std::numeric_limits<uint8_t>::max())
1736           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1737       }
1738     }
1739   }
1740 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_input_offset)1741   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_input_offset) {
1742     TEST_REQUIRES_X86_SSE2;
1743     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1744       for (size_t channels = 32; channels < 128; channels += 16) {
1745         MaxPoolMicrokernelTester()
1746           .pooling_elements(pooling_elements)
1747           .pooling_tile(9, 8)
1748           .channels(channels)
1749           .input_offset(131)
1750           .qmin(std::numeric_limits<uint8_t>::min())
1751           .qmax(std::numeric_limits<uint8_t>::max())
1752           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1753       }
1754     }
1755   }
1756 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_qmin)1757   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_qmin) {
1758     TEST_REQUIRES_X86_SSE2;
1759     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1760       for (size_t channels = 32; channels < 128; channels += 16) {
1761         MaxPoolMicrokernelTester()
1762           .pooling_elements(pooling_elements)
1763           .pooling_tile(9, 8)
1764           .channels(channels)
1765           .qmin(64)
1766           .qmax(std::numeric_limits<uint8_t>::max())
1767           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1768       }
1769     }
1770   }
1771 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_qmax)1772   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_qmax) {
1773     TEST_REQUIRES_X86_SSE2;
1774     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1775       for (size_t channels = 32; channels < 128; channels += 16) {
1776         MaxPoolMicrokernelTester()
1777           .pooling_elements(pooling_elements)
1778           .pooling_tile(9, 8)
1779           .channels(channels)
1780           .qmin(std::numeric_limits<uint8_t>::min())
1781           .qmax(192)
1782           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1783       }
1784     }
1785   }
1786 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass)1787   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass) {
1788     TEST_REQUIRES_X86_SSE2;
1789     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1790       for (size_t channels = 1; channels < 16; channels++) {
1791         MaxPoolMicrokernelTester()
1792           .pooling_elements(pooling_elements)
1793           .pooling_tile(9, 8)
1794           .channels(channels)
1795           .qmin(std::numeric_limits<uint8_t>::min())
1796           .qmax(std::numeric_limits<uint8_t>::max())
1797           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1798       }
1799     }
1800   }
1801 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_input_offset)1802   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_input_offset) {
1803     TEST_REQUIRES_X86_SSE2;
1804     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1805       for (size_t channels = 1; channels < 16; channels++) {
1806         MaxPoolMicrokernelTester()
1807           .pooling_elements(pooling_elements)
1808           .pooling_tile(9, 8)
1809           .channels(channels)
1810           .input_offset(16)
1811           .qmin(std::numeric_limits<uint8_t>::min())
1812           .qmax(std::numeric_limits<uint8_t>::max())
1813           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1814       }
1815     }
1816   }
1817 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_qmin)1818   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_qmin) {
1819     TEST_REQUIRES_X86_SSE2;
1820     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1821       for (size_t channels = 1; channels < 16; channels++) {
1822         MaxPoolMicrokernelTester()
1823           .pooling_elements(pooling_elements)
1824           .pooling_tile(9, 8)
1825           .channels(channels)
1826           .qmin(64)
1827           .qmax(std::numeric_limits<uint8_t>::max())
1828           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1829       }
1830     }
1831   }
1832 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_qmax)1833   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_qmax) {
1834     TEST_REQUIRES_X86_SSE2;
1835     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1836       for (size_t channels = 1; channels < 16; channels++) {
1837         MaxPoolMicrokernelTester()
1838           .pooling_elements(pooling_elements)
1839           .pooling_tile(9, 8)
1840           .channels(channels)
1841           .qmin(std::numeric_limits<uint8_t>::min())
1842           .qmax(192)
1843           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1844       }
1845     }
1846   }
1847 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass)1848   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass) {
1849     TEST_REQUIRES_X86_SSE2;
1850     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1851       for (size_t channels = 17; channels < 32; channels++) {
1852         MaxPoolMicrokernelTester()
1853           .pooling_elements(pooling_elements)
1854           .pooling_tile(9, 8)
1855           .channels(channels)
1856           .qmin(std::numeric_limits<uint8_t>::min())
1857           .qmax(std::numeric_limits<uint8_t>::max())
1858           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1859       }
1860     }
1861   }
1862 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_input_offset)1863   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_input_offset) {
1864     TEST_REQUIRES_X86_SSE2;
1865     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1866       for (size_t channels = 17; channels < 32; channels++) {
1867         MaxPoolMicrokernelTester()
1868           .pooling_elements(pooling_elements)
1869           .pooling_tile(9, 8)
1870           .channels(channels)
1871           .input_offset(37)
1872           .qmin(std::numeric_limits<uint8_t>::min())
1873           .qmax(std::numeric_limits<uint8_t>::max())
1874           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1875       }
1876     }
1877   }
1878 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_qmin)1879   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_qmin) {
1880     TEST_REQUIRES_X86_SSE2;
1881     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1882       for (size_t channels = 17; channels < 32; channels++) {
1883         MaxPoolMicrokernelTester()
1884           .pooling_elements(pooling_elements)
1885           .pooling_tile(9, 8)
1886           .channels(channels)
1887           .qmin(64)
1888           .qmax(std::numeric_limits<uint8_t>::max())
1889           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1890       }
1891     }
1892   }
1893 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_qmax)1894   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_qmax) {
1895     TEST_REQUIRES_X86_SSE2;
1896     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
1897       for (size_t channels = 17; channels < 32; channels++) {
1898         MaxPoolMicrokernelTester()
1899           .pooling_elements(pooling_elements)
1900           .pooling_tile(9, 8)
1901           .channels(channels)
1902           .qmin(std::numeric_limits<uint8_t>::min())
1903           .qmax(192)
1904           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1905       }
1906     }
1907   }
1908 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels)1909   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels) {
1910     TEST_REQUIRES_X86_SSE2;
1911     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1912       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1913         for (size_t channels = 1; channels <= 80; channels += 15) {
1914           MaxPoolMicrokernelTester()
1915             .output_pixels(output_pixels)
1916             .pooling_elements(pooling_elements)
1917             .pooling_tile(9, 8)
1918             .channels(channels)
1919             .qmin(std::numeric_limits<uint8_t>::min())
1920             .qmax(std::numeric_limits<uint8_t>::max())
1921             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1922         }
1923       }
1924     }
1925   }
1926 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_input_offset)1927   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_input_offset) {
1928     TEST_REQUIRES_X86_SSE2;
1929     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1930       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1931         for (size_t channels = 1; channels <= 80; channels += 15) {
1932           MaxPoolMicrokernelTester()
1933             .output_pixels(output_pixels)
1934             .pooling_elements(pooling_elements)
1935             .pooling_tile(9, 8)
1936             .channels(channels)
1937             .input_offset(83)
1938             .qmin(std::numeric_limits<uint8_t>::min())
1939             .qmax(std::numeric_limits<uint8_t>::max())
1940             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1941         }
1942       }
1943     }
1944   }
1945 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_qmin)1946   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_qmin) {
1947     TEST_REQUIRES_X86_SSE2;
1948     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1949       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1950         for (size_t channels = 1; channels <= 80; channels += 15) {
1951           MaxPoolMicrokernelTester()
1952             .output_pixels(output_pixels)
1953             .pooling_elements(pooling_elements)
1954             .pooling_tile(9, 8)
1955             .channels(channels)
1956             .qmin(64)
1957             .qmax(std::numeric_limits<uint8_t>::max())
1958             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1959         }
1960       }
1961     }
1962   }
1963 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_qmax)1964   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_qmax) {
1965     TEST_REQUIRES_X86_SSE2;
1966     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1967       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1968         for (size_t channels = 1; channels <= 80; channels += 15) {
1969           MaxPoolMicrokernelTester()
1970             .output_pixels(output_pixels)
1971             .pooling_elements(pooling_elements)
1972             .pooling_tile(9, 8)
1973             .channels(channels)
1974             .qmin(std::numeric_limits<uint8_t>::min())
1975             .qmax(192)
1976             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1977         }
1978       }
1979     }
1980   }
1981 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_output_stride)1982   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_output_stride) {
1983     TEST_REQUIRES_X86_SSE2;
1984     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1985       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
1986         for (size_t channels = 1; channels <= 80; channels += 15) {
1987           MaxPoolMicrokernelTester()
1988             .output_pixels(output_pixels)
1989             .pooling_elements(pooling_elements)
1990             .pooling_tile(9, 8)
1991             .channels(channels)
1992             .output_stride(83)
1993             .qmin(std::numeric_limits<uint8_t>::min())
1994             .qmax(std::numeric_limits<uint8_t>::max())
1995             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
1996         }
1997       }
1998     }
1999   }
2000 
TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_step)2001   TEST(U8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_step) {
2002     TEST_REQUIRES_X86_SSE2;
2003     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2004       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2005         for (size_t channels = 1; channels <= 80; channels += 15) {
2006           for (size_t step = 2; step <= pooling_elements; step++) {
2007             MaxPoolMicrokernelTester()
2008               .output_pixels(output_pixels)
2009               .pooling_elements(pooling_elements)
2010               .pooling_tile(9, 8)
2011               .step(step)
2012               .channels(channels)
2013               .output_stride(83)
2014               .qmin(std::numeric_limits<uint8_t>::min())
2015               .qmax(std::numeric_limits<uint8_t>::max())
2016               .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_u8_minmax_sse2_params);
2017           }
2018         }
2019       }
2020     }
2021   }
2022 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
2023 
2024 
2025 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile)2026   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile) {
2027     MaxPoolMicrokernelTester()
2028       .pooling_elements(9)
2029       .pooling_tile(9, 8)
2030       .channels(16)
2031       .qmin(std::numeric_limits<uint8_t>::min())
2032       .qmax(std::numeric_limits<uint8_t>::max())
2033       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2034   }
2035 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_input_offset)2036   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
2037     MaxPoolMicrokernelTester()
2038       .pooling_elements(9)
2039       .pooling_tile(9, 8)
2040       .channels(16)
2041       .input_offset(19)
2042       .qmin(std::numeric_limits<uint8_t>::min())
2043       .qmax(std::numeric_limits<uint8_t>::max())
2044       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2045   }
2046 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_qmin)2047   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_qmin) {
2048     MaxPoolMicrokernelTester()
2049       .pooling_elements(9)
2050       .pooling_tile(9, 8)
2051       .channels(16)
2052       .qmin(64)
2053       .qmax(std::numeric_limits<uint8_t>::max())
2054       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2055   }
2056 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_qmax)2057   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_qmax) {
2058     MaxPoolMicrokernelTester()
2059       .pooling_elements(9)
2060       .pooling_tile(9, 8)
2061       .channels(16)
2062       .qmin(std::numeric_limits<uint8_t>::min())
2063       .qmax(192)
2064       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2065   }
2066 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_subtile)2067   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_subtile) {
2068     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2069       MaxPoolMicrokernelTester()
2070         .pooling_elements(pooling_elements)
2071         .pooling_tile(9, 8)
2072         .channels(16)
2073         .qmin(std::numeric_limits<uint8_t>::min())
2074         .qmax(std::numeric_limits<uint8_t>::max())
2075         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2076     }
2077   }
2078 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_subtile_with_input_offset)2079   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_subtile_with_input_offset) {
2080     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2081       MaxPoolMicrokernelTester()
2082         .pooling_elements(pooling_elements)
2083         .pooling_tile(9, 8)
2084         .channels(16)
2085         .input_offset(19)
2086         .qmin(std::numeric_limits<uint8_t>::min())
2087         .qmax(std::numeric_limits<uint8_t>::max())
2088         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2089     }
2090   }
2091 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile)2092   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile) {
2093     for (size_t channels = 32; channels < 128; channels += 16) {
2094       MaxPoolMicrokernelTester()
2095         .pooling_elements(9)
2096         .pooling_tile(9, 8)
2097         .channels(channels)
2098         .qmin(std::numeric_limits<uint8_t>::min())
2099         .qmax(std::numeric_limits<uint8_t>::max())
2100         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2101     }
2102   }
2103 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_input_offset)2104   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_input_offset) {
2105     for (size_t channels = 32; channels < 128; channels += 16) {
2106       MaxPoolMicrokernelTester()
2107         .pooling_elements(9)
2108         .pooling_tile(9, 8)
2109         .channels(channels)
2110         .input_offset(131)
2111         .qmin(std::numeric_limits<uint8_t>::min())
2112         .qmax(std::numeric_limits<uint8_t>::max())
2113         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2114     }
2115   }
2116 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_qmin)2117   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_qmin) {
2118     for (size_t channels = 32; channels < 128; channels += 16) {
2119       MaxPoolMicrokernelTester()
2120         .pooling_elements(9)
2121         .pooling_tile(9, 8)
2122         .channels(channels)
2123         .qmin(64)
2124         .qmax(std::numeric_limits<uint8_t>::max())
2125         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2126     }
2127   }
2128 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_qmax)2129   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_qmax) {
2130     for (size_t channels = 32; channels < 128; channels += 16) {
2131       MaxPoolMicrokernelTester()
2132         .pooling_elements(9)
2133         .pooling_tile(9, 8)
2134         .channels(channels)
2135         .qmin(std::numeric_limits<uint8_t>::min())
2136         .qmax(192)
2137         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2138     }
2139   }
2140 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_subtile)2141   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_subtile) {
2142     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2143       for (size_t channels = 32; channels < 128; channels += 16) {
2144         MaxPoolMicrokernelTester()
2145           .pooling_elements(pooling_elements)
2146           .pooling_tile(9, 8)
2147           .channels(channels)
2148           .qmin(std::numeric_limits<uint8_t>::min())
2149           .qmax(std::numeric_limits<uint8_t>::max())
2150           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2151       }
2152     }
2153   }
2154 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_subtile_with_input_offset)2155   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_subtile_with_input_offset) {
2156     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2157       for (size_t channels = 32; channels < 128; channels += 16) {
2158         MaxPoolMicrokernelTester()
2159           .pooling_elements(pooling_elements)
2160           .pooling_tile(9, 8)
2161           .channels(channels)
2162           .input_offset(131)
2163           .qmin(std::numeric_limits<uint8_t>::min())
2164           .qmax(std::numeric_limits<uint8_t>::max())
2165           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2166       }
2167     }
2168   }
2169 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile)2170   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile) {
2171     for (size_t channels = 1; channels < 16; channels++) {
2172       MaxPoolMicrokernelTester()
2173         .pooling_elements(9)
2174         .pooling_tile(9, 8)
2175         .channels(channels)
2176         .qmin(std::numeric_limits<uint8_t>::min())
2177         .qmax(std::numeric_limits<uint8_t>::max())
2178         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2179     }
2180   }
2181 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_input_offset)2182   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
2183     for (size_t channels = 1; channels < 16; channels++) {
2184       MaxPoolMicrokernelTester()
2185         .pooling_elements(9)
2186         .pooling_tile(9, 8)
2187         .channels(channels)
2188         .input_offset(17)
2189         .qmin(std::numeric_limits<uint8_t>::min())
2190         .qmax(std::numeric_limits<uint8_t>::max())
2191         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2192     }
2193   }
2194 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_qmin)2195   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_qmin) {
2196     for (size_t channels = 1; channels < 16; channels++) {
2197       MaxPoolMicrokernelTester()
2198         .pooling_elements(9)
2199         .pooling_tile(9, 8)
2200         .channels(channels)
2201         .qmin(64)
2202         .qmax(std::numeric_limits<uint8_t>::max())
2203         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2204     }
2205   }
2206 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_qmax)2207   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_qmax) {
2208     for (size_t channels = 1; channels < 16; channels++) {
2209       MaxPoolMicrokernelTester()
2210         .pooling_elements(9)
2211         .pooling_tile(9, 8)
2212         .channels(channels)
2213         .qmin(std::numeric_limits<uint8_t>::min())
2214         .qmax(192)
2215         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2216     }
2217   }
2218 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_subtile)2219   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_subtile) {
2220     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2221       for (size_t channels = 1; channels < 16; channels++) {
2222         MaxPoolMicrokernelTester()
2223           .pooling_elements(pooling_elements)
2224           .pooling_tile(9, 8)
2225           .channels(channels)
2226           .qmin(std::numeric_limits<uint8_t>::min())
2227           .qmax(std::numeric_limits<uint8_t>::max())
2228           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2229       }
2230     }
2231   }
2232 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_subtile_with_input_offset)2233   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_subtile_with_input_offset) {
2234     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2235       for (size_t channels = 1; channels < 16; channels++) {
2236         MaxPoolMicrokernelTester()
2237           .pooling_elements(pooling_elements)
2238           .pooling_tile(9, 8)
2239           .channels(channels)
2240           .input_offset(17)
2241           .qmin(std::numeric_limits<uint8_t>::min())
2242           .qmax(std::numeric_limits<uint8_t>::max())
2243           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2244       }
2245     }
2246   }
2247 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile)2248   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile) {
2249     for (size_t channels = 17; channels < 32; channels++) {
2250       MaxPoolMicrokernelTester()
2251         .pooling_elements(9)
2252         .pooling_tile(9, 8)
2253         .channels(channels)
2254         .qmin(std::numeric_limits<uint8_t>::min())
2255         .qmax(std::numeric_limits<uint8_t>::max())
2256         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2257     }
2258   }
2259 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_input_offset)2260   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
2261     for (size_t channels = 17; channels < 32; channels++) {
2262       MaxPoolMicrokernelTester()
2263         .pooling_elements(9)
2264         .pooling_tile(9, 8)
2265         .channels(channels)
2266         .input_offset(37)
2267         .qmin(std::numeric_limits<uint8_t>::min())
2268         .qmax(std::numeric_limits<uint8_t>::max())
2269         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2270     }
2271   }
2272 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_qmin)2273   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_qmin) {
2274     for (size_t channels = 17; channels < 32; channels++) {
2275       MaxPoolMicrokernelTester()
2276         .pooling_elements(9)
2277         .pooling_tile(9, 8)
2278         .channels(channels)
2279         .qmin(64)
2280         .qmax(std::numeric_limits<uint8_t>::max())
2281         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2282     }
2283   }
2284 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_qmax)2285   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_qmax) {
2286     for (size_t channels = 17; channels < 32; channels++) {
2287       MaxPoolMicrokernelTester()
2288         .pooling_elements(9)
2289         .pooling_tile(9, 8)
2290         .channels(channels)
2291         .qmin(std::numeric_limits<uint8_t>::min())
2292         .qmax(192)
2293         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2294     }
2295   }
2296 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_subtile)2297   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_subtile) {
2298     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2299       for (size_t channels = 17; channels < 32; channels++) {
2300         MaxPoolMicrokernelTester()
2301           .pooling_elements(pooling_elements)
2302           .pooling_tile(9, 8)
2303           .channels(channels)
2304           .qmin(std::numeric_limits<uint8_t>::min())
2305           .qmax(std::numeric_limits<uint8_t>::max())
2306           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2307       }
2308     }
2309   }
2310 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_subtile_with_input_offset)2311   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_subtile_with_input_offset) {
2312     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2313       for (size_t channels = 17; channels < 32; channels++) {
2314         MaxPoolMicrokernelTester()
2315           .pooling_elements(pooling_elements)
2316           .pooling_tile(9, 8)
2317           .channels(channels)
2318           .input_offset(37)
2319           .qmin(std::numeric_limits<uint8_t>::min())
2320           .qmax(std::numeric_limits<uint8_t>::max())
2321           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2322       }
2323     }
2324   }
2325 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile)2326   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile) {
2327     MaxPoolMicrokernelTester()
2328       .pooling_elements(17)
2329       .pooling_tile(9, 8)
2330       .channels(16)
2331       .qmin(std::numeric_limits<uint8_t>::min())
2332       .qmax(std::numeric_limits<uint8_t>::max())
2333       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2334   }
2335 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_input_offset)2336   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
2337     MaxPoolMicrokernelTester()
2338       .pooling_elements(17)
2339       .pooling_tile(9, 8)
2340       .channels(16)
2341       .input_offset(19)
2342       .qmin(std::numeric_limits<uint8_t>::min())
2343       .qmax(std::numeric_limits<uint8_t>::max())
2344       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2345   }
2346 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_qmin)2347   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_qmin) {
2348     MaxPoolMicrokernelTester()
2349       .pooling_elements(17)
2350       .pooling_tile(9, 8)
2351       .channels(16)
2352       .qmin(64)
2353       .qmax(std::numeric_limits<uint8_t>::max())
2354       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2355   }
2356 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_qmax)2357   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_qmax) {
2358     MaxPoolMicrokernelTester()
2359       .pooling_elements(17)
2360       .pooling_tile(9, 8)
2361       .channels(16)
2362       .qmin(std::numeric_limits<uint8_t>::min())
2363       .qmax(192)
2364       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2365   }
2366 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_subtile)2367   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_subtile) {
2368     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2369       MaxPoolMicrokernelTester()
2370         .pooling_elements(pooling_elements)
2371         .pooling_tile(9, 8)
2372         .channels(16)
2373         .qmin(std::numeric_limits<uint8_t>::min())
2374         .qmax(std::numeric_limits<uint8_t>::max())
2375         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2376     }
2377   }
2378 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_subtile_with_input_offset)2379   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_subtile_with_input_offset) {
2380     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2381       MaxPoolMicrokernelTester()
2382         .pooling_elements(pooling_elements)
2383         .pooling_tile(9, 8)
2384         .channels(16)
2385         .input_offset(19)
2386         .qmin(std::numeric_limits<uint8_t>::min())
2387         .qmax(std::numeric_limits<uint8_t>::max())
2388         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2389     }
2390   }
2391 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile)2392   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile) {
2393     for (size_t channels = 32; channels < 128; channels += 16) {
2394       MaxPoolMicrokernelTester()
2395         .pooling_elements(17)
2396         .pooling_tile(9, 8)
2397         .channels(channels)
2398         .qmin(std::numeric_limits<uint8_t>::min())
2399         .qmax(std::numeric_limits<uint8_t>::max())
2400         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2401     }
2402   }
2403 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_input_offset)2404   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_input_offset) {
2405     for (size_t channels = 32; channels < 128; channels += 16) {
2406       MaxPoolMicrokernelTester()
2407         .pooling_elements(17)
2408         .pooling_tile(9, 8)
2409         .channels(channels)
2410         .input_offset(83)
2411         .qmin(std::numeric_limits<uint8_t>::min())
2412         .qmax(std::numeric_limits<uint8_t>::max())
2413         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2414     }
2415   }
2416 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_qmin)2417   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_qmin) {
2418     for (size_t channels = 32; channels < 128; channels += 16) {
2419       MaxPoolMicrokernelTester()
2420         .pooling_elements(17)
2421         .pooling_tile(9, 8)
2422         .channels(channels)
2423         .qmin(64)
2424         .qmax(std::numeric_limits<uint8_t>::max())
2425         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2426     }
2427   }
2428 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_qmax)2429   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_qmax) {
2430     for (size_t channels = 32; channels < 128; channels += 16) {
2431       MaxPoolMicrokernelTester()
2432         .pooling_elements(17)
2433         .pooling_tile(9, 8)
2434         .channels(channels)
2435         .qmin(std::numeric_limits<uint8_t>::min())
2436         .qmax(192)
2437         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2438     }
2439   }
2440 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_subtile)2441   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_subtile) {
2442     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2443       for (size_t channels = 32; channels < 128; channels += 16) {
2444         MaxPoolMicrokernelTester()
2445           .pooling_elements(pooling_elements)
2446           .pooling_tile(9, 8)
2447           .channels(channels)
2448           .qmin(std::numeric_limits<uint8_t>::min())
2449           .qmax(std::numeric_limits<uint8_t>::max())
2450           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2451       }
2452     }
2453   }
2454 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_subtile_with_input_offset)2455   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_subtile_with_input_offset) {
2456     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2457       for (size_t channels = 32; channels < 128; channels += 16) {
2458         MaxPoolMicrokernelTester()
2459           .pooling_elements(pooling_elements)
2460           .pooling_tile(9, 8)
2461           .channels(channels)
2462           .input_offset(131)
2463           .qmin(std::numeric_limits<uint8_t>::min())
2464           .qmax(std::numeric_limits<uint8_t>::max())
2465           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2466       }
2467     }
2468   }
2469 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile)2470   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile) {
2471     for (size_t channels = 1; channels < 16; channels++) {
2472       MaxPoolMicrokernelTester()
2473         .pooling_elements(17)
2474         .pooling_tile(9, 8)
2475         .channels(channels)
2476         .qmin(std::numeric_limits<uint8_t>::min())
2477         .qmax(std::numeric_limits<uint8_t>::max())
2478         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2479     }
2480   }
2481 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_input_offset)2482   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
2483     for (size_t channels = 1; channels < 16; channels++) {
2484       MaxPoolMicrokernelTester()
2485         .pooling_elements(17)
2486         .pooling_tile(9, 8)
2487         .channels(channels)
2488         .input_offset(17)
2489         .qmin(std::numeric_limits<uint8_t>::min())
2490         .qmax(std::numeric_limits<uint8_t>::max())
2491         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2492     }
2493   }
2494 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_qmin)2495   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_qmin) {
2496     for (size_t channels = 1; channels < 16; channels++) {
2497       MaxPoolMicrokernelTester()
2498         .pooling_elements(17)
2499         .pooling_tile(9, 8)
2500         .channels(channels)
2501         .qmin(64)
2502         .qmax(std::numeric_limits<uint8_t>::max())
2503         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2504     }
2505   }
2506 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_qmax)2507   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_qmax) {
2508     for (size_t channels = 1; channels < 16; channels++) {
2509       MaxPoolMicrokernelTester()
2510         .pooling_elements(17)
2511         .pooling_tile(9, 8)
2512         .channels(channels)
2513         .qmin(std::numeric_limits<uint8_t>::min())
2514         .qmax(192)
2515         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2516     }
2517   }
2518 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_subtile)2519   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_subtile) {
2520     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2521       for (size_t channels = 1; channels < 16; channels++) {
2522         MaxPoolMicrokernelTester()
2523           .pooling_elements(pooling_elements)
2524           .pooling_tile(9, 8)
2525           .channels(channels)
2526           .qmin(std::numeric_limits<uint8_t>::min())
2527           .qmax(std::numeric_limits<uint8_t>::max())
2528           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2529       }
2530     }
2531   }
2532 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_subtile_with_input_offset)2533   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_subtile_with_input_offset) {
2534     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2535       for (size_t channels = 1; channels < 16; channels++) {
2536         MaxPoolMicrokernelTester()
2537           .pooling_elements(pooling_elements)
2538           .pooling_tile(9, 8)
2539           .channels(channels)
2540           .input_offset(17)
2541           .qmin(std::numeric_limits<uint8_t>::min())
2542           .qmax(std::numeric_limits<uint8_t>::max())
2543           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2544       }
2545     }
2546   }
2547 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile)2548   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile) {
2549     for (size_t channels = 17; channels < 32; channels++) {
2550       MaxPoolMicrokernelTester()
2551         .pooling_elements(17)
2552         .pooling_tile(9, 8)
2553         .channels(channels)
2554         .qmin(std::numeric_limits<uint8_t>::min())
2555         .qmax(std::numeric_limits<uint8_t>::max())
2556         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2557     }
2558   }
2559 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_input_offset)2560   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
2561     for (size_t channels = 17; channels < 32; channels++) {
2562       MaxPoolMicrokernelTester()
2563         .pooling_elements(17)
2564         .pooling_tile(9, 8)
2565         .channels(channels)
2566         .input_offset(37)
2567         .qmin(std::numeric_limits<uint8_t>::min())
2568         .qmax(std::numeric_limits<uint8_t>::max())
2569         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2570     }
2571   }
2572 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_qmin)2573   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_qmin) {
2574     for (size_t channels = 17; channels < 32; channels++) {
2575       MaxPoolMicrokernelTester()
2576         .pooling_elements(17)
2577         .pooling_tile(9, 8)
2578         .channels(channels)
2579         .qmin(64)
2580         .qmax(std::numeric_limits<uint8_t>::max())
2581         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2582     }
2583   }
2584 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_qmax)2585   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_qmax) {
2586     for (size_t channels = 17; channels < 32; channels++) {
2587       MaxPoolMicrokernelTester()
2588         .pooling_elements(17)
2589         .pooling_tile(9, 8)
2590         .channels(channels)
2591         .qmin(std::numeric_limits<uint8_t>::min())
2592         .qmax(192)
2593         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2594     }
2595   }
2596 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_subtile)2597   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_subtile) {
2598     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2599       for (size_t channels = 17; channels < 32; channels++) {
2600         MaxPoolMicrokernelTester()
2601           .pooling_elements(pooling_elements)
2602           .pooling_tile(9, 8)
2603           .channels(channels)
2604           .qmin(std::numeric_limits<uint8_t>::min())
2605           .qmax(std::numeric_limits<uint8_t>::max())
2606           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2607       }
2608     }
2609   }
2610 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_subtile_with_input_offset)2611   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_subtile_with_input_offset) {
2612     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2613       for (size_t channels = 17; channels < 32; channels++) {
2614         MaxPoolMicrokernelTester()
2615           .pooling_elements(pooling_elements)
2616           .pooling_tile(9, 8)
2617           .channels(channels)
2618           .input_offset(37)
2619           .qmin(std::numeric_limits<uint8_t>::min())
2620           .qmax(std::numeric_limits<uint8_t>::max())
2621           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2622       }
2623     }
2624   }
2625 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass)2626   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass) {
2627     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2628       MaxPoolMicrokernelTester()
2629         .pooling_elements(pooling_elements)
2630         .pooling_tile(9, 8)
2631         .channels(16)
2632         .qmin(std::numeric_limits<uint8_t>::min())
2633         .qmax(std::numeric_limits<uint8_t>::max())
2634         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2635     }
2636   }
2637 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_input_offset)2638   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_input_offset) {
2639     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2640       MaxPoolMicrokernelTester()
2641         .pooling_elements(pooling_elements)
2642         .pooling_tile(9, 8)
2643         .channels(16)
2644         .input_offset(19)
2645         .qmin(std::numeric_limits<uint8_t>::min())
2646         .qmax(std::numeric_limits<uint8_t>::max())
2647         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2648     }
2649   }
2650 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_qmin)2651   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_qmin) {
2652     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2653       MaxPoolMicrokernelTester()
2654         .pooling_elements(pooling_elements)
2655         .pooling_tile(9, 8)
2656         .channels(16)
2657         .qmin(64)
2658         .qmax(std::numeric_limits<uint8_t>::max())
2659         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2660     }
2661   }
2662 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_qmax)2663   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_qmax) {
2664     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2665       MaxPoolMicrokernelTester()
2666         .pooling_elements(pooling_elements)
2667         .pooling_tile(9, 8)
2668         .channels(16)
2669         .qmin(std::numeric_limits<uint8_t>::min())
2670         .qmax(192)
2671         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2672     }
2673   }
2674 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass)2675   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass) {
2676     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2677       for (size_t channels = 32; channels < 128; channels += 16) {
2678         MaxPoolMicrokernelTester()
2679           .pooling_elements(pooling_elements)
2680           .pooling_tile(9, 8)
2681           .channels(channels)
2682           .qmin(std::numeric_limits<uint8_t>::min())
2683           .qmax(std::numeric_limits<uint8_t>::max())
2684           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2685       }
2686     }
2687   }
2688 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_input_offset)2689   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_input_offset) {
2690     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2691       for (size_t channels = 32; channels < 128; channels += 16) {
2692         MaxPoolMicrokernelTester()
2693           .pooling_elements(pooling_elements)
2694           .pooling_tile(9, 8)
2695           .channels(channels)
2696           .input_offset(131)
2697           .qmin(std::numeric_limits<uint8_t>::min())
2698           .qmax(std::numeric_limits<uint8_t>::max())
2699           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2700       }
2701     }
2702   }
2703 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_qmin)2704   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_qmin) {
2705     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2706       for (size_t channels = 32; channels < 128; channels += 16) {
2707         MaxPoolMicrokernelTester()
2708           .pooling_elements(pooling_elements)
2709           .pooling_tile(9, 8)
2710           .channels(channels)
2711           .qmin(64)
2712           .qmax(std::numeric_limits<uint8_t>::max())
2713           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2714       }
2715     }
2716   }
2717 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_qmax)2718   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_qmax) {
2719     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2720       for (size_t channels = 32; channels < 128; channels += 16) {
2721         MaxPoolMicrokernelTester()
2722           .pooling_elements(pooling_elements)
2723           .pooling_tile(9, 8)
2724           .channels(channels)
2725           .qmin(std::numeric_limits<uint8_t>::min())
2726           .qmax(192)
2727           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2728       }
2729     }
2730   }
2731 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass)2732   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass) {
2733     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2734       for (size_t channels = 1; channels < 16; channels++) {
2735         MaxPoolMicrokernelTester()
2736           .pooling_elements(pooling_elements)
2737           .pooling_tile(9, 8)
2738           .channels(channels)
2739           .qmin(std::numeric_limits<uint8_t>::min())
2740           .qmax(std::numeric_limits<uint8_t>::max())
2741           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2742       }
2743     }
2744   }
2745 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_input_offset)2746   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_input_offset) {
2747     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2748       for (size_t channels = 1; channels < 16; channels++) {
2749         MaxPoolMicrokernelTester()
2750           .pooling_elements(pooling_elements)
2751           .pooling_tile(9, 8)
2752           .channels(channels)
2753           .input_offset(16)
2754           .qmin(std::numeric_limits<uint8_t>::min())
2755           .qmax(std::numeric_limits<uint8_t>::max())
2756           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2757       }
2758     }
2759   }
2760 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_qmin)2761   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_qmin) {
2762     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2763       for (size_t channels = 1; channels < 16; channels++) {
2764         MaxPoolMicrokernelTester()
2765           .pooling_elements(pooling_elements)
2766           .pooling_tile(9, 8)
2767           .channels(channels)
2768           .qmin(64)
2769           .qmax(std::numeric_limits<uint8_t>::max())
2770           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2771       }
2772     }
2773   }
2774 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_qmax)2775   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_qmax) {
2776     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2777       for (size_t channels = 1; channels < 16; channels++) {
2778         MaxPoolMicrokernelTester()
2779           .pooling_elements(pooling_elements)
2780           .pooling_tile(9, 8)
2781           .channels(channels)
2782           .qmin(std::numeric_limits<uint8_t>::min())
2783           .qmax(192)
2784           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2785       }
2786     }
2787   }
2788 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass)2789   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass) {
2790     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2791       for (size_t channels = 17; channels < 32; channels++) {
2792         MaxPoolMicrokernelTester()
2793           .pooling_elements(pooling_elements)
2794           .pooling_tile(9, 8)
2795           .channels(channels)
2796           .qmin(std::numeric_limits<uint8_t>::min())
2797           .qmax(std::numeric_limits<uint8_t>::max())
2798           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2799       }
2800     }
2801   }
2802 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_input_offset)2803   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_input_offset) {
2804     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2805       for (size_t channels = 17; channels < 32; channels++) {
2806         MaxPoolMicrokernelTester()
2807           .pooling_elements(pooling_elements)
2808           .pooling_tile(9, 8)
2809           .channels(channels)
2810           .input_offset(37)
2811           .qmin(std::numeric_limits<uint8_t>::min())
2812           .qmax(std::numeric_limits<uint8_t>::max())
2813           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2814       }
2815     }
2816   }
2817 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_qmin)2818   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_qmin) {
2819     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2820       for (size_t channels = 17; channels < 32; channels++) {
2821         MaxPoolMicrokernelTester()
2822           .pooling_elements(pooling_elements)
2823           .pooling_tile(9, 8)
2824           .channels(channels)
2825           .qmin(64)
2826           .qmax(std::numeric_limits<uint8_t>::max())
2827           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2828       }
2829     }
2830   }
2831 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_qmax)2832   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_qmax) {
2833     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2834       for (size_t channels = 17; channels < 32; channels++) {
2835         MaxPoolMicrokernelTester()
2836           .pooling_elements(pooling_elements)
2837           .pooling_tile(9, 8)
2838           .channels(channels)
2839           .qmin(std::numeric_limits<uint8_t>::min())
2840           .qmax(192)
2841           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2842       }
2843     }
2844   }
2845 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels)2846   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels) {
2847     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2848       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2849         for (size_t channels = 1; channels <= 80; channels += 15) {
2850           MaxPoolMicrokernelTester()
2851             .output_pixels(output_pixels)
2852             .pooling_elements(pooling_elements)
2853             .pooling_tile(9, 8)
2854             .channels(channels)
2855             .qmin(std::numeric_limits<uint8_t>::min())
2856             .qmax(std::numeric_limits<uint8_t>::max())
2857             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2858         }
2859       }
2860     }
2861   }
2862 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_input_offset)2863   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_input_offset) {
2864     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2865       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2866         for (size_t channels = 1; channels <= 80; channels += 15) {
2867           MaxPoolMicrokernelTester()
2868             .output_pixels(output_pixels)
2869             .pooling_elements(pooling_elements)
2870             .pooling_tile(9, 8)
2871             .channels(channels)
2872             .input_offset(83)
2873             .qmin(std::numeric_limits<uint8_t>::min())
2874             .qmax(std::numeric_limits<uint8_t>::max())
2875             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2876         }
2877       }
2878     }
2879   }
2880 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_qmin)2881   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_qmin) {
2882     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2883       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2884         for (size_t channels = 1; channels <= 80; channels += 15) {
2885           MaxPoolMicrokernelTester()
2886             .output_pixels(output_pixels)
2887             .pooling_elements(pooling_elements)
2888             .pooling_tile(9, 8)
2889             .channels(channels)
2890             .qmin(64)
2891             .qmax(std::numeric_limits<uint8_t>::max())
2892             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2893         }
2894       }
2895     }
2896   }
2897 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_qmax)2898   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_qmax) {
2899     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2900       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2901         for (size_t channels = 1; channels <= 80; channels += 15) {
2902           MaxPoolMicrokernelTester()
2903             .output_pixels(output_pixels)
2904             .pooling_elements(pooling_elements)
2905             .pooling_tile(9, 8)
2906             .channels(channels)
2907             .qmin(std::numeric_limits<uint8_t>::min())
2908             .qmax(192)
2909             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2910         }
2911       }
2912     }
2913   }
2914 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_output_stride)2915   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_output_stride) {
2916     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2917       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2918         for (size_t channels = 1; channels <= 80; channels += 15) {
2919           MaxPoolMicrokernelTester()
2920             .output_pixels(output_pixels)
2921             .pooling_elements(pooling_elements)
2922             .pooling_tile(9, 8)
2923             .channels(channels)
2924             .output_stride(83)
2925             .qmin(std::numeric_limits<uint8_t>::min())
2926             .qmax(std::numeric_limits<uint8_t>::max())
2927             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2928         }
2929       }
2930     }
2931   }
2932 
TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_step)2933   TEST(U8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_step) {
2934     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2935       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2936         for (size_t channels = 1; channels <= 80; channels += 15) {
2937           for (size_t step = 2; step <= pooling_elements; step++) {
2938             MaxPoolMicrokernelTester()
2939               .output_pixels(output_pixels)
2940               .pooling_elements(pooling_elements)
2941               .pooling_tile(9, 8)
2942               .step(step)
2943               .channels(channels)
2944               .output_stride(83)
2945               .qmin(std::numeric_limits<uint8_t>::min())
2946               .qmax(std::numeric_limits<uint8_t>::max())
2947               .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_u8_minmax_wasmsimd_params);
2948           }
2949         }
2950       }
2951     }
2952   }
2953 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
2954 
2955 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile)2956 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile) {
2957   MaxPoolMicrokernelTester()
2958     .pooling_elements(9)
2959     .pooling_tile(9, 8)
2960     .channels(1)
2961     .qmin(std::numeric_limits<uint8_t>::min())
2962     .qmax(std::numeric_limits<uint8_t>::max())
2963     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
2964 }
2965 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_input_offset)2966 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_input_offset) {
2967   MaxPoolMicrokernelTester()
2968     .pooling_elements(9)
2969     .pooling_tile(9, 8)
2970     .channels(1)
2971     .input_offset(3)
2972     .qmin(std::numeric_limits<uint8_t>::min())
2973     .qmax(std::numeric_limits<uint8_t>::max())
2974     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
2975 }
2976 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_qmin)2977 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_qmin) {
2978   MaxPoolMicrokernelTester()
2979     .pooling_elements(9)
2980     .pooling_tile(9, 8)
2981     .channels(1)
2982     .qmin(64)
2983     .qmax(std::numeric_limits<uint8_t>::max())
2984     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
2985 }
2986 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_qmax)2987 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_qmax) {
2988   MaxPoolMicrokernelTester()
2989     .pooling_elements(9)
2990     .pooling_tile(9, 8)
2991     .channels(1)
2992     .qmin(std::numeric_limits<uint8_t>::min())
2993     .qmax(192)
2994     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
2995 }
2996 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_subtile)2997 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_subtile) {
2998   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2999     MaxPoolMicrokernelTester()
3000       .pooling_elements(pooling_elements)
3001       .pooling_tile(9, 8)
3002       .channels(1)
3003       .qmin(std::numeric_limits<uint8_t>::min())
3004       .qmax(std::numeric_limits<uint8_t>::max())
3005       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3006   }
3007 }
3008 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_subtile_with_input_offset)3009 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_subtile_with_input_offset) {
3010   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3011     MaxPoolMicrokernelTester()
3012       .pooling_elements(pooling_elements)
3013       .pooling_tile(9, 8)
3014       .channels(1)
3015       .input_offset(3)
3016       .qmin(std::numeric_limits<uint8_t>::min())
3017       .qmax(std::numeric_limits<uint8_t>::max())
3018       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3019   }
3020 }
3021 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile)3022 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile) {
3023   for (size_t channels = 2; channels < 10; channels++) {
3024     MaxPoolMicrokernelTester()
3025       .pooling_elements(9)
3026       .pooling_tile(9, 8)
3027       .channels(channels)
3028       .qmin(std::numeric_limits<uint8_t>::min())
3029       .qmax(std::numeric_limits<uint8_t>::max())
3030       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3031   }
3032 }
3033 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_input_offset)3034 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_input_offset) {
3035   for (size_t channels = 2; channels < 10; channels++) {
3036     MaxPoolMicrokernelTester()
3037       .pooling_elements(9)
3038       .pooling_tile(9, 8)
3039       .channels(channels)
3040       .input_offset(3)
3041       .qmin(std::numeric_limits<uint8_t>::min())
3042       .qmax(std::numeric_limits<uint8_t>::max())
3043       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3044   }
3045 }
3046 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_qmin)3047 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_qmin) {
3048   for (size_t channels = 2; channels < 10; channels++) {
3049     MaxPoolMicrokernelTester()
3050       .pooling_elements(9)
3051       .pooling_tile(9, 8)
3052       .channels(channels)
3053       .qmin(64)
3054       .qmax(std::numeric_limits<uint8_t>::max())
3055       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3056   }
3057 }
3058 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_qmax)3059 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_qmax) {
3060   for (size_t channels = 2; channels < 10; channels++) {
3061     MaxPoolMicrokernelTester()
3062       .pooling_elements(9)
3063       .pooling_tile(9, 8)
3064       .channels(channels)
3065       .qmin(std::numeric_limits<uint8_t>::min())
3066       .qmax(192)
3067       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3068   }
3069 }
3070 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_subtile)3071 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_subtile) {
3072   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3073     for (size_t channels = 2; channels < 10; channels++) {
3074       MaxPoolMicrokernelTester()
3075         .pooling_elements(pooling_elements)
3076         .pooling_tile(9, 8)
3077         .channels(channels)
3078         .qmin(std::numeric_limits<uint8_t>::min())
3079         .qmax(std::numeric_limits<uint8_t>::max())
3080         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3081     }
3082   }
3083 }
3084 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_subtile_with_input_offset)3085 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_subtile_with_input_offset) {
3086   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3087     for (size_t channels = 2; channels < 10; channels++) {
3088       MaxPoolMicrokernelTester()
3089         .pooling_elements(pooling_elements)
3090         .pooling_tile(9, 8)
3091         .channels(channels)
3092         .input_offset(3)
3093         .qmin(std::numeric_limits<uint8_t>::min())
3094         .qmax(std::numeric_limits<uint8_t>::max())
3095         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3096     }
3097   }
3098 }
3099 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile)3100 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile) {
3101   MaxPoolMicrokernelTester()
3102     .pooling_elements(17)
3103     .pooling_tile(9, 8)
3104     .channels(1)
3105     .qmin(std::numeric_limits<uint8_t>::min())
3106     .qmax(std::numeric_limits<uint8_t>::max())
3107     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3108 }
3109 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_input_offset)3110 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_input_offset) {
3111   MaxPoolMicrokernelTester()
3112     .pooling_elements(17)
3113     .pooling_tile(9, 8)
3114     .channels(1)
3115     .input_offset(3)
3116     .qmin(std::numeric_limits<uint8_t>::min())
3117     .qmax(std::numeric_limits<uint8_t>::max())
3118     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3119 }
3120 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_qmin)3121 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_qmin) {
3122   MaxPoolMicrokernelTester()
3123     .pooling_elements(17)
3124     .pooling_tile(9, 8)
3125     .channels(1)
3126     .qmin(64)
3127     .qmax(std::numeric_limits<uint8_t>::max())
3128     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3129 }
3130 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_qmax)3131 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_qmax) {
3132   MaxPoolMicrokernelTester()
3133     .pooling_elements(17)
3134     .pooling_tile(9, 8)
3135     .channels(1)
3136     .qmin(std::numeric_limits<uint8_t>::min())
3137     .qmax(192)
3138     .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3139 }
3140 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_subtile)3141 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_subtile) {
3142   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3143     MaxPoolMicrokernelTester()
3144       .pooling_elements(pooling_elements)
3145       .pooling_tile(9, 8)
3146       .channels(1)
3147       .qmin(std::numeric_limits<uint8_t>::min())
3148       .qmax(std::numeric_limits<uint8_t>::max())
3149       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3150   }
3151 }
3152 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_subtile_with_input_offset)3153 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_subtile_with_input_offset) {
3154   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3155     MaxPoolMicrokernelTester()
3156       .pooling_elements(pooling_elements)
3157       .pooling_tile(9, 8)
3158       .channels(1)
3159       .input_offset(3)
3160       .qmin(std::numeric_limits<uint8_t>::min())
3161       .qmax(std::numeric_limits<uint8_t>::max())
3162       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3163   }
3164 }
3165 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile)3166 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile) {
3167   for (size_t channels = 2; channels < 10; channels++) {
3168     MaxPoolMicrokernelTester()
3169       .pooling_elements(17)
3170       .pooling_tile(9, 8)
3171       .channels(channels)
3172       .qmin(std::numeric_limits<uint8_t>::min())
3173       .qmax(std::numeric_limits<uint8_t>::max())
3174       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3175   }
3176 }
3177 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_input_offset)3178 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_input_offset) {
3179   for (size_t channels = 2; channels < 10; channels++) {
3180     MaxPoolMicrokernelTester()
3181       .pooling_elements(17)
3182       .pooling_tile(9, 8)
3183       .channels(channels)
3184       .input_offset(3)
3185       .qmin(std::numeric_limits<uint8_t>::min())
3186       .qmax(std::numeric_limits<uint8_t>::max())
3187       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3188   }
3189 }
3190 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_qmin)3191 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_qmin) {
3192   for (size_t channels = 2; channels < 10; channels++) {
3193     MaxPoolMicrokernelTester()
3194       .pooling_elements(17)
3195       .pooling_tile(9, 8)
3196       .channels(channels)
3197       .qmin(64)
3198       .qmax(std::numeric_limits<uint8_t>::max())
3199       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3200   }
3201 }
3202 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_qmax)3203 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_qmax) {
3204   for (size_t channels = 2; channels < 10; channels++) {
3205     MaxPoolMicrokernelTester()
3206       .pooling_elements(17)
3207       .pooling_tile(9, 8)
3208       .channels(channels)
3209       .qmin(std::numeric_limits<uint8_t>::min())
3210       .qmax(192)
3211       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3212   }
3213 }
3214 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_subtile)3215 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_subtile) {
3216   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3217     for (size_t channels = 2; channels < 10; channels++) {
3218       MaxPoolMicrokernelTester()
3219         .pooling_elements(pooling_elements)
3220         .pooling_tile(9, 8)
3221         .channels(channels)
3222         .qmin(std::numeric_limits<uint8_t>::min())
3223         .qmax(std::numeric_limits<uint8_t>::max())
3224         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3225     }
3226   }
3227 }
3228 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_subtile_with_input_offset)3229 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_subtile_with_input_offset) {
3230   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3231     for (size_t channels = 2; channels < 10; channels++) {
3232       MaxPoolMicrokernelTester()
3233         .pooling_elements(pooling_elements)
3234         .pooling_tile(9, 8)
3235         .channels(channels)
3236         .input_offset(3)
3237         .qmin(std::numeric_limits<uint8_t>::min())
3238         .qmax(std::numeric_limits<uint8_t>::max())
3239         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3240     }
3241   }
3242 }
3243 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass)3244 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass) {
3245   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3246     MaxPoolMicrokernelTester()
3247       .pooling_elements(pooling_elements)
3248       .pooling_tile(9, 8)
3249       .channels(1)
3250       .qmin(std::numeric_limits<uint8_t>::min())
3251       .qmax(std::numeric_limits<uint8_t>::max())
3252       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3253   }
3254 }
3255 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_input_offset)3256 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_input_offset) {
3257   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3258     MaxPoolMicrokernelTester()
3259       .pooling_elements(pooling_elements)
3260       .pooling_tile(9, 8)
3261       .channels(1)
3262       .input_offset(3)
3263       .qmin(std::numeric_limits<uint8_t>::min())
3264       .qmax(std::numeric_limits<uint8_t>::max())
3265       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3266   }
3267 }
3268 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_qmin)3269 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_qmin) {
3270   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3271     MaxPoolMicrokernelTester()
3272       .pooling_elements(pooling_elements)
3273       .pooling_tile(9, 8)
3274       .channels(1)
3275       .qmin(64)
3276       .qmax(std::numeric_limits<uint8_t>::max())
3277       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3278   }
3279 }
3280 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_qmax)3281 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_qmax) {
3282   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3283     MaxPoolMicrokernelTester()
3284       .pooling_elements(pooling_elements)
3285       .pooling_tile(9, 8)
3286       .channels(1)
3287       .qmin(std::numeric_limits<uint8_t>::min())
3288       .qmax(192)
3289       .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3290   }
3291 }
3292 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass)3293 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass) {
3294   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3295     for (size_t channels = 2; channels < 10; channels++) {
3296       MaxPoolMicrokernelTester()
3297         .pooling_elements(pooling_elements)
3298         .pooling_tile(9, 8)
3299         .channels(channels)
3300         .qmin(std::numeric_limits<uint8_t>::min())
3301         .qmax(std::numeric_limits<uint8_t>::max())
3302         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3303     }
3304   }
3305 }
3306 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_input_offset)3307 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_input_offset) {
3308   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3309     for (size_t channels = 2; channels < 10; channels++) {
3310       MaxPoolMicrokernelTester()
3311         .pooling_elements(pooling_elements)
3312         .pooling_tile(9, 8)
3313         .channels(channels)
3314         .input_offset(3)
3315         .qmin(std::numeric_limits<uint8_t>::min())
3316         .qmax(std::numeric_limits<uint8_t>::max())
3317         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3318     }
3319   }
3320 }
3321 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_qmin)3322 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_qmin) {
3323   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3324     for (size_t channels = 2; channels < 10; channels++) {
3325       MaxPoolMicrokernelTester()
3326         .pooling_elements(pooling_elements)
3327         .pooling_tile(9, 8)
3328         .channels(channels)
3329         .qmin(64)
3330         .qmax(std::numeric_limits<uint8_t>::max())
3331         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3332     }
3333   }
3334 }
3335 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_qmax)3336 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_qmax) {
3337   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3338     for (size_t channels = 2; channels < 10; channels++) {
3339       MaxPoolMicrokernelTester()
3340         .pooling_elements(pooling_elements)
3341         .pooling_tile(9, 8)
3342         .channels(channels)
3343         .qmin(std::numeric_limits<uint8_t>::min())
3344         .qmax(192)
3345         .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3346     }
3347   }
3348 }
3349 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels)3350 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels) {
3351   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3352     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3353       for (size_t channels = 1; channels <= 5; channels += 1) {
3354         MaxPoolMicrokernelTester()
3355           .output_pixels(output_pixels)
3356           .pooling_elements(pooling_elements)
3357           .pooling_tile(9, 8)
3358           .channels(channels)
3359           .qmin(std::numeric_limits<uint8_t>::min())
3360           .qmax(std::numeric_limits<uint8_t>::max())
3361           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3362       }
3363     }
3364   }
3365 }
3366 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_input_offset)3367 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_input_offset) {
3368   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3369     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3370       for (size_t channels = 1; channels <= 5; channels += 1) {
3371         MaxPoolMicrokernelTester()
3372           .output_pixels(output_pixels)
3373           .pooling_elements(pooling_elements)
3374           .pooling_tile(9, 8)
3375           .channels(channels)
3376           .input_offset(7)
3377           .qmin(std::numeric_limits<uint8_t>::min())
3378           .qmax(std::numeric_limits<uint8_t>::max())
3379           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3380       }
3381     }
3382   }
3383 }
3384 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_qmin)3385 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_qmin) {
3386   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3387     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3388       for (size_t channels = 1; channels <= 5; channels += 1) {
3389         MaxPoolMicrokernelTester()
3390           .output_pixels(output_pixels)
3391           .pooling_elements(pooling_elements)
3392           .pooling_tile(9, 8)
3393           .channels(channels)
3394           .qmin(64)
3395           .qmax(std::numeric_limits<uint8_t>::max())
3396           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3397       }
3398     }
3399   }
3400 }
3401 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_qmax)3402 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_qmax) {
3403   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3404     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3405       for (size_t channels = 1; channels <= 5; channels += 1) {
3406         MaxPoolMicrokernelTester()
3407           .output_pixels(output_pixels)
3408           .pooling_elements(pooling_elements)
3409           .pooling_tile(9, 8)
3410           .channels(channels)
3411           .qmin(std::numeric_limits<uint8_t>::min())
3412           .qmax(192)
3413           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3414       }
3415     }
3416   }
3417 }
3418 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_output_stride)3419 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_output_stride) {
3420   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3421     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3422       for (size_t channels = 1; channels <= 5; channels += 1) {
3423         MaxPoolMicrokernelTester()
3424           .output_pixels(output_pixels)
3425           .pooling_elements(pooling_elements)
3426           .pooling_tile(9, 8)
3427           .channels(channels)
3428           .output_stride(7)
3429           .qmin(std::numeric_limits<uint8_t>::min())
3430           .qmax(std::numeric_limits<uint8_t>::max())
3431           .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3432       }
3433     }
3434   }
3435 }
3436 
TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_step)3437 TEST(U8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_step) {
3438   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3439     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3440       for (size_t channels = 1; channels <= 5; channels += 1) {
3441         for (size_t step = 2; step <= pooling_elements; step++) {
3442           MaxPoolMicrokernelTester()
3443             .output_pixels(output_pixels)
3444             .pooling_elements(pooling_elements)
3445             .pooling_tile(9, 8)
3446             .step(step)
3447             .channels(channels)
3448             .output_stride(7)
3449             .qmin(std::numeric_limits<uint8_t>::min())
3450             .qmax(std::numeric_limits<uint8_t>::max())
3451             .Test(xnn_u8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_u8_minmax_scalar_params);
3452         }
3453       }
3454     }
3455   }
3456 }