xref: /aosp_15_r20/external/XNNPACK/tools/generate-maxpool-test.py (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker#!/usr/bin/env python
2*4bdc9457SAndroid Build Coastguard Worker# Copyright 2019 Google LLC
3*4bdc9457SAndroid Build Coastguard Worker#
4*4bdc9457SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the
5*4bdc9457SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree.
6*4bdc9457SAndroid Build Coastguard Worker
7*4bdc9457SAndroid Build Coastguard Workerimport argparse
8*4bdc9457SAndroid Build Coastguard Workerimport codecs
9*4bdc9457SAndroid Build Coastguard Workerimport math
10*4bdc9457SAndroid Build Coastguard Workerimport os
11*4bdc9457SAndroid Build Coastguard Workerimport re
12*4bdc9457SAndroid Build Coastguard Workerimport sys
13*4bdc9457SAndroid Build Coastguard Workerimport yaml
14*4bdc9457SAndroid Build Coastguard Worker
15*4bdc9457SAndroid Build Coastguard Workersys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
16*4bdc9457SAndroid Build Coastguard Workerfrom primes import next_prime
17*4bdc9457SAndroid Build Coastguard Workerimport xngen
18*4bdc9457SAndroid Build Coastguard Workerimport xnncommon
19*4bdc9457SAndroid Build Coastguard Worker
20*4bdc9457SAndroid Build Coastguard Worker
21*4bdc9457SAndroid Build Coastguard Workerparser = argparse.ArgumentParser(description='MaxPool microkernel test generator')
22*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("-s", "--spec", metavar="FILE", required=True,
23*4bdc9457SAndroid Build Coastguard Worker                    help="Specification (YAML) file")
24*4bdc9457SAndroid Build Coastguard Workerparser.add_argument("-o", "--output", metavar="FILE", required=True,
25*4bdc9457SAndroid Build Coastguard Worker                    help='Output (C++ source) file')
26*4bdc9457SAndroid Build Coastguard Workerparser.set_defaults(defines=list())
27*4bdc9457SAndroid Build Coastguard Worker
28*4bdc9457SAndroid Build Coastguard Worker
29*4bdc9457SAndroid Build Coastguard Workerdef split_ukernel_name(name):
30*4bdc9457SAndroid Build Coastguard Worker  match = re.fullmatch(r"xnn_(s8|u8|s16|f16|f32)_maxpool(_(minmax))?_ukernel_(\d+)p(\d+)x__(.+)_c(\d+)", name)
31*4bdc9457SAndroid Build Coastguard Worker  if match is None:
32*4bdc9457SAndroid Build Coastguard Worker    raise ValueError("Unexpected microkernel name: " + name)
33*4bdc9457SAndroid Build Coastguard Worker
34*4bdc9457SAndroid Build Coastguard Worker  primary_tile = int(match.group(4))
35*4bdc9457SAndroid Build Coastguard Worker  incremental_tile = int(match.group(5))
36*4bdc9457SAndroid Build Coastguard Worker  channel_tile = int(match.group(7))
37*4bdc9457SAndroid Build Coastguard Worker
38*4bdc9457SAndroid Build Coastguard Worker  arch, isa = xnncommon.parse_target_name(target_name=match.group(6))
39*4bdc9457SAndroid Build Coastguard Worker  return primary_tile, incremental_tile, channel_tile, arch, isa
40*4bdc9457SAndroid Build Coastguard Worker
41*4bdc9457SAndroid Build Coastguard Worker
42*4bdc9457SAndroid Build Coastguard WorkerMAXPOOL_TEST_TEMPLATE = """\
43*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile) {
44*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
45*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
46*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
47*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE})
48*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
49*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
50*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
51*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
52*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
53*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
54*4bdc9457SAndroid Build Coastguard Worker}
55*4bdc9457SAndroid Build Coastguard Worker
56*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
57*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
58*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
59*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
60*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE})
61*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
62*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
63*4bdc9457SAndroid Build Coastguard Worker    .input_offset(${next_prime(CHANNEL_TILE+1)})
64*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
65*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
66*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
67*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
68*4bdc9457SAndroid Build Coastguard Worker}
69*4bdc9457SAndroid Build Coastguard Worker
70*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
71*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
72*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
73*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
74*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE})
75*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
76*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
77*4bdc9457SAndroid Build Coastguard Worker    .qmin(${QMIN})
78*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
79*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
80*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
81*4bdc9457SAndroid Build Coastguard Worker}
82*4bdc9457SAndroid Build Coastguard Worker
83*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
84*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
85*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
86*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
87*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE})
88*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
89*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
90*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
91*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
92*4bdc9457SAndroid Build Coastguard Worker    .qmax(${QMAX})
93*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
94*4bdc9457SAndroid Build Coastguard Worker}
95*4bdc9457SAndroid Build Coastguard Worker
96*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_subtile) {
97*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
98*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
99*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
100*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
101*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
102*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
103*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
104*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
105*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
106*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
107*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
108*4bdc9457SAndroid Build Coastguard Worker  }
109*4bdc9457SAndroid Build Coastguard Worker}
110*4bdc9457SAndroid Build Coastguard Worker
111*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
112*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
113*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
114*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
115*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
116*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
117*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
118*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
119*4bdc9457SAndroid Build Coastguard Worker      .input_offset(${next_prime(CHANNEL_TILE+1)})
120*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
121*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
122*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
123*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
124*4bdc9457SAndroid Build Coastguard Worker  }
125*4bdc9457SAndroid Build Coastguard Worker}
126*4bdc9457SAndroid Build Coastguard Worker
127*4bdc9457SAndroid Build Coastguard Worker$if CHANNEL_TILE > 1:
128*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile) {
129*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
130*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
131*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
132*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
133*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
134*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
135*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
136*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
137*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
138*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
139*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
140*4bdc9457SAndroid Build Coastguard Worker    }
141*4bdc9457SAndroid Build Coastguard Worker  }
142*4bdc9457SAndroid Build Coastguard Worker
143*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
144*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
145*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
146*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
147*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
148*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
149*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
150*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
151*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE*8)})
152*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
153*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
154*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
155*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
156*4bdc9457SAndroid Build Coastguard Worker    }
157*4bdc9457SAndroid Build Coastguard Worker  }
158*4bdc9457SAndroid Build Coastguard Worker
159*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
160*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
161*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
162*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
163*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
164*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
165*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
166*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
167*4bdc9457SAndroid Build Coastguard Worker        .qmin(${QMIN})
168*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
169*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
170*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
171*4bdc9457SAndroid Build Coastguard Worker    }
172*4bdc9457SAndroid Build Coastguard Worker  }
173*4bdc9457SAndroid Build Coastguard Worker
174*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
175*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
176*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
177*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
178*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
179*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
180*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
181*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
182*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
183*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
184*4bdc9457SAndroid Build Coastguard Worker        .qmax(${QMAX})
185*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
186*4bdc9457SAndroid Build Coastguard Worker    }
187*4bdc9457SAndroid Build Coastguard Worker  }
188*4bdc9457SAndroid Build Coastguard Worker
189*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_subtile) {
190*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
191*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
192*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
193*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
194*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
195*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
196*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
197*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
198*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
199*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
200*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
201*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
202*4bdc9457SAndroid Build Coastguard Worker      }
203*4bdc9457SAndroid Build Coastguard Worker    }
204*4bdc9457SAndroid Build Coastguard Worker  }
205*4bdc9457SAndroid Build Coastguard Worker
206*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
207*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
208*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
209*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
210*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
211*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
212*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
213*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
214*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
215*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE*8)})
216*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
217*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
218*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
219*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
220*4bdc9457SAndroid Build Coastguard Worker      }
221*4bdc9457SAndroid Build Coastguard Worker    }
222*4bdc9457SAndroid Build Coastguard Worker  }
223*4bdc9457SAndroid Build Coastguard Worker
224*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile) {
225*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
226*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
227*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
228*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
229*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
230*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
231*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
232*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
233*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
234*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
235*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
236*4bdc9457SAndroid Build Coastguard Worker    }
237*4bdc9457SAndroid Build Coastguard Worker  }
238*4bdc9457SAndroid Build Coastguard Worker
239*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
240*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
241*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
242*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
243*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
244*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
245*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
246*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
247*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE)})
248*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
249*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
250*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
251*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
252*4bdc9457SAndroid Build Coastguard Worker    }
253*4bdc9457SAndroid Build Coastguard Worker  }
254*4bdc9457SAndroid Build Coastguard Worker
255*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
256*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
257*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
258*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
259*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
260*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
261*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
262*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
263*4bdc9457SAndroid Build Coastguard Worker        .qmin(${QMIN})
264*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
265*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
266*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
267*4bdc9457SAndroid Build Coastguard Worker    }
268*4bdc9457SAndroid Build Coastguard Worker  }
269*4bdc9457SAndroid Build Coastguard Worker
270*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
271*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
272*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
273*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
274*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
275*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE})
276*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
277*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
278*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
279*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
280*4bdc9457SAndroid Build Coastguard Worker        .qmax(${QMAX})
281*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
282*4bdc9457SAndroid Build Coastguard Worker    }
283*4bdc9457SAndroid Build Coastguard Worker  }
284*4bdc9457SAndroid Build Coastguard Worker
285*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_subtile) {
286*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
287*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
288*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
289*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
290*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
291*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
292*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
293*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
294*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
295*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
296*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
297*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
298*4bdc9457SAndroid Build Coastguard Worker      }
299*4bdc9457SAndroid Build Coastguard Worker    }
300*4bdc9457SAndroid Build Coastguard Worker  }
301*4bdc9457SAndroid Build Coastguard Worker
302*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
303*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
304*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
305*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
306*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
307*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
308*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
309*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
310*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
311*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE)})
312*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
313*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
314*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
315*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
316*4bdc9457SAndroid Build Coastguard Worker      }
317*4bdc9457SAndroid Build Coastguard Worker    }
318*4bdc9457SAndroid Build Coastguard Worker  }
319*4bdc9457SAndroid Build Coastguard Worker
320*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile) {
321*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
322*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
323*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
324*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
325*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE})
326*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
327*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
328*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
329*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
330*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
331*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
332*4bdc9457SAndroid Build Coastguard Worker  }
333*4bdc9457SAndroid Build Coastguard Worker}
334*4bdc9457SAndroid Build Coastguard Worker
335*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_input_offset) {
336*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
337*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
338*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
339*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
340*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE})
341*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
342*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
343*4bdc9457SAndroid Build Coastguard Worker      .input_offset(${next_prime(CHANNEL_TILE*2)})
344*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
345*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
346*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
347*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
348*4bdc9457SAndroid Build Coastguard Worker  }
349*4bdc9457SAndroid Build Coastguard Worker}
350*4bdc9457SAndroid Build Coastguard Worker
351*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_qmin) {
352*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
353*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
354*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
355*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
356*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE})
357*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
358*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
359*4bdc9457SAndroid Build Coastguard Worker      .qmin(${QMIN})
360*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
361*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
362*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
363*4bdc9457SAndroid Build Coastguard Worker  }
364*4bdc9457SAndroid Build Coastguard Worker}
365*4bdc9457SAndroid Build Coastguard Worker
366*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_fulltile_with_qmax) {
367*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
368*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
369*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
370*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
371*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE})
372*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
373*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
374*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
375*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
376*4bdc9457SAndroid Build Coastguard Worker      .qmax(${QMAX})
377*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
378*4bdc9457SAndroid Build Coastguard Worker  }
379*4bdc9457SAndroid Build Coastguard Worker}
380*4bdc9457SAndroid Build Coastguard Worker
381*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_subtile) {
382*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
383*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
384*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
385*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
386*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
387*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
388*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
389*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
390*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
391*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
392*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
393*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
394*4bdc9457SAndroid Build Coastguard Worker    }
395*4bdc9457SAndroid Build Coastguard Worker  }
396*4bdc9457SAndroid Build Coastguard Worker}
397*4bdc9457SAndroid Build Coastguard Worker
398*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_unipass_subtile_with_input_offset) {
399*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
400*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
401*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = 2; pooling_elements < ${PRIMARY_TILE}; pooling_elements++) {
402*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
403*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
404*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
405*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
406*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
407*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE*2)})
408*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
409*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
410*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
411*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
412*4bdc9457SAndroid Build Coastguard Worker    }
413*4bdc9457SAndroid Build Coastguard Worker  }
414*4bdc9457SAndroid Build Coastguard Worker}
415*4bdc9457SAndroid Build Coastguard Worker
416*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile) {
417*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
418*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
419*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
420*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
421*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
422*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
423*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
424*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
425*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
426*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
427*4bdc9457SAndroid Build Coastguard Worker}
428*4bdc9457SAndroid Build Coastguard Worker
429*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
430*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
431*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
432*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
433*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
434*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
435*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
436*4bdc9457SAndroid Build Coastguard Worker    .input_offset(${next_prime(CHANNEL_TILE+1)})
437*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
438*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
439*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
440*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
441*4bdc9457SAndroid Build Coastguard Worker}
442*4bdc9457SAndroid Build Coastguard Worker
443*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
444*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
445*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
446*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
447*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
448*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
449*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
450*4bdc9457SAndroid Build Coastguard Worker    .qmin(${QMIN})
451*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
452*4bdc9457SAndroid Build Coastguard Worker      .qmax(std::numeric_limits<${CTYPE}>::max())
453*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
454*4bdc9457SAndroid Build Coastguard Worker}
455*4bdc9457SAndroid Build Coastguard Worker
456*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
457*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
458*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
459*4bdc9457SAndroid Build Coastguard Worker  MaxPoolMicrokernelTester()
460*4bdc9457SAndroid Build Coastguard Worker    .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
461*4bdc9457SAndroid Build Coastguard Worker    .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
462*4bdc9457SAndroid Build Coastguard Worker    .channels(${CHANNEL_TILE})
463*4bdc9457SAndroid Build Coastguard Worker    $if DATATYPE in ["s8", "u8"]:
464*4bdc9457SAndroid Build Coastguard Worker      .qmin(std::numeric_limits<${CTYPE}>::min())
465*4bdc9457SAndroid Build Coastguard Worker    .qmax(${QMAX})
466*4bdc9457SAndroid Build Coastguard Worker    .Test(${", ".join(TEST_ARGS)});
467*4bdc9457SAndroid Build Coastguard Worker}
468*4bdc9457SAndroid Build Coastguard Worker
469*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_subtile) {
470*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
471*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
472*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
473*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
474*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
475*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
476*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
477*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
478*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
479*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
480*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
481*4bdc9457SAndroid Build Coastguard Worker  }
482*4bdc9457SAndroid Build Coastguard Worker}
483*4bdc9457SAndroid Build Coastguard Worker
484*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
485*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
486*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
487*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
488*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
489*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
490*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
491*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
492*4bdc9457SAndroid Build Coastguard Worker      .input_offset(${next_prime(CHANNEL_TILE+1)})
493*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
494*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
495*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
496*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
497*4bdc9457SAndroid Build Coastguard Worker  }
498*4bdc9457SAndroid Build Coastguard Worker}
499*4bdc9457SAndroid Build Coastguard Worker
500*4bdc9457SAndroid Build Coastguard Worker$if CHANNEL_TILE > 1:
501*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile) {
502*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
503*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
504*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
505*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
506*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
507*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
508*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
509*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
510*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
511*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
512*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
513*4bdc9457SAndroid Build Coastguard Worker    }
514*4bdc9457SAndroid Build Coastguard Worker  }
515*4bdc9457SAndroid Build Coastguard Worker
516*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
517*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
518*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
519*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
520*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
521*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
522*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
523*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
524*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE*5)})
525*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
526*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
527*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
528*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
529*4bdc9457SAndroid Build Coastguard Worker    }
530*4bdc9457SAndroid Build Coastguard Worker  }
531*4bdc9457SAndroid Build Coastguard Worker
532*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
533*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
534*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
535*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
536*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
537*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
538*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
539*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
540*4bdc9457SAndroid Build Coastguard Worker        .qmin(${QMIN})
541*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
542*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
543*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
544*4bdc9457SAndroid Build Coastguard Worker    }
545*4bdc9457SAndroid Build Coastguard Worker  }
546*4bdc9457SAndroid Build Coastguard Worker
547*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
548*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
549*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
550*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
551*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
552*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
553*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
554*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
555*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
556*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
557*4bdc9457SAndroid Build Coastguard Worker        .qmax(${QMAX})
558*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
559*4bdc9457SAndroid Build Coastguard Worker    }
560*4bdc9457SAndroid Build Coastguard Worker  }
561*4bdc9457SAndroid Build Coastguard Worker
562*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_subtile) {
563*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
564*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
565*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
566*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
567*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
568*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
569*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
570*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
571*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
572*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
573*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
574*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
575*4bdc9457SAndroid Build Coastguard Worker      }
576*4bdc9457SAndroid Build Coastguard Worker    }
577*4bdc9457SAndroid Build Coastguard Worker  }
578*4bdc9457SAndroid Build Coastguard Worker
579*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
580*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
581*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
582*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
583*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
584*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
585*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
586*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
587*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
588*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE*8)})
589*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
590*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
591*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
592*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
593*4bdc9457SAndroid Build Coastguard Worker      }
594*4bdc9457SAndroid Build Coastguard Worker    }
595*4bdc9457SAndroid Build Coastguard Worker  }
596*4bdc9457SAndroid Build Coastguard Worker
597*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile) {
598*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
599*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
600*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
601*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
602*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
603*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
604*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
605*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
606*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
607*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
608*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
609*4bdc9457SAndroid Build Coastguard Worker    }
610*4bdc9457SAndroid Build Coastguard Worker  }
611*4bdc9457SAndroid Build Coastguard Worker
612*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
613*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
614*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
615*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
616*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
617*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
618*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
619*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
620*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE)})
621*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
622*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
623*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
624*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
625*4bdc9457SAndroid Build Coastguard Worker    }
626*4bdc9457SAndroid Build Coastguard Worker  }
627*4bdc9457SAndroid Build Coastguard Worker
628*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
629*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
630*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
631*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
632*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
633*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
634*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
635*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
636*4bdc9457SAndroid Build Coastguard Worker        .qmin(${QMIN})
637*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
638*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
639*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
640*4bdc9457SAndroid Build Coastguard Worker    }
641*4bdc9457SAndroid Build Coastguard Worker  }
642*4bdc9457SAndroid Build Coastguard Worker
643*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
644*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
645*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
646*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
647*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
648*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
649*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
650*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
651*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
652*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
653*4bdc9457SAndroid Build Coastguard Worker        .qmax(${QMAX})
654*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
655*4bdc9457SAndroid Build Coastguard Worker    }
656*4bdc9457SAndroid Build Coastguard Worker  }
657*4bdc9457SAndroid Build Coastguard Worker
658*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_subtile) {
659*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
660*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
661*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
662*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
663*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
664*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
665*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
666*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
667*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
668*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
669*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
670*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
671*4bdc9457SAndroid Build Coastguard Worker      }
672*4bdc9457SAndroid Build Coastguard Worker    }
673*4bdc9457SAndroid Build Coastguard Worker  }
674*4bdc9457SAndroid Build Coastguard Worker
675*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
676*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
677*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
678*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
679*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
680*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
681*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
682*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
683*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
684*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE)})
685*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
686*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
687*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
688*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
689*4bdc9457SAndroid Build Coastguard Worker      }
690*4bdc9457SAndroid Build Coastguard Worker    }
691*4bdc9457SAndroid Build Coastguard Worker  }
692*4bdc9457SAndroid Build Coastguard Worker
693*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile) {
694*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
695*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
696*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
697*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
698*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
699*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
700*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
701*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
702*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
703*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
704*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
705*4bdc9457SAndroid Build Coastguard Worker  }
706*4bdc9457SAndroid Build Coastguard Worker}
707*4bdc9457SAndroid Build Coastguard Worker
708*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_input_offset) {
709*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
710*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
711*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
712*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
713*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
714*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
715*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
716*4bdc9457SAndroid Build Coastguard Worker      .input_offset(${next_prime(CHANNEL_TILE*2)})
717*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
718*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
719*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
720*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
721*4bdc9457SAndroid Build Coastguard Worker  }
722*4bdc9457SAndroid Build Coastguard Worker}
723*4bdc9457SAndroid Build Coastguard Worker
724*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_qmin) {
725*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
726*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
727*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
728*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
729*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
730*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
731*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
732*4bdc9457SAndroid Build Coastguard Worker      .qmin(${QMIN})
733*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
734*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
735*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
736*4bdc9457SAndroid Build Coastguard Worker  }
737*4bdc9457SAndroid Build Coastguard Worker}
738*4bdc9457SAndroid Build Coastguard Worker
739*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_fulltile_with_qmax) {
740*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
741*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
742*4bdc9457SAndroid Build Coastguard Worker  for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
743*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
744*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(${PRIMARY_TILE+INCREMENTAL_TILE})
745*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
746*4bdc9457SAndroid Build Coastguard Worker      .channels(channels)
747*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
748*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
749*4bdc9457SAndroid Build Coastguard Worker      .qmax(${QMAX})
750*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
751*4bdc9457SAndroid Build Coastguard Worker  }
752*4bdc9457SAndroid Build Coastguard Worker}
753*4bdc9457SAndroid Build Coastguard Worker
754*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_subtile) {
755*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
756*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
757*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
758*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
759*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
760*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
761*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
762*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
763*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
764*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
765*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
766*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
767*4bdc9457SAndroid Build Coastguard Worker    }
768*4bdc9457SAndroid Build Coastguard Worker  }
769*4bdc9457SAndroid Build Coastguard Worker}
770*4bdc9457SAndroid Build Coastguard Worker
771*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_twopass_subtile_with_input_offset) {
772*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
773*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
774*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+1}; pooling_elements < ${PRIMARY_TILE+INCREMENTAL_TILE}; pooling_elements++) {
775*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
776*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
777*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
778*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
779*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
780*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE*2)})
781*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
782*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
783*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
784*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
785*4bdc9457SAndroid Build Coastguard Worker    }
786*4bdc9457SAndroid Build Coastguard Worker  }
787*4bdc9457SAndroid Build Coastguard Worker}
788*4bdc9457SAndroid Build Coastguard Worker
789*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass) {
790*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
791*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
792*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
793*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
794*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
795*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
796*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
797*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
798*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
799*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
800*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
801*4bdc9457SAndroid Build Coastguard Worker  }
802*4bdc9457SAndroid Build Coastguard Worker}
803*4bdc9457SAndroid Build Coastguard Worker
804*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_input_offset) {
805*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
806*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
807*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
808*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
809*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
810*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
811*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
812*4bdc9457SAndroid Build Coastguard Worker      .input_offset(${next_prime(CHANNEL_TILE+1)})
813*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
814*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
815*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
816*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
817*4bdc9457SAndroid Build Coastguard Worker  }
818*4bdc9457SAndroid Build Coastguard Worker}
819*4bdc9457SAndroid Build Coastguard Worker
820*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_qmin) {
821*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
822*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
823*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
824*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
825*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
826*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
827*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
828*4bdc9457SAndroid Build Coastguard Worker      .qmin(${QMIN})
829*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
830*4bdc9457SAndroid Build Coastguard Worker        .qmax(std::numeric_limits<${CTYPE}>::max())
831*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
832*4bdc9457SAndroid Build Coastguard Worker  }
833*4bdc9457SAndroid Build Coastguard Worker}
834*4bdc9457SAndroid Build Coastguard Worker
835*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_eq_${CHANNEL_TILE}_multipass_with_qmax) {
836*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
837*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
838*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
839*4bdc9457SAndroid Build Coastguard Worker    MaxPoolMicrokernelTester()
840*4bdc9457SAndroid Build Coastguard Worker      .pooling_elements(pooling_elements)
841*4bdc9457SAndroid Build Coastguard Worker      .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
842*4bdc9457SAndroid Build Coastguard Worker      .channels(${CHANNEL_TILE})
843*4bdc9457SAndroid Build Coastguard Worker      $if DATATYPE in ["s8", "u8"]:
844*4bdc9457SAndroid Build Coastguard Worker        .qmin(std::numeric_limits<${CTYPE}>::min())
845*4bdc9457SAndroid Build Coastguard Worker      .qmax(${QMAX})
846*4bdc9457SAndroid Build Coastguard Worker      .Test(${", ".join(TEST_ARGS)});
847*4bdc9457SAndroid Build Coastguard Worker  }
848*4bdc9457SAndroid Build Coastguard Worker}
849*4bdc9457SAndroid Build Coastguard Worker
850*4bdc9457SAndroid Build Coastguard Worker$if CHANNEL_TILE > 1:
851*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass) {
852*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
853*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
854*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
855*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
856*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
857*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
858*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
859*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
860*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
861*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
862*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
863*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
864*4bdc9457SAndroid Build Coastguard Worker      }
865*4bdc9457SAndroid Build Coastguard Worker    }
866*4bdc9457SAndroid Build Coastguard Worker  }
867*4bdc9457SAndroid Build Coastguard Worker
868*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_input_offset) {
869*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
870*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
871*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
872*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
873*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
874*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
875*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
876*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
877*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE*8)})
878*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
879*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
880*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
881*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
882*4bdc9457SAndroid Build Coastguard Worker      }
883*4bdc9457SAndroid Build Coastguard Worker    }
884*4bdc9457SAndroid Build Coastguard Worker  }
885*4bdc9457SAndroid Build Coastguard Worker
886*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_qmin) {
887*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
888*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
889*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
890*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
891*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
892*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
893*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
894*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
895*4bdc9457SAndroid Build Coastguard Worker          .qmin(${QMIN})
896*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
897*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
898*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
899*4bdc9457SAndroid Build Coastguard Worker      }
900*4bdc9457SAndroid Build Coastguard Worker    }
901*4bdc9457SAndroid Build Coastguard Worker  }
902*4bdc9457SAndroid Build Coastguard Worker
903*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_div_${CHANNEL_TILE}_multipass_with_qmax) {
904*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
905*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
906*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
907*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = ${CHANNEL_TILE*2}; channels < ${CHANNEL_TILE*8}; channels += ${CHANNEL_TILE}) {
908*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
909*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
910*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
911*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
912*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
913*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
914*4bdc9457SAndroid Build Coastguard Worker          .qmax(${QMAX})
915*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
916*4bdc9457SAndroid Build Coastguard Worker      }
917*4bdc9457SAndroid Build Coastguard Worker    }
918*4bdc9457SAndroid Build Coastguard Worker  }
919*4bdc9457SAndroid Build Coastguard Worker
920*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass) {
921*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
922*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
923*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
924*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
925*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
926*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
927*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
928*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
929*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
930*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
931*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
932*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
933*4bdc9457SAndroid Build Coastguard Worker      }
934*4bdc9457SAndroid Build Coastguard Worker    }
935*4bdc9457SAndroid Build Coastguard Worker  }
936*4bdc9457SAndroid Build Coastguard Worker
937*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_input_offset) {
938*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
939*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
940*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
941*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
942*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
943*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
944*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
945*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
946*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${CHANNEL_TILE})
947*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
948*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
949*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
950*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
951*4bdc9457SAndroid Build Coastguard Worker      }
952*4bdc9457SAndroid Build Coastguard Worker    }
953*4bdc9457SAndroid Build Coastguard Worker  }
954*4bdc9457SAndroid Build Coastguard Worker
955*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_qmin) {
956*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
957*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
958*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
959*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
960*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
961*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
962*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
963*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
964*4bdc9457SAndroid Build Coastguard Worker          .qmin(${QMIN})
965*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
966*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
967*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
968*4bdc9457SAndroid Build Coastguard Worker      }
969*4bdc9457SAndroid Build Coastguard Worker    }
970*4bdc9457SAndroid Build Coastguard Worker  }
971*4bdc9457SAndroid Build Coastguard Worker
972*4bdc9457SAndroid Build Coastguard Worker  TEST(${TEST_NAME}, channels_lt_${CHANNEL_TILE}_multipass_with_qmax) {
973*4bdc9457SAndroid Build Coastguard Worker    $if ISA_CHECK:
974*4bdc9457SAndroid Build Coastguard Worker      ${ISA_CHECK};
975*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
976*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels < ${CHANNEL_TILE}; channels++) {
977*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
978*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
979*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
980*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
981*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
982*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
983*4bdc9457SAndroid Build Coastguard Worker          .qmax(${QMAX})
984*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
985*4bdc9457SAndroid Build Coastguard Worker      }
986*4bdc9457SAndroid Build Coastguard Worker    }
987*4bdc9457SAndroid Build Coastguard Worker  }
988*4bdc9457SAndroid Build Coastguard Worker
989*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass) {
990*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
991*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
992*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
993*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
994*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
995*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
996*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
997*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
998*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
999*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
1000*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
1001*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
1002*4bdc9457SAndroid Build Coastguard Worker    }
1003*4bdc9457SAndroid Build Coastguard Worker  }
1004*4bdc9457SAndroid Build Coastguard Worker}
1005*4bdc9457SAndroid Build Coastguard Worker
1006*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_input_offset) {
1007*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1008*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1009*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
1010*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
1011*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
1012*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
1013*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1014*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
1015*4bdc9457SAndroid Build Coastguard Worker        .input_offset(${next_prime(CHANNEL_TILE*2)})
1016*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
1017*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
1018*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
1019*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
1020*4bdc9457SAndroid Build Coastguard Worker    }
1021*4bdc9457SAndroid Build Coastguard Worker  }
1022*4bdc9457SAndroid Build Coastguard Worker}
1023*4bdc9457SAndroid Build Coastguard Worker
1024*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_qmin) {
1025*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1026*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1027*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
1028*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
1029*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
1030*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
1031*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1032*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
1033*4bdc9457SAndroid Build Coastguard Worker        .qmin(${QMIN})
1034*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
1035*4bdc9457SAndroid Build Coastguard Worker          .qmax(std::numeric_limits<${CTYPE}>::max())
1036*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
1037*4bdc9457SAndroid Build Coastguard Worker    }
1038*4bdc9457SAndroid Build Coastguard Worker  }
1039*4bdc9457SAndroid Build Coastguard Worker}
1040*4bdc9457SAndroid Build Coastguard Worker
1041*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, channels_gt_${CHANNEL_TILE}_multipass_with_qmax) {
1042*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1043*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1044*4bdc9457SAndroid Build Coastguard Worker  for (size_t pooling_elements = ${PRIMARY_TILE+INCREMENTAL_TILE+1}; pooling_elements <= ${PRIMARY_TILE+INCREMENTAL_TILE*3}; pooling_elements += 3) {
1045*4bdc9457SAndroid Build Coastguard Worker    for (size_t channels = ${CHANNEL_TILE+1}; channels < ${10 if CHANNEL_TILE == 1 else CHANNEL_TILE*2}; channels++) {
1046*4bdc9457SAndroid Build Coastguard Worker      MaxPoolMicrokernelTester()
1047*4bdc9457SAndroid Build Coastguard Worker        .pooling_elements(pooling_elements)
1048*4bdc9457SAndroid Build Coastguard Worker        .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1049*4bdc9457SAndroid Build Coastguard Worker        .channels(channels)
1050*4bdc9457SAndroid Build Coastguard Worker        $if DATATYPE in ["s8", "u8"]:
1051*4bdc9457SAndroid Build Coastguard Worker          .qmin(std::numeric_limits<${CTYPE}>::min())
1052*4bdc9457SAndroid Build Coastguard Worker        .qmax(${QMAX})
1053*4bdc9457SAndroid Build Coastguard Worker        .Test(${", ".join(TEST_ARGS)});
1054*4bdc9457SAndroid Build Coastguard Worker    }
1055*4bdc9457SAndroid Build Coastguard Worker  }
1056*4bdc9457SAndroid Build Coastguard Worker}
1057*4bdc9457SAndroid Build Coastguard Worker
1058*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels) {
1059*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1060*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1061*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1062*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1063*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1064*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
1065*4bdc9457SAndroid Build Coastguard Worker          .output_pixels(output_pixels)
1066*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
1067*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1068*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
1069*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
1070*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
1071*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
1072*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
1073*4bdc9457SAndroid Build Coastguard Worker      }
1074*4bdc9457SAndroid Build Coastguard Worker    }
1075*4bdc9457SAndroid Build Coastguard Worker  }
1076*4bdc9457SAndroid Build Coastguard Worker}
1077*4bdc9457SAndroid Build Coastguard Worker
1078*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels_with_input_offset) {
1079*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1080*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1081*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1082*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1083*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1084*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
1085*4bdc9457SAndroid Build Coastguard Worker          .output_pixels(output_pixels)
1086*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
1087*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1088*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
1089*4bdc9457SAndroid Build Coastguard Worker          .input_offset(${next_prime(CHANNEL_TILE*5+1)})
1090*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
1091*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
1092*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
1093*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
1094*4bdc9457SAndroid Build Coastguard Worker      }
1095*4bdc9457SAndroid Build Coastguard Worker    }
1096*4bdc9457SAndroid Build Coastguard Worker  }
1097*4bdc9457SAndroid Build Coastguard Worker}
1098*4bdc9457SAndroid Build Coastguard Worker
1099*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels_with_qmin) {
1100*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1101*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1102*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1103*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1104*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1105*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
1106*4bdc9457SAndroid Build Coastguard Worker          .output_pixels(output_pixels)
1107*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
1108*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1109*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
1110*4bdc9457SAndroid Build Coastguard Worker          .qmin(${QMIN})
1111*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
1112*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
1113*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
1114*4bdc9457SAndroid Build Coastguard Worker      }
1115*4bdc9457SAndroid Build Coastguard Worker    }
1116*4bdc9457SAndroid Build Coastguard Worker  }
1117*4bdc9457SAndroid Build Coastguard Worker}
1118*4bdc9457SAndroid Build Coastguard Worker
1119*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels_with_qmax) {
1120*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1121*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1122*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1123*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1124*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1125*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
1126*4bdc9457SAndroid Build Coastguard Worker          .output_pixels(output_pixels)
1127*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
1128*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1129*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
1130*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
1131*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
1132*4bdc9457SAndroid Build Coastguard Worker          .qmax(${QMAX})
1133*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
1134*4bdc9457SAndroid Build Coastguard Worker      }
1135*4bdc9457SAndroid Build Coastguard Worker    }
1136*4bdc9457SAndroid Build Coastguard Worker  }
1137*4bdc9457SAndroid Build Coastguard Worker}
1138*4bdc9457SAndroid Build Coastguard Worker
1139*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels_with_output_stride) {
1140*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1141*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1142*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1143*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1144*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1145*4bdc9457SAndroid Build Coastguard Worker        MaxPoolMicrokernelTester()
1146*4bdc9457SAndroid Build Coastguard Worker          .output_pixels(output_pixels)
1147*4bdc9457SAndroid Build Coastguard Worker          .pooling_elements(pooling_elements)
1148*4bdc9457SAndroid Build Coastguard Worker          .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1149*4bdc9457SAndroid Build Coastguard Worker          .channels(channels)
1150*4bdc9457SAndroid Build Coastguard Worker          .output_stride(${next_prime(CHANNEL_TILE*5+1)})
1151*4bdc9457SAndroid Build Coastguard Worker          $if DATATYPE in ["s8", "u8"]:
1152*4bdc9457SAndroid Build Coastguard Worker            .qmin(std::numeric_limits<${CTYPE}>::min())
1153*4bdc9457SAndroid Build Coastguard Worker            .qmax(std::numeric_limits<${CTYPE}>::max())
1154*4bdc9457SAndroid Build Coastguard Worker          .Test(${", ".join(TEST_ARGS)});
1155*4bdc9457SAndroid Build Coastguard Worker      }
1156*4bdc9457SAndroid Build Coastguard Worker    }
1157*4bdc9457SAndroid Build Coastguard Worker  }
1158*4bdc9457SAndroid Build Coastguard Worker}
1159*4bdc9457SAndroid Build Coastguard Worker
1160*4bdc9457SAndroid Build Coastguard WorkerTEST(${TEST_NAME}, few_output_pixels_with_step) {
1161*4bdc9457SAndroid Build Coastguard Worker  $if ISA_CHECK:
1162*4bdc9457SAndroid Build Coastguard Worker    ${ISA_CHECK};
1163*4bdc9457SAndroid Build Coastguard Worker  for (size_t output_pixels = 2; output_pixels <= 5; output_pixels++) {
1164*4bdc9457SAndroid Build Coastguard Worker    for (size_t pooling_elements : std::vector<size_t>{{2, ${PRIMARY_TILE}, ${PRIMARY_TILE+INCREMENTAL_TILE-1}}}) {
1165*4bdc9457SAndroid Build Coastguard Worker      for (size_t channels = 1; channels <= ${CHANNEL_TILE*5}; channels += ${max(1, CHANNEL_TILE-1)}) {
1166*4bdc9457SAndroid Build Coastguard Worker        for (size_t step = 2; step <= pooling_elements; step++) {
1167*4bdc9457SAndroid Build Coastguard Worker          MaxPoolMicrokernelTester()
1168*4bdc9457SAndroid Build Coastguard Worker            .output_pixels(output_pixels)
1169*4bdc9457SAndroid Build Coastguard Worker            .pooling_elements(pooling_elements)
1170*4bdc9457SAndroid Build Coastguard Worker            .pooling_tile(${PRIMARY_TILE}, ${INCREMENTAL_TILE})
1171*4bdc9457SAndroid Build Coastguard Worker            .step(step)
1172*4bdc9457SAndroid Build Coastguard Worker            .channels(channels)
1173*4bdc9457SAndroid Build Coastguard Worker            .output_stride(${next_prime(CHANNEL_TILE*5+1)})
1174*4bdc9457SAndroid Build Coastguard Worker            $if DATATYPE in ["s8", "u8"]:
1175*4bdc9457SAndroid Build Coastguard Worker              .qmin(std::numeric_limits<${CTYPE}>::min())
1176*4bdc9457SAndroid Build Coastguard Worker              .qmax(std::numeric_limits<${CTYPE}>::max())
1177*4bdc9457SAndroid Build Coastguard Worker            .Test(${", ".join(TEST_ARGS)});
1178*4bdc9457SAndroid Build Coastguard Worker        }
1179*4bdc9457SAndroid Build Coastguard Worker      }
1180*4bdc9457SAndroid Build Coastguard Worker    }
1181*4bdc9457SAndroid Build Coastguard Worker  }
1182*4bdc9457SAndroid Build Coastguard Worker}
1183*4bdc9457SAndroid Build Coastguard Worker"""
1184*4bdc9457SAndroid Build Coastguard Worker
1185*4bdc9457SAndroid Build Coastguard Worker
1186*4bdc9457SAndroid Build Coastguard Workerdef generate_test_cases(ukernel, init_fn, primary_tile, incremental_tile,
1187*4bdc9457SAndroid Build Coastguard Worker                        channel_tile, isa):
1188*4bdc9457SAndroid Build Coastguard Worker  """Generates all tests cases for a MAXPOOL micro-kernel.
1189*4bdc9457SAndroid Build Coastguard Worker
1190*4bdc9457SAndroid Build Coastguard Worker  Args:
1191*4bdc9457SAndroid Build Coastguard Worker    ukernel: C name of the micro-kernel function.
1192*4bdc9457SAndroid Build Coastguard Worker    init_fn: C name of the function to initialize microkernel parameters.
1193*4bdc9457SAndroid Build Coastguard Worker    primary_tile: Number of rows (pixels) processed per one iteration of the
1194*4bdc9457SAndroid Build Coastguard Worker                  primary outer loop of the micro-kernel.
1195*4bdc9457SAndroid Build Coastguard Worker    incremental_tile: Number of rows (pixels) processed per one iteration of
1196*4bdc9457SAndroid Build Coastguard Worker                      the incremental outer loop of the micro-kernel.
1197*4bdc9457SAndroid Build Coastguard Worker    channel_tile: Number of channels processed per one iteration of the inner
1198*4bdc9457SAndroid Build Coastguard Worker                  loops of the micro-kernel.
1199*4bdc9457SAndroid Build Coastguard Worker    isa: instruction set required to run the micro-kernel. Generated unit test
1200*4bdc9457SAndroid Build Coastguard Worker         will skip execution if the host processor doesn't support this ISA.
1201*4bdc9457SAndroid Build Coastguard Worker
1202*4bdc9457SAndroid Build Coastguard Worker  Returns:
1203*4bdc9457SAndroid Build Coastguard Worker    Code for the test case.
1204*4bdc9457SAndroid Build Coastguard Worker  """
1205*4bdc9457SAndroid Build Coastguard Worker  _, test_name = ukernel.split("_", 1)
1206*4bdc9457SAndroid Build Coastguard Worker  _, datatype, ukernel_type, _ = ukernel.split("_", 3)
1207*4bdc9457SAndroid Build Coastguard Worker  test_args = [ukernel, init_fn]
1208*4bdc9457SAndroid Build Coastguard Worker  return xngen.preprocess(MAXPOOL_TEST_TEMPLATE, {
1209*4bdc9457SAndroid Build Coastguard Worker      "TEST_NAME": test_name.upper().replace("UKERNEL_", ""),
1210*4bdc9457SAndroid Build Coastguard Worker      "TEST_ARGS": test_args,
1211*4bdc9457SAndroid Build Coastguard Worker      "DATATYPE": datatype,
1212*4bdc9457SAndroid Build Coastguard Worker      "CTYPE": {"s8": "int8_t", "u8": "uint8_t", "f16": "uint16_t", "f32": "int16_t"}[datatype],
1213*4bdc9457SAndroid Build Coastguard Worker      "QMIN": {"s8": -64, "u8": 64}.get(datatype, -16384),
1214*4bdc9457SAndroid Build Coastguard Worker      "QMAX": {"s8": 64, "u8": 192}.get(datatype, 16384),
1215*4bdc9457SAndroid Build Coastguard Worker      "PRIMARY_TILE": primary_tile,
1216*4bdc9457SAndroid Build Coastguard Worker      "INCREMENTAL_TILE": incremental_tile,
1217*4bdc9457SAndroid Build Coastguard Worker      "CHANNEL_TILE": channel_tile,
1218*4bdc9457SAndroid Build Coastguard Worker      "ISA_CHECK": xnncommon.generate_isa_check_macro(isa),
1219*4bdc9457SAndroid Build Coastguard Worker      "next_prime": next_prime,
1220*4bdc9457SAndroid Build Coastguard Worker    })
1221*4bdc9457SAndroid Build Coastguard Worker
1222*4bdc9457SAndroid Build Coastguard Worker
1223*4bdc9457SAndroid Build Coastguard Workerdef main(args):
1224*4bdc9457SAndroid Build Coastguard Worker  options = parser.parse_args(args)
1225*4bdc9457SAndroid Build Coastguard Worker
1226*4bdc9457SAndroid Build Coastguard Worker  with codecs.open(options.spec, "r", encoding="utf-8") as spec_file:
1227*4bdc9457SAndroid Build Coastguard Worker    spec_yaml = yaml.safe_load(spec_file)
1228*4bdc9457SAndroid Build Coastguard Worker    if not isinstance(spec_yaml, list):
1229*4bdc9457SAndroid Build Coastguard Worker      raise ValueError("expected a list of micro-kernels in the spec")
1230*4bdc9457SAndroid Build Coastguard Worker
1231*4bdc9457SAndroid Build Coastguard Worker    tests = """\
1232*4bdc9457SAndroid Build Coastguard Worker// Copyright (c) Facebook, Inc. and its affiliates.
1233*4bdc9457SAndroid Build Coastguard Worker// All rights reserved.
1234*4bdc9457SAndroid Build Coastguard Worker//
1235*4bdc9457SAndroid Build Coastguard Worker// Copyright 2019 Google LLC
1236*4bdc9457SAndroid Build Coastguard Worker//
1237*4bdc9457SAndroid Build Coastguard Worker// This source code is licensed under the BSD-style license found in the
1238*4bdc9457SAndroid Build Coastguard Worker// LICENSE file in the root directory of this source tree.
1239*4bdc9457SAndroid Build Coastguard Worker//
1240*4bdc9457SAndroid Build Coastguard Worker// Auto-generated file. Do not edit!
1241*4bdc9457SAndroid Build Coastguard Worker//   Specification: {specification}
1242*4bdc9457SAndroid Build Coastguard Worker//   Generator: {generator}
1243*4bdc9457SAndroid Build Coastguard Worker
1244*4bdc9457SAndroid Build Coastguard Worker
1245*4bdc9457SAndroid Build Coastguard Worker#include <gtest/gtest.h>
1246*4bdc9457SAndroid Build Coastguard Worker
1247*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/common.h>
1248*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/isa-checks.h>
1249*4bdc9457SAndroid Build Coastguard Worker
1250*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/maxpool.h>
1251*4bdc9457SAndroid Build Coastguard Worker#include "maxpool-microkernel-tester.h"
1252*4bdc9457SAndroid Build Coastguard Worker""".format(specification=options.spec, generator=sys.argv[0])
1253*4bdc9457SAndroid Build Coastguard Worker
1254*4bdc9457SAndroid Build Coastguard Worker    for ukernel_spec in spec_yaml:
1255*4bdc9457SAndroid Build Coastguard Worker      name = ukernel_spec["name"]
1256*4bdc9457SAndroid Build Coastguard Worker      init_fn = ukernel_spec["init"]
1257*4bdc9457SAndroid Build Coastguard Worker      primary_tile, incremental_tile, channel_tile, arch, isa = \
1258*4bdc9457SAndroid Build Coastguard Worker        split_ukernel_name(name)
1259*4bdc9457SAndroid Build Coastguard Worker
1260*4bdc9457SAndroid Build Coastguard Worker      # specification can override architecture
1261*4bdc9457SAndroid Build Coastguard Worker      arch = ukernel_spec.get("arch", arch)
1262*4bdc9457SAndroid Build Coastguard Worker
1263*4bdc9457SAndroid Build Coastguard Worker      test_case = generate_test_cases(name, init_fn, primary_tile,
1264*4bdc9457SAndroid Build Coastguard Worker                                      incremental_tile, channel_tile, isa)
1265*4bdc9457SAndroid Build Coastguard Worker      tests += "\n\n" + xnncommon.postprocess_test_case(test_case, arch, isa)
1266*4bdc9457SAndroid Build Coastguard Worker
1267*4bdc9457SAndroid Build Coastguard Worker    txt_changed = True
1268*4bdc9457SAndroid Build Coastguard Worker    if os.path.exists(options.output):
1269*4bdc9457SAndroid Build Coastguard Worker      with codecs.open(options.output, "r", encoding="utf-8") as output_file:
1270*4bdc9457SAndroid Build Coastguard Worker        txt_changed = output_file.read() != tests
1271*4bdc9457SAndroid Build Coastguard Worker
1272*4bdc9457SAndroid Build Coastguard Worker    if txt_changed:
1273*4bdc9457SAndroid Build Coastguard Worker      with codecs.open(options.output, "w", encoding="utf-8") as output_file:
1274*4bdc9457SAndroid Build Coastguard Worker        output_file.write(tests)
1275*4bdc9457SAndroid Build Coastguard Worker
1276*4bdc9457SAndroid Build Coastguard Worker
1277*4bdc9457SAndroid Build Coastguard Workerif __name__ == "__main__":
1278*4bdc9457SAndroid Build Coastguard Worker  main(sys.argv[1:])
1279