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