xref: /aosp_15_r20/external/XNNPACK/test/s8-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/s8-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(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_fulltile)24   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_fulltile) {
25     TEST_REQUIRES_ARM_NEON;
26     MaxPoolMicrokernelTester()
27       .pooling_elements(2)
28       .pooling_tile(2, 2)
29       .channels(16)
30       .qmin(std::numeric_limits<int8_t>::min())
31       .qmax(std::numeric_limits<int8_t>::max())
32       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
33   }
34 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_fulltile_with_input_offset)35   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
36     TEST_REQUIRES_ARM_NEON;
37     MaxPoolMicrokernelTester()
38       .pooling_elements(2)
39       .pooling_tile(2, 2)
40       .channels(16)
41       .input_offset(19)
42       .qmin(std::numeric_limits<int8_t>::min())
43       .qmax(std::numeric_limits<int8_t>::max())
44       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
45   }
46 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmin)47   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmin) {
48     TEST_REQUIRES_ARM_NEON;
49     MaxPoolMicrokernelTester()
50       .pooling_elements(2)
51       .pooling_tile(2, 2)
52       .channels(16)
53       .qmin(-64)
54       .qmax(std::numeric_limits<int8_t>::max())
55       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
56   }
57 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmax)58   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmax) {
59     TEST_REQUIRES_ARM_NEON;
60     MaxPoolMicrokernelTester()
61       .pooling_elements(2)
62       .pooling_tile(2, 2)
63       .channels(16)
64       .qmin(std::numeric_limits<int8_t>::min())
65       .qmax(64)
66       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
67   }
68 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_subtile)69   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_subtile) {
70     TEST_REQUIRES_ARM_NEON;
71     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
72       MaxPoolMicrokernelTester()
73         .pooling_elements(pooling_elements)
74         .pooling_tile(2, 2)
75         .channels(16)
76         .qmin(std::numeric_limits<int8_t>::min())
77         .qmax(std::numeric_limits<int8_t>::max())
78         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
79     }
80   }
81 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_unipass_subtile_with_input_offset)82   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_unipass_subtile_with_input_offset) {
83     TEST_REQUIRES_ARM_NEON;
84     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
85       MaxPoolMicrokernelTester()
86         .pooling_elements(pooling_elements)
87         .pooling_tile(2, 2)
88         .channels(16)
89         .input_offset(19)
90         .qmin(std::numeric_limits<int8_t>::min())
91         .qmax(std::numeric_limits<int8_t>::max())
92         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
93     }
94   }
95 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_fulltile)96   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
101         .pooling_tile(2, 2)
102         .channels(channels)
103         .qmin(std::numeric_limits<int8_t>::min())
104         .qmax(std::numeric_limits<int8_t>::max())
105         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
106     }
107   }
108 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_fulltile_with_input_offset)109   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
114         .pooling_tile(2, 2)
115         .channels(channels)
116         .input_offset(131)
117         .qmin(std::numeric_limits<int8_t>::min())
118         .qmax(std::numeric_limits<int8_t>::max())
119         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
120     }
121   }
122 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_fulltile_with_qmin)123   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
128         .pooling_tile(2, 2)
129         .channels(channels)
130         .qmin(-64)
131         .qmax(std::numeric_limits<int8_t>::max())
132         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
133     }
134   }
135 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_fulltile_with_qmax)136   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
141         .pooling_tile(2, 2)
142         .channels(channels)
143         .qmin(std::numeric_limits<int8_t>::min())
144         .qmax(64)
145         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
146     }
147   }
148 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_subtile)149   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_unipass_subtile) {
150     TEST_REQUIRES_ARM_NEON;
151     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
152       for (size_t channels = 32; channels < 128; channels += 16) {
153         MaxPoolMicrokernelTester()
154           .pooling_elements(pooling_elements)
155           .pooling_tile(2, 2)
156           .channels(channels)
157           .qmin(std::numeric_limits<int8_t>::min())
158           .qmax(std::numeric_limits<int8_t>::max())
159           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
160       }
161     }
162   }
163 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_unipass_subtile_with_input_offset)164   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_unipass_subtile_with_input_offset) {
165     TEST_REQUIRES_ARM_NEON;
166     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
167       for (size_t channels = 32; channels < 128; channels += 16) {
168         MaxPoolMicrokernelTester()
169           .pooling_elements(pooling_elements)
170           .pooling_tile(2, 2)
171           .channels(channels)
172           .input_offset(131)
173           .qmin(std::numeric_limits<int8_t>::min())
174           .qmax(std::numeric_limits<int8_t>::max())
175           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
176       }
177     }
178   }
179 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_fulltile)180   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
185         .pooling_tile(2, 2)
186         .channels(channels)
187         .qmin(std::numeric_limits<int8_t>::min())
188         .qmax(std::numeric_limits<int8_t>::max())
189         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
190     }
191   }
192 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_fulltile_with_input_offset)193   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
198         .pooling_tile(2, 2)
199         .channels(channels)
200         .input_offset(17)
201         .qmin(std::numeric_limits<int8_t>::min())
202         .qmax(std::numeric_limits<int8_t>::max())
203         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
204     }
205   }
206 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmin)207   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
212         .pooling_tile(2, 2)
213         .channels(channels)
214         .qmin(-64)
215         .qmax(std::numeric_limits<int8_t>::max())
216         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
217     }
218   }
219 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmax)220   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
225         .pooling_tile(2, 2)
226         .channels(channels)
227         .qmin(std::numeric_limits<int8_t>::min())
228         .qmax(64)
229         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
230     }
231   }
232 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_subtile)233   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_unipass_subtile) {
234     TEST_REQUIRES_ARM_NEON;
235     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
236       for (size_t channels = 1; channels < 16; channels++) {
237         MaxPoolMicrokernelTester()
238           .pooling_elements(pooling_elements)
239           .pooling_tile(2, 2)
240           .channels(channels)
241           .qmin(std::numeric_limits<int8_t>::min())
242           .qmax(std::numeric_limits<int8_t>::max())
243           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
244       }
245     }
246   }
247 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_unipass_subtile_with_input_offset)248   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_unipass_subtile_with_input_offset) {
249     TEST_REQUIRES_ARM_NEON;
250     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
251       for (size_t channels = 1; channels < 16; channels++) {
252         MaxPoolMicrokernelTester()
253           .pooling_elements(pooling_elements)
254           .pooling_tile(2, 2)
255           .channels(channels)
256           .input_offset(17)
257           .qmin(std::numeric_limits<int8_t>::min())
258           .qmax(std::numeric_limits<int8_t>::max())
259           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
260       }
261     }
262   }
263 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_fulltile)264   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
269         .pooling_tile(2, 2)
270         .channels(channels)
271         .qmin(std::numeric_limits<int8_t>::min())
272         .qmax(std::numeric_limits<int8_t>::max())
273         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
274     }
275   }
276 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_fulltile_with_input_offset)277   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
282         .pooling_tile(2, 2)
283         .channels(channels)
284         .input_offset(37)
285         .qmin(std::numeric_limits<int8_t>::min())
286         .qmax(std::numeric_limits<int8_t>::max())
287         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
288     }
289   }
290 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmin)291   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
296         .pooling_tile(2, 2)
297         .channels(channels)
298         .qmin(-64)
299         .qmax(std::numeric_limits<int8_t>::max())
300         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
301     }
302   }
303 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmax)304   TEST(S8_MAXPOOL_MINMAX_2P2X__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(2)
309         .pooling_tile(2, 2)
310         .channels(channels)
311         .qmin(std::numeric_limits<int8_t>::min())
312         .qmax(64)
313         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
314     }
315   }
316 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_subtile)317   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_unipass_subtile) {
318     TEST_REQUIRES_ARM_NEON;
319     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
320       for (size_t channels = 17; channels < 32; channels++) {
321         MaxPoolMicrokernelTester()
322           .pooling_elements(pooling_elements)
323           .pooling_tile(2, 2)
324           .channels(channels)
325           .qmin(std::numeric_limits<int8_t>::min())
326           .qmax(std::numeric_limits<int8_t>::max())
327           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
328       }
329     }
330   }
331 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_unipass_subtile_with_input_offset)332   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_unipass_subtile_with_input_offset) {
333     TEST_REQUIRES_ARM_NEON;
334     for (size_t pooling_elements = 2; pooling_elements < 2; pooling_elements++) {
335       for (size_t channels = 17; channels < 32; channels++) {
336         MaxPoolMicrokernelTester()
337           .pooling_elements(pooling_elements)
338           .pooling_tile(2, 2)
339           .channels(channels)
340           .input_offset(37)
341           .qmin(std::numeric_limits<int8_t>::min())
342           .qmax(std::numeric_limits<int8_t>::max())
343           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
344       }
345     }
346   }
347 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_fulltile)348   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_fulltile) {
349     TEST_REQUIRES_ARM_NEON;
350     MaxPoolMicrokernelTester()
351       .pooling_elements(4)
352       .pooling_tile(2, 2)
353       .channels(16)
354       .qmin(std::numeric_limits<int8_t>::min())
355       .qmax(std::numeric_limits<int8_t>::max())
356       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
357   }
358 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_fulltile_with_input_offset)359   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
360     TEST_REQUIRES_ARM_NEON;
361     MaxPoolMicrokernelTester()
362       .pooling_elements(4)
363       .pooling_tile(2, 2)
364       .channels(16)
365       .input_offset(19)
366       .qmin(std::numeric_limits<int8_t>::min())
367       .qmax(std::numeric_limits<int8_t>::max())
368       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
369   }
370 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmin)371   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmin) {
372     TEST_REQUIRES_ARM_NEON;
373     MaxPoolMicrokernelTester()
374       .pooling_elements(4)
375       .pooling_tile(2, 2)
376       .channels(16)
377       .qmin(-64)
378       .qmax(std::numeric_limits<int8_t>::max())
379       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
380   }
381 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmax)382   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmax) {
383     TEST_REQUIRES_ARM_NEON;
384     MaxPoolMicrokernelTester()
385       .pooling_elements(4)
386       .pooling_tile(2, 2)
387       .channels(16)
388       .qmin(std::numeric_limits<int8_t>::min())
389       .qmax(64)
390       .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
391   }
392 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_subtile)393   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_subtile) {
394     TEST_REQUIRES_ARM_NEON;
395     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
396       MaxPoolMicrokernelTester()
397         .pooling_elements(pooling_elements)
398         .pooling_tile(2, 2)
399         .channels(16)
400         .qmin(std::numeric_limits<int8_t>::min())
401         .qmax(std::numeric_limits<int8_t>::max())
402         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
403     }
404   }
405 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_twopass_subtile_with_input_offset)406   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_twopass_subtile_with_input_offset) {
407     TEST_REQUIRES_ARM_NEON;
408     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
409       MaxPoolMicrokernelTester()
410         .pooling_elements(pooling_elements)
411         .pooling_tile(2, 2)
412         .channels(16)
413         .input_offset(19)
414         .qmin(std::numeric_limits<int8_t>::min())
415         .qmax(std::numeric_limits<int8_t>::max())
416         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
417     }
418   }
419 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_fulltile)420   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
425         .pooling_tile(2, 2)
426         .channels(channels)
427         .qmin(std::numeric_limits<int8_t>::min())
428         .qmax(std::numeric_limits<int8_t>::max())
429         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
430     }
431   }
432 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_fulltile_with_input_offset)433   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
438         .pooling_tile(2, 2)
439         .channels(channels)
440         .input_offset(83)
441         .qmin(std::numeric_limits<int8_t>::min())
442         .qmax(std::numeric_limits<int8_t>::max())
443         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
444     }
445   }
446 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_fulltile_with_qmin)447   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
452         .pooling_tile(2, 2)
453         .channels(channels)
454         .qmin(-64)
455         .qmax(std::numeric_limits<int8_t>::max())
456         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
457     }
458   }
459 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_fulltile_with_qmax)460   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
465         .pooling_tile(2, 2)
466         .channels(channels)
467         .qmin(std::numeric_limits<int8_t>::min())
468         .qmax(64)
469         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
470     }
471   }
472 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_subtile)473   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_twopass_subtile) {
474     TEST_REQUIRES_ARM_NEON;
475     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
476       for (size_t channels = 32; channels < 128; channels += 16) {
477         MaxPoolMicrokernelTester()
478           .pooling_elements(pooling_elements)
479           .pooling_tile(2, 2)
480           .channels(channels)
481           .qmin(std::numeric_limits<int8_t>::min())
482           .qmax(std::numeric_limits<int8_t>::max())
483           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
484       }
485     }
486   }
487 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_twopass_subtile_with_input_offset)488   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_twopass_subtile_with_input_offset) {
489     TEST_REQUIRES_ARM_NEON;
490     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
491       for (size_t channels = 32; channels < 128; channels += 16) {
492         MaxPoolMicrokernelTester()
493           .pooling_elements(pooling_elements)
494           .pooling_tile(2, 2)
495           .channels(channels)
496           .input_offset(131)
497           .qmin(std::numeric_limits<int8_t>::min())
498           .qmax(std::numeric_limits<int8_t>::max())
499           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
500       }
501     }
502   }
503 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_fulltile)504   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
509         .pooling_tile(2, 2)
510         .channels(channels)
511         .qmin(std::numeric_limits<int8_t>::min())
512         .qmax(std::numeric_limits<int8_t>::max())
513         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
514     }
515   }
516 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_fulltile_with_input_offset)517   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
522         .pooling_tile(2, 2)
523         .channels(channels)
524         .input_offset(17)
525         .qmin(std::numeric_limits<int8_t>::min())
526         .qmax(std::numeric_limits<int8_t>::max())
527         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
528     }
529   }
530 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmin)531   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
536         .pooling_tile(2, 2)
537         .channels(channels)
538         .qmin(-64)
539         .qmax(std::numeric_limits<int8_t>::max())
540         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
541     }
542   }
543 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmax)544   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
549         .pooling_tile(2, 2)
550         .channels(channels)
551         .qmin(std::numeric_limits<int8_t>::min())
552         .qmax(64)
553         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
554     }
555   }
556 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_subtile)557   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_twopass_subtile) {
558     TEST_REQUIRES_ARM_NEON;
559     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
560       for (size_t channels = 1; channels < 16; channels++) {
561         MaxPoolMicrokernelTester()
562           .pooling_elements(pooling_elements)
563           .pooling_tile(2, 2)
564           .channels(channels)
565           .qmin(std::numeric_limits<int8_t>::min())
566           .qmax(std::numeric_limits<int8_t>::max())
567           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
568       }
569     }
570   }
571 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_twopass_subtile_with_input_offset)572   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_twopass_subtile_with_input_offset) {
573     TEST_REQUIRES_ARM_NEON;
574     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
575       for (size_t channels = 1; channels < 16; channels++) {
576         MaxPoolMicrokernelTester()
577           .pooling_elements(pooling_elements)
578           .pooling_tile(2, 2)
579           .channels(channels)
580           .input_offset(17)
581           .qmin(std::numeric_limits<int8_t>::min())
582           .qmax(std::numeric_limits<int8_t>::max())
583           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
584       }
585     }
586   }
587 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_fulltile)588   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
593         .pooling_tile(2, 2)
594         .channels(channels)
595         .qmin(std::numeric_limits<int8_t>::min())
596         .qmax(std::numeric_limits<int8_t>::max())
597         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
598     }
599   }
600 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_fulltile_with_input_offset)601   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
606         .pooling_tile(2, 2)
607         .channels(channels)
608         .input_offset(37)
609         .qmin(std::numeric_limits<int8_t>::min())
610         .qmax(std::numeric_limits<int8_t>::max())
611         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
612     }
613   }
614 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmin)615   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
620         .pooling_tile(2, 2)
621         .channels(channels)
622         .qmin(-64)
623         .qmax(std::numeric_limits<int8_t>::max())
624         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
625     }
626   }
627 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmax)628   TEST(S8_MAXPOOL_MINMAX_2P2X__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(4)
633         .pooling_tile(2, 2)
634         .channels(channels)
635         .qmin(std::numeric_limits<int8_t>::min())
636         .qmax(64)
637         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
638     }
639   }
640 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_subtile)641   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_twopass_subtile) {
642     TEST_REQUIRES_ARM_NEON;
643     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
644       for (size_t channels = 17; channels < 32; channels++) {
645         MaxPoolMicrokernelTester()
646           .pooling_elements(pooling_elements)
647           .pooling_tile(2, 2)
648           .channels(channels)
649           .qmin(std::numeric_limits<int8_t>::min())
650           .qmax(std::numeric_limits<int8_t>::max())
651           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
652       }
653     }
654   }
655 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_twopass_subtile_with_input_offset)656   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_twopass_subtile_with_input_offset) {
657     TEST_REQUIRES_ARM_NEON;
658     for (size_t pooling_elements = 3; pooling_elements < 4; pooling_elements++) {
659       for (size_t channels = 17; channels < 32; channels++) {
660         MaxPoolMicrokernelTester()
661           .pooling_elements(pooling_elements)
662           .pooling_tile(2, 2)
663           .channels(channels)
664           .input_offset(37)
665           .qmin(std::numeric_limits<int8_t>::min())
666           .qmax(std::numeric_limits<int8_t>::max())
667           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
668       }
669     }
670   }
671 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_multipass)672   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_multipass) {
673     TEST_REQUIRES_ARM_NEON;
674     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
675       MaxPoolMicrokernelTester()
676         .pooling_elements(pooling_elements)
677         .pooling_tile(2, 2)
678         .channels(16)
679         .qmin(std::numeric_limits<int8_t>::min())
680         .qmax(std::numeric_limits<int8_t>::max())
681         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
682     }
683   }
684 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_multipass_with_input_offset)685   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_multipass_with_input_offset) {
686     TEST_REQUIRES_ARM_NEON;
687     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
688       MaxPoolMicrokernelTester()
689         .pooling_elements(pooling_elements)
690         .pooling_tile(2, 2)
691         .channels(16)
692         .input_offset(19)
693         .qmin(std::numeric_limits<int8_t>::min())
694         .qmax(std::numeric_limits<int8_t>::max())
695         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
696     }
697   }
698 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_multipass_with_qmin)699   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_multipass_with_qmin) {
700     TEST_REQUIRES_ARM_NEON;
701     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
702       MaxPoolMicrokernelTester()
703         .pooling_elements(pooling_elements)
704         .pooling_tile(2, 2)
705         .channels(16)
706         .qmin(-64)
707         .qmax(std::numeric_limits<int8_t>::max())
708         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
709     }
710   }
711 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_eq_16_multipass_with_qmax)712   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_eq_16_multipass_with_qmax) {
713     TEST_REQUIRES_ARM_NEON;
714     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
715       MaxPoolMicrokernelTester()
716         .pooling_elements(pooling_elements)
717         .pooling_tile(2, 2)
718         .channels(16)
719         .qmin(std::numeric_limits<int8_t>::min())
720         .qmax(64)
721         .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
722     }
723   }
724 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_multipass)725   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_multipass) {
726     TEST_REQUIRES_ARM_NEON;
727     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
728       for (size_t channels = 32; channels < 128; channels += 16) {
729         MaxPoolMicrokernelTester()
730           .pooling_elements(pooling_elements)
731           .pooling_tile(2, 2)
732           .channels(channels)
733           .qmin(std::numeric_limits<int8_t>::min())
734           .qmax(std::numeric_limits<int8_t>::max())
735           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
736       }
737     }
738   }
739 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_multipass_with_input_offset)740   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_multipass_with_input_offset) {
741     TEST_REQUIRES_ARM_NEON;
742     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
743       for (size_t channels = 32; channels < 128; channels += 16) {
744         MaxPoolMicrokernelTester()
745           .pooling_elements(pooling_elements)
746           .pooling_tile(2, 2)
747           .channels(channels)
748           .input_offset(131)
749           .qmin(std::numeric_limits<int8_t>::min())
750           .qmax(std::numeric_limits<int8_t>::max())
751           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
752       }
753     }
754   }
755 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_multipass_with_qmin)756   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_multipass_with_qmin) {
757     TEST_REQUIRES_ARM_NEON;
758     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
759       for (size_t channels = 32; channels < 128; channels += 16) {
760         MaxPoolMicrokernelTester()
761           .pooling_elements(pooling_elements)
762           .pooling_tile(2, 2)
763           .channels(channels)
764           .qmin(-64)
765           .qmax(std::numeric_limits<int8_t>::max())
766           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
767       }
768     }
769   }
770 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_div_16_multipass_with_qmax)771   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_div_16_multipass_with_qmax) {
772     TEST_REQUIRES_ARM_NEON;
773     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
774       for (size_t channels = 32; channels < 128; channels += 16) {
775         MaxPoolMicrokernelTester()
776           .pooling_elements(pooling_elements)
777           .pooling_tile(2, 2)
778           .channels(channels)
779           .qmin(std::numeric_limits<int8_t>::min())
780           .qmax(64)
781           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
782       }
783     }
784   }
785 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_multipass)786   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_multipass) {
787     TEST_REQUIRES_ARM_NEON;
788     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
789       for (size_t channels = 1; channels < 16; channels++) {
790         MaxPoolMicrokernelTester()
791           .pooling_elements(pooling_elements)
792           .pooling_tile(2, 2)
793           .channels(channels)
794           .qmin(std::numeric_limits<int8_t>::min())
795           .qmax(std::numeric_limits<int8_t>::max())
796           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
797       }
798     }
799   }
800 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_multipass_with_input_offset)801   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_multipass_with_input_offset) {
802     TEST_REQUIRES_ARM_NEON;
803     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
804       for (size_t channels = 1; channels < 16; channels++) {
805         MaxPoolMicrokernelTester()
806           .pooling_elements(pooling_elements)
807           .pooling_tile(2, 2)
808           .channels(channels)
809           .input_offset(16)
810           .qmin(std::numeric_limits<int8_t>::min())
811           .qmax(std::numeric_limits<int8_t>::max())
812           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
813       }
814     }
815   }
816 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_multipass_with_qmin)817   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_multipass_with_qmin) {
818     TEST_REQUIRES_ARM_NEON;
819     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
820       for (size_t channels = 1; channels < 16; channels++) {
821         MaxPoolMicrokernelTester()
822           .pooling_elements(pooling_elements)
823           .pooling_tile(2, 2)
824           .channels(channels)
825           .qmin(-64)
826           .qmax(std::numeric_limits<int8_t>::max())
827           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
828       }
829     }
830   }
831 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_lt_16_multipass_with_qmax)832   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_lt_16_multipass_with_qmax) {
833     TEST_REQUIRES_ARM_NEON;
834     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
835       for (size_t channels = 1; channels < 16; channels++) {
836         MaxPoolMicrokernelTester()
837           .pooling_elements(pooling_elements)
838           .pooling_tile(2, 2)
839           .channels(channels)
840           .qmin(std::numeric_limits<int8_t>::min())
841           .qmax(64)
842           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
843       }
844     }
845   }
846 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_multipass)847   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_multipass) {
848     TEST_REQUIRES_ARM_NEON;
849     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
850       for (size_t channels = 17; channels < 32; channels++) {
851         MaxPoolMicrokernelTester()
852           .pooling_elements(pooling_elements)
853           .pooling_tile(2, 2)
854           .channels(channels)
855           .qmin(std::numeric_limits<int8_t>::min())
856           .qmax(std::numeric_limits<int8_t>::max())
857           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
858       }
859     }
860   }
861 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_multipass_with_input_offset)862   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_multipass_with_input_offset) {
863     TEST_REQUIRES_ARM_NEON;
864     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
865       for (size_t channels = 17; channels < 32; channels++) {
866         MaxPoolMicrokernelTester()
867           .pooling_elements(pooling_elements)
868           .pooling_tile(2, 2)
869           .channels(channels)
870           .input_offset(37)
871           .qmin(std::numeric_limits<int8_t>::min())
872           .qmax(std::numeric_limits<int8_t>::max())
873           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
874       }
875     }
876   }
877 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_multipass_with_qmin)878   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_multipass_with_qmin) {
879     TEST_REQUIRES_ARM_NEON;
880     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
881       for (size_t channels = 17; channels < 32; channels++) {
882         MaxPoolMicrokernelTester()
883           .pooling_elements(pooling_elements)
884           .pooling_tile(2, 2)
885           .channels(channels)
886           .qmin(-64)
887           .qmax(std::numeric_limits<int8_t>::max())
888           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
889       }
890     }
891   }
892 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,channels_gt_16_multipass_with_qmax)893   TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16, channels_gt_16_multipass_with_qmax) {
894     TEST_REQUIRES_ARM_NEON;
895     for (size_t pooling_elements = 5; pooling_elements <= 8; pooling_elements += 3) {
896       for (size_t channels = 17; channels < 32; channels++) {
897         MaxPoolMicrokernelTester()
898           .pooling_elements(pooling_elements)
899           .pooling_tile(2, 2)
900           .channels(channels)
901           .qmin(std::numeric_limits<int8_t>::min())
902           .qmax(64)
903           .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
904       }
905     }
906   }
907 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels)908   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
917             .channels(channels)
918             .qmin(std::numeric_limits<int8_t>::min())
919             .qmax(std::numeric_limits<int8_t>::max())
920             .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
921         }
922       }
923     }
924   }
925 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels_with_input_offset)926   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
935             .channels(channels)
936             .input_offset(83)
937             .qmin(std::numeric_limits<int8_t>::min())
938             .qmax(std::numeric_limits<int8_t>::max())
939             .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
940         }
941       }
942     }
943   }
944 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels_with_qmin)945   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
954             .channels(channels)
955             .qmin(-64)
956             .qmax(std::numeric_limits<int8_t>::max())
957             .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
958         }
959       }
960     }
961   }
962 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels_with_qmax)963   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
972             .channels(channels)
973             .qmin(std::numeric_limits<int8_t>::min())
974             .qmax(64)
975             .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
976         }
977       }
978     }
979   }
980 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels_with_output_stride)981   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
990             .channels(channels)
991             .output_stride(83)
992             .qmin(std::numeric_limits<int8_t>::min())
993             .qmax(std::numeric_limits<int8_t>::max())
994             .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
995         }
996       }
997     }
998   }
999 
TEST(S8_MAXPOOL_MINMAX_2P2X__NEON_C16,few_output_pixels_with_step)1000   TEST(S8_MAXPOOL_MINMAX_2P2X__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, 2, 3}}) {
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(2, 2)
1010               .step(step)
1011               .channels(channels)
1012               .output_stride(83)
1013               .qmin(std::numeric_limits<int8_t>::min())
1014               .qmax(std::numeric_limits<int8_t>::max())
1015               .Test(xnn_s8_maxpool_minmax_ukernel_2p2x__neon_c16, xnn_init_s8_minmax_neon_params);
1016           }
1017         }
1018       }
1019     }
1020   }
1021 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1022 
1023 
1024 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_fulltile)1025   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_fulltile) {
1026     TEST_REQUIRES_ARM_NEON;
1027     MaxPoolMicrokernelTester()
1028       .pooling_elements(4)
1029       .pooling_tile(4, 3)
1030       .channels(16)
1031       .qmin(std::numeric_limits<int8_t>::min())
1032       .qmax(std::numeric_limits<int8_t>::max())
1033       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1034   }
1035 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_fulltile_with_input_offset)1036   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
1037     TEST_REQUIRES_ARM_NEON;
1038     MaxPoolMicrokernelTester()
1039       .pooling_elements(4)
1040       .pooling_tile(4, 3)
1041       .channels(16)
1042       .input_offset(19)
1043       .qmin(std::numeric_limits<int8_t>::min())
1044       .qmax(std::numeric_limits<int8_t>::max())
1045       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1046   }
1047 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmin)1048   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmin) {
1049     TEST_REQUIRES_ARM_NEON;
1050     MaxPoolMicrokernelTester()
1051       .pooling_elements(4)
1052       .pooling_tile(4, 3)
1053       .channels(16)
1054       .qmin(-64)
1055       .qmax(std::numeric_limits<int8_t>::max())
1056       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1057   }
1058 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmax)1059   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmax) {
1060     TEST_REQUIRES_ARM_NEON;
1061     MaxPoolMicrokernelTester()
1062       .pooling_elements(4)
1063       .pooling_tile(4, 3)
1064       .channels(16)
1065       .qmin(std::numeric_limits<int8_t>::min())
1066       .qmax(64)
1067       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1068   }
1069 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_subtile)1070   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_subtile) {
1071     TEST_REQUIRES_ARM_NEON;
1072     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1073       MaxPoolMicrokernelTester()
1074         .pooling_elements(pooling_elements)
1075         .pooling_tile(4, 3)
1076         .channels(16)
1077         .qmin(std::numeric_limits<int8_t>::min())
1078         .qmax(std::numeric_limits<int8_t>::max())
1079         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1080     }
1081   }
1082 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_unipass_subtile_with_input_offset)1083   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_unipass_subtile_with_input_offset) {
1084     TEST_REQUIRES_ARM_NEON;
1085     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1086       MaxPoolMicrokernelTester()
1087         .pooling_elements(pooling_elements)
1088         .pooling_tile(4, 3)
1089         .channels(16)
1090         .input_offset(19)
1091         .qmin(std::numeric_limits<int8_t>::min())
1092         .qmax(std::numeric_limits<int8_t>::max())
1093         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1094     }
1095   }
1096 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_fulltile)1097   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_fulltile) {
1098     TEST_REQUIRES_ARM_NEON;
1099     for (size_t channels = 32; channels < 128; channels += 16) {
1100       MaxPoolMicrokernelTester()
1101         .pooling_elements(4)
1102         .pooling_tile(4, 3)
1103         .channels(channels)
1104         .qmin(std::numeric_limits<int8_t>::min())
1105         .qmax(std::numeric_limits<int8_t>::max())
1106         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1107     }
1108   }
1109 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_fulltile_with_input_offset)1110   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_fulltile_with_input_offset) {
1111     TEST_REQUIRES_ARM_NEON;
1112     for (size_t channels = 32; channels < 128; channels += 16) {
1113       MaxPoolMicrokernelTester()
1114         .pooling_elements(4)
1115         .pooling_tile(4, 3)
1116         .channels(channels)
1117         .input_offset(131)
1118         .qmin(std::numeric_limits<int8_t>::min())
1119         .qmax(std::numeric_limits<int8_t>::max())
1120         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1121     }
1122   }
1123 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_fulltile_with_qmin)1124   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_fulltile_with_qmin) {
1125     TEST_REQUIRES_ARM_NEON;
1126     for (size_t channels = 32; channels < 128; channels += 16) {
1127       MaxPoolMicrokernelTester()
1128         .pooling_elements(4)
1129         .pooling_tile(4, 3)
1130         .channels(channels)
1131         .qmin(-64)
1132         .qmax(std::numeric_limits<int8_t>::max())
1133         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1134     }
1135   }
1136 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_fulltile_with_qmax)1137   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_fulltile_with_qmax) {
1138     TEST_REQUIRES_ARM_NEON;
1139     for (size_t channels = 32; channels < 128; channels += 16) {
1140       MaxPoolMicrokernelTester()
1141         .pooling_elements(4)
1142         .pooling_tile(4, 3)
1143         .channels(channels)
1144         .qmin(std::numeric_limits<int8_t>::min())
1145         .qmax(64)
1146         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1147     }
1148   }
1149 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_subtile)1150   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_subtile) {
1151     TEST_REQUIRES_ARM_NEON;
1152     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1153       for (size_t channels = 32; channels < 128; channels += 16) {
1154         MaxPoolMicrokernelTester()
1155           .pooling_elements(pooling_elements)
1156           .pooling_tile(4, 3)
1157           .channels(channels)
1158           .qmin(std::numeric_limits<int8_t>::min())
1159           .qmax(std::numeric_limits<int8_t>::max())
1160           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1161       }
1162     }
1163   }
1164 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_unipass_subtile_with_input_offset)1165   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_unipass_subtile_with_input_offset) {
1166     TEST_REQUIRES_ARM_NEON;
1167     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1168       for (size_t channels = 32; channels < 128; channels += 16) {
1169         MaxPoolMicrokernelTester()
1170           .pooling_elements(pooling_elements)
1171           .pooling_tile(4, 3)
1172           .channels(channels)
1173           .input_offset(131)
1174           .qmin(std::numeric_limits<int8_t>::min())
1175           .qmax(std::numeric_limits<int8_t>::max())
1176           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1177       }
1178     }
1179   }
1180 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_fulltile)1181   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_fulltile) {
1182     TEST_REQUIRES_ARM_NEON;
1183     for (size_t channels = 1; channels < 16; channels++) {
1184       MaxPoolMicrokernelTester()
1185         .pooling_elements(4)
1186         .pooling_tile(4, 3)
1187         .channels(channels)
1188         .qmin(std::numeric_limits<int8_t>::min())
1189         .qmax(std::numeric_limits<int8_t>::max())
1190         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1191     }
1192   }
1193 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_fulltile_with_input_offset)1194   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
1195     TEST_REQUIRES_ARM_NEON;
1196     for (size_t channels = 1; channels < 16; channels++) {
1197       MaxPoolMicrokernelTester()
1198         .pooling_elements(4)
1199         .pooling_tile(4, 3)
1200         .channels(channels)
1201         .input_offset(17)
1202         .qmin(std::numeric_limits<int8_t>::min())
1203         .qmax(std::numeric_limits<int8_t>::max())
1204         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1205     }
1206   }
1207 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmin)1208   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmin) {
1209     TEST_REQUIRES_ARM_NEON;
1210     for (size_t channels = 1; channels < 16; channels++) {
1211       MaxPoolMicrokernelTester()
1212         .pooling_elements(4)
1213         .pooling_tile(4, 3)
1214         .channels(channels)
1215         .qmin(-64)
1216         .qmax(std::numeric_limits<int8_t>::max())
1217         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1218     }
1219   }
1220 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmax)1221   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmax) {
1222     TEST_REQUIRES_ARM_NEON;
1223     for (size_t channels = 1; channels < 16; channels++) {
1224       MaxPoolMicrokernelTester()
1225         .pooling_elements(4)
1226         .pooling_tile(4, 3)
1227         .channels(channels)
1228         .qmin(std::numeric_limits<int8_t>::min())
1229         .qmax(64)
1230         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1231     }
1232   }
1233 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_subtile)1234   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_subtile) {
1235     TEST_REQUIRES_ARM_NEON;
1236     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1237       for (size_t channels = 1; channels < 16; channels++) {
1238         MaxPoolMicrokernelTester()
1239           .pooling_elements(pooling_elements)
1240           .pooling_tile(4, 3)
1241           .channels(channels)
1242           .qmin(std::numeric_limits<int8_t>::min())
1243           .qmax(std::numeric_limits<int8_t>::max())
1244           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1245       }
1246     }
1247   }
1248 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_unipass_subtile_with_input_offset)1249   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_unipass_subtile_with_input_offset) {
1250     TEST_REQUIRES_ARM_NEON;
1251     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1252       for (size_t channels = 1; channels < 16; channels++) {
1253         MaxPoolMicrokernelTester()
1254           .pooling_elements(pooling_elements)
1255           .pooling_tile(4, 3)
1256           .channels(channels)
1257           .input_offset(17)
1258           .qmin(std::numeric_limits<int8_t>::min())
1259           .qmax(std::numeric_limits<int8_t>::max())
1260           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1261       }
1262     }
1263   }
1264 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_fulltile)1265   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_fulltile) {
1266     TEST_REQUIRES_ARM_NEON;
1267     for (size_t channels = 17; channels < 32; channels++) {
1268       MaxPoolMicrokernelTester()
1269         .pooling_elements(4)
1270         .pooling_tile(4, 3)
1271         .channels(channels)
1272         .qmin(std::numeric_limits<int8_t>::min())
1273         .qmax(std::numeric_limits<int8_t>::max())
1274         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1275     }
1276   }
1277 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_fulltile_with_input_offset)1278   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
1279     TEST_REQUIRES_ARM_NEON;
1280     for (size_t channels = 17; channels < 32; channels++) {
1281       MaxPoolMicrokernelTester()
1282         .pooling_elements(4)
1283         .pooling_tile(4, 3)
1284         .channels(channels)
1285         .input_offset(37)
1286         .qmin(std::numeric_limits<int8_t>::min())
1287         .qmax(std::numeric_limits<int8_t>::max())
1288         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1289     }
1290   }
1291 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmin)1292   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmin) {
1293     TEST_REQUIRES_ARM_NEON;
1294     for (size_t channels = 17; channels < 32; channels++) {
1295       MaxPoolMicrokernelTester()
1296         .pooling_elements(4)
1297         .pooling_tile(4, 3)
1298         .channels(channels)
1299         .qmin(-64)
1300         .qmax(std::numeric_limits<int8_t>::max())
1301         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1302     }
1303   }
1304 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmax)1305   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmax) {
1306     TEST_REQUIRES_ARM_NEON;
1307     for (size_t channels = 17; channels < 32; channels++) {
1308       MaxPoolMicrokernelTester()
1309         .pooling_elements(4)
1310         .pooling_tile(4, 3)
1311         .channels(channels)
1312         .qmin(std::numeric_limits<int8_t>::min())
1313         .qmax(64)
1314         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1315     }
1316   }
1317 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_subtile)1318   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_subtile) {
1319     TEST_REQUIRES_ARM_NEON;
1320     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1321       for (size_t channels = 17; channels < 32; channels++) {
1322         MaxPoolMicrokernelTester()
1323           .pooling_elements(pooling_elements)
1324           .pooling_tile(4, 3)
1325           .channels(channels)
1326           .qmin(std::numeric_limits<int8_t>::min())
1327           .qmax(std::numeric_limits<int8_t>::max())
1328           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1329       }
1330     }
1331   }
1332 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_unipass_subtile_with_input_offset)1333   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_unipass_subtile_with_input_offset) {
1334     TEST_REQUIRES_ARM_NEON;
1335     for (size_t pooling_elements = 2; pooling_elements < 4; pooling_elements++) {
1336       for (size_t channels = 17; channels < 32; channels++) {
1337         MaxPoolMicrokernelTester()
1338           .pooling_elements(pooling_elements)
1339           .pooling_tile(4, 3)
1340           .channels(channels)
1341           .input_offset(37)
1342           .qmin(std::numeric_limits<int8_t>::min())
1343           .qmax(std::numeric_limits<int8_t>::max())
1344           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1345       }
1346     }
1347   }
1348 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_fulltile)1349   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_fulltile) {
1350     TEST_REQUIRES_ARM_NEON;
1351     MaxPoolMicrokernelTester()
1352       .pooling_elements(7)
1353       .pooling_tile(4, 3)
1354       .channels(16)
1355       .qmin(std::numeric_limits<int8_t>::min())
1356       .qmax(std::numeric_limits<int8_t>::max())
1357       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1358   }
1359 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_fulltile_with_input_offset)1360   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
1361     TEST_REQUIRES_ARM_NEON;
1362     MaxPoolMicrokernelTester()
1363       .pooling_elements(7)
1364       .pooling_tile(4, 3)
1365       .channels(16)
1366       .input_offset(19)
1367       .qmin(std::numeric_limits<int8_t>::min())
1368       .qmax(std::numeric_limits<int8_t>::max())
1369       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1370   }
1371 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmin)1372   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmin) {
1373     TEST_REQUIRES_ARM_NEON;
1374     MaxPoolMicrokernelTester()
1375       .pooling_elements(7)
1376       .pooling_tile(4, 3)
1377       .channels(16)
1378       .qmin(-64)
1379       .qmax(std::numeric_limits<int8_t>::max())
1380       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1381   }
1382 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmax)1383   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmax) {
1384     TEST_REQUIRES_ARM_NEON;
1385     MaxPoolMicrokernelTester()
1386       .pooling_elements(7)
1387       .pooling_tile(4, 3)
1388       .channels(16)
1389       .qmin(std::numeric_limits<int8_t>::min())
1390       .qmax(64)
1391       .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1392   }
1393 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_subtile)1394   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_subtile) {
1395     TEST_REQUIRES_ARM_NEON;
1396     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1397       MaxPoolMicrokernelTester()
1398         .pooling_elements(pooling_elements)
1399         .pooling_tile(4, 3)
1400         .channels(16)
1401         .qmin(std::numeric_limits<int8_t>::min())
1402         .qmax(std::numeric_limits<int8_t>::max())
1403         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1404     }
1405   }
1406 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_twopass_subtile_with_input_offset)1407   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_twopass_subtile_with_input_offset) {
1408     TEST_REQUIRES_ARM_NEON;
1409     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1410       MaxPoolMicrokernelTester()
1411         .pooling_elements(pooling_elements)
1412         .pooling_tile(4, 3)
1413         .channels(16)
1414         .input_offset(19)
1415         .qmin(std::numeric_limits<int8_t>::min())
1416         .qmax(std::numeric_limits<int8_t>::max())
1417         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1418     }
1419   }
1420 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_fulltile)1421   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_fulltile) {
1422     TEST_REQUIRES_ARM_NEON;
1423     for (size_t channels = 32; channels < 128; channels += 16) {
1424       MaxPoolMicrokernelTester()
1425         .pooling_elements(7)
1426         .pooling_tile(4, 3)
1427         .channels(channels)
1428         .qmin(std::numeric_limits<int8_t>::min())
1429         .qmax(std::numeric_limits<int8_t>::max())
1430         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1431     }
1432   }
1433 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_fulltile_with_input_offset)1434   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_fulltile_with_input_offset) {
1435     TEST_REQUIRES_ARM_NEON;
1436     for (size_t channels = 32; channels < 128; channels += 16) {
1437       MaxPoolMicrokernelTester()
1438         .pooling_elements(7)
1439         .pooling_tile(4, 3)
1440         .channels(channels)
1441         .input_offset(83)
1442         .qmin(std::numeric_limits<int8_t>::min())
1443         .qmax(std::numeric_limits<int8_t>::max())
1444         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1445     }
1446   }
1447 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_fulltile_with_qmin)1448   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_fulltile_with_qmin) {
1449     TEST_REQUIRES_ARM_NEON;
1450     for (size_t channels = 32; channels < 128; channels += 16) {
1451       MaxPoolMicrokernelTester()
1452         .pooling_elements(7)
1453         .pooling_tile(4, 3)
1454         .channels(channels)
1455         .qmin(-64)
1456         .qmax(std::numeric_limits<int8_t>::max())
1457         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1458     }
1459   }
1460 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_fulltile_with_qmax)1461   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_fulltile_with_qmax) {
1462     TEST_REQUIRES_ARM_NEON;
1463     for (size_t channels = 32; channels < 128; channels += 16) {
1464       MaxPoolMicrokernelTester()
1465         .pooling_elements(7)
1466         .pooling_tile(4, 3)
1467         .channels(channels)
1468         .qmin(std::numeric_limits<int8_t>::min())
1469         .qmax(64)
1470         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1471     }
1472   }
1473 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_subtile)1474   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_subtile) {
1475     TEST_REQUIRES_ARM_NEON;
1476     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1477       for (size_t channels = 32; channels < 128; channels += 16) {
1478         MaxPoolMicrokernelTester()
1479           .pooling_elements(pooling_elements)
1480           .pooling_tile(4, 3)
1481           .channels(channels)
1482           .qmin(std::numeric_limits<int8_t>::min())
1483           .qmax(std::numeric_limits<int8_t>::max())
1484           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1485       }
1486     }
1487   }
1488 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_twopass_subtile_with_input_offset)1489   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_twopass_subtile_with_input_offset) {
1490     TEST_REQUIRES_ARM_NEON;
1491     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1492       for (size_t channels = 32; channels < 128; channels += 16) {
1493         MaxPoolMicrokernelTester()
1494           .pooling_elements(pooling_elements)
1495           .pooling_tile(4, 3)
1496           .channels(channels)
1497           .input_offset(131)
1498           .qmin(std::numeric_limits<int8_t>::min())
1499           .qmax(std::numeric_limits<int8_t>::max())
1500           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1501       }
1502     }
1503   }
1504 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_fulltile)1505   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_fulltile) {
1506     TEST_REQUIRES_ARM_NEON;
1507     for (size_t channels = 1; channels < 16; channels++) {
1508       MaxPoolMicrokernelTester()
1509         .pooling_elements(7)
1510         .pooling_tile(4, 3)
1511         .channels(channels)
1512         .qmin(std::numeric_limits<int8_t>::min())
1513         .qmax(std::numeric_limits<int8_t>::max())
1514         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1515     }
1516   }
1517 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_fulltile_with_input_offset)1518   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
1519     TEST_REQUIRES_ARM_NEON;
1520     for (size_t channels = 1; channels < 16; channels++) {
1521       MaxPoolMicrokernelTester()
1522         .pooling_elements(7)
1523         .pooling_tile(4, 3)
1524         .channels(channels)
1525         .input_offset(17)
1526         .qmin(std::numeric_limits<int8_t>::min())
1527         .qmax(std::numeric_limits<int8_t>::max())
1528         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1529     }
1530   }
1531 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmin)1532   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmin) {
1533     TEST_REQUIRES_ARM_NEON;
1534     for (size_t channels = 1; channels < 16; channels++) {
1535       MaxPoolMicrokernelTester()
1536         .pooling_elements(7)
1537         .pooling_tile(4, 3)
1538         .channels(channels)
1539         .qmin(-64)
1540         .qmax(std::numeric_limits<int8_t>::max())
1541         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1542     }
1543   }
1544 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmax)1545   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmax) {
1546     TEST_REQUIRES_ARM_NEON;
1547     for (size_t channels = 1; channels < 16; channels++) {
1548       MaxPoolMicrokernelTester()
1549         .pooling_elements(7)
1550         .pooling_tile(4, 3)
1551         .channels(channels)
1552         .qmin(std::numeric_limits<int8_t>::min())
1553         .qmax(64)
1554         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1555     }
1556   }
1557 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_subtile)1558   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_subtile) {
1559     TEST_REQUIRES_ARM_NEON;
1560     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1561       for (size_t channels = 1; channels < 16; channels++) {
1562         MaxPoolMicrokernelTester()
1563           .pooling_elements(pooling_elements)
1564           .pooling_tile(4, 3)
1565           .channels(channels)
1566           .qmin(std::numeric_limits<int8_t>::min())
1567           .qmax(std::numeric_limits<int8_t>::max())
1568           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1569       }
1570     }
1571   }
1572 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_twopass_subtile_with_input_offset)1573   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_twopass_subtile_with_input_offset) {
1574     TEST_REQUIRES_ARM_NEON;
1575     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1576       for (size_t channels = 1; channels < 16; channels++) {
1577         MaxPoolMicrokernelTester()
1578           .pooling_elements(pooling_elements)
1579           .pooling_tile(4, 3)
1580           .channels(channels)
1581           .input_offset(17)
1582           .qmin(std::numeric_limits<int8_t>::min())
1583           .qmax(std::numeric_limits<int8_t>::max())
1584           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1585       }
1586     }
1587   }
1588 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_fulltile)1589   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_fulltile) {
1590     TEST_REQUIRES_ARM_NEON;
1591     for (size_t channels = 17; channels < 32; channels++) {
1592       MaxPoolMicrokernelTester()
1593         .pooling_elements(7)
1594         .pooling_tile(4, 3)
1595         .channels(channels)
1596         .qmin(std::numeric_limits<int8_t>::min())
1597         .qmax(std::numeric_limits<int8_t>::max())
1598         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1599     }
1600   }
1601 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_fulltile_with_input_offset)1602   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
1603     TEST_REQUIRES_ARM_NEON;
1604     for (size_t channels = 17; channels < 32; channels++) {
1605       MaxPoolMicrokernelTester()
1606         .pooling_elements(7)
1607         .pooling_tile(4, 3)
1608         .channels(channels)
1609         .input_offset(37)
1610         .qmin(std::numeric_limits<int8_t>::min())
1611         .qmax(std::numeric_limits<int8_t>::max())
1612         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1613     }
1614   }
1615 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmin)1616   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmin) {
1617     TEST_REQUIRES_ARM_NEON;
1618     for (size_t channels = 17; channels < 32; channels++) {
1619       MaxPoolMicrokernelTester()
1620         .pooling_elements(7)
1621         .pooling_tile(4, 3)
1622         .channels(channels)
1623         .qmin(-64)
1624         .qmax(std::numeric_limits<int8_t>::max())
1625         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1626     }
1627   }
1628 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmax)1629   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmax) {
1630     TEST_REQUIRES_ARM_NEON;
1631     for (size_t channels = 17; channels < 32; channels++) {
1632       MaxPoolMicrokernelTester()
1633         .pooling_elements(7)
1634         .pooling_tile(4, 3)
1635         .channels(channels)
1636         .qmin(std::numeric_limits<int8_t>::min())
1637         .qmax(64)
1638         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1639     }
1640   }
1641 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_subtile)1642   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_subtile) {
1643     TEST_REQUIRES_ARM_NEON;
1644     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1645       for (size_t channels = 17; channels < 32; channels++) {
1646         MaxPoolMicrokernelTester()
1647           .pooling_elements(pooling_elements)
1648           .pooling_tile(4, 3)
1649           .channels(channels)
1650           .qmin(std::numeric_limits<int8_t>::min())
1651           .qmax(std::numeric_limits<int8_t>::max())
1652           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1653       }
1654     }
1655   }
1656 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_twopass_subtile_with_input_offset)1657   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_twopass_subtile_with_input_offset) {
1658     TEST_REQUIRES_ARM_NEON;
1659     for (size_t pooling_elements = 5; pooling_elements < 7; pooling_elements++) {
1660       for (size_t channels = 17; channels < 32; channels++) {
1661         MaxPoolMicrokernelTester()
1662           .pooling_elements(pooling_elements)
1663           .pooling_tile(4, 3)
1664           .channels(channels)
1665           .input_offset(37)
1666           .qmin(std::numeric_limits<int8_t>::min())
1667           .qmax(std::numeric_limits<int8_t>::max())
1668           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1669       }
1670     }
1671   }
1672 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_multipass)1673   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_multipass) {
1674     TEST_REQUIRES_ARM_NEON;
1675     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1676       MaxPoolMicrokernelTester()
1677         .pooling_elements(pooling_elements)
1678         .pooling_tile(4, 3)
1679         .channels(16)
1680         .qmin(std::numeric_limits<int8_t>::min())
1681         .qmax(std::numeric_limits<int8_t>::max())
1682         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1683     }
1684   }
1685 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_multipass_with_input_offset)1686   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_multipass_with_input_offset) {
1687     TEST_REQUIRES_ARM_NEON;
1688     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1689       MaxPoolMicrokernelTester()
1690         .pooling_elements(pooling_elements)
1691         .pooling_tile(4, 3)
1692         .channels(16)
1693         .input_offset(19)
1694         .qmin(std::numeric_limits<int8_t>::min())
1695         .qmax(std::numeric_limits<int8_t>::max())
1696         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1697     }
1698   }
1699 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_multipass_with_qmin)1700   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_multipass_with_qmin) {
1701     TEST_REQUIRES_ARM_NEON;
1702     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1703       MaxPoolMicrokernelTester()
1704         .pooling_elements(pooling_elements)
1705         .pooling_tile(4, 3)
1706         .channels(16)
1707         .qmin(-64)
1708         .qmax(std::numeric_limits<int8_t>::max())
1709         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1710     }
1711   }
1712 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_eq_16_multipass_with_qmax)1713   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_eq_16_multipass_with_qmax) {
1714     TEST_REQUIRES_ARM_NEON;
1715     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1716       MaxPoolMicrokernelTester()
1717         .pooling_elements(pooling_elements)
1718         .pooling_tile(4, 3)
1719         .channels(16)
1720         .qmin(std::numeric_limits<int8_t>::min())
1721         .qmax(64)
1722         .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1723     }
1724   }
1725 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_multipass)1726   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_multipass) {
1727     TEST_REQUIRES_ARM_NEON;
1728     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1729       for (size_t channels = 32; channels < 128; channels += 16) {
1730         MaxPoolMicrokernelTester()
1731           .pooling_elements(pooling_elements)
1732           .pooling_tile(4, 3)
1733           .channels(channels)
1734           .qmin(std::numeric_limits<int8_t>::min())
1735           .qmax(std::numeric_limits<int8_t>::max())
1736           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1737       }
1738     }
1739   }
1740 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_multipass_with_input_offset)1741   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_multipass_with_input_offset) {
1742     TEST_REQUIRES_ARM_NEON;
1743     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1744       for (size_t channels = 32; channels < 128; channels += 16) {
1745         MaxPoolMicrokernelTester()
1746           .pooling_elements(pooling_elements)
1747           .pooling_tile(4, 3)
1748           .channels(channels)
1749           .input_offset(131)
1750           .qmin(std::numeric_limits<int8_t>::min())
1751           .qmax(std::numeric_limits<int8_t>::max())
1752           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1753       }
1754     }
1755   }
1756 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_multipass_with_qmin)1757   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_multipass_with_qmin) {
1758     TEST_REQUIRES_ARM_NEON;
1759     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1760       for (size_t channels = 32; channels < 128; channels += 16) {
1761         MaxPoolMicrokernelTester()
1762           .pooling_elements(pooling_elements)
1763           .pooling_tile(4, 3)
1764           .channels(channels)
1765           .qmin(-64)
1766           .qmax(std::numeric_limits<int8_t>::max())
1767           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1768       }
1769     }
1770   }
1771 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_div_16_multipass_with_qmax)1772   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_div_16_multipass_with_qmax) {
1773     TEST_REQUIRES_ARM_NEON;
1774     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1775       for (size_t channels = 32; channels < 128; channels += 16) {
1776         MaxPoolMicrokernelTester()
1777           .pooling_elements(pooling_elements)
1778           .pooling_tile(4, 3)
1779           .channels(channels)
1780           .qmin(std::numeric_limits<int8_t>::min())
1781           .qmax(64)
1782           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1783       }
1784     }
1785   }
1786 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_multipass)1787   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_multipass) {
1788     TEST_REQUIRES_ARM_NEON;
1789     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1790       for (size_t channels = 1; channels < 16; channels++) {
1791         MaxPoolMicrokernelTester()
1792           .pooling_elements(pooling_elements)
1793           .pooling_tile(4, 3)
1794           .channels(channels)
1795           .qmin(std::numeric_limits<int8_t>::min())
1796           .qmax(std::numeric_limits<int8_t>::max())
1797           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1798       }
1799     }
1800   }
1801 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_multipass_with_input_offset)1802   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_multipass_with_input_offset) {
1803     TEST_REQUIRES_ARM_NEON;
1804     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1805       for (size_t channels = 1; channels < 16; channels++) {
1806         MaxPoolMicrokernelTester()
1807           .pooling_elements(pooling_elements)
1808           .pooling_tile(4, 3)
1809           .channels(channels)
1810           .input_offset(16)
1811           .qmin(std::numeric_limits<int8_t>::min())
1812           .qmax(std::numeric_limits<int8_t>::max())
1813           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1814       }
1815     }
1816   }
1817 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_multipass_with_qmin)1818   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_multipass_with_qmin) {
1819     TEST_REQUIRES_ARM_NEON;
1820     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1821       for (size_t channels = 1; channels < 16; channels++) {
1822         MaxPoolMicrokernelTester()
1823           .pooling_elements(pooling_elements)
1824           .pooling_tile(4, 3)
1825           .channels(channels)
1826           .qmin(-64)
1827           .qmax(std::numeric_limits<int8_t>::max())
1828           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1829       }
1830     }
1831   }
1832 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_lt_16_multipass_with_qmax)1833   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_lt_16_multipass_with_qmax) {
1834     TEST_REQUIRES_ARM_NEON;
1835     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1836       for (size_t channels = 1; channels < 16; channels++) {
1837         MaxPoolMicrokernelTester()
1838           .pooling_elements(pooling_elements)
1839           .pooling_tile(4, 3)
1840           .channels(channels)
1841           .qmin(std::numeric_limits<int8_t>::min())
1842           .qmax(64)
1843           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1844       }
1845     }
1846   }
1847 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_multipass)1848   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_multipass) {
1849     TEST_REQUIRES_ARM_NEON;
1850     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1851       for (size_t channels = 17; channels < 32; channels++) {
1852         MaxPoolMicrokernelTester()
1853           .pooling_elements(pooling_elements)
1854           .pooling_tile(4, 3)
1855           .channels(channels)
1856           .qmin(std::numeric_limits<int8_t>::min())
1857           .qmax(std::numeric_limits<int8_t>::max())
1858           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1859       }
1860     }
1861   }
1862 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_multipass_with_input_offset)1863   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_multipass_with_input_offset) {
1864     TEST_REQUIRES_ARM_NEON;
1865     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1866       for (size_t channels = 17; channels < 32; channels++) {
1867         MaxPoolMicrokernelTester()
1868           .pooling_elements(pooling_elements)
1869           .pooling_tile(4, 3)
1870           .channels(channels)
1871           .input_offset(37)
1872           .qmin(std::numeric_limits<int8_t>::min())
1873           .qmax(std::numeric_limits<int8_t>::max())
1874           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1875       }
1876     }
1877   }
1878 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_multipass_with_qmin)1879   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_multipass_with_qmin) {
1880     TEST_REQUIRES_ARM_NEON;
1881     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1882       for (size_t channels = 17; channels < 32; channels++) {
1883         MaxPoolMicrokernelTester()
1884           .pooling_elements(pooling_elements)
1885           .pooling_tile(4, 3)
1886           .channels(channels)
1887           .qmin(-64)
1888           .qmax(std::numeric_limits<int8_t>::max())
1889           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1890       }
1891     }
1892   }
1893 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,channels_gt_16_multipass_with_qmax)1894   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, channels_gt_16_multipass_with_qmax) {
1895     TEST_REQUIRES_ARM_NEON;
1896     for (size_t pooling_elements = 8; pooling_elements <= 13; pooling_elements += 3) {
1897       for (size_t channels = 17; channels < 32; channels++) {
1898         MaxPoolMicrokernelTester()
1899           .pooling_elements(pooling_elements)
1900           .pooling_tile(4, 3)
1901           .channels(channels)
1902           .qmin(std::numeric_limits<int8_t>::min())
1903           .qmax(64)
1904           .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1905       }
1906     }
1907   }
1908 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels)1909   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels) {
1910     TEST_REQUIRES_ARM_NEON;
1911     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1912       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
1918             .channels(channels)
1919             .qmin(std::numeric_limits<int8_t>::min())
1920             .qmax(std::numeric_limits<int8_t>::max())
1921             .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1922         }
1923       }
1924     }
1925   }
1926 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels_with_input_offset)1927   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels_with_input_offset) {
1928     TEST_REQUIRES_ARM_NEON;
1929     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1930       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
1936             .channels(channels)
1937             .input_offset(83)
1938             .qmin(std::numeric_limits<int8_t>::min())
1939             .qmax(std::numeric_limits<int8_t>::max())
1940             .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1941         }
1942       }
1943     }
1944   }
1945 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels_with_qmin)1946   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels_with_qmin) {
1947     TEST_REQUIRES_ARM_NEON;
1948     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1949       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
1955             .channels(channels)
1956             .qmin(-64)
1957             .qmax(std::numeric_limits<int8_t>::max())
1958             .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1959         }
1960       }
1961     }
1962   }
1963 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels_with_qmax)1964   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels_with_qmax) {
1965     TEST_REQUIRES_ARM_NEON;
1966     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1967       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
1973             .channels(channels)
1974             .qmin(std::numeric_limits<int8_t>::min())
1975             .qmax(64)
1976             .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1977         }
1978       }
1979     }
1980   }
1981 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels_with_output_stride)1982   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels_with_output_stride) {
1983     TEST_REQUIRES_ARM_NEON;
1984     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1985       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
1991             .channels(channels)
1992             .output_stride(83)
1993             .qmin(std::numeric_limits<int8_t>::min())
1994             .qmax(std::numeric_limits<int8_t>::max())
1995             .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
1996         }
1997       }
1998     }
1999   }
2000 
TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16,few_output_pixels_with_step)2001   TEST(S8_MAXPOOL_MINMAX_4P3X__NEON_C16, few_output_pixels_with_step) {
2002     TEST_REQUIRES_ARM_NEON;
2003     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2004       for (size_t pooling_elements : std::vector<size_t>{{2, 4, 6}}) {
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(4, 3)
2011               .step(step)
2012               .channels(channels)
2013               .output_stride(83)
2014               .qmin(std::numeric_limits<int8_t>::min())
2015               .qmax(std::numeric_limits<int8_t>::max())
2016               .Test(xnn_s8_maxpool_minmax_ukernel_4p3x__neon_c16, xnn_init_s8_minmax_neon_params);
2017           }
2018         }
2019       }
2020     }
2021   }
2022 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
2023 
2024 
2025 #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile)2026   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile) {
2027     TEST_REQUIRES_ARM_NEON;
2028     MaxPoolMicrokernelTester()
2029       .pooling_elements(9)
2030       .pooling_tile(9, 8)
2031       .channels(16)
2032       .qmin(std::numeric_limits<int8_t>::min())
2033       .qmax(std::numeric_limits<int8_t>::max())
2034       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2035   }
2036 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_input_offset)2037   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
2038     TEST_REQUIRES_ARM_NEON;
2039     MaxPoolMicrokernelTester()
2040       .pooling_elements(9)
2041       .pooling_tile(9, 8)
2042       .channels(16)
2043       .input_offset(19)
2044       .qmin(std::numeric_limits<int8_t>::min())
2045       .qmax(std::numeric_limits<int8_t>::max())
2046       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2047   }
2048 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmin)2049   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmin) {
2050     TEST_REQUIRES_ARM_NEON;
2051     MaxPoolMicrokernelTester()
2052       .pooling_elements(9)
2053       .pooling_tile(9, 8)
2054       .channels(16)
2055       .qmin(-64)
2056       .qmax(std::numeric_limits<int8_t>::max())
2057       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2058   }
2059 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_fulltile_with_qmax)2060   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_fulltile_with_qmax) {
2061     TEST_REQUIRES_ARM_NEON;
2062     MaxPoolMicrokernelTester()
2063       .pooling_elements(9)
2064       .pooling_tile(9, 8)
2065       .channels(16)
2066       .qmin(std::numeric_limits<int8_t>::min())
2067       .qmax(64)
2068       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2069   }
2070 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_subtile)2071   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_subtile) {
2072     TEST_REQUIRES_ARM_NEON;
2073     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2074       MaxPoolMicrokernelTester()
2075         .pooling_elements(pooling_elements)
2076         .pooling_tile(9, 8)
2077         .channels(16)
2078         .qmin(std::numeric_limits<int8_t>::min())
2079         .qmax(std::numeric_limits<int8_t>::max())
2080         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2081     }
2082   }
2083 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_unipass_subtile_with_input_offset)2084   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_unipass_subtile_with_input_offset) {
2085     TEST_REQUIRES_ARM_NEON;
2086     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2087       MaxPoolMicrokernelTester()
2088         .pooling_elements(pooling_elements)
2089         .pooling_tile(9, 8)
2090         .channels(16)
2091         .input_offset(19)
2092         .qmin(std::numeric_limits<int8_t>::min())
2093         .qmax(std::numeric_limits<int8_t>::max())
2094         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2095     }
2096   }
2097 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile)2098   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile) {
2099     TEST_REQUIRES_ARM_NEON;
2100     for (size_t channels = 32; channels < 128; channels += 16) {
2101       MaxPoolMicrokernelTester()
2102         .pooling_elements(9)
2103         .pooling_tile(9, 8)
2104         .channels(channels)
2105         .qmin(std::numeric_limits<int8_t>::min())
2106         .qmax(std::numeric_limits<int8_t>::max())
2107         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2108     }
2109   }
2110 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_input_offset)2111   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_input_offset) {
2112     TEST_REQUIRES_ARM_NEON;
2113     for (size_t channels = 32; channels < 128; channels += 16) {
2114       MaxPoolMicrokernelTester()
2115         .pooling_elements(9)
2116         .pooling_tile(9, 8)
2117         .channels(channels)
2118         .input_offset(131)
2119         .qmin(std::numeric_limits<int8_t>::min())
2120         .qmax(std::numeric_limits<int8_t>::max())
2121         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2122     }
2123   }
2124 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_qmin)2125   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_qmin) {
2126     TEST_REQUIRES_ARM_NEON;
2127     for (size_t channels = 32; channels < 128; channels += 16) {
2128       MaxPoolMicrokernelTester()
2129         .pooling_elements(9)
2130         .pooling_tile(9, 8)
2131         .channels(channels)
2132         .qmin(-64)
2133         .qmax(std::numeric_limits<int8_t>::max())
2134         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2135     }
2136   }
2137 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_fulltile_with_qmax)2138   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_fulltile_with_qmax) {
2139     TEST_REQUIRES_ARM_NEON;
2140     for (size_t channels = 32; channels < 128; channels += 16) {
2141       MaxPoolMicrokernelTester()
2142         .pooling_elements(9)
2143         .pooling_tile(9, 8)
2144         .channels(channels)
2145         .qmin(std::numeric_limits<int8_t>::min())
2146         .qmax(64)
2147         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2148     }
2149   }
2150 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_subtile)2151   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_subtile) {
2152     TEST_REQUIRES_ARM_NEON;
2153     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2154       for (size_t channels = 32; channels < 128; channels += 16) {
2155         MaxPoolMicrokernelTester()
2156           .pooling_elements(pooling_elements)
2157           .pooling_tile(9, 8)
2158           .channels(channels)
2159           .qmin(std::numeric_limits<int8_t>::min())
2160           .qmax(std::numeric_limits<int8_t>::max())
2161           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2162       }
2163     }
2164   }
2165 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_unipass_subtile_with_input_offset)2166   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_unipass_subtile_with_input_offset) {
2167     TEST_REQUIRES_ARM_NEON;
2168     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2169       for (size_t channels = 32; channels < 128; channels += 16) {
2170         MaxPoolMicrokernelTester()
2171           .pooling_elements(pooling_elements)
2172           .pooling_tile(9, 8)
2173           .channels(channels)
2174           .input_offset(131)
2175           .qmin(std::numeric_limits<int8_t>::min())
2176           .qmax(std::numeric_limits<int8_t>::max())
2177           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2178       }
2179     }
2180   }
2181 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile)2182   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile) {
2183     TEST_REQUIRES_ARM_NEON;
2184     for (size_t channels = 1; channels < 16; channels++) {
2185       MaxPoolMicrokernelTester()
2186         .pooling_elements(9)
2187         .pooling_tile(9, 8)
2188         .channels(channels)
2189         .qmin(std::numeric_limits<int8_t>::min())
2190         .qmax(std::numeric_limits<int8_t>::max())
2191         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2192     }
2193   }
2194 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_input_offset)2195   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
2196     TEST_REQUIRES_ARM_NEON;
2197     for (size_t channels = 1; channels < 16; channels++) {
2198       MaxPoolMicrokernelTester()
2199         .pooling_elements(9)
2200         .pooling_tile(9, 8)
2201         .channels(channels)
2202         .input_offset(17)
2203         .qmin(std::numeric_limits<int8_t>::min())
2204         .qmax(std::numeric_limits<int8_t>::max())
2205         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2206     }
2207   }
2208 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmin)2209   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmin) {
2210     TEST_REQUIRES_ARM_NEON;
2211     for (size_t channels = 1; channels < 16; channels++) {
2212       MaxPoolMicrokernelTester()
2213         .pooling_elements(9)
2214         .pooling_tile(9, 8)
2215         .channels(channels)
2216         .qmin(-64)
2217         .qmax(std::numeric_limits<int8_t>::max())
2218         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2219     }
2220   }
2221 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_fulltile_with_qmax)2222   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_fulltile_with_qmax) {
2223     TEST_REQUIRES_ARM_NEON;
2224     for (size_t channels = 1; channels < 16; channels++) {
2225       MaxPoolMicrokernelTester()
2226         .pooling_elements(9)
2227         .pooling_tile(9, 8)
2228         .channels(channels)
2229         .qmin(std::numeric_limits<int8_t>::min())
2230         .qmax(64)
2231         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2232     }
2233   }
2234 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_subtile)2235   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_subtile) {
2236     TEST_REQUIRES_ARM_NEON;
2237     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2238       for (size_t channels = 1; channels < 16; channels++) {
2239         MaxPoolMicrokernelTester()
2240           .pooling_elements(pooling_elements)
2241           .pooling_tile(9, 8)
2242           .channels(channels)
2243           .qmin(std::numeric_limits<int8_t>::min())
2244           .qmax(std::numeric_limits<int8_t>::max())
2245           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2246       }
2247     }
2248   }
2249 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_unipass_subtile_with_input_offset)2250   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_unipass_subtile_with_input_offset) {
2251     TEST_REQUIRES_ARM_NEON;
2252     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2253       for (size_t channels = 1; channels < 16; channels++) {
2254         MaxPoolMicrokernelTester()
2255           .pooling_elements(pooling_elements)
2256           .pooling_tile(9, 8)
2257           .channels(channels)
2258           .input_offset(17)
2259           .qmin(std::numeric_limits<int8_t>::min())
2260           .qmax(std::numeric_limits<int8_t>::max())
2261           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2262       }
2263     }
2264   }
2265 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile)2266   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile) {
2267     TEST_REQUIRES_ARM_NEON;
2268     for (size_t channels = 17; channels < 32; channels++) {
2269       MaxPoolMicrokernelTester()
2270         .pooling_elements(9)
2271         .pooling_tile(9, 8)
2272         .channels(channels)
2273         .qmin(std::numeric_limits<int8_t>::min())
2274         .qmax(std::numeric_limits<int8_t>::max())
2275         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2276     }
2277   }
2278 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_input_offset)2279   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
2280     TEST_REQUIRES_ARM_NEON;
2281     for (size_t channels = 17; channels < 32; channels++) {
2282       MaxPoolMicrokernelTester()
2283         .pooling_elements(9)
2284         .pooling_tile(9, 8)
2285         .channels(channels)
2286         .input_offset(37)
2287         .qmin(std::numeric_limits<int8_t>::min())
2288         .qmax(std::numeric_limits<int8_t>::max())
2289         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2290     }
2291   }
2292 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmin)2293   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmin) {
2294     TEST_REQUIRES_ARM_NEON;
2295     for (size_t channels = 17; channels < 32; channels++) {
2296       MaxPoolMicrokernelTester()
2297         .pooling_elements(9)
2298         .pooling_tile(9, 8)
2299         .channels(channels)
2300         .qmin(-64)
2301         .qmax(std::numeric_limits<int8_t>::max())
2302         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2303     }
2304   }
2305 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_fulltile_with_qmax)2306   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_fulltile_with_qmax) {
2307     TEST_REQUIRES_ARM_NEON;
2308     for (size_t channels = 17; channels < 32; channels++) {
2309       MaxPoolMicrokernelTester()
2310         .pooling_elements(9)
2311         .pooling_tile(9, 8)
2312         .channels(channels)
2313         .qmin(std::numeric_limits<int8_t>::min())
2314         .qmax(64)
2315         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2316     }
2317   }
2318 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_subtile)2319   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_subtile) {
2320     TEST_REQUIRES_ARM_NEON;
2321     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2322       for (size_t channels = 17; channels < 32; channels++) {
2323         MaxPoolMicrokernelTester()
2324           .pooling_elements(pooling_elements)
2325           .pooling_tile(9, 8)
2326           .channels(channels)
2327           .qmin(std::numeric_limits<int8_t>::min())
2328           .qmax(std::numeric_limits<int8_t>::max())
2329           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2330       }
2331     }
2332   }
2333 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_unipass_subtile_with_input_offset)2334   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_unipass_subtile_with_input_offset) {
2335     TEST_REQUIRES_ARM_NEON;
2336     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
2337       for (size_t channels = 17; channels < 32; channels++) {
2338         MaxPoolMicrokernelTester()
2339           .pooling_elements(pooling_elements)
2340           .pooling_tile(9, 8)
2341           .channels(channels)
2342           .input_offset(37)
2343           .qmin(std::numeric_limits<int8_t>::min())
2344           .qmax(std::numeric_limits<int8_t>::max())
2345           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2346       }
2347     }
2348   }
2349 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile)2350   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile) {
2351     TEST_REQUIRES_ARM_NEON;
2352     MaxPoolMicrokernelTester()
2353       .pooling_elements(17)
2354       .pooling_tile(9, 8)
2355       .channels(16)
2356       .qmin(std::numeric_limits<int8_t>::min())
2357       .qmax(std::numeric_limits<int8_t>::max())
2358       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2359   }
2360 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_input_offset)2361   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
2362     TEST_REQUIRES_ARM_NEON;
2363     MaxPoolMicrokernelTester()
2364       .pooling_elements(17)
2365       .pooling_tile(9, 8)
2366       .channels(16)
2367       .input_offset(19)
2368       .qmin(std::numeric_limits<int8_t>::min())
2369       .qmax(std::numeric_limits<int8_t>::max())
2370       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2371   }
2372 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmin)2373   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmin) {
2374     TEST_REQUIRES_ARM_NEON;
2375     MaxPoolMicrokernelTester()
2376       .pooling_elements(17)
2377       .pooling_tile(9, 8)
2378       .channels(16)
2379       .qmin(-64)
2380       .qmax(std::numeric_limits<int8_t>::max())
2381       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2382   }
2383 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_fulltile_with_qmax)2384   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_fulltile_with_qmax) {
2385     TEST_REQUIRES_ARM_NEON;
2386     MaxPoolMicrokernelTester()
2387       .pooling_elements(17)
2388       .pooling_tile(9, 8)
2389       .channels(16)
2390       .qmin(std::numeric_limits<int8_t>::min())
2391       .qmax(64)
2392       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2393   }
2394 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_subtile)2395   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_subtile) {
2396     TEST_REQUIRES_ARM_NEON;
2397     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2398       MaxPoolMicrokernelTester()
2399         .pooling_elements(pooling_elements)
2400         .pooling_tile(9, 8)
2401         .channels(16)
2402         .qmin(std::numeric_limits<int8_t>::min())
2403         .qmax(std::numeric_limits<int8_t>::max())
2404         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2405     }
2406   }
2407 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_twopass_subtile_with_input_offset)2408   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_twopass_subtile_with_input_offset) {
2409     TEST_REQUIRES_ARM_NEON;
2410     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2411       MaxPoolMicrokernelTester()
2412         .pooling_elements(pooling_elements)
2413         .pooling_tile(9, 8)
2414         .channels(16)
2415         .input_offset(19)
2416         .qmin(std::numeric_limits<int8_t>::min())
2417         .qmax(std::numeric_limits<int8_t>::max())
2418         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2419     }
2420   }
2421 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile)2422   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile) {
2423     TEST_REQUIRES_ARM_NEON;
2424     for (size_t channels = 32; channels < 128; channels += 16) {
2425       MaxPoolMicrokernelTester()
2426         .pooling_elements(17)
2427         .pooling_tile(9, 8)
2428         .channels(channels)
2429         .qmin(std::numeric_limits<int8_t>::min())
2430         .qmax(std::numeric_limits<int8_t>::max())
2431         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2432     }
2433   }
2434 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_input_offset)2435   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_input_offset) {
2436     TEST_REQUIRES_ARM_NEON;
2437     for (size_t channels = 32; channels < 128; channels += 16) {
2438       MaxPoolMicrokernelTester()
2439         .pooling_elements(17)
2440         .pooling_tile(9, 8)
2441         .channels(channels)
2442         .input_offset(83)
2443         .qmin(std::numeric_limits<int8_t>::min())
2444         .qmax(std::numeric_limits<int8_t>::max())
2445         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2446     }
2447   }
2448 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_qmin)2449   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_qmin) {
2450     TEST_REQUIRES_ARM_NEON;
2451     for (size_t channels = 32; channels < 128; channels += 16) {
2452       MaxPoolMicrokernelTester()
2453         .pooling_elements(17)
2454         .pooling_tile(9, 8)
2455         .channels(channels)
2456         .qmin(-64)
2457         .qmax(std::numeric_limits<int8_t>::max())
2458         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2459     }
2460   }
2461 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_fulltile_with_qmax)2462   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_fulltile_with_qmax) {
2463     TEST_REQUIRES_ARM_NEON;
2464     for (size_t channels = 32; channels < 128; channels += 16) {
2465       MaxPoolMicrokernelTester()
2466         .pooling_elements(17)
2467         .pooling_tile(9, 8)
2468         .channels(channels)
2469         .qmin(std::numeric_limits<int8_t>::min())
2470         .qmax(64)
2471         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2472     }
2473   }
2474 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_subtile)2475   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_subtile) {
2476     TEST_REQUIRES_ARM_NEON;
2477     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2478       for (size_t channels = 32; channels < 128; channels += 16) {
2479         MaxPoolMicrokernelTester()
2480           .pooling_elements(pooling_elements)
2481           .pooling_tile(9, 8)
2482           .channels(channels)
2483           .qmin(std::numeric_limits<int8_t>::min())
2484           .qmax(std::numeric_limits<int8_t>::max())
2485           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2486       }
2487     }
2488   }
2489 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_twopass_subtile_with_input_offset)2490   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_twopass_subtile_with_input_offset) {
2491     TEST_REQUIRES_ARM_NEON;
2492     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2493       for (size_t channels = 32; channels < 128; channels += 16) {
2494         MaxPoolMicrokernelTester()
2495           .pooling_elements(pooling_elements)
2496           .pooling_tile(9, 8)
2497           .channels(channels)
2498           .input_offset(131)
2499           .qmin(std::numeric_limits<int8_t>::min())
2500           .qmax(std::numeric_limits<int8_t>::max())
2501           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2502       }
2503     }
2504   }
2505 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile)2506   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile) {
2507     TEST_REQUIRES_ARM_NEON;
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<int8_t>::min())
2514         .qmax(std::numeric_limits<int8_t>::max())
2515         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2516     }
2517   }
2518 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_input_offset)2519   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
2520     TEST_REQUIRES_ARM_NEON;
2521     for (size_t channels = 1; channels < 16; channels++) {
2522       MaxPoolMicrokernelTester()
2523         .pooling_elements(17)
2524         .pooling_tile(9, 8)
2525         .channels(channels)
2526         .input_offset(17)
2527         .qmin(std::numeric_limits<int8_t>::min())
2528         .qmax(std::numeric_limits<int8_t>::max())
2529         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2530     }
2531   }
2532 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmin)2533   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmin) {
2534     TEST_REQUIRES_ARM_NEON;
2535     for (size_t channels = 1; channels < 16; channels++) {
2536       MaxPoolMicrokernelTester()
2537         .pooling_elements(17)
2538         .pooling_tile(9, 8)
2539         .channels(channels)
2540         .qmin(-64)
2541         .qmax(std::numeric_limits<int8_t>::max())
2542         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2543     }
2544   }
2545 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_fulltile_with_qmax)2546   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_fulltile_with_qmax) {
2547     TEST_REQUIRES_ARM_NEON;
2548     for (size_t channels = 1; channels < 16; channels++) {
2549       MaxPoolMicrokernelTester()
2550         .pooling_elements(17)
2551         .pooling_tile(9, 8)
2552         .channels(channels)
2553         .qmin(std::numeric_limits<int8_t>::min())
2554         .qmax(64)
2555         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2556     }
2557   }
2558 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_subtile)2559   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_subtile) {
2560     TEST_REQUIRES_ARM_NEON;
2561     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2562       for (size_t channels = 1; channels < 16; channels++) {
2563         MaxPoolMicrokernelTester()
2564           .pooling_elements(pooling_elements)
2565           .pooling_tile(9, 8)
2566           .channels(channels)
2567           .qmin(std::numeric_limits<int8_t>::min())
2568           .qmax(std::numeric_limits<int8_t>::max())
2569           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2570       }
2571     }
2572   }
2573 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_twopass_subtile_with_input_offset)2574   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_twopass_subtile_with_input_offset) {
2575     TEST_REQUIRES_ARM_NEON;
2576     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2577       for (size_t channels = 1; channels < 16; channels++) {
2578         MaxPoolMicrokernelTester()
2579           .pooling_elements(pooling_elements)
2580           .pooling_tile(9, 8)
2581           .channels(channels)
2582           .input_offset(17)
2583           .qmin(std::numeric_limits<int8_t>::min())
2584           .qmax(std::numeric_limits<int8_t>::max())
2585           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2586       }
2587     }
2588   }
2589 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile)2590   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile) {
2591     TEST_REQUIRES_ARM_NEON;
2592     for (size_t channels = 17; channels < 32; channels++) {
2593       MaxPoolMicrokernelTester()
2594         .pooling_elements(17)
2595         .pooling_tile(9, 8)
2596         .channels(channels)
2597         .qmin(std::numeric_limits<int8_t>::min())
2598         .qmax(std::numeric_limits<int8_t>::max())
2599         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2600     }
2601   }
2602 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_input_offset)2603   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
2604     TEST_REQUIRES_ARM_NEON;
2605     for (size_t channels = 17; channels < 32; channels++) {
2606       MaxPoolMicrokernelTester()
2607         .pooling_elements(17)
2608         .pooling_tile(9, 8)
2609         .channels(channels)
2610         .input_offset(37)
2611         .qmin(std::numeric_limits<int8_t>::min())
2612         .qmax(std::numeric_limits<int8_t>::max())
2613         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2614     }
2615   }
2616 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmin)2617   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmin) {
2618     TEST_REQUIRES_ARM_NEON;
2619     for (size_t channels = 17; channels < 32; channels++) {
2620       MaxPoolMicrokernelTester()
2621         .pooling_elements(17)
2622         .pooling_tile(9, 8)
2623         .channels(channels)
2624         .qmin(-64)
2625         .qmax(std::numeric_limits<int8_t>::max())
2626         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2627     }
2628   }
2629 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_fulltile_with_qmax)2630   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_fulltile_with_qmax) {
2631     TEST_REQUIRES_ARM_NEON;
2632     for (size_t channels = 17; channels < 32; channels++) {
2633       MaxPoolMicrokernelTester()
2634         .pooling_elements(17)
2635         .pooling_tile(9, 8)
2636         .channels(channels)
2637         .qmin(std::numeric_limits<int8_t>::min())
2638         .qmax(64)
2639         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2640     }
2641   }
2642 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_subtile)2643   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_subtile) {
2644     TEST_REQUIRES_ARM_NEON;
2645     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2646       for (size_t channels = 17; channels < 32; channels++) {
2647         MaxPoolMicrokernelTester()
2648           .pooling_elements(pooling_elements)
2649           .pooling_tile(9, 8)
2650           .channels(channels)
2651           .qmin(std::numeric_limits<int8_t>::min())
2652           .qmax(std::numeric_limits<int8_t>::max())
2653           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2654       }
2655     }
2656   }
2657 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_twopass_subtile_with_input_offset)2658   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_twopass_subtile_with_input_offset) {
2659     TEST_REQUIRES_ARM_NEON;
2660     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
2661       for (size_t channels = 17; channels < 32; channels++) {
2662         MaxPoolMicrokernelTester()
2663           .pooling_elements(pooling_elements)
2664           .pooling_tile(9, 8)
2665           .channels(channels)
2666           .input_offset(37)
2667           .qmin(std::numeric_limits<int8_t>::min())
2668           .qmax(std::numeric_limits<int8_t>::max())
2669           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2670       }
2671     }
2672   }
2673 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass)2674   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass) {
2675     TEST_REQUIRES_ARM_NEON;
2676     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2677       MaxPoolMicrokernelTester()
2678         .pooling_elements(pooling_elements)
2679         .pooling_tile(9, 8)
2680         .channels(16)
2681         .qmin(std::numeric_limits<int8_t>::min())
2682         .qmax(std::numeric_limits<int8_t>::max())
2683         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2684     }
2685   }
2686 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_input_offset)2687   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_input_offset) {
2688     TEST_REQUIRES_ARM_NEON;
2689     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2690       MaxPoolMicrokernelTester()
2691         .pooling_elements(pooling_elements)
2692         .pooling_tile(9, 8)
2693         .channels(16)
2694         .input_offset(19)
2695         .qmin(std::numeric_limits<int8_t>::min())
2696         .qmax(std::numeric_limits<int8_t>::max())
2697         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2698     }
2699   }
2700 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_qmin)2701   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_qmin) {
2702     TEST_REQUIRES_ARM_NEON;
2703     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2704       MaxPoolMicrokernelTester()
2705         .pooling_elements(pooling_elements)
2706         .pooling_tile(9, 8)
2707         .channels(16)
2708         .qmin(-64)
2709         .qmax(std::numeric_limits<int8_t>::max())
2710         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2711     }
2712   }
2713 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_eq_16_multipass_with_qmax)2714   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_eq_16_multipass_with_qmax) {
2715     TEST_REQUIRES_ARM_NEON;
2716     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2717       MaxPoolMicrokernelTester()
2718         .pooling_elements(pooling_elements)
2719         .pooling_tile(9, 8)
2720         .channels(16)
2721         .qmin(std::numeric_limits<int8_t>::min())
2722         .qmax(64)
2723         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2724     }
2725   }
2726 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass)2727   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass) {
2728     TEST_REQUIRES_ARM_NEON;
2729     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2730       for (size_t channels = 32; channels < 128; channels += 16) {
2731         MaxPoolMicrokernelTester()
2732           .pooling_elements(pooling_elements)
2733           .pooling_tile(9, 8)
2734           .channels(channels)
2735           .qmin(std::numeric_limits<int8_t>::min())
2736           .qmax(std::numeric_limits<int8_t>::max())
2737           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2738       }
2739     }
2740   }
2741 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_input_offset)2742   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_input_offset) {
2743     TEST_REQUIRES_ARM_NEON;
2744     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2745       for (size_t channels = 32; channels < 128; channels += 16) {
2746         MaxPoolMicrokernelTester()
2747           .pooling_elements(pooling_elements)
2748           .pooling_tile(9, 8)
2749           .channels(channels)
2750           .input_offset(131)
2751           .qmin(std::numeric_limits<int8_t>::min())
2752           .qmax(std::numeric_limits<int8_t>::max())
2753           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2754       }
2755     }
2756   }
2757 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_qmin)2758   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_qmin) {
2759     TEST_REQUIRES_ARM_NEON;
2760     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2761       for (size_t channels = 32; channels < 128; channels += 16) {
2762         MaxPoolMicrokernelTester()
2763           .pooling_elements(pooling_elements)
2764           .pooling_tile(9, 8)
2765           .channels(channels)
2766           .qmin(-64)
2767           .qmax(std::numeric_limits<int8_t>::max())
2768           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2769       }
2770     }
2771   }
2772 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_div_16_multipass_with_qmax)2773   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_div_16_multipass_with_qmax) {
2774     TEST_REQUIRES_ARM_NEON;
2775     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2776       for (size_t channels = 32; channels < 128; channels += 16) {
2777         MaxPoolMicrokernelTester()
2778           .pooling_elements(pooling_elements)
2779           .pooling_tile(9, 8)
2780           .channels(channels)
2781           .qmin(std::numeric_limits<int8_t>::min())
2782           .qmax(64)
2783           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2784       }
2785     }
2786   }
2787 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass)2788   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass) {
2789     TEST_REQUIRES_ARM_NEON;
2790     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2791       for (size_t channels = 1; channels < 16; channels++) {
2792         MaxPoolMicrokernelTester()
2793           .pooling_elements(pooling_elements)
2794           .pooling_tile(9, 8)
2795           .channels(channels)
2796           .qmin(std::numeric_limits<int8_t>::min())
2797           .qmax(std::numeric_limits<int8_t>::max())
2798           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2799       }
2800     }
2801   }
2802 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_input_offset)2803   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_input_offset) {
2804     TEST_REQUIRES_ARM_NEON;
2805     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2806       for (size_t channels = 1; channels < 16; channels++) {
2807         MaxPoolMicrokernelTester()
2808           .pooling_elements(pooling_elements)
2809           .pooling_tile(9, 8)
2810           .channels(channels)
2811           .input_offset(16)
2812           .qmin(std::numeric_limits<int8_t>::min())
2813           .qmax(std::numeric_limits<int8_t>::max())
2814           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2815       }
2816     }
2817   }
2818 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_qmin)2819   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_qmin) {
2820     TEST_REQUIRES_ARM_NEON;
2821     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2822       for (size_t channels = 1; channels < 16; channels++) {
2823         MaxPoolMicrokernelTester()
2824           .pooling_elements(pooling_elements)
2825           .pooling_tile(9, 8)
2826           .channels(channels)
2827           .qmin(-64)
2828           .qmax(std::numeric_limits<int8_t>::max())
2829           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2830       }
2831     }
2832   }
2833 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_lt_16_multipass_with_qmax)2834   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_lt_16_multipass_with_qmax) {
2835     TEST_REQUIRES_ARM_NEON;
2836     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2837       for (size_t channels = 1; channels < 16; channels++) {
2838         MaxPoolMicrokernelTester()
2839           .pooling_elements(pooling_elements)
2840           .pooling_tile(9, 8)
2841           .channels(channels)
2842           .qmin(std::numeric_limits<int8_t>::min())
2843           .qmax(64)
2844           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2845       }
2846     }
2847   }
2848 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass)2849   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass) {
2850     TEST_REQUIRES_ARM_NEON;
2851     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2852       for (size_t channels = 17; channels < 32; channels++) {
2853         MaxPoolMicrokernelTester()
2854           .pooling_elements(pooling_elements)
2855           .pooling_tile(9, 8)
2856           .channels(channels)
2857           .qmin(std::numeric_limits<int8_t>::min())
2858           .qmax(std::numeric_limits<int8_t>::max())
2859           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2860       }
2861     }
2862   }
2863 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_input_offset)2864   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_input_offset) {
2865     TEST_REQUIRES_ARM_NEON;
2866     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2867       for (size_t channels = 17; channels < 32; channels++) {
2868         MaxPoolMicrokernelTester()
2869           .pooling_elements(pooling_elements)
2870           .pooling_tile(9, 8)
2871           .channels(channels)
2872           .input_offset(37)
2873           .qmin(std::numeric_limits<int8_t>::min())
2874           .qmax(std::numeric_limits<int8_t>::max())
2875           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2876       }
2877     }
2878   }
2879 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_qmin)2880   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_qmin) {
2881     TEST_REQUIRES_ARM_NEON;
2882     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2883       for (size_t channels = 17; channels < 32; channels++) {
2884         MaxPoolMicrokernelTester()
2885           .pooling_elements(pooling_elements)
2886           .pooling_tile(9, 8)
2887           .channels(channels)
2888           .qmin(-64)
2889           .qmax(std::numeric_limits<int8_t>::max())
2890           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2891       }
2892     }
2893   }
2894 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,channels_gt_16_multipass_with_qmax)2895   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, channels_gt_16_multipass_with_qmax) {
2896     TEST_REQUIRES_ARM_NEON;
2897     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
2898       for (size_t channels = 17; channels < 32; channels++) {
2899         MaxPoolMicrokernelTester()
2900           .pooling_elements(pooling_elements)
2901           .pooling_tile(9, 8)
2902           .channels(channels)
2903           .qmin(std::numeric_limits<int8_t>::min())
2904           .qmax(64)
2905           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2906       }
2907     }
2908   }
2909 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels)2910   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels) {
2911     TEST_REQUIRES_ARM_NEON;
2912     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2913       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2914         for (size_t channels = 1; channels <= 80; channels += 15) {
2915           MaxPoolMicrokernelTester()
2916             .output_pixels(output_pixels)
2917             .pooling_elements(pooling_elements)
2918             .pooling_tile(9, 8)
2919             .channels(channels)
2920             .qmin(std::numeric_limits<int8_t>::min())
2921             .qmax(std::numeric_limits<int8_t>::max())
2922             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2923         }
2924       }
2925     }
2926   }
2927 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_input_offset)2928   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_input_offset) {
2929     TEST_REQUIRES_ARM_NEON;
2930     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2931       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2932         for (size_t channels = 1; channels <= 80; channels += 15) {
2933           MaxPoolMicrokernelTester()
2934             .output_pixels(output_pixels)
2935             .pooling_elements(pooling_elements)
2936             .pooling_tile(9, 8)
2937             .channels(channels)
2938             .input_offset(83)
2939             .qmin(std::numeric_limits<int8_t>::min())
2940             .qmax(std::numeric_limits<int8_t>::max())
2941             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2942         }
2943       }
2944     }
2945   }
2946 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_qmin)2947   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_qmin) {
2948     TEST_REQUIRES_ARM_NEON;
2949     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2950       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2951         for (size_t channels = 1; channels <= 80; channels += 15) {
2952           MaxPoolMicrokernelTester()
2953             .output_pixels(output_pixels)
2954             .pooling_elements(pooling_elements)
2955             .pooling_tile(9, 8)
2956             .channels(channels)
2957             .qmin(-64)
2958             .qmax(std::numeric_limits<int8_t>::max())
2959             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2960         }
2961       }
2962     }
2963   }
2964 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_qmax)2965   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_qmax) {
2966     TEST_REQUIRES_ARM_NEON;
2967     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2968       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2969         for (size_t channels = 1; channels <= 80; channels += 15) {
2970           MaxPoolMicrokernelTester()
2971             .output_pixels(output_pixels)
2972             .pooling_elements(pooling_elements)
2973             .pooling_tile(9, 8)
2974             .channels(channels)
2975             .qmin(std::numeric_limits<int8_t>::min())
2976             .qmax(64)
2977             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2978         }
2979       }
2980     }
2981   }
2982 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_output_stride)2983   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_output_stride) {
2984     TEST_REQUIRES_ARM_NEON;
2985     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
2986       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
2987         for (size_t channels = 1; channels <= 80; channels += 15) {
2988           MaxPoolMicrokernelTester()
2989             .output_pixels(output_pixels)
2990             .pooling_elements(pooling_elements)
2991             .pooling_tile(9, 8)
2992             .channels(channels)
2993             .output_stride(83)
2994             .qmin(std::numeric_limits<int8_t>::min())
2995             .qmax(std::numeric_limits<int8_t>::max())
2996             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
2997         }
2998       }
2999     }
3000   }
3001 
TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16,few_output_pixels_with_step)3002   TEST(S8_MAXPOOL_MINMAX_9P8X__NEON_C16, few_output_pixels_with_step) {
3003     TEST_REQUIRES_ARM_NEON;
3004     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3005       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3006         for (size_t channels = 1; channels <= 80; channels += 15) {
3007           for (size_t step = 2; step <= pooling_elements; step++) {
3008             MaxPoolMicrokernelTester()
3009               .output_pixels(output_pixels)
3010               .pooling_elements(pooling_elements)
3011               .pooling_tile(9, 8)
3012               .step(step)
3013               .channels(channels)
3014               .output_stride(83)
3015               .qmin(std::numeric_limits<int8_t>::min())
3016               .qmax(std::numeric_limits<int8_t>::max())
3017               .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__neon_c16, xnn_init_s8_minmax_neon_params);
3018           }
3019         }
3020       }
3021     }
3022   }
3023 #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
3024 
3025 
3026 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile)3027   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile) {
3028     TEST_REQUIRES_X86_SSE2;
3029     MaxPoolMicrokernelTester()
3030       .pooling_elements(9)
3031       .pooling_tile(9, 8)
3032       .channels(16)
3033       .qmin(std::numeric_limits<int8_t>::min())
3034       .qmax(std::numeric_limits<int8_t>::max())
3035       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3036   }
3037 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_input_offset)3038   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
3039     TEST_REQUIRES_X86_SSE2;
3040     MaxPoolMicrokernelTester()
3041       .pooling_elements(9)
3042       .pooling_tile(9, 8)
3043       .channels(16)
3044       .input_offset(19)
3045       .qmin(std::numeric_limits<int8_t>::min())
3046       .qmax(std::numeric_limits<int8_t>::max())
3047       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3048   }
3049 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_qmin)3050   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_qmin) {
3051     TEST_REQUIRES_X86_SSE2;
3052     MaxPoolMicrokernelTester()
3053       .pooling_elements(9)
3054       .pooling_tile(9, 8)
3055       .channels(16)
3056       .qmin(-64)
3057       .qmax(std::numeric_limits<int8_t>::max())
3058       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3059   }
3060 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_fulltile_with_qmax)3061   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_fulltile_with_qmax) {
3062     TEST_REQUIRES_X86_SSE2;
3063     MaxPoolMicrokernelTester()
3064       .pooling_elements(9)
3065       .pooling_tile(9, 8)
3066       .channels(16)
3067       .qmin(std::numeric_limits<int8_t>::min())
3068       .qmax(64)
3069       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3070   }
3071 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_subtile)3072   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_subtile) {
3073     TEST_REQUIRES_X86_SSE2;
3074     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3075       MaxPoolMicrokernelTester()
3076         .pooling_elements(pooling_elements)
3077         .pooling_tile(9, 8)
3078         .channels(16)
3079         .qmin(std::numeric_limits<int8_t>::min())
3080         .qmax(std::numeric_limits<int8_t>::max())
3081         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3082     }
3083   }
3084 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_unipass_subtile_with_input_offset)3085   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_unipass_subtile_with_input_offset) {
3086     TEST_REQUIRES_X86_SSE2;
3087     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3088       MaxPoolMicrokernelTester()
3089         .pooling_elements(pooling_elements)
3090         .pooling_tile(9, 8)
3091         .channels(16)
3092         .input_offset(19)
3093         .qmin(std::numeric_limits<int8_t>::min())
3094         .qmax(std::numeric_limits<int8_t>::max())
3095         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3096     }
3097   }
3098 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile)3099   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile) {
3100     TEST_REQUIRES_X86_SSE2;
3101     for (size_t channels = 32; channels < 128; channels += 16) {
3102       MaxPoolMicrokernelTester()
3103         .pooling_elements(9)
3104         .pooling_tile(9, 8)
3105         .channels(channels)
3106         .qmin(std::numeric_limits<int8_t>::min())
3107         .qmax(std::numeric_limits<int8_t>::max())
3108         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3109     }
3110   }
3111 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_input_offset)3112   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_input_offset) {
3113     TEST_REQUIRES_X86_SSE2;
3114     for (size_t channels = 32; channels < 128; channels += 16) {
3115       MaxPoolMicrokernelTester()
3116         .pooling_elements(9)
3117         .pooling_tile(9, 8)
3118         .channels(channels)
3119         .input_offset(131)
3120         .qmin(std::numeric_limits<int8_t>::min())
3121         .qmax(std::numeric_limits<int8_t>::max())
3122         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3123     }
3124   }
3125 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_qmin)3126   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_qmin) {
3127     TEST_REQUIRES_X86_SSE2;
3128     for (size_t channels = 32; channels < 128; channels += 16) {
3129       MaxPoolMicrokernelTester()
3130         .pooling_elements(9)
3131         .pooling_tile(9, 8)
3132         .channels(channels)
3133         .qmin(-64)
3134         .qmax(std::numeric_limits<int8_t>::max())
3135         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3136     }
3137   }
3138 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_fulltile_with_qmax)3139   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_fulltile_with_qmax) {
3140     TEST_REQUIRES_X86_SSE2;
3141     for (size_t channels = 32; channels < 128; channels += 16) {
3142       MaxPoolMicrokernelTester()
3143         .pooling_elements(9)
3144         .pooling_tile(9, 8)
3145         .channels(channels)
3146         .qmin(std::numeric_limits<int8_t>::min())
3147         .qmax(64)
3148         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3149     }
3150   }
3151 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_subtile)3152   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_subtile) {
3153     TEST_REQUIRES_X86_SSE2;
3154     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3155       for (size_t channels = 32; channels < 128; channels += 16) {
3156         MaxPoolMicrokernelTester()
3157           .pooling_elements(pooling_elements)
3158           .pooling_tile(9, 8)
3159           .channels(channels)
3160           .qmin(std::numeric_limits<int8_t>::min())
3161           .qmax(std::numeric_limits<int8_t>::max())
3162           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3163       }
3164     }
3165   }
3166 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_unipass_subtile_with_input_offset)3167   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_unipass_subtile_with_input_offset) {
3168     TEST_REQUIRES_X86_SSE2;
3169     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3170       for (size_t channels = 32; channels < 128; channels += 16) {
3171         MaxPoolMicrokernelTester()
3172           .pooling_elements(pooling_elements)
3173           .pooling_tile(9, 8)
3174           .channels(channels)
3175           .input_offset(131)
3176           .qmin(std::numeric_limits<int8_t>::min())
3177           .qmax(std::numeric_limits<int8_t>::max())
3178           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3179       }
3180     }
3181   }
3182 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile)3183   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile) {
3184     TEST_REQUIRES_X86_SSE2;
3185     for (size_t channels = 1; channels < 16; channels++) {
3186       MaxPoolMicrokernelTester()
3187         .pooling_elements(9)
3188         .pooling_tile(9, 8)
3189         .channels(channels)
3190         .qmin(std::numeric_limits<int8_t>::min())
3191         .qmax(std::numeric_limits<int8_t>::max())
3192         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3193     }
3194   }
3195 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_input_offset)3196   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
3197     TEST_REQUIRES_X86_SSE2;
3198     for (size_t channels = 1; channels < 16; channels++) {
3199       MaxPoolMicrokernelTester()
3200         .pooling_elements(9)
3201         .pooling_tile(9, 8)
3202         .channels(channels)
3203         .input_offset(17)
3204         .qmin(std::numeric_limits<int8_t>::min())
3205         .qmax(std::numeric_limits<int8_t>::max())
3206         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3207     }
3208   }
3209 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_qmin)3210   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_qmin) {
3211     TEST_REQUIRES_X86_SSE2;
3212     for (size_t channels = 1; channels < 16; channels++) {
3213       MaxPoolMicrokernelTester()
3214         .pooling_elements(9)
3215         .pooling_tile(9, 8)
3216         .channels(channels)
3217         .qmin(-64)
3218         .qmax(std::numeric_limits<int8_t>::max())
3219         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3220     }
3221   }
3222 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_fulltile_with_qmax)3223   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_fulltile_with_qmax) {
3224     TEST_REQUIRES_X86_SSE2;
3225     for (size_t channels = 1; channels < 16; channels++) {
3226       MaxPoolMicrokernelTester()
3227         .pooling_elements(9)
3228         .pooling_tile(9, 8)
3229         .channels(channels)
3230         .qmin(std::numeric_limits<int8_t>::min())
3231         .qmax(64)
3232         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3233     }
3234   }
3235 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_subtile)3236   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_subtile) {
3237     TEST_REQUIRES_X86_SSE2;
3238     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3239       for (size_t channels = 1; channels < 16; channels++) {
3240         MaxPoolMicrokernelTester()
3241           .pooling_elements(pooling_elements)
3242           .pooling_tile(9, 8)
3243           .channels(channels)
3244           .qmin(std::numeric_limits<int8_t>::min())
3245           .qmax(std::numeric_limits<int8_t>::max())
3246           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3247       }
3248     }
3249   }
3250 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_unipass_subtile_with_input_offset)3251   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_unipass_subtile_with_input_offset) {
3252     TEST_REQUIRES_X86_SSE2;
3253     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3254       for (size_t channels = 1; channels < 16; channels++) {
3255         MaxPoolMicrokernelTester()
3256           .pooling_elements(pooling_elements)
3257           .pooling_tile(9, 8)
3258           .channels(channels)
3259           .input_offset(17)
3260           .qmin(std::numeric_limits<int8_t>::min())
3261           .qmax(std::numeric_limits<int8_t>::max())
3262           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3263       }
3264     }
3265   }
3266 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile)3267   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile) {
3268     TEST_REQUIRES_X86_SSE2;
3269     for (size_t channels = 17; channels < 32; channels++) {
3270       MaxPoolMicrokernelTester()
3271         .pooling_elements(9)
3272         .pooling_tile(9, 8)
3273         .channels(channels)
3274         .qmin(std::numeric_limits<int8_t>::min())
3275         .qmax(std::numeric_limits<int8_t>::max())
3276         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3277     }
3278   }
3279 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_input_offset)3280   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
3281     TEST_REQUIRES_X86_SSE2;
3282     for (size_t channels = 17; channels < 32; channels++) {
3283       MaxPoolMicrokernelTester()
3284         .pooling_elements(9)
3285         .pooling_tile(9, 8)
3286         .channels(channels)
3287         .input_offset(37)
3288         .qmin(std::numeric_limits<int8_t>::min())
3289         .qmax(std::numeric_limits<int8_t>::max())
3290         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3291     }
3292   }
3293 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_qmin)3294   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_qmin) {
3295     TEST_REQUIRES_X86_SSE2;
3296     for (size_t channels = 17; channels < 32; channels++) {
3297       MaxPoolMicrokernelTester()
3298         .pooling_elements(9)
3299         .pooling_tile(9, 8)
3300         .channels(channels)
3301         .qmin(-64)
3302         .qmax(std::numeric_limits<int8_t>::max())
3303         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3304     }
3305   }
3306 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_fulltile_with_qmax)3307   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_fulltile_with_qmax) {
3308     TEST_REQUIRES_X86_SSE2;
3309     for (size_t channels = 17; channels < 32; channels++) {
3310       MaxPoolMicrokernelTester()
3311         .pooling_elements(9)
3312         .pooling_tile(9, 8)
3313         .channels(channels)
3314         .qmin(std::numeric_limits<int8_t>::min())
3315         .qmax(64)
3316         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3317     }
3318   }
3319 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_subtile)3320   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_subtile) {
3321     TEST_REQUIRES_X86_SSE2;
3322     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3323       for (size_t channels = 17; channels < 32; channels++) {
3324         MaxPoolMicrokernelTester()
3325           .pooling_elements(pooling_elements)
3326           .pooling_tile(9, 8)
3327           .channels(channels)
3328           .qmin(std::numeric_limits<int8_t>::min())
3329           .qmax(std::numeric_limits<int8_t>::max())
3330           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3331       }
3332     }
3333   }
3334 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_unipass_subtile_with_input_offset)3335   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_unipass_subtile_with_input_offset) {
3336     TEST_REQUIRES_X86_SSE2;
3337     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
3338       for (size_t channels = 17; channels < 32; channels++) {
3339         MaxPoolMicrokernelTester()
3340           .pooling_elements(pooling_elements)
3341           .pooling_tile(9, 8)
3342           .channels(channels)
3343           .input_offset(37)
3344           .qmin(std::numeric_limits<int8_t>::min())
3345           .qmax(std::numeric_limits<int8_t>::max())
3346           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3347       }
3348     }
3349   }
3350 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile)3351   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile) {
3352     TEST_REQUIRES_X86_SSE2;
3353     MaxPoolMicrokernelTester()
3354       .pooling_elements(17)
3355       .pooling_tile(9, 8)
3356       .channels(16)
3357       .qmin(std::numeric_limits<int8_t>::min())
3358       .qmax(std::numeric_limits<int8_t>::max())
3359       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3360   }
3361 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_input_offset)3362   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
3363     TEST_REQUIRES_X86_SSE2;
3364     MaxPoolMicrokernelTester()
3365       .pooling_elements(17)
3366       .pooling_tile(9, 8)
3367       .channels(16)
3368       .input_offset(19)
3369       .qmin(std::numeric_limits<int8_t>::min())
3370       .qmax(std::numeric_limits<int8_t>::max())
3371       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3372   }
3373 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_qmin)3374   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_qmin) {
3375     TEST_REQUIRES_X86_SSE2;
3376     MaxPoolMicrokernelTester()
3377       .pooling_elements(17)
3378       .pooling_tile(9, 8)
3379       .channels(16)
3380       .qmin(-64)
3381       .qmax(std::numeric_limits<int8_t>::max())
3382       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3383   }
3384 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_fulltile_with_qmax)3385   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_fulltile_with_qmax) {
3386     TEST_REQUIRES_X86_SSE2;
3387     MaxPoolMicrokernelTester()
3388       .pooling_elements(17)
3389       .pooling_tile(9, 8)
3390       .channels(16)
3391       .qmin(std::numeric_limits<int8_t>::min())
3392       .qmax(64)
3393       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3394   }
3395 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_subtile)3396   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_subtile) {
3397     TEST_REQUIRES_X86_SSE2;
3398     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3399       MaxPoolMicrokernelTester()
3400         .pooling_elements(pooling_elements)
3401         .pooling_tile(9, 8)
3402         .channels(16)
3403         .qmin(std::numeric_limits<int8_t>::min())
3404         .qmax(std::numeric_limits<int8_t>::max())
3405         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3406     }
3407   }
3408 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_twopass_subtile_with_input_offset)3409   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_twopass_subtile_with_input_offset) {
3410     TEST_REQUIRES_X86_SSE2;
3411     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3412       MaxPoolMicrokernelTester()
3413         .pooling_elements(pooling_elements)
3414         .pooling_tile(9, 8)
3415         .channels(16)
3416         .input_offset(19)
3417         .qmin(std::numeric_limits<int8_t>::min())
3418         .qmax(std::numeric_limits<int8_t>::max())
3419         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3420     }
3421   }
3422 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile)3423   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile) {
3424     TEST_REQUIRES_X86_SSE2;
3425     for (size_t channels = 32; channels < 128; channels += 16) {
3426       MaxPoolMicrokernelTester()
3427         .pooling_elements(17)
3428         .pooling_tile(9, 8)
3429         .channels(channels)
3430         .qmin(std::numeric_limits<int8_t>::min())
3431         .qmax(std::numeric_limits<int8_t>::max())
3432         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3433     }
3434   }
3435 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_input_offset)3436   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_input_offset) {
3437     TEST_REQUIRES_X86_SSE2;
3438     for (size_t channels = 32; channels < 128; channels += 16) {
3439       MaxPoolMicrokernelTester()
3440         .pooling_elements(17)
3441         .pooling_tile(9, 8)
3442         .channels(channels)
3443         .input_offset(83)
3444         .qmin(std::numeric_limits<int8_t>::min())
3445         .qmax(std::numeric_limits<int8_t>::max())
3446         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3447     }
3448   }
3449 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_qmin)3450   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_qmin) {
3451     TEST_REQUIRES_X86_SSE2;
3452     for (size_t channels = 32; channels < 128; channels += 16) {
3453       MaxPoolMicrokernelTester()
3454         .pooling_elements(17)
3455         .pooling_tile(9, 8)
3456         .channels(channels)
3457         .qmin(-64)
3458         .qmax(std::numeric_limits<int8_t>::max())
3459         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3460     }
3461   }
3462 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_fulltile_with_qmax)3463   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_fulltile_with_qmax) {
3464     TEST_REQUIRES_X86_SSE2;
3465     for (size_t channels = 32; channels < 128; channels += 16) {
3466       MaxPoolMicrokernelTester()
3467         .pooling_elements(17)
3468         .pooling_tile(9, 8)
3469         .channels(channels)
3470         .qmin(std::numeric_limits<int8_t>::min())
3471         .qmax(64)
3472         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3473     }
3474   }
3475 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_subtile)3476   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_subtile) {
3477     TEST_REQUIRES_X86_SSE2;
3478     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3479       for (size_t channels = 32; channels < 128; channels += 16) {
3480         MaxPoolMicrokernelTester()
3481           .pooling_elements(pooling_elements)
3482           .pooling_tile(9, 8)
3483           .channels(channels)
3484           .qmin(std::numeric_limits<int8_t>::min())
3485           .qmax(std::numeric_limits<int8_t>::max())
3486           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3487       }
3488     }
3489   }
3490 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_twopass_subtile_with_input_offset)3491   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_twopass_subtile_with_input_offset) {
3492     TEST_REQUIRES_X86_SSE2;
3493     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3494       for (size_t channels = 32; channels < 128; channels += 16) {
3495         MaxPoolMicrokernelTester()
3496           .pooling_elements(pooling_elements)
3497           .pooling_tile(9, 8)
3498           .channels(channels)
3499           .input_offset(131)
3500           .qmin(std::numeric_limits<int8_t>::min())
3501           .qmax(std::numeric_limits<int8_t>::max())
3502           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3503       }
3504     }
3505   }
3506 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile)3507   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile) {
3508     TEST_REQUIRES_X86_SSE2;
3509     for (size_t channels = 1; channels < 16; channels++) {
3510       MaxPoolMicrokernelTester()
3511         .pooling_elements(17)
3512         .pooling_tile(9, 8)
3513         .channels(channels)
3514         .qmin(std::numeric_limits<int8_t>::min())
3515         .qmax(std::numeric_limits<int8_t>::max())
3516         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3517     }
3518   }
3519 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_input_offset)3520   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
3521     TEST_REQUIRES_X86_SSE2;
3522     for (size_t channels = 1; channels < 16; channels++) {
3523       MaxPoolMicrokernelTester()
3524         .pooling_elements(17)
3525         .pooling_tile(9, 8)
3526         .channels(channels)
3527         .input_offset(17)
3528         .qmin(std::numeric_limits<int8_t>::min())
3529         .qmax(std::numeric_limits<int8_t>::max())
3530         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3531     }
3532   }
3533 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_qmin)3534   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_qmin) {
3535     TEST_REQUIRES_X86_SSE2;
3536     for (size_t channels = 1; channels < 16; channels++) {
3537       MaxPoolMicrokernelTester()
3538         .pooling_elements(17)
3539         .pooling_tile(9, 8)
3540         .channels(channels)
3541         .qmin(-64)
3542         .qmax(std::numeric_limits<int8_t>::max())
3543         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3544     }
3545   }
3546 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_fulltile_with_qmax)3547   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_fulltile_with_qmax) {
3548     TEST_REQUIRES_X86_SSE2;
3549     for (size_t channels = 1; channels < 16; channels++) {
3550       MaxPoolMicrokernelTester()
3551         .pooling_elements(17)
3552         .pooling_tile(9, 8)
3553         .channels(channels)
3554         .qmin(std::numeric_limits<int8_t>::min())
3555         .qmax(64)
3556         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3557     }
3558   }
3559 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_subtile)3560   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_subtile) {
3561     TEST_REQUIRES_X86_SSE2;
3562     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3563       for (size_t channels = 1; channels < 16; channels++) {
3564         MaxPoolMicrokernelTester()
3565           .pooling_elements(pooling_elements)
3566           .pooling_tile(9, 8)
3567           .channels(channels)
3568           .qmin(std::numeric_limits<int8_t>::min())
3569           .qmax(std::numeric_limits<int8_t>::max())
3570           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3571       }
3572     }
3573   }
3574 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_twopass_subtile_with_input_offset)3575   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_twopass_subtile_with_input_offset) {
3576     TEST_REQUIRES_X86_SSE2;
3577     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3578       for (size_t channels = 1; channels < 16; channels++) {
3579         MaxPoolMicrokernelTester()
3580           .pooling_elements(pooling_elements)
3581           .pooling_tile(9, 8)
3582           .channels(channels)
3583           .input_offset(17)
3584           .qmin(std::numeric_limits<int8_t>::min())
3585           .qmax(std::numeric_limits<int8_t>::max())
3586           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3587       }
3588     }
3589   }
3590 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile)3591   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile) {
3592     TEST_REQUIRES_X86_SSE2;
3593     for (size_t channels = 17; channels < 32; channels++) {
3594       MaxPoolMicrokernelTester()
3595         .pooling_elements(17)
3596         .pooling_tile(9, 8)
3597         .channels(channels)
3598         .qmin(std::numeric_limits<int8_t>::min())
3599         .qmax(std::numeric_limits<int8_t>::max())
3600         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3601     }
3602   }
3603 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_input_offset)3604   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
3605     TEST_REQUIRES_X86_SSE2;
3606     for (size_t channels = 17; channels < 32; channels++) {
3607       MaxPoolMicrokernelTester()
3608         .pooling_elements(17)
3609         .pooling_tile(9, 8)
3610         .channels(channels)
3611         .input_offset(37)
3612         .qmin(std::numeric_limits<int8_t>::min())
3613         .qmax(std::numeric_limits<int8_t>::max())
3614         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3615     }
3616   }
3617 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_qmin)3618   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_qmin) {
3619     TEST_REQUIRES_X86_SSE2;
3620     for (size_t channels = 17; channels < 32; channels++) {
3621       MaxPoolMicrokernelTester()
3622         .pooling_elements(17)
3623         .pooling_tile(9, 8)
3624         .channels(channels)
3625         .qmin(-64)
3626         .qmax(std::numeric_limits<int8_t>::max())
3627         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3628     }
3629   }
3630 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_fulltile_with_qmax)3631   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_fulltile_with_qmax) {
3632     TEST_REQUIRES_X86_SSE2;
3633     for (size_t channels = 17; channels < 32; channels++) {
3634       MaxPoolMicrokernelTester()
3635         .pooling_elements(17)
3636         .pooling_tile(9, 8)
3637         .channels(channels)
3638         .qmin(std::numeric_limits<int8_t>::min())
3639         .qmax(64)
3640         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3641     }
3642   }
3643 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_subtile)3644   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_subtile) {
3645     TEST_REQUIRES_X86_SSE2;
3646     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3647       for (size_t channels = 17; channels < 32; channels++) {
3648         MaxPoolMicrokernelTester()
3649           .pooling_elements(pooling_elements)
3650           .pooling_tile(9, 8)
3651           .channels(channels)
3652           .qmin(std::numeric_limits<int8_t>::min())
3653           .qmax(std::numeric_limits<int8_t>::max())
3654           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3655       }
3656     }
3657   }
3658 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_twopass_subtile_with_input_offset)3659   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_twopass_subtile_with_input_offset) {
3660     TEST_REQUIRES_X86_SSE2;
3661     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
3662       for (size_t channels = 17; channels < 32; channels++) {
3663         MaxPoolMicrokernelTester()
3664           .pooling_elements(pooling_elements)
3665           .pooling_tile(9, 8)
3666           .channels(channels)
3667           .input_offset(37)
3668           .qmin(std::numeric_limits<int8_t>::min())
3669           .qmax(std::numeric_limits<int8_t>::max())
3670           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3671       }
3672     }
3673   }
3674 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass)3675   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass) {
3676     TEST_REQUIRES_X86_SSE2;
3677     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3678       MaxPoolMicrokernelTester()
3679         .pooling_elements(pooling_elements)
3680         .pooling_tile(9, 8)
3681         .channels(16)
3682         .qmin(std::numeric_limits<int8_t>::min())
3683         .qmax(std::numeric_limits<int8_t>::max())
3684         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3685     }
3686   }
3687 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_input_offset)3688   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_input_offset) {
3689     TEST_REQUIRES_X86_SSE2;
3690     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3691       MaxPoolMicrokernelTester()
3692         .pooling_elements(pooling_elements)
3693         .pooling_tile(9, 8)
3694         .channels(16)
3695         .input_offset(19)
3696         .qmin(std::numeric_limits<int8_t>::min())
3697         .qmax(std::numeric_limits<int8_t>::max())
3698         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3699     }
3700   }
3701 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_qmin)3702   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_qmin) {
3703     TEST_REQUIRES_X86_SSE2;
3704     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3705       MaxPoolMicrokernelTester()
3706         .pooling_elements(pooling_elements)
3707         .pooling_tile(9, 8)
3708         .channels(16)
3709         .qmin(-64)
3710         .qmax(std::numeric_limits<int8_t>::max())
3711         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3712     }
3713   }
3714 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_eq_16_multipass_with_qmax)3715   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_eq_16_multipass_with_qmax) {
3716     TEST_REQUIRES_X86_SSE2;
3717     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3718       MaxPoolMicrokernelTester()
3719         .pooling_elements(pooling_elements)
3720         .pooling_tile(9, 8)
3721         .channels(16)
3722         .qmin(std::numeric_limits<int8_t>::min())
3723         .qmax(64)
3724         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3725     }
3726   }
3727 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass)3728   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass) {
3729     TEST_REQUIRES_X86_SSE2;
3730     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3731       for (size_t channels = 32; channels < 128; channels += 16) {
3732         MaxPoolMicrokernelTester()
3733           .pooling_elements(pooling_elements)
3734           .pooling_tile(9, 8)
3735           .channels(channels)
3736           .qmin(std::numeric_limits<int8_t>::min())
3737           .qmax(std::numeric_limits<int8_t>::max())
3738           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3739       }
3740     }
3741   }
3742 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_input_offset)3743   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_input_offset) {
3744     TEST_REQUIRES_X86_SSE2;
3745     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3746       for (size_t channels = 32; channels < 128; channels += 16) {
3747         MaxPoolMicrokernelTester()
3748           .pooling_elements(pooling_elements)
3749           .pooling_tile(9, 8)
3750           .channels(channels)
3751           .input_offset(131)
3752           .qmin(std::numeric_limits<int8_t>::min())
3753           .qmax(std::numeric_limits<int8_t>::max())
3754           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3755       }
3756     }
3757   }
3758 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_qmin)3759   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_qmin) {
3760     TEST_REQUIRES_X86_SSE2;
3761     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3762       for (size_t channels = 32; channels < 128; channels += 16) {
3763         MaxPoolMicrokernelTester()
3764           .pooling_elements(pooling_elements)
3765           .pooling_tile(9, 8)
3766           .channels(channels)
3767           .qmin(-64)
3768           .qmax(std::numeric_limits<int8_t>::max())
3769           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3770       }
3771     }
3772   }
3773 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_div_16_multipass_with_qmax)3774   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_div_16_multipass_with_qmax) {
3775     TEST_REQUIRES_X86_SSE2;
3776     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3777       for (size_t channels = 32; channels < 128; channels += 16) {
3778         MaxPoolMicrokernelTester()
3779           .pooling_elements(pooling_elements)
3780           .pooling_tile(9, 8)
3781           .channels(channels)
3782           .qmin(std::numeric_limits<int8_t>::min())
3783           .qmax(64)
3784           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3785       }
3786     }
3787   }
3788 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass)3789   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass) {
3790     TEST_REQUIRES_X86_SSE2;
3791     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3792       for (size_t channels = 1; channels < 16; channels++) {
3793         MaxPoolMicrokernelTester()
3794           .pooling_elements(pooling_elements)
3795           .pooling_tile(9, 8)
3796           .channels(channels)
3797           .qmin(std::numeric_limits<int8_t>::min())
3798           .qmax(std::numeric_limits<int8_t>::max())
3799           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3800       }
3801     }
3802   }
3803 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_input_offset)3804   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_input_offset) {
3805     TEST_REQUIRES_X86_SSE2;
3806     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3807       for (size_t channels = 1; channels < 16; channels++) {
3808         MaxPoolMicrokernelTester()
3809           .pooling_elements(pooling_elements)
3810           .pooling_tile(9, 8)
3811           .channels(channels)
3812           .input_offset(16)
3813           .qmin(std::numeric_limits<int8_t>::min())
3814           .qmax(std::numeric_limits<int8_t>::max())
3815           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3816       }
3817     }
3818   }
3819 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_qmin)3820   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_qmin) {
3821     TEST_REQUIRES_X86_SSE2;
3822     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3823       for (size_t channels = 1; channels < 16; channels++) {
3824         MaxPoolMicrokernelTester()
3825           .pooling_elements(pooling_elements)
3826           .pooling_tile(9, 8)
3827           .channels(channels)
3828           .qmin(-64)
3829           .qmax(std::numeric_limits<int8_t>::max())
3830           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3831       }
3832     }
3833   }
3834 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_lt_16_multipass_with_qmax)3835   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_lt_16_multipass_with_qmax) {
3836     TEST_REQUIRES_X86_SSE2;
3837     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3838       for (size_t channels = 1; channels < 16; channels++) {
3839         MaxPoolMicrokernelTester()
3840           .pooling_elements(pooling_elements)
3841           .pooling_tile(9, 8)
3842           .channels(channels)
3843           .qmin(std::numeric_limits<int8_t>::min())
3844           .qmax(64)
3845           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3846       }
3847     }
3848   }
3849 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass)3850   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass) {
3851     TEST_REQUIRES_X86_SSE2;
3852     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3853       for (size_t channels = 17; channels < 32; channels++) {
3854         MaxPoolMicrokernelTester()
3855           .pooling_elements(pooling_elements)
3856           .pooling_tile(9, 8)
3857           .channels(channels)
3858           .qmin(std::numeric_limits<int8_t>::min())
3859           .qmax(std::numeric_limits<int8_t>::max())
3860           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3861       }
3862     }
3863   }
3864 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_input_offset)3865   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_input_offset) {
3866     TEST_REQUIRES_X86_SSE2;
3867     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3868       for (size_t channels = 17; channels < 32; channels++) {
3869         MaxPoolMicrokernelTester()
3870           .pooling_elements(pooling_elements)
3871           .pooling_tile(9, 8)
3872           .channels(channels)
3873           .input_offset(37)
3874           .qmin(std::numeric_limits<int8_t>::min())
3875           .qmax(std::numeric_limits<int8_t>::max())
3876           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3877       }
3878     }
3879   }
3880 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_qmin)3881   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_qmin) {
3882     TEST_REQUIRES_X86_SSE2;
3883     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3884       for (size_t channels = 17; channels < 32; channels++) {
3885         MaxPoolMicrokernelTester()
3886           .pooling_elements(pooling_elements)
3887           .pooling_tile(9, 8)
3888           .channels(channels)
3889           .qmin(-64)
3890           .qmax(std::numeric_limits<int8_t>::max())
3891           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3892       }
3893     }
3894   }
3895 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,channels_gt_16_multipass_with_qmax)3896   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, channels_gt_16_multipass_with_qmax) {
3897     TEST_REQUIRES_X86_SSE2;
3898     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
3899       for (size_t channels = 17; channels < 32; channels++) {
3900         MaxPoolMicrokernelTester()
3901           .pooling_elements(pooling_elements)
3902           .pooling_tile(9, 8)
3903           .channels(channels)
3904           .qmin(std::numeric_limits<int8_t>::min())
3905           .qmax(64)
3906           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3907       }
3908     }
3909   }
3910 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels)3911   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels) {
3912     TEST_REQUIRES_X86_SSE2;
3913     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3914       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3915         for (size_t channels = 1; channels <= 80; channels += 15) {
3916           MaxPoolMicrokernelTester()
3917             .output_pixels(output_pixels)
3918             .pooling_elements(pooling_elements)
3919             .pooling_tile(9, 8)
3920             .channels(channels)
3921             .qmin(std::numeric_limits<int8_t>::min())
3922             .qmax(std::numeric_limits<int8_t>::max())
3923             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3924         }
3925       }
3926     }
3927   }
3928 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_input_offset)3929   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_input_offset) {
3930     TEST_REQUIRES_X86_SSE2;
3931     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3932       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3933         for (size_t channels = 1; channels <= 80; channels += 15) {
3934           MaxPoolMicrokernelTester()
3935             .output_pixels(output_pixels)
3936             .pooling_elements(pooling_elements)
3937             .pooling_tile(9, 8)
3938             .channels(channels)
3939             .input_offset(83)
3940             .qmin(std::numeric_limits<int8_t>::min())
3941             .qmax(std::numeric_limits<int8_t>::max())
3942             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3943         }
3944       }
3945     }
3946   }
3947 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_qmin)3948   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_qmin) {
3949     TEST_REQUIRES_X86_SSE2;
3950     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3951       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3952         for (size_t channels = 1; channels <= 80; channels += 15) {
3953           MaxPoolMicrokernelTester()
3954             .output_pixels(output_pixels)
3955             .pooling_elements(pooling_elements)
3956             .pooling_tile(9, 8)
3957             .channels(channels)
3958             .qmin(-64)
3959             .qmax(std::numeric_limits<int8_t>::max())
3960             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3961         }
3962       }
3963     }
3964   }
3965 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_qmax)3966   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_qmax) {
3967     TEST_REQUIRES_X86_SSE2;
3968     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3969       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3970         for (size_t channels = 1; channels <= 80; channels += 15) {
3971           MaxPoolMicrokernelTester()
3972             .output_pixels(output_pixels)
3973             .pooling_elements(pooling_elements)
3974             .pooling_tile(9, 8)
3975             .channels(channels)
3976             .qmin(std::numeric_limits<int8_t>::min())
3977             .qmax(64)
3978             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3979         }
3980       }
3981     }
3982   }
3983 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_output_stride)3984   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_output_stride) {
3985     TEST_REQUIRES_X86_SSE2;
3986     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
3987       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
3988         for (size_t channels = 1; channels <= 80; channels += 15) {
3989           MaxPoolMicrokernelTester()
3990             .output_pixels(output_pixels)
3991             .pooling_elements(pooling_elements)
3992             .pooling_tile(9, 8)
3993             .channels(channels)
3994             .output_stride(83)
3995             .qmin(std::numeric_limits<int8_t>::min())
3996             .qmax(std::numeric_limits<int8_t>::max())
3997             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
3998         }
3999       }
4000     }
4001   }
4002 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16,few_output_pixels_with_step)4003   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE2_C16, few_output_pixels_with_step) {
4004     TEST_REQUIRES_X86_SSE2;
4005     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4006       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4007         for (size_t channels = 1; channels <= 80; channels += 15) {
4008           for (size_t step = 2; step <= pooling_elements; step++) {
4009             MaxPoolMicrokernelTester()
4010               .output_pixels(output_pixels)
4011               .pooling_elements(pooling_elements)
4012               .pooling_tile(9, 8)
4013               .step(step)
4014               .channels(channels)
4015               .output_stride(83)
4016               .qmin(std::numeric_limits<int8_t>::min())
4017               .qmax(std::numeric_limits<int8_t>::max())
4018               .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse2_c16, xnn_init_s8_minmax_sse2_params);
4019           }
4020         }
4021       }
4022     }
4023   }
4024 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
4025 
4026 
4027 #if XNN_ARCH_X86 || XNN_ARCH_X86_64
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_fulltile)4028   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_fulltile) {
4029     TEST_REQUIRES_X86_SSE41;
4030     MaxPoolMicrokernelTester()
4031       .pooling_elements(9)
4032       .pooling_tile(9, 8)
4033       .channels(16)
4034       .qmin(std::numeric_limits<int8_t>::min())
4035       .qmax(std::numeric_limits<int8_t>::max())
4036       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4037   }
4038 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_fulltile_with_input_offset)4039   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
4040     TEST_REQUIRES_X86_SSE41;
4041     MaxPoolMicrokernelTester()
4042       .pooling_elements(9)
4043       .pooling_tile(9, 8)
4044       .channels(16)
4045       .input_offset(19)
4046       .qmin(std::numeric_limits<int8_t>::min())
4047       .qmax(std::numeric_limits<int8_t>::max())
4048       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4049   }
4050 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_fulltile_with_qmin)4051   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_fulltile_with_qmin) {
4052     TEST_REQUIRES_X86_SSE41;
4053     MaxPoolMicrokernelTester()
4054       .pooling_elements(9)
4055       .pooling_tile(9, 8)
4056       .channels(16)
4057       .qmin(-64)
4058       .qmax(std::numeric_limits<int8_t>::max())
4059       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4060   }
4061 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_fulltile_with_qmax)4062   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_fulltile_with_qmax) {
4063     TEST_REQUIRES_X86_SSE41;
4064     MaxPoolMicrokernelTester()
4065       .pooling_elements(9)
4066       .pooling_tile(9, 8)
4067       .channels(16)
4068       .qmin(std::numeric_limits<int8_t>::min())
4069       .qmax(64)
4070       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4071   }
4072 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_subtile)4073   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_subtile) {
4074     TEST_REQUIRES_X86_SSE41;
4075     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4076       MaxPoolMicrokernelTester()
4077         .pooling_elements(pooling_elements)
4078         .pooling_tile(9, 8)
4079         .channels(16)
4080         .qmin(std::numeric_limits<int8_t>::min())
4081         .qmax(std::numeric_limits<int8_t>::max())
4082         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4083     }
4084   }
4085 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_unipass_subtile_with_input_offset)4086   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_unipass_subtile_with_input_offset) {
4087     TEST_REQUIRES_X86_SSE41;
4088     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4089       MaxPoolMicrokernelTester()
4090         .pooling_elements(pooling_elements)
4091         .pooling_tile(9, 8)
4092         .channels(16)
4093         .input_offset(19)
4094         .qmin(std::numeric_limits<int8_t>::min())
4095         .qmax(std::numeric_limits<int8_t>::max())
4096         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4097     }
4098   }
4099 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_fulltile)4100   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_fulltile) {
4101     TEST_REQUIRES_X86_SSE41;
4102     for (size_t channels = 32; channels < 128; channels += 16) {
4103       MaxPoolMicrokernelTester()
4104         .pooling_elements(9)
4105         .pooling_tile(9, 8)
4106         .channels(channels)
4107         .qmin(std::numeric_limits<int8_t>::min())
4108         .qmax(std::numeric_limits<int8_t>::max())
4109         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4110     }
4111   }
4112 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_fulltile_with_input_offset)4113   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_fulltile_with_input_offset) {
4114     TEST_REQUIRES_X86_SSE41;
4115     for (size_t channels = 32; channels < 128; channels += 16) {
4116       MaxPoolMicrokernelTester()
4117         .pooling_elements(9)
4118         .pooling_tile(9, 8)
4119         .channels(channels)
4120         .input_offset(131)
4121         .qmin(std::numeric_limits<int8_t>::min())
4122         .qmax(std::numeric_limits<int8_t>::max())
4123         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4124     }
4125   }
4126 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_fulltile_with_qmin)4127   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_fulltile_with_qmin) {
4128     TEST_REQUIRES_X86_SSE41;
4129     for (size_t channels = 32; channels < 128; channels += 16) {
4130       MaxPoolMicrokernelTester()
4131         .pooling_elements(9)
4132         .pooling_tile(9, 8)
4133         .channels(channels)
4134         .qmin(-64)
4135         .qmax(std::numeric_limits<int8_t>::max())
4136         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4137     }
4138   }
4139 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_fulltile_with_qmax)4140   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_fulltile_with_qmax) {
4141     TEST_REQUIRES_X86_SSE41;
4142     for (size_t channels = 32; channels < 128; channels += 16) {
4143       MaxPoolMicrokernelTester()
4144         .pooling_elements(9)
4145         .pooling_tile(9, 8)
4146         .channels(channels)
4147         .qmin(std::numeric_limits<int8_t>::min())
4148         .qmax(64)
4149         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4150     }
4151   }
4152 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_subtile)4153   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_subtile) {
4154     TEST_REQUIRES_X86_SSE41;
4155     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4156       for (size_t channels = 32; channels < 128; channels += 16) {
4157         MaxPoolMicrokernelTester()
4158           .pooling_elements(pooling_elements)
4159           .pooling_tile(9, 8)
4160           .channels(channels)
4161           .qmin(std::numeric_limits<int8_t>::min())
4162           .qmax(std::numeric_limits<int8_t>::max())
4163           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4164       }
4165     }
4166   }
4167 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_unipass_subtile_with_input_offset)4168   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_unipass_subtile_with_input_offset) {
4169     TEST_REQUIRES_X86_SSE41;
4170     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4171       for (size_t channels = 32; channels < 128; channels += 16) {
4172         MaxPoolMicrokernelTester()
4173           .pooling_elements(pooling_elements)
4174           .pooling_tile(9, 8)
4175           .channels(channels)
4176           .input_offset(131)
4177           .qmin(std::numeric_limits<int8_t>::min())
4178           .qmax(std::numeric_limits<int8_t>::max())
4179           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4180       }
4181     }
4182   }
4183 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_fulltile)4184   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_fulltile) {
4185     TEST_REQUIRES_X86_SSE41;
4186     for (size_t channels = 1; channels < 16; channels++) {
4187       MaxPoolMicrokernelTester()
4188         .pooling_elements(9)
4189         .pooling_tile(9, 8)
4190         .channels(channels)
4191         .qmin(std::numeric_limits<int8_t>::min())
4192         .qmax(std::numeric_limits<int8_t>::max())
4193         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4194     }
4195   }
4196 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_fulltile_with_input_offset)4197   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
4198     TEST_REQUIRES_X86_SSE41;
4199     for (size_t channels = 1; channels < 16; channels++) {
4200       MaxPoolMicrokernelTester()
4201         .pooling_elements(9)
4202         .pooling_tile(9, 8)
4203         .channels(channels)
4204         .input_offset(17)
4205         .qmin(std::numeric_limits<int8_t>::min())
4206         .qmax(std::numeric_limits<int8_t>::max())
4207         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4208     }
4209   }
4210 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_fulltile_with_qmin)4211   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_fulltile_with_qmin) {
4212     TEST_REQUIRES_X86_SSE41;
4213     for (size_t channels = 1; channels < 16; channels++) {
4214       MaxPoolMicrokernelTester()
4215         .pooling_elements(9)
4216         .pooling_tile(9, 8)
4217         .channels(channels)
4218         .qmin(-64)
4219         .qmax(std::numeric_limits<int8_t>::max())
4220         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4221     }
4222   }
4223 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_fulltile_with_qmax)4224   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_fulltile_with_qmax) {
4225     TEST_REQUIRES_X86_SSE41;
4226     for (size_t channels = 1; channels < 16; channels++) {
4227       MaxPoolMicrokernelTester()
4228         .pooling_elements(9)
4229         .pooling_tile(9, 8)
4230         .channels(channels)
4231         .qmin(std::numeric_limits<int8_t>::min())
4232         .qmax(64)
4233         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4234     }
4235   }
4236 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_subtile)4237   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_subtile) {
4238     TEST_REQUIRES_X86_SSE41;
4239     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4240       for (size_t channels = 1; channels < 16; channels++) {
4241         MaxPoolMicrokernelTester()
4242           .pooling_elements(pooling_elements)
4243           .pooling_tile(9, 8)
4244           .channels(channels)
4245           .qmin(std::numeric_limits<int8_t>::min())
4246           .qmax(std::numeric_limits<int8_t>::max())
4247           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4248       }
4249     }
4250   }
4251 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_unipass_subtile_with_input_offset)4252   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_unipass_subtile_with_input_offset) {
4253     TEST_REQUIRES_X86_SSE41;
4254     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4255       for (size_t channels = 1; channels < 16; channels++) {
4256         MaxPoolMicrokernelTester()
4257           .pooling_elements(pooling_elements)
4258           .pooling_tile(9, 8)
4259           .channels(channels)
4260           .input_offset(17)
4261           .qmin(std::numeric_limits<int8_t>::min())
4262           .qmax(std::numeric_limits<int8_t>::max())
4263           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4264       }
4265     }
4266   }
4267 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_fulltile)4268   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_fulltile) {
4269     TEST_REQUIRES_X86_SSE41;
4270     for (size_t channels = 17; channels < 32; channels++) {
4271       MaxPoolMicrokernelTester()
4272         .pooling_elements(9)
4273         .pooling_tile(9, 8)
4274         .channels(channels)
4275         .qmin(std::numeric_limits<int8_t>::min())
4276         .qmax(std::numeric_limits<int8_t>::max())
4277         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4278     }
4279   }
4280 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_fulltile_with_input_offset)4281   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
4282     TEST_REQUIRES_X86_SSE41;
4283     for (size_t channels = 17; channels < 32; channels++) {
4284       MaxPoolMicrokernelTester()
4285         .pooling_elements(9)
4286         .pooling_tile(9, 8)
4287         .channels(channels)
4288         .input_offset(37)
4289         .qmin(std::numeric_limits<int8_t>::min())
4290         .qmax(std::numeric_limits<int8_t>::max())
4291         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4292     }
4293   }
4294 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_fulltile_with_qmin)4295   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_fulltile_with_qmin) {
4296     TEST_REQUIRES_X86_SSE41;
4297     for (size_t channels = 17; channels < 32; channels++) {
4298       MaxPoolMicrokernelTester()
4299         .pooling_elements(9)
4300         .pooling_tile(9, 8)
4301         .channels(channels)
4302         .qmin(-64)
4303         .qmax(std::numeric_limits<int8_t>::max())
4304         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4305     }
4306   }
4307 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_fulltile_with_qmax)4308   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_fulltile_with_qmax) {
4309     TEST_REQUIRES_X86_SSE41;
4310     for (size_t channels = 17; channels < 32; channels++) {
4311       MaxPoolMicrokernelTester()
4312         .pooling_elements(9)
4313         .pooling_tile(9, 8)
4314         .channels(channels)
4315         .qmin(std::numeric_limits<int8_t>::min())
4316         .qmax(64)
4317         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4318     }
4319   }
4320 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_subtile)4321   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_subtile) {
4322     TEST_REQUIRES_X86_SSE41;
4323     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4324       for (size_t channels = 17; channels < 32; channels++) {
4325         MaxPoolMicrokernelTester()
4326           .pooling_elements(pooling_elements)
4327           .pooling_tile(9, 8)
4328           .channels(channels)
4329           .qmin(std::numeric_limits<int8_t>::min())
4330           .qmax(std::numeric_limits<int8_t>::max())
4331           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4332       }
4333     }
4334   }
4335 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_unipass_subtile_with_input_offset)4336   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_unipass_subtile_with_input_offset) {
4337     TEST_REQUIRES_X86_SSE41;
4338     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
4339       for (size_t channels = 17; channels < 32; channels++) {
4340         MaxPoolMicrokernelTester()
4341           .pooling_elements(pooling_elements)
4342           .pooling_tile(9, 8)
4343           .channels(channels)
4344           .input_offset(37)
4345           .qmin(std::numeric_limits<int8_t>::min())
4346           .qmax(std::numeric_limits<int8_t>::max())
4347           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4348       }
4349     }
4350   }
4351 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_fulltile)4352   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_fulltile) {
4353     TEST_REQUIRES_X86_SSE41;
4354     MaxPoolMicrokernelTester()
4355       .pooling_elements(17)
4356       .pooling_tile(9, 8)
4357       .channels(16)
4358       .qmin(std::numeric_limits<int8_t>::min())
4359       .qmax(std::numeric_limits<int8_t>::max())
4360       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4361   }
4362 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_fulltile_with_input_offset)4363   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
4364     TEST_REQUIRES_X86_SSE41;
4365     MaxPoolMicrokernelTester()
4366       .pooling_elements(17)
4367       .pooling_tile(9, 8)
4368       .channels(16)
4369       .input_offset(19)
4370       .qmin(std::numeric_limits<int8_t>::min())
4371       .qmax(std::numeric_limits<int8_t>::max())
4372       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4373   }
4374 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_fulltile_with_qmin)4375   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_fulltile_with_qmin) {
4376     TEST_REQUIRES_X86_SSE41;
4377     MaxPoolMicrokernelTester()
4378       .pooling_elements(17)
4379       .pooling_tile(9, 8)
4380       .channels(16)
4381       .qmin(-64)
4382       .qmax(std::numeric_limits<int8_t>::max())
4383       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4384   }
4385 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_fulltile_with_qmax)4386   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_fulltile_with_qmax) {
4387     TEST_REQUIRES_X86_SSE41;
4388     MaxPoolMicrokernelTester()
4389       .pooling_elements(17)
4390       .pooling_tile(9, 8)
4391       .channels(16)
4392       .qmin(std::numeric_limits<int8_t>::min())
4393       .qmax(64)
4394       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4395   }
4396 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_subtile)4397   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_subtile) {
4398     TEST_REQUIRES_X86_SSE41;
4399     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4400       MaxPoolMicrokernelTester()
4401         .pooling_elements(pooling_elements)
4402         .pooling_tile(9, 8)
4403         .channels(16)
4404         .qmin(std::numeric_limits<int8_t>::min())
4405         .qmax(std::numeric_limits<int8_t>::max())
4406         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4407     }
4408   }
4409 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_twopass_subtile_with_input_offset)4410   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_twopass_subtile_with_input_offset) {
4411     TEST_REQUIRES_X86_SSE41;
4412     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4413       MaxPoolMicrokernelTester()
4414         .pooling_elements(pooling_elements)
4415         .pooling_tile(9, 8)
4416         .channels(16)
4417         .input_offset(19)
4418         .qmin(std::numeric_limits<int8_t>::min())
4419         .qmax(std::numeric_limits<int8_t>::max())
4420         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4421     }
4422   }
4423 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_fulltile)4424   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_fulltile) {
4425     TEST_REQUIRES_X86_SSE41;
4426     for (size_t channels = 32; channels < 128; channels += 16) {
4427       MaxPoolMicrokernelTester()
4428         .pooling_elements(17)
4429         .pooling_tile(9, 8)
4430         .channels(channels)
4431         .qmin(std::numeric_limits<int8_t>::min())
4432         .qmax(std::numeric_limits<int8_t>::max())
4433         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4434     }
4435   }
4436 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_fulltile_with_input_offset)4437   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_fulltile_with_input_offset) {
4438     TEST_REQUIRES_X86_SSE41;
4439     for (size_t channels = 32; channels < 128; channels += 16) {
4440       MaxPoolMicrokernelTester()
4441         .pooling_elements(17)
4442         .pooling_tile(9, 8)
4443         .channels(channels)
4444         .input_offset(83)
4445         .qmin(std::numeric_limits<int8_t>::min())
4446         .qmax(std::numeric_limits<int8_t>::max())
4447         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4448     }
4449   }
4450 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_fulltile_with_qmin)4451   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_fulltile_with_qmin) {
4452     TEST_REQUIRES_X86_SSE41;
4453     for (size_t channels = 32; channels < 128; channels += 16) {
4454       MaxPoolMicrokernelTester()
4455         .pooling_elements(17)
4456         .pooling_tile(9, 8)
4457         .channels(channels)
4458         .qmin(-64)
4459         .qmax(std::numeric_limits<int8_t>::max())
4460         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4461     }
4462   }
4463 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_fulltile_with_qmax)4464   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_fulltile_with_qmax) {
4465     TEST_REQUIRES_X86_SSE41;
4466     for (size_t channels = 32; channels < 128; channels += 16) {
4467       MaxPoolMicrokernelTester()
4468         .pooling_elements(17)
4469         .pooling_tile(9, 8)
4470         .channels(channels)
4471         .qmin(std::numeric_limits<int8_t>::min())
4472         .qmax(64)
4473         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4474     }
4475   }
4476 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_subtile)4477   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_subtile) {
4478     TEST_REQUIRES_X86_SSE41;
4479     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4480       for (size_t channels = 32; channels < 128; channels += 16) {
4481         MaxPoolMicrokernelTester()
4482           .pooling_elements(pooling_elements)
4483           .pooling_tile(9, 8)
4484           .channels(channels)
4485           .qmin(std::numeric_limits<int8_t>::min())
4486           .qmax(std::numeric_limits<int8_t>::max())
4487           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4488       }
4489     }
4490   }
4491 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_twopass_subtile_with_input_offset)4492   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_twopass_subtile_with_input_offset) {
4493     TEST_REQUIRES_X86_SSE41;
4494     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4495       for (size_t channels = 32; channels < 128; channels += 16) {
4496         MaxPoolMicrokernelTester()
4497           .pooling_elements(pooling_elements)
4498           .pooling_tile(9, 8)
4499           .channels(channels)
4500           .input_offset(131)
4501           .qmin(std::numeric_limits<int8_t>::min())
4502           .qmax(std::numeric_limits<int8_t>::max())
4503           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4504       }
4505     }
4506   }
4507 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_fulltile)4508   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_fulltile) {
4509     TEST_REQUIRES_X86_SSE41;
4510     for (size_t channels = 1; channels < 16; channels++) {
4511       MaxPoolMicrokernelTester()
4512         .pooling_elements(17)
4513         .pooling_tile(9, 8)
4514         .channels(channels)
4515         .qmin(std::numeric_limits<int8_t>::min())
4516         .qmax(std::numeric_limits<int8_t>::max())
4517         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4518     }
4519   }
4520 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_fulltile_with_input_offset)4521   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
4522     TEST_REQUIRES_X86_SSE41;
4523     for (size_t channels = 1; channels < 16; channels++) {
4524       MaxPoolMicrokernelTester()
4525         .pooling_elements(17)
4526         .pooling_tile(9, 8)
4527         .channels(channels)
4528         .input_offset(17)
4529         .qmin(std::numeric_limits<int8_t>::min())
4530         .qmax(std::numeric_limits<int8_t>::max())
4531         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4532     }
4533   }
4534 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_fulltile_with_qmin)4535   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_fulltile_with_qmin) {
4536     TEST_REQUIRES_X86_SSE41;
4537     for (size_t channels = 1; channels < 16; channels++) {
4538       MaxPoolMicrokernelTester()
4539         .pooling_elements(17)
4540         .pooling_tile(9, 8)
4541         .channels(channels)
4542         .qmin(-64)
4543         .qmax(std::numeric_limits<int8_t>::max())
4544         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4545     }
4546   }
4547 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_fulltile_with_qmax)4548   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_fulltile_with_qmax) {
4549     TEST_REQUIRES_X86_SSE41;
4550     for (size_t channels = 1; channels < 16; channels++) {
4551       MaxPoolMicrokernelTester()
4552         .pooling_elements(17)
4553         .pooling_tile(9, 8)
4554         .channels(channels)
4555         .qmin(std::numeric_limits<int8_t>::min())
4556         .qmax(64)
4557         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4558     }
4559   }
4560 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_subtile)4561   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_subtile) {
4562     TEST_REQUIRES_X86_SSE41;
4563     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4564       for (size_t channels = 1; channels < 16; channels++) {
4565         MaxPoolMicrokernelTester()
4566           .pooling_elements(pooling_elements)
4567           .pooling_tile(9, 8)
4568           .channels(channels)
4569           .qmin(std::numeric_limits<int8_t>::min())
4570           .qmax(std::numeric_limits<int8_t>::max())
4571           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4572       }
4573     }
4574   }
4575 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_twopass_subtile_with_input_offset)4576   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_twopass_subtile_with_input_offset) {
4577     TEST_REQUIRES_X86_SSE41;
4578     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4579       for (size_t channels = 1; channels < 16; channels++) {
4580         MaxPoolMicrokernelTester()
4581           .pooling_elements(pooling_elements)
4582           .pooling_tile(9, 8)
4583           .channels(channels)
4584           .input_offset(17)
4585           .qmin(std::numeric_limits<int8_t>::min())
4586           .qmax(std::numeric_limits<int8_t>::max())
4587           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4588       }
4589     }
4590   }
4591 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_fulltile)4592   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_fulltile) {
4593     TEST_REQUIRES_X86_SSE41;
4594     for (size_t channels = 17; channels < 32; channels++) {
4595       MaxPoolMicrokernelTester()
4596         .pooling_elements(17)
4597         .pooling_tile(9, 8)
4598         .channels(channels)
4599         .qmin(std::numeric_limits<int8_t>::min())
4600         .qmax(std::numeric_limits<int8_t>::max())
4601         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4602     }
4603   }
4604 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_fulltile_with_input_offset)4605   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
4606     TEST_REQUIRES_X86_SSE41;
4607     for (size_t channels = 17; channels < 32; channels++) {
4608       MaxPoolMicrokernelTester()
4609         .pooling_elements(17)
4610         .pooling_tile(9, 8)
4611         .channels(channels)
4612         .input_offset(37)
4613         .qmin(std::numeric_limits<int8_t>::min())
4614         .qmax(std::numeric_limits<int8_t>::max())
4615         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4616     }
4617   }
4618 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_fulltile_with_qmin)4619   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_fulltile_with_qmin) {
4620     TEST_REQUIRES_X86_SSE41;
4621     for (size_t channels = 17; channels < 32; channels++) {
4622       MaxPoolMicrokernelTester()
4623         .pooling_elements(17)
4624         .pooling_tile(9, 8)
4625         .channels(channels)
4626         .qmin(-64)
4627         .qmax(std::numeric_limits<int8_t>::max())
4628         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4629     }
4630   }
4631 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_fulltile_with_qmax)4632   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_fulltile_with_qmax) {
4633     TEST_REQUIRES_X86_SSE41;
4634     for (size_t channels = 17; channels < 32; channels++) {
4635       MaxPoolMicrokernelTester()
4636         .pooling_elements(17)
4637         .pooling_tile(9, 8)
4638         .channels(channels)
4639         .qmin(std::numeric_limits<int8_t>::min())
4640         .qmax(64)
4641         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4642     }
4643   }
4644 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_subtile)4645   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_subtile) {
4646     TEST_REQUIRES_X86_SSE41;
4647     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4648       for (size_t channels = 17; channels < 32; channels++) {
4649         MaxPoolMicrokernelTester()
4650           .pooling_elements(pooling_elements)
4651           .pooling_tile(9, 8)
4652           .channels(channels)
4653           .qmin(std::numeric_limits<int8_t>::min())
4654           .qmax(std::numeric_limits<int8_t>::max())
4655           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4656       }
4657     }
4658   }
4659 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_twopass_subtile_with_input_offset)4660   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_twopass_subtile_with_input_offset) {
4661     TEST_REQUIRES_X86_SSE41;
4662     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
4663       for (size_t channels = 17; channels < 32; channels++) {
4664         MaxPoolMicrokernelTester()
4665           .pooling_elements(pooling_elements)
4666           .pooling_tile(9, 8)
4667           .channels(channels)
4668           .input_offset(37)
4669           .qmin(std::numeric_limits<int8_t>::min())
4670           .qmax(std::numeric_limits<int8_t>::max())
4671           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4672       }
4673     }
4674   }
4675 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_multipass)4676   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_multipass) {
4677     TEST_REQUIRES_X86_SSE41;
4678     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4679       MaxPoolMicrokernelTester()
4680         .pooling_elements(pooling_elements)
4681         .pooling_tile(9, 8)
4682         .channels(16)
4683         .qmin(std::numeric_limits<int8_t>::min())
4684         .qmax(std::numeric_limits<int8_t>::max())
4685         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4686     }
4687   }
4688 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_multipass_with_input_offset)4689   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_multipass_with_input_offset) {
4690     TEST_REQUIRES_X86_SSE41;
4691     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4692       MaxPoolMicrokernelTester()
4693         .pooling_elements(pooling_elements)
4694         .pooling_tile(9, 8)
4695         .channels(16)
4696         .input_offset(19)
4697         .qmin(std::numeric_limits<int8_t>::min())
4698         .qmax(std::numeric_limits<int8_t>::max())
4699         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4700     }
4701   }
4702 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_multipass_with_qmin)4703   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_multipass_with_qmin) {
4704     TEST_REQUIRES_X86_SSE41;
4705     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4706       MaxPoolMicrokernelTester()
4707         .pooling_elements(pooling_elements)
4708         .pooling_tile(9, 8)
4709         .channels(16)
4710         .qmin(-64)
4711         .qmax(std::numeric_limits<int8_t>::max())
4712         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4713     }
4714   }
4715 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_eq_16_multipass_with_qmax)4716   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_eq_16_multipass_with_qmax) {
4717     TEST_REQUIRES_X86_SSE41;
4718     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4719       MaxPoolMicrokernelTester()
4720         .pooling_elements(pooling_elements)
4721         .pooling_tile(9, 8)
4722         .channels(16)
4723         .qmin(std::numeric_limits<int8_t>::min())
4724         .qmax(64)
4725         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4726     }
4727   }
4728 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_multipass)4729   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_multipass) {
4730     TEST_REQUIRES_X86_SSE41;
4731     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4732       for (size_t channels = 32; channels < 128; channels += 16) {
4733         MaxPoolMicrokernelTester()
4734           .pooling_elements(pooling_elements)
4735           .pooling_tile(9, 8)
4736           .channels(channels)
4737           .qmin(std::numeric_limits<int8_t>::min())
4738           .qmax(std::numeric_limits<int8_t>::max())
4739           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4740       }
4741     }
4742   }
4743 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_multipass_with_input_offset)4744   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_multipass_with_input_offset) {
4745     TEST_REQUIRES_X86_SSE41;
4746     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4747       for (size_t channels = 32; channels < 128; channels += 16) {
4748         MaxPoolMicrokernelTester()
4749           .pooling_elements(pooling_elements)
4750           .pooling_tile(9, 8)
4751           .channels(channels)
4752           .input_offset(131)
4753           .qmin(std::numeric_limits<int8_t>::min())
4754           .qmax(std::numeric_limits<int8_t>::max())
4755           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4756       }
4757     }
4758   }
4759 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_multipass_with_qmin)4760   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_multipass_with_qmin) {
4761     TEST_REQUIRES_X86_SSE41;
4762     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4763       for (size_t channels = 32; channels < 128; channels += 16) {
4764         MaxPoolMicrokernelTester()
4765           .pooling_elements(pooling_elements)
4766           .pooling_tile(9, 8)
4767           .channels(channels)
4768           .qmin(-64)
4769           .qmax(std::numeric_limits<int8_t>::max())
4770           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4771       }
4772     }
4773   }
4774 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_div_16_multipass_with_qmax)4775   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_div_16_multipass_with_qmax) {
4776     TEST_REQUIRES_X86_SSE41;
4777     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4778       for (size_t channels = 32; channels < 128; channels += 16) {
4779         MaxPoolMicrokernelTester()
4780           .pooling_elements(pooling_elements)
4781           .pooling_tile(9, 8)
4782           .channels(channels)
4783           .qmin(std::numeric_limits<int8_t>::min())
4784           .qmax(64)
4785           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4786       }
4787     }
4788   }
4789 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_multipass)4790   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_multipass) {
4791     TEST_REQUIRES_X86_SSE41;
4792     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4793       for (size_t channels = 1; channels < 16; channels++) {
4794         MaxPoolMicrokernelTester()
4795           .pooling_elements(pooling_elements)
4796           .pooling_tile(9, 8)
4797           .channels(channels)
4798           .qmin(std::numeric_limits<int8_t>::min())
4799           .qmax(std::numeric_limits<int8_t>::max())
4800           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4801       }
4802     }
4803   }
4804 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_multipass_with_input_offset)4805   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_multipass_with_input_offset) {
4806     TEST_REQUIRES_X86_SSE41;
4807     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4808       for (size_t channels = 1; channels < 16; channels++) {
4809         MaxPoolMicrokernelTester()
4810           .pooling_elements(pooling_elements)
4811           .pooling_tile(9, 8)
4812           .channels(channels)
4813           .input_offset(16)
4814           .qmin(std::numeric_limits<int8_t>::min())
4815           .qmax(std::numeric_limits<int8_t>::max())
4816           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4817       }
4818     }
4819   }
4820 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_multipass_with_qmin)4821   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_multipass_with_qmin) {
4822     TEST_REQUIRES_X86_SSE41;
4823     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4824       for (size_t channels = 1; channels < 16; channels++) {
4825         MaxPoolMicrokernelTester()
4826           .pooling_elements(pooling_elements)
4827           .pooling_tile(9, 8)
4828           .channels(channels)
4829           .qmin(-64)
4830           .qmax(std::numeric_limits<int8_t>::max())
4831           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4832       }
4833     }
4834   }
4835 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_lt_16_multipass_with_qmax)4836   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_lt_16_multipass_with_qmax) {
4837     TEST_REQUIRES_X86_SSE41;
4838     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4839       for (size_t channels = 1; channels < 16; channels++) {
4840         MaxPoolMicrokernelTester()
4841           .pooling_elements(pooling_elements)
4842           .pooling_tile(9, 8)
4843           .channels(channels)
4844           .qmin(std::numeric_limits<int8_t>::min())
4845           .qmax(64)
4846           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4847       }
4848     }
4849   }
4850 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_multipass)4851   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_multipass) {
4852     TEST_REQUIRES_X86_SSE41;
4853     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4854       for (size_t channels = 17; channels < 32; channels++) {
4855         MaxPoolMicrokernelTester()
4856           .pooling_elements(pooling_elements)
4857           .pooling_tile(9, 8)
4858           .channels(channels)
4859           .qmin(std::numeric_limits<int8_t>::min())
4860           .qmax(std::numeric_limits<int8_t>::max())
4861           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4862       }
4863     }
4864   }
4865 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_multipass_with_input_offset)4866   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_multipass_with_input_offset) {
4867     TEST_REQUIRES_X86_SSE41;
4868     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4869       for (size_t channels = 17; channels < 32; channels++) {
4870         MaxPoolMicrokernelTester()
4871           .pooling_elements(pooling_elements)
4872           .pooling_tile(9, 8)
4873           .channels(channels)
4874           .input_offset(37)
4875           .qmin(std::numeric_limits<int8_t>::min())
4876           .qmax(std::numeric_limits<int8_t>::max())
4877           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4878       }
4879     }
4880   }
4881 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_multipass_with_qmin)4882   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_multipass_with_qmin) {
4883     TEST_REQUIRES_X86_SSE41;
4884     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4885       for (size_t channels = 17; channels < 32; channels++) {
4886         MaxPoolMicrokernelTester()
4887           .pooling_elements(pooling_elements)
4888           .pooling_tile(9, 8)
4889           .channels(channels)
4890           .qmin(-64)
4891           .qmax(std::numeric_limits<int8_t>::max())
4892           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4893       }
4894     }
4895   }
4896 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,channels_gt_16_multipass_with_qmax)4897   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, channels_gt_16_multipass_with_qmax) {
4898     TEST_REQUIRES_X86_SSE41;
4899     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
4900       for (size_t channels = 17; channels < 32; channels++) {
4901         MaxPoolMicrokernelTester()
4902           .pooling_elements(pooling_elements)
4903           .pooling_tile(9, 8)
4904           .channels(channels)
4905           .qmin(std::numeric_limits<int8_t>::min())
4906           .qmax(64)
4907           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4908       }
4909     }
4910   }
4911 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels)4912   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels) {
4913     TEST_REQUIRES_X86_SSE41;
4914     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4915       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4916         for (size_t channels = 1; channels <= 80; channels += 15) {
4917           MaxPoolMicrokernelTester()
4918             .output_pixels(output_pixels)
4919             .pooling_elements(pooling_elements)
4920             .pooling_tile(9, 8)
4921             .channels(channels)
4922             .qmin(std::numeric_limits<int8_t>::min())
4923             .qmax(std::numeric_limits<int8_t>::max())
4924             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4925         }
4926       }
4927     }
4928   }
4929 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels_with_input_offset)4930   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels_with_input_offset) {
4931     TEST_REQUIRES_X86_SSE41;
4932     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4933       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4934         for (size_t channels = 1; channels <= 80; channels += 15) {
4935           MaxPoolMicrokernelTester()
4936             .output_pixels(output_pixels)
4937             .pooling_elements(pooling_elements)
4938             .pooling_tile(9, 8)
4939             .channels(channels)
4940             .input_offset(83)
4941             .qmin(std::numeric_limits<int8_t>::min())
4942             .qmax(std::numeric_limits<int8_t>::max())
4943             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4944         }
4945       }
4946     }
4947   }
4948 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels_with_qmin)4949   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels_with_qmin) {
4950     TEST_REQUIRES_X86_SSE41;
4951     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4952       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4953         for (size_t channels = 1; channels <= 80; channels += 15) {
4954           MaxPoolMicrokernelTester()
4955             .output_pixels(output_pixels)
4956             .pooling_elements(pooling_elements)
4957             .pooling_tile(9, 8)
4958             .channels(channels)
4959             .qmin(-64)
4960             .qmax(std::numeric_limits<int8_t>::max())
4961             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4962         }
4963       }
4964     }
4965   }
4966 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels_with_qmax)4967   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels_with_qmax) {
4968     TEST_REQUIRES_X86_SSE41;
4969     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4970       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4971         for (size_t channels = 1; channels <= 80; channels += 15) {
4972           MaxPoolMicrokernelTester()
4973             .output_pixels(output_pixels)
4974             .pooling_elements(pooling_elements)
4975             .pooling_tile(9, 8)
4976             .channels(channels)
4977             .qmin(std::numeric_limits<int8_t>::min())
4978             .qmax(64)
4979             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4980         }
4981       }
4982     }
4983   }
4984 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels_with_output_stride)4985   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels_with_output_stride) {
4986     TEST_REQUIRES_X86_SSE41;
4987     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
4988       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
4989         for (size_t channels = 1; channels <= 80; channels += 15) {
4990           MaxPoolMicrokernelTester()
4991             .output_pixels(output_pixels)
4992             .pooling_elements(pooling_elements)
4993             .pooling_tile(9, 8)
4994             .channels(channels)
4995             .output_stride(83)
4996             .qmin(std::numeric_limits<int8_t>::min())
4997             .qmax(std::numeric_limits<int8_t>::max())
4998             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
4999         }
5000       }
5001     }
5002   }
5003 
TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16,few_output_pixels_with_step)5004   TEST(S8_MAXPOOL_MINMAX_9P8X__SSE41_C16, few_output_pixels_with_step) {
5005     TEST_REQUIRES_X86_SSE41;
5006     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5007       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5008         for (size_t channels = 1; channels <= 80; channels += 15) {
5009           for (size_t step = 2; step <= pooling_elements; step++) {
5010             MaxPoolMicrokernelTester()
5011               .output_pixels(output_pixels)
5012               .pooling_elements(pooling_elements)
5013               .pooling_tile(9, 8)
5014               .step(step)
5015               .channels(channels)
5016               .output_stride(83)
5017               .qmin(std::numeric_limits<int8_t>::min())
5018               .qmax(std::numeric_limits<int8_t>::max())
5019               .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__sse41_c16, xnn_init_s8_minmax_sse4_params);
5020           }
5021         }
5022       }
5023     }
5024   }
5025 #endif  // XNN_ARCH_X86 || XNN_ARCH_X86_64
5026 
5027 
5028 #if XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile)5029   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile) {
5030     MaxPoolMicrokernelTester()
5031       .pooling_elements(9)
5032       .pooling_tile(9, 8)
5033       .channels(16)
5034       .qmin(std::numeric_limits<int8_t>::min())
5035       .qmax(std::numeric_limits<int8_t>::max())
5036       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5037   }
5038 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_input_offset)5039   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_input_offset) {
5040     MaxPoolMicrokernelTester()
5041       .pooling_elements(9)
5042       .pooling_tile(9, 8)
5043       .channels(16)
5044       .input_offset(19)
5045       .qmin(std::numeric_limits<int8_t>::min())
5046       .qmax(std::numeric_limits<int8_t>::max())
5047       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5048   }
5049 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_qmin)5050   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_qmin) {
5051     MaxPoolMicrokernelTester()
5052       .pooling_elements(9)
5053       .pooling_tile(9, 8)
5054       .channels(16)
5055       .qmin(-64)
5056       .qmax(std::numeric_limits<int8_t>::max())
5057       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5058   }
5059 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_fulltile_with_qmax)5060   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_fulltile_with_qmax) {
5061     MaxPoolMicrokernelTester()
5062       .pooling_elements(9)
5063       .pooling_tile(9, 8)
5064       .channels(16)
5065       .qmin(std::numeric_limits<int8_t>::min())
5066       .qmax(64)
5067       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5068   }
5069 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_subtile)5070   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_subtile) {
5071     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5072       MaxPoolMicrokernelTester()
5073         .pooling_elements(pooling_elements)
5074         .pooling_tile(9, 8)
5075         .channels(16)
5076         .qmin(std::numeric_limits<int8_t>::min())
5077         .qmax(std::numeric_limits<int8_t>::max())
5078         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5079     }
5080   }
5081 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_unipass_subtile_with_input_offset)5082   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_unipass_subtile_with_input_offset) {
5083     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5084       MaxPoolMicrokernelTester()
5085         .pooling_elements(pooling_elements)
5086         .pooling_tile(9, 8)
5087         .channels(16)
5088         .input_offset(19)
5089         .qmin(std::numeric_limits<int8_t>::min())
5090         .qmax(std::numeric_limits<int8_t>::max())
5091         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5092     }
5093   }
5094 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile)5095   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile) {
5096     for (size_t channels = 32; channels < 128; channels += 16) {
5097       MaxPoolMicrokernelTester()
5098         .pooling_elements(9)
5099         .pooling_tile(9, 8)
5100         .channels(channels)
5101         .qmin(std::numeric_limits<int8_t>::min())
5102         .qmax(std::numeric_limits<int8_t>::max())
5103         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5104     }
5105   }
5106 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_input_offset)5107   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_input_offset) {
5108     for (size_t channels = 32; channels < 128; channels += 16) {
5109       MaxPoolMicrokernelTester()
5110         .pooling_elements(9)
5111         .pooling_tile(9, 8)
5112         .channels(channels)
5113         .input_offset(131)
5114         .qmin(std::numeric_limits<int8_t>::min())
5115         .qmax(std::numeric_limits<int8_t>::max())
5116         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5117     }
5118   }
5119 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_qmin)5120   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_qmin) {
5121     for (size_t channels = 32; channels < 128; channels += 16) {
5122       MaxPoolMicrokernelTester()
5123         .pooling_elements(9)
5124         .pooling_tile(9, 8)
5125         .channels(channels)
5126         .qmin(-64)
5127         .qmax(std::numeric_limits<int8_t>::max())
5128         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5129     }
5130   }
5131 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_fulltile_with_qmax)5132   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_fulltile_with_qmax) {
5133     for (size_t channels = 32; channels < 128; channels += 16) {
5134       MaxPoolMicrokernelTester()
5135         .pooling_elements(9)
5136         .pooling_tile(9, 8)
5137         .channels(channels)
5138         .qmin(std::numeric_limits<int8_t>::min())
5139         .qmax(64)
5140         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5141     }
5142   }
5143 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_subtile)5144   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_subtile) {
5145     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5146       for (size_t channels = 32; channels < 128; channels += 16) {
5147         MaxPoolMicrokernelTester()
5148           .pooling_elements(pooling_elements)
5149           .pooling_tile(9, 8)
5150           .channels(channels)
5151           .qmin(std::numeric_limits<int8_t>::min())
5152           .qmax(std::numeric_limits<int8_t>::max())
5153           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5154       }
5155     }
5156   }
5157 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_unipass_subtile_with_input_offset)5158   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_unipass_subtile_with_input_offset) {
5159     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5160       for (size_t channels = 32; channels < 128; channels += 16) {
5161         MaxPoolMicrokernelTester()
5162           .pooling_elements(pooling_elements)
5163           .pooling_tile(9, 8)
5164           .channels(channels)
5165           .input_offset(131)
5166           .qmin(std::numeric_limits<int8_t>::min())
5167           .qmax(std::numeric_limits<int8_t>::max())
5168           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5169       }
5170     }
5171   }
5172 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile)5173   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile) {
5174     for (size_t channels = 1; channels < 16; channels++) {
5175       MaxPoolMicrokernelTester()
5176         .pooling_elements(9)
5177         .pooling_tile(9, 8)
5178         .channels(channels)
5179         .qmin(std::numeric_limits<int8_t>::min())
5180         .qmax(std::numeric_limits<int8_t>::max())
5181         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5182     }
5183   }
5184 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_input_offset)5185   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_input_offset) {
5186     for (size_t channels = 1; channels < 16; channels++) {
5187       MaxPoolMicrokernelTester()
5188         .pooling_elements(9)
5189         .pooling_tile(9, 8)
5190         .channels(channels)
5191         .input_offset(17)
5192         .qmin(std::numeric_limits<int8_t>::min())
5193         .qmax(std::numeric_limits<int8_t>::max())
5194         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5195     }
5196   }
5197 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_qmin)5198   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_qmin) {
5199     for (size_t channels = 1; channels < 16; channels++) {
5200       MaxPoolMicrokernelTester()
5201         .pooling_elements(9)
5202         .pooling_tile(9, 8)
5203         .channels(channels)
5204         .qmin(-64)
5205         .qmax(std::numeric_limits<int8_t>::max())
5206         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5207     }
5208   }
5209 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_fulltile_with_qmax)5210   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_fulltile_with_qmax) {
5211     for (size_t channels = 1; channels < 16; channels++) {
5212       MaxPoolMicrokernelTester()
5213         .pooling_elements(9)
5214         .pooling_tile(9, 8)
5215         .channels(channels)
5216         .qmin(std::numeric_limits<int8_t>::min())
5217         .qmax(64)
5218         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5219     }
5220   }
5221 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_subtile)5222   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_subtile) {
5223     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5224       for (size_t channels = 1; channels < 16; channels++) {
5225         MaxPoolMicrokernelTester()
5226           .pooling_elements(pooling_elements)
5227           .pooling_tile(9, 8)
5228           .channels(channels)
5229           .qmin(std::numeric_limits<int8_t>::min())
5230           .qmax(std::numeric_limits<int8_t>::max())
5231           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5232       }
5233     }
5234   }
5235 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_unipass_subtile_with_input_offset)5236   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_unipass_subtile_with_input_offset) {
5237     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5238       for (size_t channels = 1; channels < 16; channels++) {
5239         MaxPoolMicrokernelTester()
5240           .pooling_elements(pooling_elements)
5241           .pooling_tile(9, 8)
5242           .channels(channels)
5243           .input_offset(17)
5244           .qmin(std::numeric_limits<int8_t>::min())
5245           .qmax(std::numeric_limits<int8_t>::max())
5246           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5247       }
5248     }
5249   }
5250 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile)5251   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile) {
5252     for (size_t channels = 17; channels < 32; channels++) {
5253       MaxPoolMicrokernelTester()
5254         .pooling_elements(9)
5255         .pooling_tile(9, 8)
5256         .channels(channels)
5257         .qmin(std::numeric_limits<int8_t>::min())
5258         .qmax(std::numeric_limits<int8_t>::max())
5259         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5260     }
5261   }
5262 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_input_offset)5263   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_input_offset) {
5264     for (size_t channels = 17; channels < 32; channels++) {
5265       MaxPoolMicrokernelTester()
5266         .pooling_elements(9)
5267         .pooling_tile(9, 8)
5268         .channels(channels)
5269         .input_offset(37)
5270         .qmin(std::numeric_limits<int8_t>::min())
5271         .qmax(std::numeric_limits<int8_t>::max())
5272         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5273     }
5274   }
5275 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_qmin)5276   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_qmin) {
5277     for (size_t channels = 17; channels < 32; channels++) {
5278       MaxPoolMicrokernelTester()
5279         .pooling_elements(9)
5280         .pooling_tile(9, 8)
5281         .channels(channels)
5282         .qmin(-64)
5283         .qmax(std::numeric_limits<int8_t>::max())
5284         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5285     }
5286   }
5287 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_fulltile_with_qmax)5288   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_fulltile_with_qmax) {
5289     for (size_t channels = 17; channels < 32; channels++) {
5290       MaxPoolMicrokernelTester()
5291         .pooling_elements(9)
5292         .pooling_tile(9, 8)
5293         .channels(channels)
5294         .qmin(std::numeric_limits<int8_t>::min())
5295         .qmax(64)
5296         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5297     }
5298   }
5299 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_subtile)5300   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_subtile) {
5301     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5302       for (size_t channels = 17; channels < 32; channels++) {
5303         MaxPoolMicrokernelTester()
5304           .pooling_elements(pooling_elements)
5305           .pooling_tile(9, 8)
5306           .channels(channels)
5307           .qmin(std::numeric_limits<int8_t>::min())
5308           .qmax(std::numeric_limits<int8_t>::max())
5309           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5310       }
5311     }
5312   }
5313 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_unipass_subtile_with_input_offset)5314   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_unipass_subtile_with_input_offset) {
5315     for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
5316       for (size_t channels = 17; channels < 32; channels++) {
5317         MaxPoolMicrokernelTester()
5318           .pooling_elements(pooling_elements)
5319           .pooling_tile(9, 8)
5320           .channels(channels)
5321           .input_offset(37)
5322           .qmin(std::numeric_limits<int8_t>::min())
5323           .qmax(std::numeric_limits<int8_t>::max())
5324           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5325       }
5326     }
5327   }
5328 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile)5329   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile) {
5330     MaxPoolMicrokernelTester()
5331       .pooling_elements(17)
5332       .pooling_tile(9, 8)
5333       .channels(16)
5334       .qmin(std::numeric_limits<int8_t>::min())
5335       .qmax(std::numeric_limits<int8_t>::max())
5336       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5337   }
5338 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_input_offset)5339   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_input_offset) {
5340     MaxPoolMicrokernelTester()
5341       .pooling_elements(17)
5342       .pooling_tile(9, 8)
5343       .channels(16)
5344       .input_offset(19)
5345       .qmin(std::numeric_limits<int8_t>::min())
5346       .qmax(std::numeric_limits<int8_t>::max())
5347       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5348   }
5349 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_qmin)5350   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_qmin) {
5351     MaxPoolMicrokernelTester()
5352       .pooling_elements(17)
5353       .pooling_tile(9, 8)
5354       .channels(16)
5355       .qmin(-64)
5356       .qmax(std::numeric_limits<int8_t>::max())
5357       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5358   }
5359 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_fulltile_with_qmax)5360   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_fulltile_with_qmax) {
5361     MaxPoolMicrokernelTester()
5362       .pooling_elements(17)
5363       .pooling_tile(9, 8)
5364       .channels(16)
5365       .qmin(std::numeric_limits<int8_t>::min())
5366       .qmax(64)
5367       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5368   }
5369 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_subtile)5370   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_subtile) {
5371     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5372       MaxPoolMicrokernelTester()
5373         .pooling_elements(pooling_elements)
5374         .pooling_tile(9, 8)
5375         .channels(16)
5376         .qmin(std::numeric_limits<int8_t>::min())
5377         .qmax(std::numeric_limits<int8_t>::max())
5378         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5379     }
5380   }
5381 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_twopass_subtile_with_input_offset)5382   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_twopass_subtile_with_input_offset) {
5383     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5384       MaxPoolMicrokernelTester()
5385         .pooling_elements(pooling_elements)
5386         .pooling_tile(9, 8)
5387         .channels(16)
5388         .input_offset(19)
5389         .qmin(std::numeric_limits<int8_t>::min())
5390         .qmax(std::numeric_limits<int8_t>::max())
5391         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5392     }
5393   }
5394 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile)5395   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile) {
5396     for (size_t channels = 32; channels < 128; channels += 16) {
5397       MaxPoolMicrokernelTester()
5398         .pooling_elements(17)
5399         .pooling_tile(9, 8)
5400         .channels(channels)
5401         .qmin(std::numeric_limits<int8_t>::min())
5402         .qmax(std::numeric_limits<int8_t>::max())
5403         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5404     }
5405   }
5406 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_input_offset)5407   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_input_offset) {
5408     for (size_t channels = 32; channels < 128; channels += 16) {
5409       MaxPoolMicrokernelTester()
5410         .pooling_elements(17)
5411         .pooling_tile(9, 8)
5412         .channels(channels)
5413         .input_offset(83)
5414         .qmin(std::numeric_limits<int8_t>::min())
5415         .qmax(std::numeric_limits<int8_t>::max())
5416         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5417     }
5418   }
5419 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_qmin)5420   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_qmin) {
5421     for (size_t channels = 32; channels < 128; channels += 16) {
5422       MaxPoolMicrokernelTester()
5423         .pooling_elements(17)
5424         .pooling_tile(9, 8)
5425         .channels(channels)
5426         .qmin(-64)
5427         .qmax(std::numeric_limits<int8_t>::max())
5428         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5429     }
5430   }
5431 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_fulltile_with_qmax)5432   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_fulltile_with_qmax) {
5433     for (size_t channels = 32; channels < 128; channels += 16) {
5434       MaxPoolMicrokernelTester()
5435         .pooling_elements(17)
5436         .pooling_tile(9, 8)
5437         .channels(channels)
5438         .qmin(std::numeric_limits<int8_t>::min())
5439         .qmax(64)
5440         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5441     }
5442   }
5443 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_subtile)5444   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_subtile) {
5445     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5446       for (size_t channels = 32; channels < 128; channels += 16) {
5447         MaxPoolMicrokernelTester()
5448           .pooling_elements(pooling_elements)
5449           .pooling_tile(9, 8)
5450           .channels(channels)
5451           .qmin(std::numeric_limits<int8_t>::min())
5452           .qmax(std::numeric_limits<int8_t>::max())
5453           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5454       }
5455     }
5456   }
5457 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_twopass_subtile_with_input_offset)5458   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_twopass_subtile_with_input_offset) {
5459     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5460       for (size_t channels = 32; channels < 128; channels += 16) {
5461         MaxPoolMicrokernelTester()
5462           .pooling_elements(pooling_elements)
5463           .pooling_tile(9, 8)
5464           .channels(channels)
5465           .input_offset(131)
5466           .qmin(std::numeric_limits<int8_t>::min())
5467           .qmax(std::numeric_limits<int8_t>::max())
5468           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5469       }
5470     }
5471   }
5472 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile)5473   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile) {
5474     for (size_t channels = 1; channels < 16; channels++) {
5475       MaxPoolMicrokernelTester()
5476         .pooling_elements(17)
5477         .pooling_tile(9, 8)
5478         .channels(channels)
5479         .qmin(std::numeric_limits<int8_t>::min())
5480         .qmax(std::numeric_limits<int8_t>::max())
5481         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5482     }
5483   }
5484 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_input_offset)5485   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_input_offset) {
5486     for (size_t channels = 1; channels < 16; channels++) {
5487       MaxPoolMicrokernelTester()
5488         .pooling_elements(17)
5489         .pooling_tile(9, 8)
5490         .channels(channels)
5491         .input_offset(17)
5492         .qmin(std::numeric_limits<int8_t>::min())
5493         .qmax(std::numeric_limits<int8_t>::max())
5494         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5495     }
5496   }
5497 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_qmin)5498   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_qmin) {
5499     for (size_t channels = 1; channels < 16; channels++) {
5500       MaxPoolMicrokernelTester()
5501         .pooling_elements(17)
5502         .pooling_tile(9, 8)
5503         .channels(channels)
5504         .qmin(-64)
5505         .qmax(std::numeric_limits<int8_t>::max())
5506         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5507     }
5508   }
5509 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_fulltile_with_qmax)5510   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_fulltile_with_qmax) {
5511     for (size_t channels = 1; channels < 16; channels++) {
5512       MaxPoolMicrokernelTester()
5513         .pooling_elements(17)
5514         .pooling_tile(9, 8)
5515         .channels(channels)
5516         .qmin(std::numeric_limits<int8_t>::min())
5517         .qmax(64)
5518         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5519     }
5520   }
5521 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_subtile)5522   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_subtile) {
5523     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5524       for (size_t channels = 1; channels < 16; channels++) {
5525         MaxPoolMicrokernelTester()
5526           .pooling_elements(pooling_elements)
5527           .pooling_tile(9, 8)
5528           .channels(channels)
5529           .qmin(std::numeric_limits<int8_t>::min())
5530           .qmax(std::numeric_limits<int8_t>::max())
5531           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5532       }
5533     }
5534   }
5535 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_twopass_subtile_with_input_offset)5536   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_twopass_subtile_with_input_offset) {
5537     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5538       for (size_t channels = 1; channels < 16; channels++) {
5539         MaxPoolMicrokernelTester()
5540           .pooling_elements(pooling_elements)
5541           .pooling_tile(9, 8)
5542           .channels(channels)
5543           .input_offset(17)
5544           .qmin(std::numeric_limits<int8_t>::min())
5545           .qmax(std::numeric_limits<int8_t>::max())
5546           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5547       }
5548     }
5549   }
5550 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile)5551   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile) {
5552     for (size_t channels = 17; channels < 32; channels++) {
5553       MaxPoolMicrokernelTester()
5554         .pooling_elements(17)
5555         .pooling_tile(9, 8)
5556         .channels(channels)
5557         .qmin(std::numeric_limits<int8_t>::min())
5558         .qmax(std::numeric_limits<int8_t>::max())
5559         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5560     }
5561   }
5562 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_input_offset)5563   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_input_offset) {
5564     for (size_t channels = 17; channels < 32; channels++) {
5565       MaxPoolMicrokernelTester()
5566         .pooling_elements(17)
5567         .pooling_tile(9, 8)
5568         .channels(channels)
5569         .input_offset(37)
5570         .qmin(std::numeric_limits<int8_t>::min())
5571         .qmax(std::numeric_limits<int8_t>::max())
5572         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5573     }
5574   }
5575 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_qmin)5576   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_qmin) {
5577     for (size_t channels = 17; channels < 32; channels++) {
5578       MaxPoolMicrokernelTester()
5579         .pooling_elements(17)
5580         .pooling_tile(9, 8)
5581         .channels(channels)
5582         .qmin(-64)
5583         .qmax(std::numeric_limits<int8_t>::max())
5584         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5585     }
5586   }
5587 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_fulltile_with_qmax)5588   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_fulltile_with_qmax) {
5589     for (size_t channels = 17; channels < 32; channels++) {
5590       MaxPoolMicrokernelTester()
5591         .pooling_elements(17)
5592         .pooling_tile(9, 8)
5593         .channels(channels)
5594         .qmin(std::numeric_limits<int8_t>::min())
5595         .qmax(64)
5596         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5597     }
5598   }
5599 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_subtile)5600   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_subtile) {
5601     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5602       for (size_t channels = 17; channels < 32; channels++) {
5603         MaxPoolMicrokernelTester()
5604           .pooling_elements(pooling_elements)
5605           .pooling_tile(9, 8)
5606           .channels(channels)
5607           .qmin(std::numeric_limits<int8_t>::min())
5608           .qmax(std::numeric_limits<int8_t>::max())
5609           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5610       }
5611     }
5612   }
5613 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_twopass_subtile_with_input_offset)5614   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_twopass_subtile_with_input_offset) {
5615     for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
5616       for (size_t channels = 17; channels < 32; channels++) {
5617         MaxPoolMicrokernelTester()
5618           .pooling_elements(pooling_elements)
5619           .pooling_tile(9, 8)
5620           .channels(channels)
5621           .input_offset(37)
5622           .qmin(std::numeric_limits<int8_t>::min())
5623           .qmax(std::numeric_limits<int8_t>::max())
5624           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5625       }
5626     }
5627   }
5628 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass)5629   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass) {
5630     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5631       MaxPoolMicrokernelTester()
5632         .pooling_elements(pooling_elements)
5633         .pooling_tile(9, 8)
5634         .channels(16)
5635         .qmin(std::numeric_limits<int8_t>::min())
5636         .qmax(std::numeric_limits<int8_t>::max())
5637         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5638     }
5639   }
5640 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_input_offset)5641   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_input_offset) {
5642     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5643       MaxPoolMicrokernelTester()
5644         .pooling_elements(pooling_elements)
5645         .pooling_tile(9, 8)
5646         .channels(16)
5647         .input_offset(19)
5648         .qmin(std::numeric_limits<int8_t>::min())
5649         .qmax(std::numeric_limits<int8_t>::max())
5650         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5651     }
5652   }
5653 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_qmin)5654   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_qmin) {
5655     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5656       MaxPoolMicrokernelTester()
5657         .pooling_elements(pooling_elements)
5658         .pooling_tile(9, 8)
5659         .channels(16)
5660         .qmin(-64)
5661         .qmax(std::numeric_limits<int8_t>::max())
5662         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5663     }
5664   }
5665 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_eq_16_multipass_with_qmax)5666   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_eq_16_multipass_with_qmax) {
5667     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5668       MaxPoolMicrokernelTester()
5669         .pooling_elements(pooling_elements)
5670         .pooling_tile(9, 8)
5671         .channels(16)
5672         .qmin(std::numeric_limits<int8_t>::min())
5673         .qmax(64)
5674         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5675     }
5676   }
5677 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass)5678   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass) {
5679     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5680       for (size_t channels = 32; channels < 128; channels += 16) {
5681         MaxPoolMicrokernelTester()
5682           .pooling_elements(pooling_elements)
5683           .pooling_tile(9, 8)
5684           .channels(channels)
5685           .qmin(std::numeric_limits<int8_t>::min())
5686           .qmax(std::numeric_limits<int8_t>::max())
5687           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5688       }
5689     }
5690   }
5691 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_input_offset)5692   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_input_offset) {
5693     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5694       for (size_t channels = 32; channels < 128; channels += 16) {
5695         MaxPoolMicrokernelTester()
5696           .pooling_elements(pooling_elements)
5697           .pooling_tile(9, 8)
5698           .channels(channels)
5699           .input_offset(131)
5700           .qmin(std::numeric_limits<int8_t>::min())
5701           .qmax(std::numeric_limits<int8_t>::max())
5702           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5703       }
5704     }
5705   }
5706 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_qmin)5707   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_qmin) {
5708     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5709       for (size_t channels = 32; channels < 128; channels += 16) {
5710         MaxPoolMicrokernelTester()
5711           .pooling_elements(pooling_elements)
5712           .pooling_tile(9, 8)
5713           .channels(channels)
5714           .qmin(-64)
5715           .qmax(std::numeric_limits<int8_t>::max())
5716           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5717       }
5718     }
5719   }
5720 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_div_16_multipass_with_qmax)5721   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_div_16_multipass_with_qmax) {
5722     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5723       for (size_t channels = 32; channels < 128; channels += 16) {
5724         MaxPoolMicrokernelTester()
5725           .pooling_elements(pooling_elements)
5726           .pooling_tile(9, 8)
5727           .channels(channels)
5728           .qmin(std::numeric_limits<int8_t>::min())
5729           .qmax(64)
5730           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5731       }
5732     }
5733   }
5734 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass)5735   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass) {
5736     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5737       for (size_t channels = 1; channels < 16; channels++) {
5738         MaxPoolMicrokernelTester()
5739           .pooling_elements(pooling_elements)
5740           .pooling_tile(9, 8)
5741           .channels(channels)
5742           .qmin(std::numeric_limits<int8_t>::min())
5743           .qmax(std::numeric_limits<int8_t>::max())
5744           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5745       }
5746     }
5747   }
5748 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_input_offset)5749   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_input_offset) {
5750     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5751       for (size_t channels = 1; channels < 16; channels++) {
5752         MaxPoolMicrokernelTester()
5753           .pooling_elements(pooling_elements)
5754           .pooling_tile(9, 8)
5755           .channels(channels)
5756           .input_offset(16)
5757           .qmin(std::numeric_limits<int8_t>::min())
5758           .qmax(std::numeric_limits<int8_t>::max())
5759           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5760       }
5761     }
5762   }
5763 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_qmin)5764   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_qmin) {
5765     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5766       for (size_t channels = 1; channels < 16; channels++) {
5767         MaxPoolMicrokernelTester()
5768           .pooling_elements(pooling_elements)
5769           .pooling_tile(9, 8)
5770           .channels(channels)
5771           .qmin(-64)
5772           .qmax(std::numeric_limits<int8_t>::max())
5773           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5774       }
5775     }
5776   }
5777 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_lt_16_multipass_with_qmax)5778   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_lt_16_multipass_with_qmax) {
5779     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5780       for (size_t channels = 1; channels < 16; channels++) {
5781         MaxPoolMicrokernelTester()
5782           .pooling_elements(pooling_elements)
5783           .pooling_tile(9, 8)
5784           .channels(channels)
5785           .qmin(std::numeric_limits<int8_t>::min())
5786           .qmax(64)
5787           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5788       }
5789     }
5790   }
5791 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass)5792   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass) {
5793     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5794       for (size_t channels = 17; channels < 32; channels++) {
5795         MaxPoolMicrokernelTester()
5796           .pooling_elements(pooling_elements)
5797           .pooling_tile(9, 8)
5798           .channels(channels)
5799           .qmin(std::numeric_limits<int8_t>::min())
5800           .qmax(std::numeric_limits<int8_t>::max())
5801           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5802       }
5803     }
5804   }
5805 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_input_offset)5806   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_input_offset) {
5807     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5808       for (size_t channels = 17; channels < 32; channels++) {
5809         MaxPoolMicrokernelTester()
5810           .pooling_elements(pooling_elements)
5811           .pooling_tile(9, 8)
5812           .channels(channels)
5813           .input_offset(37)
5814           .qmin(std::numeric_limits<int8_t>::min())
5815           .qmax(std::numeric_limits<int8_t>::max())
5816           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5817       }
5818     }
5819   }
5820 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_qmin)5821   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_qmin) {
5822     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5823       for (size_t channels = 17; channels < 32; channels++) {
5824         MaxPoolMicrokernelTester()
5825           .pooling_elements(pooling_elements)
5826           .pooling_tile(9, 8)
5827           .channels(channels)
5828           .qmin(-64)
5829           .qmax(std::numeric_limits<int8_t>::max())
5830           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5831       }
5832     }
5833   }
5834 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,channels_gt_16_multipass_with_qmax)5835   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, channels_gt_16_multipass_with_qmax) {
5836     for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
5837       for (size_t channels = 17; channels < 32; channels++) {
5838         MaxPoolMicrokernelTester()
5839           .pooling_elements(pooling_elements)
5840           .pooling_tile(9, 8)
5841           .channels(channels)
5842           .qmin(std::numeric_limits<int8_t>::min())
5843           .qmax(64)
5844           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5845       }
5846     }
5847   }
5848 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels)5849   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels) {
5850     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5851       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5852         for (size_t channels = 1; channels <= 80; channels += 15) {
5853           MaxPoolMicrokernelTester()
5854             .output_pixels(output_pixels)
5855             .pooling_elements(pooling_elements)
5856             .pooling_tile(9, 8)
5857             .channels(channels)
5858             .qmin(std::numeric_limits<int8_t>::min())
5859             .qmax(std::numeric_limits<int8_t>::max())
5860             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5861         }
5862       }
5863     }
5864   }
5865 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_input_offset)5866   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_input_offset) {
5867     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5868       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5869         for (size_t channels = 1; channels <= 80; channels += 15) {
5870           MaxPoolMicrokernelTester()
5871             .output_pixels(output_pixels)
5872             .pooling_elements(pooling_elements)
5873             .pooling_tile(9, 8)
5874             .channels(channels)
5875             .input_offset(83)
5876             .qmin(std::numeric_limits<int8_t>::min())
5877             .qmax(std::numeric_limits<int8_t>::max())
5878             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5879         }
5880       }
5881     }
5882   }
5883 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_qmin)5884   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_qmin) {
5885     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5886       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5887         for (size_t channels = 1; channels <= 80; channels += 15) {
5888           MaxPoolMicrokernelTester()
5889             .output_pixels(output_pixels)
5890             .pooling_elements(pooling_elements)
5891             .pooling_tile(9, 8)
5892             .channels(channels)
5893             .qmin(-64)
5894             .qmax(std::numeric_limits<int8_t>::max())
5895             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5896         }
5897       }
5898     }
5899   }
5900 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_qmax)5901   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_qmax) {
5902     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5903       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5904         for (size_t channels = 1; channels <= 80; channels += 15) {
5905           MaxPoolMicrokernelTester()
5906             .output_pixels(output_pixels)
5907             .pooling_elements(pooling_elements)
5908             .pooling_tile(9, 8)
5909             .channels(channels)
5910             .qmin(std::numeric_limits<int8_t>::min())
5911             .qmax(64)
5912             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5913         }
5914       }
5915     }
5916   }
5917 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_output_stride)5918   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_output_stride) {
5919     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5920       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5921         for (size_t channels = 1; channels <= 80; channels += 15) {
5922           MaxPoolMicrokernelTester()
5923             .output_pixels(output_pixels)
5924             .pooling_elements(pooling_elements)
5925             .pooling_tile(9, 8)
5926             .channels(channels)
5927             .output_stride(83)
5928             .qmin(std::numeric_limits<int8_t>::min())
5929             .qmax(std::numeric_limits<int8_t>::max())
5930             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5931         }
5932       }
5933     }
5934   }
5935 
TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16,few_output_pixels_with_step)5936   TEST(S8_MAXPOOL_MINMAX_9P8X__WASMSIMD_C16, few_output_pixels_with_step) {
5937     for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
5938       for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
5939         for (size_t channels = 1; channels <= 80; channels += 15) {
5940           for (size_t step = 2; step <= pooling_elements; step++) {
5941             MaxPoolMicrokernelTester()
5942               .output_pixels(output_pixels)
5943               .pooling_elements(pooling_elements)
5944               .pooling_tile(9, 8)
5945               .step(step)
5946               .channels(channels)
5947               .output_stride(83)
5948               .qmin(std::numeric_limits<int8_t>::min())
5949               .qmax(std::numeric_limits<int8_t>::max())
5950               .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__wasmsimd_c16, xnn_init_s8_minmax_wasmsimd_params);
5951           }
5952         }
5953       }
5954     }
5955   }
5956 #endif  // XNN_ARCH_WASMSIMD || XNN_ARCH_WASMRELAXEDSIMD
5957 
5958 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile)5959 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile) {
5960   MaxPoolMicrokernelTester()
5961     .pooling_elements(9)
5962     .pooling_tile(9, 8)
5963     .channels(1)
5964     .qmin(std::numeric_limits<int8_t>::min())
5965     .qmax(std::numeric_limits<int8_t>::max())
5966     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
5967 }
5968 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_input_offset)5969 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_input_offset) {
5970   MaxPoolMicrokernelTester()
5971     .pooling_elements(9)
5972     .pooling_tile(9, 8)
5973     .channels(1)
5974     .input_offset(3)
5975     .qmin(std::numeric_limits<int8_t>::min())
5976     .qmax(std::numeric_limits<int8_t>::max())
5977     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
5978 }
5979 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_qmin)5980 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_qmin) {
5981   MaxPoolMicrokernelTester()
5982     .pooling_elements(9)
5983     .pooling_tile(9, 8)
5984     .channels(1)
5985     .qmin(-64)
5986     .qmax(std::numeric_limits<int8_t>::max())
5987     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
5988 }
5989 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_fulltile_with_qmax)5990 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_fulltile_with_qmax) {
5991   MaxPoolMicrokernelTester()
5992     .pooling_elements(9)
5993     .pooling_tile(9, 8)
5994     .channels(1)
5995     .qmin(std::numeric_limits<int8_t>::min())
5996     .qmax(64)
5997     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
5998 }
5999 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_subtile)6000 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_subtile) {
6001   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
6002     MaxPoolMicrokernelTester()
6003       .pooling_elements(pooling_elements)
6004       .pooling_tile(9, 8)
6005       .channels(1)
6006       .qmin(std::numeric_limits<int8_t>::min())
6007       .qmax(std::numeric_limits<int8_t>::max())
6008       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6009   }
6010 }
6011 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_unipass_subtile_with_input_offset)6012 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_unipass_subtile_with_input_offset) {
6013   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
6014     MaxPoolMicrokernelTester()
6015       .pooling_elements(pooling_elements)
6016       .pooling_tile(9, 8)
6017       .channels(1)
6018       .input_offset(3)
6019       .qmin(std::numeric_limits<int8_t>::min())
6020       .qmax(std::numeric_limits<int8_t>::max())
6021       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6022   }
6023 }
6024 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile)6025 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile) {
6026   for (size_t channels = 2; channels < 10; channels++) {
6027     MaxPoolMicrokernelTester()
6028       .pooling_elements(9)
6029       .pooling_tile(9, 8)
6030       .channels(channels)
6031       .qmin(std::numeric_limits<int8_t>::min())
6032       .qmax(std::numeric_limits<int8_t>::max())
6033       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6034   }
6035 }
6036 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_input_offset)6037 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_input_offset) {
6038   for (size_t channels = 2; channels < 10; channels++) {
6039     MaxPoolMicrokernelTester()
6040       .pooling_elements(9)
6041       .pooling_tile(9, 8)
6042       .channels(channels)
6043       .input_offset(3)
6044       .qmin(std::numeric_limits<int8_t>::min())
6045       .qmax(std::numeric_limits<int8_t>::max())
6046       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6047   }
6048 }
6049 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_qmin)6050 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_qmin) {
6051   for (size_t channels = 2; channels < 10; channels++) {
6052     MaxPoolMicrokernelTester()
6053       .pooling_elements(9)
6054       .pooling_tile(9, 8)
6055       .channels(channels)
6056       .qmin(-64)
6057       .qmax(std::numeric_limits<int8_t>::max())
6058       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6059   }
6060 }
6061 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_fulltile_with_qmax)6062 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_fulltile_with_qmax) {
6063   for (size_t channels = 2; channels < 10; channels++) {
6064     MaxPoolMicrokernelTester()
6065       .pooling_elements(9)
6066       .pooling_tile(9, 8)
6067       .channels(channels)
6068       .qmin(std::numeric_limits<int8_t>::min())
6069       .qmax(64)
6070       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6071   }
6072 }
6073 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_subtile)6074 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_subtile) {
6075   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
6076     for (size_t channels = 2; channels < 10; channels++) {
6077       MaxPoolMicrokernelTester()
6078         .pooling_elements(pooling_elements)
6079         .pooling_tile(9, 8)
6080         .channels(channels)
6081         .qmin(std::numeric_limits<int8_t>::min())
6082         .qmax(std::numeric_limits<int8_t>::max())
6083         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6084     }
6085   }
6086 }
6087 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_unipass_subtile_with_input_offset)6088 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_unipass_subtile_with_input_offset) {
6089   for (size_t pooling_elements = 2; pooling_elements < 9; pooling_elements++) {
6090     for (size_t channels = 2; channels < 10; channels++) {
6091       MaxPoolMicrokernelTester()
6092         .pooling_elements(pooling_elements)
6093         .pooling_tile(9, 8)
6094         .channels(channels)
6095         .input_offset(3)
6096         .qmin(std::numeric_limits<int8_t>::min())
6097         .qmax(std::numeric_limits<int8_t>::max())
6098         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6099     }
6100   }
6101 }
6102 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile)6103 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile) {
6104   MaxPoolMicrokernelTester()
6105     .pooling_elements(17)
6106     .pooling_tile(9, 8)
6107     .channels(1)
6108     .qmin(std::numeric_limits<int8_t>::min())
6109     .qmax(std::numeric_limits<int8_t>::max())
6110     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6111 }
6112 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_input_offset)6113 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_input_offset) {
6114   MaxPoolMicrokernelTester()
6115     .pooling_elements(17)
6116     .pooling_tile(9, 8)
6117     .channels(1)
6118     .input_offset(3)
6119     .qmin(std::numeric_limits<int8_t>::min())
6120     .qmax(std::numeric_limits<int8_t>::max())
6121     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6122 }
6123 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_qmin)6124 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_qmin) {
6125   MaxPoolMicrokernelTester()
6126     .pooling_elements(17)
6127     .pooling_tile(9, 8)
6128     .channels(1)
6129     .qmin(-64)
6130     .qmax(std::numeric_limits<int8_t>::max())
6131     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6132 }
6133 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_fulltile_with_qmax)6134 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_fulltile_with_qmax) {
6135   MaxPoolMicrokernelTester()
6136     .pooling_elements(17)
6137     .pooling_tile(9, 8)
6138     .channels(1)
6139     .qmin(std::numeric_limits<int8_t>::min())
6140     .qmax(64)
6141     .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6142 }
6143 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_subtile)6144 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_subtile) {
6145   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
6146     MaxPoolMicrokernelTester()
6147       .pooling_elements(pooling_elements)
6148       .pooling_tile(9, 8)
6149       .channels(1)
6150       .qmin(std::numeric_limits<int8_t>::min())
6151       .qmax(std::numeric_limits<int8_t>::max())
6152       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6153   }
6154 }
6155 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_twopass_subtile_with_input_offset)6156 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_twopass_subtile_with_input_offset) {
6157   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
6158     MaxPoolMicrokernelTester()
6159       .pooling_elements(pooling_elements)
6160       .pooling_tile(9, 8)
6161       .channels(1)
6162       .input_offset(3)
6163       .qmin(std::numeric_limits<int8_t>::min())
6164       .qmax(std::numeric_limits<int8_t>::max())
6165       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6166   }
6167 }
6168 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile)6169 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile) {
6170   for (size_t channels = 2; channels < 10; channels++) {
6171     MaxPoolMicrokernelTester()
6172       .pooling_elements(17)
6173       .pooling_tile(9, 8)
6174       .channels(channels)
6175       .qmin(std::numeric_limits<int8_t>::min())
6176       .qmax(std::numeric_limits<int8_t>::max())
6177       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6178   }
6179 }
6180 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_input_offset)6181 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_input_offset) {
6182   for (size_t channels = 2; channels < 10; channels++) {
6183     MaxPoolMicrokernelTester()
6184       .pooling_elements(17)
6185       .pooling_tile(9, 8)
6186       .channels(channels)
6187       .input_offset(3)
6188       .qmin(std::numeric_limits<int8_t>::min())
6189       .qmax(std::numeric_limits<int8_t>::max())
6190       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6191   }
6192 }
6193 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_qmin)6194 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_qmin) {
6195   for (size_t channels = 2; channels < 10; channels++) {
6196     MaxPoolMicrokernelTester()
6197       .pooling_elements(17)
6198       .pooling_tile(9, 8)
6199       .channels(channels)
6200       .qmin(-64)
6201       .qmax(std::numeric_limits<int8_t>::max())
6202       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6203   }
6204 }
6205 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_fulltile_with_qmax)6206 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_fulltile_with_qmax) {
6207   for (size_t channels = 2; channels < 10; channels++) {
6208     MaxPoolMicrokernelTester()
6209       .pooling_elements(17)
6210       .pooling_tile(9, 8)
6211       .channels(channels)
6212       .qmin(std::numeric_limits<int8_t>::min())
6213       .qmax(64)
6214       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6215   }
6216 }
6217 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_subtile)6218 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_subtile) {
6219   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
6220     for (size_t channels = 2; channels < 10; channels++) {
6221       MaxPoolMicrokernelTester()
6222         .pooling_elements(pooling_elements)
6223         .pooling_tile(9, 8)
6224         .channels(channels)
6225         .qmin(std::numeric_limits<int8_t>::min())
6226         .qmax(std::numeric_limits<int8_t>::max())
6227         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6228     }
6229   }
6230 }
6231 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_twopass_subtile_with_input_offset)6232 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_twopass_subtile_with_input_offset) {
6233   for (size_t pooling_elements = 10; pooling_elements < 17; pooling_elements++) {
6234     for (size_t channels = 2; channels < 10; channels++) {
6235       MaxPoolMicrokernelTester()
6236         .pooling_elements(pooling_elements)
6237         .pooling_tile(9, 8)
6238         .channels(channels)
6239         .input_offset(3)
6240         .qmin(std::numeric_limits<int8_t>::min())
6241         .qmax(std::numeric_limits<int8_t>::max())
6242         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6243     }
6244   }
6245 }
6246 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass)6247 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass) {
6248   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6249     MaxPoolMicrokernelTester()
6250       .pooling_elements(pooling_elements)
6251       .pooling_tile(9, 8)
6252       .channels(1)
6253       .qmin(std::numeric_limits<int8_t>::min())
6254       .qmax(std::numeric_limits<int8_t>::max())
6255       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6256   }
6257 }
6258 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_input_offset)6259 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_input_offset) {
6260   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6261     MaxPoolMicrokernelTester()
6262       .pooling_elements(pooling_elements)
6263       .pooling_tile(9, 8)
6264       .channels(1)
6265       .input_offset(3)
6266       .qmin(std::numeric_limits<int8_t>::min())
6267       .qmax(std::numeric_limits<int8_t>::max())
6268       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6269   }
6270 }
6271 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_qmin)6272 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_qmin) {
6273   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6274     MaxPoolMicrokernelTester()
6275       .pooling_elements(pooling_elements)
6276       .pooling_tile(9, 8)
6277       .channels(1)
6278       .qmin(-64)
6279       .qmax(std::numeric_limits<int8_t>::max())
6280       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6281   }
6282 }
6283 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_eq_1_multipass_with_qmax)6284 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_eq_1_multipass_with_qmax) {
6285   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6286     MaxPoolMicrokernelTester()
6287       .pooling_elements(pooling_elements)
6288       .pooling_tile(9, 8)
6289       .channels(1)
6290       .qmin(std::numeric_limits<int8_t>::min())
6291       .qmax(64)
6292       .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6293   }
6294 }
6295 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass)6296 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass) {
6297   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6298     for (size_t channels = 2; channels < 10; channels++) {
6299       MaxPoolMicrokernelTester()
6300         .pooling_elements(pooling_elements)
6301         .pooling_tile(9, 8)
6302         .channels(channels)
6303         .qmin(std::numeric_limits<int8_t>::min())
6304         .qmax(std::numeric_limits<int8_t>::max())
6305         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6306     }
6307   }
6308 }
6309 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_input_offset)6310 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_input_offset) {
6311   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6312     for (size_t channels = 2; channels < 10; channels++) {
6313       MaxPoolMicrokernelTester()
6314         .pooling_elements(pooling_elements)
6315         .pooling_tile(9, 8)
6316         .channels(channels)
6317         .input_offset(3)
6318         .qmin(std::numeric_limits<int8_t>::min())
6319         .qmax(std::numeric_limits<int8_t>::max())
6320         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6321     }
6322   }
6323 }
6324 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_qmin)6325 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_qmin) {
6326   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6327     for (size_t channels = 2; channels < 10; channels++) {
6328       MaxPoolMicrokernelTester()
6329         .pooling_elements(pooling_elements)
6330         .pooling_tile(9, 8)
6331         .channels(channels)
6332         .qmin(-64)
6333         .qmax(std::numeric_limits<int8_t>::max())
6334         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6335     }
6336   }
6337 }
6338 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,channels_gt_1_multipass_with_qmax)6339 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, channels_gt_1_multipass_with_qmax) {
6340   for (size_t pooling_elements = 18; pooling_elements <= 33; pooling_elements += 3) {
6341     for (size_t channels = 2; channels < 10; channels++) {
6342       MaxPoolMicrokernelTester()
6343         .pooling_elements(pooling_elements)
6344         .pooling_tile(9, 8)
6345         .channels(channels)
6346         .qmin(std::numeric_limits<int8_t>::min())
6347         .qmax(64)
6348         .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6349     }
6350   }
6351 }
6352 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels)6353 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels) {
6354   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6355     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6356       for (size_t channels = 1; channels <= 5; channels += 1) {
6357         MaxPoolMicrokernelTester()
6358           .output_pixels(output_pixels)
6359           .pooling_elements(pooling_elements)
6360           .pooling_tile(9, 8)
6361           .channels(channels)
6362           .qmin(std::numeric_limits<int8_t>::min())
6363           .qmax(std::numeric_limits<int8_t>::max())
6364           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6365       }
6366     }
6367   }
6368 }
6369 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_input_offset)6370 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_input_offset) {
6371   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6372     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6373       for (size_t channels = 1; channels <= 5; channels += 1) {
6374         MaxPoolMicrokernelTester()
6375           .output_pixels(output_pixels)
6376           .pooling_elements(pooling_elements)
6377           .pooling_tile(9, 8)
6378           .channels(channels)
6379           .input_offset(7)
6380           .qmin(std::numeric_limits<int8_t>::min())
6381           .qmax(std::numeric_limits<int8_t>::max())
6382           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6383       }
6384     }
6385   }
6386 }
6387 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_qmin)6388 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_qmin) {
6389   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6390     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6391       for (size_t channels = 1; channels <= 5; channels += 1) {
6392         MaxPoolMicrokernelTester()
6393           .output_pixels(output_pixels)
6394           .pooling_elements(pooling_elements)
6395           .pooling_tile(9, 8)
6396           .channels(channels)
6397           .qmin(-64)
6398           .qmax(std::numeric_limits<int8_t>::max())
6399           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6400       }
6401     }
6402   }
6403 }
6404 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_qmax)6405 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_qmax) {
6406   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6407     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6408       for (size_t channels = 1; channels <= 5; channels += 1) {
6409         MaxPoolMicrokernelTester()
6410           .output_pixels(output_pixels)
6411           .pooling_elements(pooling_elements)
6412           .pooling_tile(9, 8)
6413           .channels(channels)
6414           .qmin(std::numeric_limits<int8_t>::min())
6415           .qmax(64)
6416           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6417       }
6418     }
6419   }
6420 }
6421 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_output_stride)6422 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_output_stride) {
6423   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6424     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6425       for (size_t channels = 1; channels <= 5; channels += 1) {
6426         MaxPoolMicrokernelTester()
6427           .output_pixels(output_pixels)
6428           .pooling_elements(pooling_elements)
6429           .pooling_tile(9, 8)
6430           .channels(channels)
6431           .output_stride(7)
6432           .qmin(std::numeric_limits<int8_t>::min())
6433           .qmax(std::numeric_limits<int8_t>::max())
6434           .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6435       }
6436     }
6437   }
6438 }
6439 
TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1,few_output_pixels_with_step)6440 TEST(S8_MAXPOOL_MINMAX_9P8X__SCALAR_C1, few_output_pixels_with_step) {
6441   for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
6442     for (size_t pooling_elements : std::vector<size_t>{{2, 9, 16}}) {
6443       for (size_t channels = 1; channels <= 5; channels += 1) {
6444         for (size_t step = 2; step <= pooling_elements; step++) {
6445           MaxPoolMicrokernelTester()
6446             .output_pixels(output_pixels)
6447             .pooling_elements(pooling_elements)
6448             .pooling_tile(9, 8)
6449             .step(step)
6450             .channels(channels)
6451             .output_stride(7)
6452             .qmin(std::numeric_limits<int8_t>::min())
6453             .qmax(std::numeric_limits<int8_t>::max())
6454             .Test(xnn_s8_maxpool_minmax_ukernel_9p8x__scalar_c1, xnn_init_s8_minmax_scalar_params);
6455         }
6456       }
6457     }
6458   }
6459 }