xref: /aosp_15_r20/external/XNNPACK/test/f32-conv-hwc.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker 
6*4bdc9457SAndroid Build Coastguard Worker #include <gtest/gtest.h>
7*4bdc9457SAndroid Build Coastguard Worker 
8*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/common.h>
9*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/isa-checks.h>
10*4bdc9457SAndroid Build Coastguard Worker 
11*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/conv.h>
12*4bdc9457SAndroid Build Coastguard Worker #include "conv-hwc-microkernel-tester.h"
13*4bdc9457SAndroid Build Coastguard Worker 
14*4bdc9457SAndroid Build Coastguard Worker 
15*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_width_eq_4)16*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_width_eq_4) {
17*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
18*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
19*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
20*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
21*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
22*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
23*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
24*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
25*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
26*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
27*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
28*4bdc9457SAndroid Build Coastguard Worker   }
29*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_width_div_4)30*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_width_div_4) {
31*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
32*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
33*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
34*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
35*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
36*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
37*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
38*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
39*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
40*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
41*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
42*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
43*4bdc9457SAndroid Build Coastguard Worker     }
44*4bdc9457SAndroid Build Coastguard Worker   }
45*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_width_lt_4)46*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_width_lt_4) {
47*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
48*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 4; input_width++) {
49*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
50*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
51*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
52*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
53*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
54*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
55*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
56*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
57*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
58*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
59*4bdc9457SAndroid Build Coastguard Worker     }
60*4bdc9457SAndroid Build Coastguard Worker   }
61*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_width_gt_4)62*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_width_gt_4) {
63*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
64*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
65*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
66*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
67*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
68*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
69*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
70*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
71*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
72*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
73*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
74*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
75*4bdc9457SAndroid Build Coastguard Worker     }
76*4bdc9457SAndroid Build Coastguard Worker   }
77*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,output_channels_lt_8)78*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, output_channels_lt_8) {
79*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
80*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
81*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
82*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
83*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
84*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
85*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
86*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
87*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
88*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
89*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
90*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
91*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
92*4bdc9457SAndroid Build Coastguard Worker       }
93*4bdc9457SAndroid Build Coastguard Worker     }
94*4bdc9457SAndroid Build Coastguard Worker   }
95*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,output_channels_div_8)96*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, output_channels_div_8) {
97*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
98*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
99*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
100*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
101*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
102*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
103*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
104*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
105*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
106*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
107*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
108*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
109*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
110*4bdc9457SAndroid Build Coastguard Worker       }
111*4bdc9457SAndroid Build Coastguard Worker     }
112*4bdc9457SAndroid Build Coastguard Worker   }
113*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,output_channels_gt_8)114*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, output_channels_gt_8) {
115*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
116*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
117*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
118*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
119*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
120*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
121*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
122*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
123*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
124*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
125*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
126*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
127*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
128*4bdc9457SAndroid Build Coastguard Worker       }
129*4bdc9457SAndroid Build Coastguard Worker     }
130*4bdc9457SAndroid Build Coastguard Worker   }
131*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_height_lt_3)132*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_height_lt_3) {
133*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
134*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
135*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
136*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
137*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
138*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
139*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
140*4bdc9457SAndroid Build Coastguard Worker             .padding(1) // padded input height of at least 3 required
141*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
142*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
143*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
144*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
145*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
146*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
147*4bdc9457SAndroid Build Coastguard Worker         }
148*4bdc9457SAndroid Build Coastguard Worker       }
149*4bdc9457SAndroid Build Coastguard Worker     }
150*4bdc9457SAndroid Build Coastguard Worker   }
151*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,input_height_gt_3)152*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, input_height_gt_3) {
153*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
154*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
155*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
156*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
157*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
158*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
159*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
160*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
161*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
162*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
163*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
164*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
165*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
166*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
167*4bdc9457SAndroid Build Coastguard Worker         }
168*4bdc9457SAndroid Build Coastguard Worker       }
169*4bdc9457SAndroid Build Coastguard Worker     }
170*4bdc9457SAndroid Build Coastguard Worker   }
171*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,padding_top)172*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, padding_top) {
173*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
174*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
175*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
176*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
177*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
178*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
179*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
180*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
181*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
182*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
183*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
184*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
185*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
186*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
187*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
188*4bdc9457SAndroid Build Coastguard Worker         }
189*4bdc9457SAndroid Build Coastguard Worker       }
190*4bdc9457SAndroid Build Coastguard Worker     }
191*4bdc9457SAndroid Build Coastguard Worker   }
192*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,padding_bottom)193*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, padding_bottom) {
194*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
195*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
196*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
197*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
198*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
199*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
200*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
201*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
202*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
203*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
204*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
205*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
206*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
207*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
208*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
209*4bdc9457SAndroid Build Coastguard Worker         }
210*4bdc9457SAndroid Build Coastguard Worker       }
211*4bdc9457SAndroid Build Coastguard Worker     }
212*4bdc9457SAndroid Build Coastguard Worker   }
213*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,output_y_start)214*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, output_y_start) {
215*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
216*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
217*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
218*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
219*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
220*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
221*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
222*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
223*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
224*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
225*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
226*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
227*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
228*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
229*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
230*4bdc9457SAndroid Build Coastguard Worker         }
231*4bdc9457SAndroid Build Coastguard Worker       }
232*4bdc9457SAndroid Build Coastguard Worker     }
233*4bdc9457SAndroid Build Coastguard Worker   }
234*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,output_y_end)235*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, output_y_end) {
236*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
237*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
238*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
239*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
240*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
241*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
242*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
243*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
244*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
245*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
246*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
247*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
248*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
249*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
250*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
251*4bdc9457SAndroid Build Coastguard Worker         }
252*4bdc9457SAndroid Build Coastguard Worker       }
253*4bdc9457SAndroid Build Coastguard Worker     }
254*4bdc9457SAndroid Build Coastguard Worker   }
255*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,qmin)256*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, qmin) {
257*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
258*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
259*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
260*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
261*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
262*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
263*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
264*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
265*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
266*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
267*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
268*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
269*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
270*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
271*4bdc9457SAndroid Build Coastguard Worker       }
272*4bdc9457SAndroid Build Coastguard Worker     }
273*4bdc9457SAndroid Build Coastguard Worker   }
274*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2,qmax)275*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X2, qmax) {
276*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
277*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
278*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
279*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
280*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
281*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
282*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
283*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
284*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
285*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
286*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
287*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
288*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
289*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x2);
290*4bdc9457SAndroid Build Coastguard Worker       }
291*4bdc9457SAndroid Build Coastguard Worker     }
292*4bdc9457SAndroid Build Coastguard Worker   }
293*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
294*4bdc9457SAndroid Build Coastguard Worker 
295*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_width_eq_4)296*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_width_eq_4) {
297*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
298*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
299*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
300*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
301*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
302*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
303*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
304*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
305*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
306*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
307*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
308*4bdc9457SAndroid Build Coastguard Worker   }
309*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_width_div_4)310*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_width_div_4) {
311*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
312*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
313*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
314*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
315*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
316*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
317*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
318*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
319*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
320*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
321*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
322*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
323*4bdc9457SAndroid Build Coastguard Worker     }
324*4bdc9457SAndroid Build Coastguard Worker   }
325*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_width_lt_4)326*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_width_lt_4) {
327*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
328*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 4; input_width++) {
329*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
330*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
331*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
332*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
333*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
334*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
335*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
336*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
337*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
338*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
339*4bdc9457SAndroid Build Coastguard Worker     }
340*4bdc9457SAndroid Build Coastguard Worker   }
341*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_width_gt_4)342*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_width_gt_4) {
343*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
344*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
345*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
346*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
347*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
348*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
349*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
350*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
351*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
352*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
353*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
354*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
355*4bdc9457SAndroid Build Coastguard Worker     }
356*4bdc9457SAndroid Build Coastguard Worker   }
357*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,output_channels_lt_4)358*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, output_channels_lt_4) {
359*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
360*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
361*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
362*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
363*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
364*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
365*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
366*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
367*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
368*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
369*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
370*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
371*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
372*4bdc9457SAndroid Build Coastguard Worker       }
373*4bdc9457SAndroid Build Coastguard Worker     }
374*4bdc9457SAndroid Build Coastguard Worker   }
375*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,output_channels_div_4)376*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, output_channels_div_4) {
377*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
378*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
379*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
380*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
381*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
382*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
383*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
384*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
385*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
386*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
387*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
388*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
389*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
390*4bdc9457SAndroid Build Coastguard Worker       }
391*4bdc9457SAndroid Build Coastguard Worker     }
392*4bdc9457SAndroid Build Coastguard Worker   }
393*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,output_channels_gt_4)394*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, output_channels_gt_4) {
395*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
396*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
397*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
398*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
399*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
400*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
401*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
402*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
403*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
404*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
405*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
406*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
407*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
408*4bdc9457SAndroid Build Coastguard Worker       }
409*4bdc9457SAndroid Build Coastguard Worker     }
410*4bdc9457SAndroid Build Coastguard Worker   }
411*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_height_lt_3)412*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_height_lt_3) {
413*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
414*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
415*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
416*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
417*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
418*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
419*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
420*4bdc9457SAndroid Build Coastguard Worker             .padding(1)
421*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3) // padded input height of at least 3 required
422*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
423*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
424*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
425*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
426*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
427*4bdc9457SAndroid Build Coastguard Worker         }
428*4bdc9457SAndroid Build Coastguard Worker       }
429*4bdc9457SAndroid Build Coastguard Worker     }
430*4bdc9457SAndroid Build Coastguard Worker   }
431*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,input_height_gt_3)432*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, input_height_gt_3) {
433*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
434*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
435*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
436*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
437*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
438*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
439*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
440*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
441*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
442*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
443*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
444*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
445*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
446*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
447*4bdc9457SAndroid Build Coastguard Worker         }
448*4bdc9457SAndroid Build Coastguard Worker       }
449*4bdc9457SAndroid Build Coastguard Worker     }
450*4bdc9457SAndroid Build Coastguard Worker   }
451*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,padding_top)452*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, padding_top) {
453*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
454*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
455*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
456*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
457*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
458*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
459*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
460*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
461*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
462*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
463*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
464*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
465*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
466*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
467*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
468*4bdc9457SAndroid Build Coastguard Worker         }
469*4bdc9457SAndroid Build Coastguard Worker       }
470*4bdc9457SAndroid Build Coastguard Worker     }
471*4bdc9457SAndroid Build Coastguard Worker   }
472*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,padding_bottom)473*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, padding_bottom) {
474*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
475*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
476*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
477*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
478*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
479*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
480*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
481*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
482*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
483*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
484*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
485*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
486*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
487*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
488*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
489*4bdc9457SAndroid Build Coastguard Worker         }
490*4bdc9457SAndroid Build Coastguard Worker       }
491*4bdc9457SAndroid Build Coastguard Worker     }
492*4bdc9457SAndroid Build Coastguard Worker   }
493*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,output_y_start)494*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, output_y_start) {
495*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
496*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
497*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
498*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
499*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
500*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
501*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
502*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
503*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
504*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
505*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
506*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
507*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
508*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
509*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
510*4bdc9457SAndroid Build Coastguard Worker         }
511*4bdc9457SAndroid Build Coastguard Worker       }
512*4bdc9457SAndroid Build Coastguard Worker     }
513*4bdc9457SAndroid Build Coastguard Worker   }
514*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,output_y_end)515*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, output_y_end) {
516*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
517*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
518*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
519*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
520*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
521*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
522*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
523*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
524*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
525*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
526*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
527*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
528*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
529*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
530*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
531*4bdc9457SAndroid Build Coastguard Worker         }
532*4bdc9457SAndroid Build Coastguard Worker       }
533*4bdc9457SAndroid Build Coastguard Worker     }
534*4bdc9457SAndroid Build Coastguard Worker   }
535*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,qmin)536*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, qmin) {
537*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
538*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
539*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
540*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
541*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
542*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
543*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
544*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
545*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
546*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
547*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
548*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
549*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
550*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
551*4bdc9457SAndroid Build Coastguard Worker       }
552*4bdc9457SAndroid Build Coastguard Worker     }
553*4bdc9457SAndroid Build Coastguard Worker   }
554*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2,qmax)555*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X2, qmax) {
556*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
557*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
558*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
559*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
560*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
561*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
562*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
563*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
564*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
565*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
566*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
567*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
568*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
569*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x2);
570*4bdc9457SAndroid Build Coastguard Worker       }
571*4bdc9457SAndroid Build Coastguard Worker     }
572*4bdc9457SAndroid Build Coastguard Worker   }
573*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
574*4bdc9457SAndroid Build Coastguard Worker 
575*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_width_eq_4)576*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_width_eq_4) {
577*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
578*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
579*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
580*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
581*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
582*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
583*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
584*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
585*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
586*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
587*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
588*4bdc9457SAndroid Build Coastguard Worker   }
589*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_width_div_4)590*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_width_div_4) {
591*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
592*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
593*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
594*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
595*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
596*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
597*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
598*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
599*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
600*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
601*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
602*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
603*4bdc9457SAndroid Build Coastguard Worker     }
604*4bdc9457SAndroid Build Coastguard Worker   }
605*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_width_lt_4)606*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_width_lt_4) {
607*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
608*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 4; input_width++) {
609*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
610*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
611*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
612*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
613*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
614*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
615*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
616*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
617*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
618*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
619*4bdc9457SAndroid Build Coastguard Worker     }
620*4bdc9457SAndroid Build Coastguard Worker   }
621*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_width_gt_4)622*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_width_gt_4) {
623*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
624*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
625*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
626*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
627*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
628*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
629*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
630*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
631*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
632*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
633*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
634*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
635*4bdc9457SAndroid Build Coastguard Worker     }
636*4bdc9457SAndroid Build Coastguard Worker   }
637*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,output_channels_lt_8)638*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, output_channels_lt_8) {
639*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
640*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
641*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
642*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
643*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
644*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
645*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
646*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
647*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
648*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
649*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
650*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
651*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
652*4bdc9457SAndroid Build Coastguard Worker       }
653*4bdc9457SAndroid Build Coastguard Worker     }
654*4bdc9457SAndroid Build Coastguard Worker   }
655*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,output_channels_div_8)656*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, output_channels_div_8) {
657*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
658*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
659*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
660*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
661*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
662*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
663*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
664*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
665*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
666*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
667*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
668*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
669*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
670*4bdc9457SAndroid Build Coastguard Worker       }
671*4bdc9457SAndroid Build Coastguard Worker     }
672*4bdc9457SAndroid Build Coastguard Worker   }
673*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,output_channels_gt_8)674*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, output_channels_gt_8) {
675*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
676*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
677*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
678*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
679*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
680*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
681*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
682*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
683*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
684*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
685*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
686*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
687*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
688*4bdc9457SAndroid Build Coastguard Worker       }
689*4bdc9457SAndroid Build Coastguard Worker     }
690*4bdc9457SAndroid Build Coastguard Worker   }
691*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_height_lt_3)692*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_height_lt_3) {
693*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
694*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
695*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
696*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
697*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
698*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
699*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
700*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1)
701*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
702*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
703*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
704*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
705*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
706*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
707*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
708*4bdc9457SAndroid Build Coastguard Worker         }
709*4bdc9457SAndroid Build Coastguard Worker       }
710*4bdc9457SAndroid Build Coastguard Worker     }
711*4bdc9457SAndroid Build Coastguard Worker   }
712*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,input_height_gt_3)713*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, input_height_gt_3) {
714*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
715*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
716*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
717*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
718*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
719*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
720*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
721*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
722*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
723*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
724*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
725*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
726*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
727*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
728*4bdc9457SAndroid Build Coastguard Worker         }
729*4bdc9457SAndroid Build Coastguard Worker       }
730*4bdc9457SAndroid Build Coastguard Worker     }
731*4bdc9457SAndroid Build Coastguard Worker   }
732*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,padding_top)733*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, padding_top) {
734*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
735*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
736*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
737*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
738*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
739*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
740*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
741*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
742*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
743*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
744*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
745*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
746*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
747*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
748*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
749*4bdc9457SAndroid Build Coastguard Worker         }
750*4bdc9457SAndroid Build Coastguard Worker       }
751*4bdc9457SAndroid Build Coastguard Worker     }
752*4bdc9457SAndroid Build Coastguard Worker   }
753*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,padding_bottom)754*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, padding_bottom) {
755*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
756*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
757*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
758*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
759*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
760*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
761*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
762*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
763*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
764*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
765*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
766*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
767*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
768*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
769*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
770*4bdc9457SAndroid Build Coastguard Worker         }
771*4bdc9457SAndroid Build Coastguard Worker       }
772*4bdc9457SAndroid Build Coastguard Worker     }
773*4bdc9457SAndroid Build Coastguard Worker   }
774*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,output_y_start)775*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, output_y_start) {
776*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
777*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
778*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
779*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
780*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
781*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
782*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
783*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
784*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
785*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
786*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
787*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
788*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
789*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
790*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
791*4bdc9457SAndroid Build Coastguard Worker         }
792*4bdc9457SAndroid Build Coastguard Worker       }
793*4bdc9457SAndroid Build Coastguard Worker     }
794*4bdc9457SAndroid Build Coastguard Worker   }
795*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,output_y_end)796*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, output_y_end) {
797*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
798*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
799*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
800*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
801*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
802*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
803*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
804*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
805*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
806*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
807*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
808*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
809*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
810*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
811*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
812*4bdc9457SAndroid Build Coastguard Worker         }
813*4bdc9457SAndroid Build Coastguard Worker       }
814*4bdc9457SAndroid Build Coastguard Worker     }
815*4bdc9457SAndroid Build Coastguard Worker   }
816*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,qmin)817*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, qmin) {
818*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
819*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
820*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
821*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
822*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
823*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
824*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
825*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
826*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
827*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
828*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
829*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
830*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
831*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
832*4bdc9457SAndroid Build Coastguard Worker       }
833*4bdc9457SAndroid Build Coastguard Worker     }
834*4bdc9457SAndroid Build Coastguard Worker   }
835*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2,qmax)836*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEON_2X2, qmax) {
837*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
838*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
839*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
840*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
841*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
842*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
843*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
844*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
845*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
846*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
847*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
848*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
849*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
850*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neon_2x2);
851*4bdc9457SAndroid Build Coastguard Worker       }
852*4bdc9457SAndroid Build Coastguard Worker     }
853*4bdc9457SAndroid Build Coastguard Worker   }
854*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
855*4bdc9457SAndroid Build Coastguard Worker 
856*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_width_eq_4)857*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_width_eq_4) {
858*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
859*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
860*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
861*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
862*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
863*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
864*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
865*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
866*4bdc9457SAndroid Build Coastguard Worker       .input_width(5)
867*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
868*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
869*4bdc9457SAndroid Build Coastguard Worker   }
870*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_width_div_4)871*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_width_div_4) {
872*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
873*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
874*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
875*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
876*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
877*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
878*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
879*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
880*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
881*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
882*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
883*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
884*4bdc9457SAndroid Build Coastguard Worker     }
885*4bdc9457SAndroid Build Coastguard Worker   }
886*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_width_lt_4)887*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_width_lt_4) {
888*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
889*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 4; input_width++) {
890*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
891*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
892*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
893*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
894*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
895*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
896*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
897*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
898*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
899*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
900*4bdc9457SAndroid Build Coastguard Worker     }
901*4bdc9457SAndroid Build Coastguard Worker   }
902*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_width_gt_4)903*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_width_gt_4) {
904*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
905*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
906*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
907*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
908*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
909*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
910*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
911*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
912*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
913*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
914*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
915*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
916*4bdc9457SAndroid Build Coastguard Worker     }
917*4bdc9457SAndroid Build Coastguard Worker   }
918*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,output_channels_lt_4)919*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, output_channels_lt_4) {
920*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
921*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
922*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
923*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
924*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
925*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
926*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
927*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
928*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
929*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
930*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
931*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
932*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
933*4bdc9457SAndroid Build Coastguard Worker       }
934*4bdc9457SAndroid Build Coastguard Worker     }
935*4bdc9457SAndroid Build Coastguard Worker   }
936*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,output_channels_div_4)937*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, output_channels_div_4) {
938*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
939*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
940*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
941*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
942*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
943*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
944*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
945*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
946*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
947*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
948*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
949*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
950*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
951*4bdc9457SAndroid Build Coastguard Worker       }
952*4bdc9457SAndroid Build Coastguard Worker     }
953*4bdc9457SAndroid Build Coastguard Worker   }
954*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,output_channels_gt_4)955*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, output_channels_gt_4) {
956*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
957*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
958*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
959*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
960*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
961*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
962*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
963*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
964*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
965*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
966*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
967*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
968*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
969*4bdc9457SAndroid Build Coastguard Worker       }
970*4bdc9457SAndroid Build Coastguard Worker     }
971*4bdc9457SAndroid Build Coastguard Worker   }
972*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_height_lt_3)973*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_height_lt_3) {
974*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
975*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
976*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
977*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
978*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
979*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
980*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
981*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
982*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1) // padded input height of at least 3 required
983*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
984*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
985*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
986*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
987*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
988*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
989*4bdc9457SAndroid Build Coastguard Worker         }
990*4bdc9457SAndroid Build Coastguard Worker       }
991*4bdc9457SAndroid Build Coastguard Worker     }
992*4bdc9457SAndroid Build Coastguard Worker   }
993*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,input_height_gt_3)994*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, input_height_gt_3) {
995*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
996*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
997*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
998*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
999*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1000*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1001*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1002*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1003*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1004*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1005*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1006*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1007*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1008*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1009*4bdc9457SAndroid Build Coastguard Worker         }
1010*4bdc9457SAndroid Build Coastguard Worker       }
1011*4bdc9457SAndroid Build Coastguard Worker     }
1012*4bdc9457SAndroid Build Coastguard Worker   }
1013*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,padding_top)1014*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, padding_top) {
1015*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1016*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1017*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1018*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1019*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1020*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1021*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1022*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1023*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
1024*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1025*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1026*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1027*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1028*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1029*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1030*4bdc9457SAndroid Build Coastguard Worker         }
1031*4bdc9457SAndroid Build Coastguard Worker       }
1032*4bdc9457SAndroid Build Coastguard Worker     }
1033*4bdc9457SAndroid Build Coastguard Worker   }
1034*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,padding_bottom)1035*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, padding_bottom) {
1036*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1037*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1038*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1039*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1040*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1041*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1042*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1043*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1044*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
1045*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1046*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1047*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1048*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1049*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1050*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1051*4bdc9457SAndroid Build Coastguard Worker         }
1052*4bdc9457SAndroid Build Coastguard Worker       }
1053*4bdc9457SAndroid Build Coastguard Worker     }
1054*4bdc9457SAndroid Build Coastguard Worker   }
1055*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,output_y_start)1056*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, output_y_start) {
1057*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1058*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
1059*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1060*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1061*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1062*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1063*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1064*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1065*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1066*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1067*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1068*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1069*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1070*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
1071*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1072*4bdc9457SAndroid Build Coastguard Worker         }
1073*4bdc9457SAndroid Build Coastguard Worker       }
1074*4bdc9457SAndroid Build Coastguard Worker     }
1075*4bdc9457SAndroid Build Coastguard Worker   }
1076*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,output_y_end)1077*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, output_y_end) {
1078*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1079*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
1080*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1081*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1082*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1083*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1084*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1085*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1086*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1087*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1088*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1089*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1090*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1091*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
1092*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1093*4bdc9457SAndroid Build Coastguard Worker         }
1094*4bdc9457SAndroid Build Coastguard Worker       }
1095*4bdc9457SAndroid Build Coastguard Worker     }
1096*4bdc9457SAndroid Build Coastguard Worker   }
1097*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,qmin)1098*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, qmin) {
1099*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1100*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1101*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1102*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1103*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1104*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1105*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1106*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1107*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1108*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1109*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1110*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1111*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
1112*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1113*4bdc9457SAndroid Build Coastguard Worker       }
1114*4bdc9457SAndroid Build Coastguard Worker     }
1115*4bdc9457SAndroid Build Coastguard Worker   }
1116*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2,qmax)1117*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEON_2X2, qmax) {
1118*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
1119*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1120*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1121*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1122*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1123*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1124*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1125*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1126*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1127*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1128*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1129*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1130*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
1131*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neon_2x2);
1132*4bdc9457SAndroid Build Coastguard Worker       }
1133*4bdc9457SAndroid Build Coastguard Worker     }
1134*4bdc9457SAndroid Build Coastguard Worker   }
1135*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
1136*4bdc9457SAndroid Build Coastguard Worker 
1137*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_width_eq_4)1138*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_width_eq_4) {
1139*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1140*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
1141*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
1142*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
1143*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
1144*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
1145*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
1146*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
1147*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
1148*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
1149*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1150*4bdc9457SAndroid Build Coastguard Worker   }
1151*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_width_div_4)1152*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_width_div_4) {
1153*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1154*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
1155*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1156*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1157*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1158*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1159*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1160*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1161*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1162*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1163*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1164*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1165*4bdc9457SAndroid Build Coastguard Worker     }
1166*4bdc9457SAndroid Build Coastguard Worker   }
1167*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_width_lt_4)1168*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_width_lt_4) {
1169*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1170*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 4; input_width++) {
1171*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1172*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1173*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1174*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1175*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1176*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1177*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1178*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1179*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1180*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1181*4bdc9457SAndroid Build Coastguard Worker     }
1182*4bdc9457SAndroid Build Coastguard Worker   }
1183*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_width_gt_4)1184*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_width_gt_4) {
1185*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1186*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
1187*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1188*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1189*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1190*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1191*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1192*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1193*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1194*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1195*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1196*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1197*4bdc9457SAndroid Build Coastguard Worker     }
1198*4bdc9457SAndroid Build Coastguard Worker   }
1199*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,output_channels_lt_8)1200*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, output_channels_lt_8) {
1201*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1202*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
1203*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1204*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1205*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1206*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1207*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1208*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1209*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1210*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1211*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1212*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1213*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1214*4bdc9457SAndroid Build Coastguard Worker       }
1215*4bdc9457SAndroid Build Coastguard Worker     }
1216*4bdc9457SAndroid Build Coastguard Worker   }
1217*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,output_channels_div_8)1218*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, output_channels_div_8) {
1219*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1220*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
1221*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1222*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1223*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1224*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1225*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1226*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1227*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1228*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1229*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1230*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1231*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1232*4bdc9457SAndroid Build Coastguard Worker       }
1233*4bdc9457SAndroid Build Coastguard Worker     }
1234*4bdc9457SAndroid Build Coastguard Worker   }
1235*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,output_channels_gt_8)1236*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, output_channels_gt_8) {
1237*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1238*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
1239*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1240*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1241*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1242*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1243*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1244*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1245*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1246*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1247*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1248*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1249*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1250*4bdc9457SAndroid Build Coastguard Worker       }
1251*4bdc9457SAndroid Build Coastguard Worker     }
1252*4bdc9457SAndroid Build Coastguard Worker   }
1253*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_height_lt_3)1254*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_height_lt_3) {
1255*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1256*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
1257*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1258*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1259*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1260*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1261*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1262*4bdc9457SAndroid Build Coastguard Worker             .padding(1) // padded input height of at least 3 required
1263*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1264*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1265*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1266*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1267*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1268*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1269*4bdc9457SAndroid Build Coastguard Worker         }
1270*4bdc9457SAndroid Build Coastguard Worker       }
1271*4bdc9457SAndroid Build Coastguard Worker     }
1272*4bdc9457SAndroid Build Coastguard Worker   }
1273*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,input_height_gt_3)1274*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, input_height_gt_3) {
1275*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1276*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
1277*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1278*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1279*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1280*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1281*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1282*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1283*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1284*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1285*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1286*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1287*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1288*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1289*4bdc9457SAndroid Build Coastguard Worker         }
1290*4bdc9457SAndroid Build Coastguard Worker       }
1291*4bdc9457SAndroid Build Coastguard Worker     }
1292*4bdc9457SAndroid Build Coastguard Worker   }
1293*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,padding_top)1294*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, padding_top) {
1295*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1296*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1297*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1298*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1299*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1300*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1301*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1302*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1303*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
1304*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1305*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1306*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1307*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1308*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1309*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1310*4bdc9457SAndroid Build Coastguard Worker         }
1311*4bdc9457SAndroid Build Coastguard Worker       }
1312*4bdc9457SAndroid Build Coastguard Worker     }
1313*4bdc9457SAndroid Build Coastguard Worker   }
1314*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,padding_bottom)1315*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, padding_bottom) {
1316*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1317*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1318*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1319*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1320*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1321*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1322*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1323*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1324*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
1325*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1326*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1327*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1328*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1329*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1330*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1331*4bdc9457SAndroid Build Coastguard Worker         }
1332*4bdc9457SAndroid Build Coastguard Worker       }
1333*4bdc9457SAndroid Build Coastguard Worker     }
1334*4bdc9457SAndroid Build Coastguard Worker   }
1335*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,output_y_start)1336*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, output_y_start) {
1337*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1338*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
1339*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1340*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1341*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1342*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1343*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1344*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1345*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1346*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1347*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1348*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1349*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1350*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
1351*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1352*4bdc9457SAndroid Build Coastguard Worker         }
1353*4bdc9457SAndroid Build Coastguard Worker       }
1354*4bdc9457SAndroid Build Coastguard Worker     }
1355*4bdc9457SAndroid Build Coastguard Worker   }
1356*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,output_y_end)1357*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, output_y_end) {
1358*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1359*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
1360*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1361*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1362*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1363*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1364*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1365*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1366*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1367*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1368*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1369*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1370*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1371*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
1372*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1373*4bdc9457SAndroid Build Coastguard Worker         }
1374*4bdc9457SAndroid Build Coastguard Worker       }
1375*4bdc9457SAndroid Build Coastguard Worker     }
1376*4bdc9457SAndroid Build Coastguard Worker   }
1377*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,qmin)1378*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, qmin) {
1379*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1380*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1381*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1382*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1383*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1384*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1385*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1386*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1387*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1388*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1389*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1390*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1391*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
1392*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1393*4bdc9457SAndroid Build Coastguard Worker       }
1394*4bdc9457SAndroid Build Coastguard Worker     }
1395*4bdc9457SAndroid Build Coastguard Worker   }
1396*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2,qmax)1397*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X2, qmax) {
1398*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1399*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1400*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1401*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1402*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1403*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1404*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1405*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1406*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1407*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1408*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1409*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1410*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
1411*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x2);
1412*4bdc9457SAndroid Build Coastguard Worker       }
1413*4bdc9457SAndroid Build Coastguard Worker     }
1414*4bdc9457SAndroid Build Coastguard Worker   }
1415*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
1416*4bdc9457SAndroid Build Coastguard Worker 
1417*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_width_eq_4)1418*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_width_eq_4) {
1419*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1420*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
1421*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
1422*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
1423*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
1424*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
1425*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
1426*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
1427*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
1428*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
1429*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1430*4bdc9457SAndroid Build Coastguard Worker   }
1431*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_width_div_4)1432*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_width_div_4) {
1433*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1434*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
1435*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1436*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1437*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1438*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1439*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1440*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
1441*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
1442*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1443*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1444*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1445*4bdc9457SAndroid Build Coastguard Worker     }
1446*4bdc9457SAndroid Build Coastguard Worker   }
1447*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_width_lt_4)1448*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_width_lt_4) {
1449*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1450*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 4; input_width++) {
1451*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1452*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1453*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1454*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1455*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1456*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
1457*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
1458*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1459*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1460*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1461*4bdc9457SAndroid Build Coastguard Worker     }
1462*4bdc9457SAndroid Build Coastguard Worker   }
1463*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_width_gt_4)1464*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_width_gt_4) {
1465*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1466*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
1467*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1468*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1469*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1470*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
1471*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1472*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
1473*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
1474*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1475*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1476*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1477*4bdc9457SAndroid Build Coastguard Worker     }
1478*4bdc9457SAndroid Build Coastguard Worker   }
1479*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,output_channels_lt_4)1480*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, output_channels_lt_4) {
1481*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1482*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
1483*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1484*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1485*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1486*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1487*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1488*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1489*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1490*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1491*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1492*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1493*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1494*4bdc9457SAndroid Build Coastguard Worker       }
1495*4bdc9457SAndroid Build Coastguard Worker     }
1496*4bdc9457SAndroid Build Coastguard Worker   }
1497*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,output_channels_div_4)1498*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, output_channels_div_4) {
1499*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1500*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
1501*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1502*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1503*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1504*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1505*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1506*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1507*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1508*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1509*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1510*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1511*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1512*4bdc9457SAndroid Build Coastguard Worker       }
1513*4bdc9457SAndroid Build Coastguard Worker     }
1514*4bdc9457SAndroid Build Coastguard Worker   }
1515*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,output_channels_gt_4)1516*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, output_channels_gt_4) {
1517*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1518*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
1519*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1520*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1521*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1522*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1523*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1524*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1525*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1526*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1527*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1528*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1529*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1530*4bdc9457SAndroid Build Coastguard Worker       }
1531*4bdc9457SAndroid Build Coastguard Worker     }
1532*4bdc9457SAndroid Build Coastguard Worker   }
1533*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_height_lt_3)1534*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_height_lt_3) {
1535*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1536*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
1537*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1538*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1539*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1540*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1541*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1542*4bdc9457SAndroid Build Coastguard Worker             .padding(1)
1543*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3) // padded input height of at least 3 required
1544*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1545*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1546*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1547*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1548*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1549*4bdc9457SAndroid Build Coastguard Worker         }
1550*4bdc9457SAndroid Build Coastguard Worker       }
1551*4bdc9457SAndroid Build Coastguard Worker     }
1552*4bdc9457SAndroid Build Coastguard Worker   }
1553*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,input_height_gt_3)1554*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, input_height_gt_3) {
1555*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1556*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
1557*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1558*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1559*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1560*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1561*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1562*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1563*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1564*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1565*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1566*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1567*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1568*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1569*4bdc9457SAndroid Build Coastguard Worker         }
1570*4bdc9457SAndroid Build Coastguard Worker       }
1571*4bdc9457SAndroid Build Coastguard Worker     }
1572*4bdc9457SAndroid Build Coastguard Worker   }
1573*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,padding_top)1574*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, padding_top) {
1575*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1576*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1577*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1578*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1579*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1580*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1581*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1582*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1583*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
1584*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1585*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1586*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1587*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1588*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1589*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1590*4bdc9457SAndroid Build Coastguard Worker         }
1591*4bdc9457SAndroid Build Coastguard Worker       }
1592*4bdc9457SAndroid Build Coastguard Worker     }
1593*4bdc9457SAndroid Build Coastguard Worker   }
1594*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,padding_bottom)1595*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, padding_bottom) {
1596*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1597*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1598*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1599*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1600*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1601*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1602*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1603*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1604*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
1605*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1606*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1607*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1608*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1609*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1610*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1611*4bdc9457SAndroid Build Coastguard Worker         }
1612*4bdc9457SAndroid Build Coastguard Worker       }
1613*4bdc9457SAndroid Build Coastguard Worker     }
1614*4bdc9457SAndroid Build Coastguard Worker   }
1615*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,output_y_start)1616*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, output_y_start) {
1617*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1618*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
1619*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1620*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1621*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1622*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1623*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1624*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1625*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1626*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1627*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1628*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1629*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1630*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
1631*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1632*4bdc9457SAndroid Build Coastguard Worker         }
1633*4bdc9457SAndroid Build Coastguard Worker       }
1634*4bdc9457SAndroid Build Coastguard Worker     }
1635*4bdc9457SAndroid Build Coastguard Worker   }
1636*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,output_y_end)1637*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, output_y_end) {
1638*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1639*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
1640*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1641*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 32; input_width += 7) {
1642*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1643*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1644*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1645*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
1646*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1647*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
1648*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1649*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1650*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1651*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
1652*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1653*4bdc9457SAndroid Build Coastguard Worker         }
1654*4bdc9457SAndroid Build Coastguard Worker       }
1655*4bdc9457SAndroid Build Coastguard Worker     }
1656*4bdc9457SAndroid Build Coastguard Worker   }
1657*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,qmin)1658*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, qmin) {
1659*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1660*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1661*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1662*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1663*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1664*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1665*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1666*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1667*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1668*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1669*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1670*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1671*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
1672*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1673*4bdc9457SAndroid Build Coastguard Worker       }
1674*4bdc9457SAndroid Build Coastguard Worker     }
1675*4bdc9457SAndroid Build Coastguard Worker   }
1676*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2,qmax)1677*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X2, qmax) {
1678*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1679*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
1680*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 32; input_width += 7) {
1681*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1682*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1683*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1684*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
1685*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1686*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
1687*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1688*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1689*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1690*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
1691*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x2);
1692*4bdc9457SAndroid Build Coastguard Worker       }
1693*4bdc9457SAndroid Build Coastguard Worker     }
1694*4bdc9457SAndroid Build Coastguard Worker   }
1695*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
1696*4bdc9457SAndroid Build Coastguard Worker 
1697*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_width_eq_4)1698*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_width_eq_4) {
1699*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1700*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
1701*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
1702*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
1703*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
1704*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
1705*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
1706*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
1707*4bdc9457SAndroid Build Coastguard Worker       .input_width(4)
1708*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
1709*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1710*4bdc9457SAndroid Build Coastguard Worker   }
1711*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_width_div_4)1712*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_width_div_4) {
1713*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1714*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
1715*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1716*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1717*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1718*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
1719*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1720*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1721*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1722*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1723*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1724*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1725*4bdc9457SAndroid Build Coastguard Worker     }
1726*4bdc9457SAndroid Build Coastguard Worker   }
1727*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_width_lt_4)1728*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_width_lt_4) {
1729*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1730*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 4; input_width++) {
1731*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1732*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1733*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1734*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
1735*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1736*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1737*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1738*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1739*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1740*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1741*4bdc9457SAndroid Build Coastguard Worker     }
1742*4bdc9457SAndroid Build Coastguard Worker   }
1743*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_width_gt_4)1744*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_width_gt_4) {
1745*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1746*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
1747*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1748*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1749*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1750*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
1751*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
1752*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
1753*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
1754*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
1755*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
1756*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1757*4bdc9457SAndroid Build Coastguard Worker     }
1758*4bdc9457SAndroid Build Coastguard Worker   }
1759*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,output_channels_lt_8)1760*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, output_channels_lt_8) {
1761*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1762*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
1763*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1764*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1765*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1766*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1767*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1768*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1769*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1770*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1771*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1772*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1773*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1774*4bdc9457SAndroid Build Coastguard Worker       }
1775*4bdc9457SAndroid Build Coastguard Worker     }
1776*4bdc9457SAndroid Build Coastguard Worker   }
1777*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,output_channels_div_8)1778*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, output_channels_div_8) {
1779*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1780*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
1781*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1782*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1783*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1784*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1785*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1786*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1787*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1788*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1789*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1790*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1791*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1792*4bdc9457SAndroid Build Coastguard Worker       }
1793*4bdc9457SAndroid Build Coastguard Worker     }
1794*4bdc9457SAndroid Build Coastguard Worker   }
1795*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,output_channels_gt_8)1796*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, output_channels_gt_8) {
1797*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1798*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
1799*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1800*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1801*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1802*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1803*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1804*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1805*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1806*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1807*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1808*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
1809*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1810*4bdc9457SAndroid Build Coastguard Worker       }
1811*4bdc9457SAndroid Build Coastguard Worker     }
1812*4bdc9457SAndroid Build Coastguard Worker   }
1813*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_height_lt_3)1814*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_height_lt_3) {
1815*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1816*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
1817*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1818*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1819*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1820*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1821*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1822*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1)
1823*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1824*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1825*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1826*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1827*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1828*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1829*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1830*4bdc9457SAndroid Build Coastguard Worker         }
1831*4bdc9457SAndroid Build Coastguard Worker       }
1832*4bdc9457SAndroid Build Coastguard Worker     }
1833*4bdc9457SAndroid Build Coastguard Worker   }
1834*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,input_height_gt_3)1835*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, input_height_gt_3) {
1836*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1837*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
1838*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1839*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1840*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1841*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1842*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1843*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1844*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1845*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1846*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1847*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1848*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
1849*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1850*4bdc9457SAndroid Build Coastguard Worker         }
1851*4bdc9457SAndroid Build Coastguard Worker       }
1852*4bdc9457SAndroid Build Coastguard Worker     }
1853*4bdc9457SAndroid Build Coastguard Worker   }
1854*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,padding_top)1855*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, padding_top) {
1856*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1857*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
1858*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1859*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1860*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1861*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1862*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1863*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1864*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
1865*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1866*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1867*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1868*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1869*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1870*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1871*4bdc9457SAndroid Build Coastguard Worker         }
1872*4bdc9457SAndroid Build Coastguard Worker       }
1873*4bdc9457SAndroid Build Coastguard Worker     }
1874*4bdc9457SAndroid Build Coastguard Worker   }
1875*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,padding_bottom)1876*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, padding_bottom) {
1877*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1878*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
1879*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1880*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1881*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1882*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1883*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1884*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1885*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
1886*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1887*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1888*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1889*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1890*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1891*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1892*4bdc9457SAndroid Build Coastguard Worker         }
1893*4bdc9457SAndroid Build Coastguard Worker       }
1894*4bdc9457SAndroid Build Coastguard Worker     }
1895*4bdc9457SAndroid Build Coastguard Worker   }
1896*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,output_y_start)1897*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, output_y_start) {
1898*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1899*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
1900*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1901*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1902*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1903*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1904*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1905*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1906*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1907*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1908*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1909*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1910*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1911*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
1912*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1913*4bdc9457SAndroid Build Coastguard Worker         }
1914*4bdc9457SAndroid Build Coastguard Worker       }
1915*4bdc9457SAndroid Build Coastguard Worker     }
1916*4bdc9457SAndroid Build Coastguard Worker   }
1917*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,output_y_end)1918*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, output_y_end) {
1919*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1920*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
1921*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1922*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
1923*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
1924*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
1925*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
1926*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
1927*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
1928*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
1929*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
1930*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
1931*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
1932*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
1933*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1934*4bdc9457SAndroid Build Coastguard Worker         }
1935*4bdc9457SAndroid Build Coastguard Worker       }
1936*4bdc9457SAndroid Build Coastguard Worker     }
1937*4bdc9457SAndroid Build Coastguard Worker   }
1938*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,qmin)1939*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, qmin) {
1940*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1941*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1942*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1943*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1944*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1945*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1946*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1947*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1948*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1949*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1950*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1951*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1952*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
1953*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1954*4bdc9457SAndroid Build Coastguard Worker       }
1955*4bdc9457SAndroid Build Coastguard Worker     }
1956*4bdc9457SAndroid Build Coastguard Worker   }
1957*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2,qmax)1958*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X2, qmax) {
1959*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1960*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
1961*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
1962*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
1963*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
1964*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
1965*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
1966*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
1967*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
1968*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
1969*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
1970*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
1971*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
1972*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x2);
1973*4bdc9457SAndroid Build Coastguard Worker       }
1974*4bdc9457SAndroid Build Coastguard Worker     }
1975*4bdc9457SAndroid Build Coastguard Worker   }
1976*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
1977*4bdc9457SAndroid Build Coastguard Worker 
1978*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_width_eq_4)1979*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_width_eq_4) {
1980*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1981*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
1982*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
1983*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
1984*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
1985*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
1986*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
1987*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
1988*4bdc9457SAndroid Build Coastguard Worker       .input_width(5)
1989*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
1990*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
1991*4bdc9457SAndroid Build Coastguard Worker   }
1992*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_width_div_4)1993*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_width_div_4) {
1994*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
1995*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 8; input_width <= 32; input_width += 12) {
1996*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
1997*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
1998*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
1999*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2000*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2001*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
2002*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
2003*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2004*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2005*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2006*4bdc9457SAndroid Build Coastguard Worker     }
2007*4bdc9457SAndroid Build Coastguard Worker   }
2008*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_width_lt_4)2009*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_width_lt_4) {
2010*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2011*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 4; input_width++) {
2012*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2013*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2014*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2015*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2016*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2017*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
2018*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
2019*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2020*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2021*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2022*4bdc9457SAndroid Build Coastguard Worker     }
2023*4bdc9457SAndroid Build Coastguard Worker   }
2024*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_width_gt_4)2025*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_width_gt_4) {
2026*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2027*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 5; input_width < 8; input_width++) {
2028*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2029*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2030*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2031*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2032*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2033*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
2034*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
2035*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2036*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2037*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2038*4bdc9457SAndroid Build Coastguard Worker     }
2039*4bdc9457SAndroid Build Coastguard Worker   }
2040*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,output_channels_lt_4)2041*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, output_channels_lt_4) {
2042*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2043*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
2044*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
2045*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2046*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2047*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2048*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2049*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2050*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2051*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2052*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2053*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2054*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2055*4bdc9457SAndroid Build Coastguard Worker       }
2056*4bdc9457SAndroid Build Coastguard Worker     }
2057*4bdc9457SAndroid Build Coastguard Worker   }
2058*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,output_channels_div_4)2059*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, output_channels_div_4) {
2060*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2061*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
2062*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
2063*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2064*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2065*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2066*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2067*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2068*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2069*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2070*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2071*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2072*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2073*4bdc9457SAndroid Build Coastguard Worker       }
2074*4bdc9457SAndroid Build Coastguard Worker     }
2075*4bdc9457SAndroid Build Coastguard Worker   }
2076*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,output_channels_gt_4)2077*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, output_channels_gt_4) {
2078*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2079*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
2080*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
2081*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2082*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2083*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2084*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2085*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2086*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2087*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2088*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2089*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2090*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2091*4bdc9457SAndroid Build Coastguard Worker       }
2092*4bdc9457SAndroid Build Coastguard Worker     }
2093*4bdc9457SAndroid Build Coastguard Worker   }
2094*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_height_lt_3)2095*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_height_lt_3) {
2096*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2097*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
2098*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2099*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2100*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2101*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2102*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2103*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2104*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1) // padded input height of at least 3 required
2105*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2106*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2107*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2108*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2109*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2110*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2111*4bdc9457SAndroid Build Coastguard Worker         }
2112*4bdc9457SAndroid Build Coastguard Worker       }
2113*4bdc9457SAndroid Build Coastguard Worker     }
2114*4bdc9457SAndroid Build Coastguard Worker   }
2115*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,input_height_gt_3)2116*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, input_height_gt_3) {
2117*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2118*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
2119*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2120*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2121*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2122*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2123*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2124*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2125*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2126*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2127*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2128*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2129*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2130*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2131*4bdc9457SAndroid Build Coastguard Worker         }
2132*4bdc9457SAndroid Build Coastguard Worker       }
2133*4bdc9457SAndroid Build Coastguard Worker     }
2134*4bdc9457SAndroid Build Coastguard Worker   }
2135*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,padding_top)2136*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, padding_top) {
2137*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2138*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2139*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2140*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2141*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2142*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2143*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2144*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2145*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
2146*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2147*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2148*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2149*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2150*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2151*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2152*4bdc9457SAndroid Build Coastguard Worker         }
2153*4bdc9457SAndroid Build Coastguard Worker       }
2154*4bdc9457SAndroid Build Coastguard Worker     }
2155*4bdc9457SAndroid Build Coastguard Worker   }
2156*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,padding_bottom)2157*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, padding_bottom) {
2158*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2159*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2160*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2161*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2162*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2163*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2164*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2165*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2166*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
2167*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2168*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2169*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2170*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2171*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2172*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2173*4bdc9457SAndroid Build Coastguard Worker         }
2174*4bdc9457SAndroid Build Coastguard Worker       }
2175*4bdc9457SAndroid Build Coastguard Worker     }
2176*4bdc9457SAndroid Build Coastguard Worker   }
2177*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,output_y_start)2178*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, output_y_start) {
2179*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2180*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
2181*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2182*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2183*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2184*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2185*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2186*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2187*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2188*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2189*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2190*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2191*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2192*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
2193*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2194*4bdc9457SAndroid Build Coastguard Worker         }
2195*4bdc9457SAndroid Build Coastguard Worker       }
2196*4bdc9457SAndroid Build Coastguard Worker     }
2197*4bdc9457SAndroid Build Coastguard Worker   }
2198*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,output_y_end)2199*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, output_y_end) {
2200*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2201*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
2202*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2203*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 32; input_width += 7) {
2204*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2205*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2206*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2207*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2208*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2209*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2210*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2211*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2212*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2213*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
2214*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2215*4bdc9457SAndroid Build Coastguard Worker         }
2216*4bdc9457SAndroid Build Coastguard Worker       }
2217*4bdc9457SAndroid Build Coastguard Worker     }
2218*4bdc9457SAndroid Build Coastguard Worker   }
2219*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,qmin)2220*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, qmin) {
2221*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2222*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2223*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
2224*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2225*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2226*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2227*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2228*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2229*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2230*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2231*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2232*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2233*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
2234*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2235*4bdc9457SAndroid Build Coastguard Worker       }
2236*4bdc9457SAndroid Build Coastguard Worker     }
2237*4bdc9457SAndroid Build Coastguard Worker   }
2238*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2,qmax)2239*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X2, qmax) {
2240*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2241*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2242*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 32; input_width += 7) {
2243*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2244*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2245*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2246*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2247*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2248*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2249*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2250*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2251*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2252*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
2253*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x2);
2254*4bdc9457SAndroid Build Coastguard Worker       }
2255*4bdc9457SAndroid Build Coastguard Worker     }
2256*4bdc9457SAndroid Build Coastguard Worker   }
2257*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
2258*4bdc9457SAndroid Build Coastguard Worker 
2259*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,input_width_eq_2)2260*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, input_width_eq_2) {
2261*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2262*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
2263*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
2264*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
2265*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
2266*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
2267*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
2268*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
2269*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
2270*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
2271*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2272*4bdc9457SAndroid Build Coastguard Worker   }
2273*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,input_width_div_2)2274*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, input_width_div_2) {
2275*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2276*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
2277*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2278*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2279*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2280*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2281*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2282*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
2283*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
2284*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2285*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2286*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2287*4bdc9457SAndroid Build Coastguard Worker     }
2288*4bdc9457SAndroid Build Coastguard Worker   }
2289*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,input_width_gt_2)2290*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, input_width_gt_2) {
2291*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2292*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
2293*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2294*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2295*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2296*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2297*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2298*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
2299*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
2300*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2301*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2302*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2303*4bdc9457SAndroid Build Coastguard Worker     }
2304*4bdc9457SAndroid Build Coastguard Worker   }
2305*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,output_channels_lt_8)2306*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, output_channels_lt_8) {
2307*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2308*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
2309*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2310*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2311*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2312*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2313*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2314*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2315*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2316*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2317*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2318*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2319*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2320*4bdc9457SAndroid Build Coastguard Worker       }
2321*4bdc9457SAndroid Build Coastguard Worker     }
2322*4bdc9457SAndroid Build Coastguard Worker   }
2323*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,output_channels_div_8)2324*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, output_channels_div_8) {
2325*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2326*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
2327*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2328*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2329*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2330*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2331*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2332*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2333*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2334*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2335*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2336*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2337*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2338*4bdc9457SAndroid Build Coastguard Worker       }
2339*4bdc9457SAndroid Build Coastguard Worker     }
2340*4bdc9457SAndroid Build Coastguard Worker   }
2341*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,output_channels_gt_8)2342*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, output_channels_gt_8) {
2343*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2344*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
2345*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2346*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2347*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2348*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2349*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2350*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2351*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2352*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2353*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2354*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2355*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2356*4bdc9457SAndroid Build Coastguard Worker       }
2357*4bdc9457SAndroid Build Coastguard Worker     }
2358*4bdc9457SAndroid Build Coastguard Worker   }
2359*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,input_height_lt_3)2360*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, input_height_lt_3) {
2361*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2362*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
2363*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2364*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2365*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2366*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2367*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2368*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1)
2369*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2370*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2371*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2372*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2373*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2374*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2375*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2376*4bdc9457SAndroid Build Coastguard Worker         }
2377*4bdc9457SAndroid Build Coastguard Worker       }
2378*4bdc9457SAndroid Build Coastguard Worker     }
2379*4bdc9457SAndroid Build Coastguard Worker   }
2380*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,input_height_gt_3)2381*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, input_height_gt_3) {
2382*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2383*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
2384*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2385*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2386*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2387*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2388*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2389*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2390*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2391*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2392*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2393*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2394*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2395*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2396*4bdc9457SAndroid Build Coastguard Worker         }
2397*4bdc9457SAndroid Build Coastguard Worker       }
2398*4bdc9457SAndroid Build Coastguard Worker     }
2399*4bdc9457SAndroid Build Coastguard Worker   }
2400*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,padding_top)2401*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, padding_top) {
2402*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2403*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2404*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2405*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2406*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2407*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2408*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2409*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2410*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
2411*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2412*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2413*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2414*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2415*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2416*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2417*4bdc9457SAndroid Build Coastguard Worker         }
2418*4bdc9457SAndroid Build Coastguard Worker       }
2419*4bdc9457SAndroid Build Coastguard Worker     }
2420*4bdc9457SAndroid Build Coastguard Worker   }
2421*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,padding_bottom)2422*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, padding_bottom) {
2423*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2424*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2425*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2426*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2427*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2428*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2429*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2430*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2431*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
2432*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2433*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2434*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2435*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2436*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2437*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2438*4bdc9457SAndroid Build Coastguard Worker         }
2439*4bdc9457SAndroid Build Coastguard Worker       }
2440*4bdc9457SAndroid Build Coastguard Worker     }
2441*4bdc9457SAndroid Build Coastguard Worker   }
2442*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,output_y_start)2443*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, output_y_start) {
2444*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2445*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
2446*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2447*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2448*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2449*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2450*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2451*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2452*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2453*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2454*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2455*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2456*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2457*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
2458*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2459*4bdc9457SAndroid Build Coastguard Worker         }
2460*4bdc9457SAndroid Build Coastguard Worker       }
2461*4bdc9457SAndroid Build Coastguard Worker     }
2462*4bdc9457SAndroid Build Coastguard Worker   }
2463*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,output_y_end)2464*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, output_y_end) {
2465*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2466*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
2467*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2468*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2469*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2470*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2471*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2472*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2473*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2474*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2475*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2476*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2477*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2478*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
2479*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2480*4bdc9457SAndroid Build Coastguard Worker         }
2481*4bdc9457SAndroid Build Coastguard Worker       }
2482*4bdc9457SAndroid Build Coastguard Worker     }
2483*4bdc9457SAndroid Build Coastguard Worker   }
2484*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,qmin)2485*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, qmin) {
2486*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2487*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2488*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2489*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2490*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2491*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2492*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2493*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2494*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2495*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2496*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2497*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2498*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
2499*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2500*4bdc9457SAndroid Build Coastguard Worker       }
2501*4bdc9457SAndroid Build Coastguard Worker     }
2502*4bdc9457SAndroid Build Coastguard Worker   }
2503*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1,qmax)2504*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X8__NEONFMA_2X1, qmax) {
2505*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2506*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2507*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2508*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2509*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2510*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2511*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2512*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2513*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2514*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2515*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2516*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2517*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
2518*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x8__neonfma_2x1);
2519*4bdc9457SAndroid Build Coastguard Worker       }
2520*4bdc9457SAndroid Build Coastguard Worker     }
2521*4bdc9457SAndroid Build Coastguard Worker   }
2522*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
2523*4bdc9457SAndroid Build Coastguard Worker 
2524*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,input_width_eq_2)2525*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, input_width_eq_2) {
2526*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2527*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
2528*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
2529*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
2530*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
2531*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
2532*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
2533*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
2534*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
2535*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
2536*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2537*4bdc9457SAndroid Build Coastguard Worker   }
2538*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,input_width_div_2)2539*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, input_width_div_2) {
2540*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2541*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
2542*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2543*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2544*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2545*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2546*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2547*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
2548*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
2549*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2550*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2551*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2552*4bdc9457SAndroid Build Coastguard Worker     }
2553*4bdc9457SAndroid Build Coastguard Worker   }
2554*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,input_width_gt_2)2555*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, input_width_gt_2) {
2556*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2557*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
2558*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2559*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2560*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2561*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
2562*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2563*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
2564*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
2565*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2566*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2567*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2568*4bdc9457SAndroid Build Coastguard Worker     }
2569*4bdc9457SAndroid Build Coastguard Worker   }
2570*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,output_channels_lt_4)2571*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, output_channels_lt_4) {
2572*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2573*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
2574*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2575*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2576*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2577*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2578*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2579*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2580*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2581*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2582*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2583*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2584*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2585*4bdc9457SAndroid Build Coastguard Worker       }
2586*4bdc9457SAndroid Build Coastguard Worker     }
2587*4bdc9457SAndroid Build Coastguard Worker   }
2588*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,output_channels_div_4)2589*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, output_channels_div_4) {
2590*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2591*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
2592*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2593*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2594*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2595*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2596*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2597*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2598*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2599*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2600*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2601*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2602*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2603*4bdc9457SAndroid Build Coastguard Worker       }
2604*4bdc9457SAndroid Build Coastguard Worker     }
2605*4bdc9457SAndroid Build Coastguard Worker   }
2606*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,output_channels_gt_4)2607*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, output_channels_gt_4) {
2608*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2609*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
2610*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2611*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2612*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2613*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2614*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2615*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2616*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2617*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2618*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2619*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2620*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2621*4bdc9457SAndroid Build Coastguard Worker       }
2622*4bdc9457SAndroid Build Coastguard Worker     }
2623*4bdc9457SAndroid Build Coastguard Worker   }
2624*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,input_height_lt_3)2625*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, input_height_lt_3) {
2626*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2627*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
2628*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2629*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2630*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2631*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2632*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2633*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2634*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1) // padded input height of at least 3 required
2635*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2636*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2637*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2638*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2639*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2640*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2641*4bdc9457SAndroid Build Coastguard Worker         }
2642*4bdc9457SAndroid Build Coastguard Worker       }
2643*4bdc9457SAndroid Build Coastguard Worker     }
2644*4bdc9457SAndroid Build Coastguard Worker   }
2645*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,input_height_gt_3)2646*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, input_height_gt_3) {
2647*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2648*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
2649*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2650*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2651*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2652*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2653*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2654*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2655*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2656*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2657*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2658*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2659*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2660*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2661*4bdc9457SAndroid Build Coastguard Worker         }
2662*4bdc9457SAndroid Build Coastguard Worker       }
2663*4bdc9457SAndroid Build Coastguard Worker     }
2664*4bdc9457SAndroid Build Coastguard Worker   }
2665*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,padding_top)2666*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, padding_top) {
2667*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2668*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2669*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2670*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2671*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2672*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2673*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2674*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2675*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
2676*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2677*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2678*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2679*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2680*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2681*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2682*4bdc9457SAndroid Build Coastguard Worker         }
2683*4bdc9457SAndroid Build Coastguard Worker       }
2684*4bdc9457SAndroid Build Coastguard Worker     }
2685*4bdc9457SAndroid Build Coastguard Worker   }
2686*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,padding_bottom)2687*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, padding_bottom) {
2688*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2689*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2690*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2691*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2692*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2693*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2694*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2695*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2696*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
2697*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2698*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2699*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2700*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2701*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2702*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2703*4bdc9457SAndroid Build Coastguard Worker         }
2704*4bdc9457SAndroid Build Coastguard Worker       }
2705*4bdc9457SAndroid Build Coastguard Worker     }
2706*4bdc9457SAndroid Build Coastguard Worker   }
2707*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,output_y_start)2708*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, output_y_start) {
2709*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2710*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
2711*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2712*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2713*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2714*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2715*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2716*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2717*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2718*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2719*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2720*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2721*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2722*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
2723*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2724*4bdc9457SAndroid Build Coastguard Worker         }
2725*4bdc9457SAndroid Build Coastguard Worker       }
2726*4bdc9457SAndroid Build Coastguard Worker     }
2727*4bdc9457SAndroid Build Coastguard Worker   }
2728*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,output_y_end)2729*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, output_y_end) {
2730*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2731*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
2732*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2733*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 2; input_width < 16; input_width += 3) {
2734*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2735*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2736*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2737*4bdc9457SAndroid Build Coastguard Worker             .padding_right(1)
2738*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2739*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
2740*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2741*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2742*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2743*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
2744*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2745*4bdc9457SAndroid Build Coastguard Worker         }
2746*4bdc9457SAndroid Build Coastguard Worker       }
2747*4bdc9457SAndroid Build Coastguard Worker     }
2748*4bdc9457SAndroid Build Coastguard Worker   }
2749*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,qmin)2750*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, qmin) {
2751*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2752*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2753*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2754*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2755*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2756*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2757*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2758*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2759*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2760*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2761*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2762*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2763*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
2764*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2765*4bdc9457SAndroid Build Coastguard Worker       }
2766*4bdc9457SAndroid Build Coastguard Worker     }
2767*4bdc9457SAndroid Build Coastguard Worker   }
2768*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1,qmax)2769*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P0P1C3X4__NEONFMA_2X1, qmax) {
2770*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2771*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
2772*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
2773*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2774*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2775*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2776*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
2777*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2778*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
2779*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2780*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2781*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
2782*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
2783*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__neonfma_2x1);
2784*4bdc9457SAndroid Build Coastguard Worker       }
2785*4bdc9457SAndroid Build Coastguard Worker     }
2786*4bdc9457SAndroid Build Coastguard Worker   }
2787*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
2788*4bdc9457SAndroid Build Coastguard Worker 
2789*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,input_width_eq_2)2790*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, input_width_eq_2) {
2791*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2792*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
2793*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
2794*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
2795*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
2796*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
2797*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
2798*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
2799*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
2800*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
2801*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2802*4bdc9457SAndroid Build Coastguard Worker   }
2803*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,input_width_div_2)2804*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, input_width_div_2) {
2805*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2806*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
2807*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2808*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2809*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2810*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
2811*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2812*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
2813*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
2814*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2815*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2816*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2817*4bdc9457SAndroid Build Coastguard Worker     }
2818*4bdc9457SAndroid Build Coastguard Worker   }
2819*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,input_width_gt_2)2820*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, input_width_gt_2) {
2821*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2822*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
2823*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
2824*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
2825*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
2826*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
2827*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
2828*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
2829*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
2830*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
2831*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
2832*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2833*4bdc9457SAndroid Build Coastguard Worker     }
2834*4bdc9457SAndroid Build Coastguard Worker   }
2835*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,output_channels_lt_8)2836*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, output_channels_lt_8) {
2837*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2838*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
2839*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
2840*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2841*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2842*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2843*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
2844*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2845*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2846*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2847*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2848*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2849*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2850*4bdc9457SAndroid Build Coastguard Worker       }
2851*4bdc9457SAndroid Build Coastguard Worker     }
2852*4bdc9457SAndroid Build Coastguard Worker   }
2853*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,output_channels_div_8)2854*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, output_channels_div_8) {
2855*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2856*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
2857*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
2858*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2859*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2860*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2861*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
2862*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2863*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2864*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2865*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2866*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2867*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2868*4bdc9457SAndroid Build Coastguard Worker       }
2869*4bdc9457SAndroid Build Coastguard Worker     }
2870*4bdc9457SAndroid Build Coastguard Worker   }
2871*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,output_channels_gt_8)2872*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, output_channels_gt_8) {
2873*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2874*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
2875*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
2876*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
2877*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
2878*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
2879*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
2880*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
2881*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
2882*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
2883*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
2884*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
2885*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2886*4bdc9457SAndroid Build Coastguard Worker       }
2887*4bdc9457SAndroid Build Coastguard Worker     }
2888*4bdc9457SAndroid Build Coastguard Worker   }
2889*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,input_height_lt_3)2890*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, input_height_lt_3) {
2891*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2892*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
2893*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2894*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2895*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2896*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2897*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2898*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1)
2899*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
2900*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2901*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2902*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2903*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2904*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2905*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2906*4bdc9457SAndroid Build Coastguard Worker         }
2907*4bdc9457SAndroid Build Coastguard Worker       }
2908*4bdc9457SAndroid Build Coastguard Worker     }
2909*4bdc9457SAndroid Build Coastguard Worker   }
2910*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,input_height_gt_3)2911*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, input_height_gt_3) {
2912*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2913*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
2914*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2915*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2916*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2917*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2918*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2919*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
2920*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2921*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2922*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2923*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2924*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
2925*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2926*4bdc9457SAndroid Build Coastguard Worker         }
2927*4bdc9457SAndroid Build Coastguard Worker       }
2928*4bdc9457SAndroid Build Coastguard Worker     }
2929*4bdc9457SAndroid Build Coastguard Worker   }
2930*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,padding_top)2931*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, padding_top) {
2932*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2933*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
2934*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2935*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2936*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2937*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2938*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2939*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
2940*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
2941*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2942*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2943*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2944*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2945*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2946*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2947*4bdc9457SAndroid Build Coastguard Worker         }
2948*4bdc9457SAndroid Build Coastguard Worker       }
2949*4bdc9457SAndroid Build Coastguard Worker     }
2950*4bdc9457SAndroid Build Coastguard Worker   }
2951*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,padding_bottom)2952*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, padding_bottom) {
2953*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2954*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
2955*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2956*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2957*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2958*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2959*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2960*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
2961*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
2962*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2963*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2964*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2965*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2966*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2967*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2968*4bdc9457SAndroid Build Coastguard Worker         }
2969*4bdc9457SAndroid Build Coastguard Worker       }
2970*4bdc9457SAndroid Build Coastguard Worker     }
2971*4bdc9457SAndroid Build Coastguard Worker   }
2972*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,output_y_start)2973*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, output_y_start) {
2974*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2975*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
2976*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2977*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2978*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
2979*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
2980*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
2981*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
2982*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
2983*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
2984*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
2985*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
2986*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
2987*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
2988*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
2989*4bdc9457SAndroid Build Coastguard Worker         }
2990*4bdc9457SAndroid Build Coastguard Worker       }
2991*4bdc9457SAndroid Build Coastguard Worker     }
2992*4bdc9457SAndroid Build Coastguard Worker   }
2993*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,output_y_end)2994*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, output_y_end) {
2995*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
2996*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
2997*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
2998*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
2999*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3000*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3001*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3002*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3003*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3004*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3005*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3006*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3007*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3008*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
3009*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
3010*4bdc9457SAndroid Build Coastguard Worker         }
3011*4bdc9457SAndroid Build Coastguard Worker       }
3012*4bdc9457SAndroid Build Coastguard Worker     }
3013*4bdc9457SAndroid Build Coastguard Worker   }
3014*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,qmin)3015*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, qmin) {
3016*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3017*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3018*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3019*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3020*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3021*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3022*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3023*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3024*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3025*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3026*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3027*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3028*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
3029*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
3030*4bdc9457SAndroid Build Coastguard Worker       }
3031*4bdc9457SAndroid Build Coastguard Worker     }
3032*4bdc9457SAndroid Build Coastguard Worker   }
3033*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1,qmax)3034*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEONFMA_2X1, qmax) {
3035*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3036*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3037*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3038*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3039*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3040*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3041*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3042*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3043*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3044*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3045*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3046*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3047*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
3048*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neonfma_2x1);
3049*4bdc9457SAndroid Build Coastguard Worker       }
3050*4bdc9457SAndroid Build Coastguard Worker     }
3051*4bdc9457SAndroid Build Coastguard Worker   }
3052*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
3053*4bdc9457SAndroid Build Coastguard Worker 
3054*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,input_width_eq_2)3055*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, input_width_eq_2) {
3056*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3057*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3058*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3059*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3060*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3061*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3062*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
3063*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
3064*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
3065*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3066*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3067*4bdc9457SAndroid Build Coastguard Worker   }
3068*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,input_width_div_2)3069*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, input_width_div_2) {
3070*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3071*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
3072*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3073*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3074*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3075*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3076*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3077*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3078*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
3079*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3080*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3081*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3082*4bdc9457SAndroid Build Coastguard Worker     }
3083*4bdc9457SAndroid Build Coastguard Worker   }
3084*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,input_width_gt_2)3085*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, input_width_gt_2) {
3086*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3087*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
3088*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3089*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3090*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3091*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3092*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3093*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3094*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
3095*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3096*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3097*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3098*4bdc9457SAndroid Build Coastguard Worker     }
3099*4bdc9457SAndroid Build Coastguard Worker   }
3100*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,output_channels_lt_4)3101*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, output_channels_lt_4) {
3102*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3103*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
3104*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3105*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3106*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3107*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3108*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3109*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3110*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3111*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3112*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3113*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3114*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3115*4bdc9457SAndroid Build Coastguard Worker       }
3116*4bdc9457SAndroid Build Coastguard Worker     }
3117*4bdc9457SAndroid Build Coastguard Worker   }
3118*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,output_channels_div_4)3119*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, output_channels_div_4) {
3120*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3121*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
3122*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3123*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3124*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3125*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3126*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3127*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3128*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3129*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3130*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3131*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3132*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3133*4bdc9457SAndroid Build Coastguard Worker       }
3134*4bdc9457SAndroid Build Coastguard Worker     }
3135*4bdc9457SAndroid Build Coastguard Worker   }
3136*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,output_channels_gt_4)3137*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, output_channels_gt_4) {
3138*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3139*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
3140*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3141*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3142*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3143*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3144*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3145*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3146*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3147*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3148*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3149*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3150*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3151*4bdc9457SAndroid Build Coastguard Worker       }
3152*4bdc9457SAndroid Build Coastguard Worker     }
3153*4bdc9457SAndroid Build Coastguard Worker   }
3154*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,input_height_lt_3)3155*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, input_height_lt_3) {
3156*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3157*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
3158*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3159*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3160*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3161*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3162*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3163*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3164*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1) // padded input height of at least 3 required
3165*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3166*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3167*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3168*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3169*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3170*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3171*4bdc9457SAndroid Build Coastguard Worker         }
3172*4bdc9457SAndroid Build Coastguard Worker       }
3173*4bdc9457SAndroid Build Coastguard Worker     }
3174*4bdc9457SAndroid Build Coastguard Worker   }
3175*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,input_height_gt_3)3176*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, input_height_gt_3) {
3177*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3178*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
3179*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3180*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3181*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3182*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3183*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3184*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3185*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3186*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3187*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3188*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3189*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3190*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3191*4bdc9457SAndroid Build Coastguard Worker         }
3192*4bdc9457SAndroid Build Coastguard Worker       }
3193*4bdc9457SAndroid Build Coastguard Worker     }
3194*4bdc9457SAndroid Build Coastguard Worker   }
3195*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,padding_top)3196*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, padding_top) {
3197*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3198*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
3199*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3200*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3201*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3202*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3203*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3204*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3205*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
3206*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3207*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3208*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3209*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3210*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3211*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3212*4bdc9457SAndroid Build Coastguard Worker         }
3213*4bdc9457SAndroid Build Coastguard Worker       }
3214*4bdc9457SAndroid Build Coastguard Worker     }
3215*4bdc9457SAndroid Build Coastguard Worker   }
3216*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,padding_bottom)3217*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, padding_bottom) {
3218*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3219*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
3220*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3221*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3222*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3223*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3224*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3225*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3226*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
3227*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3228*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3229*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3230*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3231*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3232*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3233*4bdc9457SAndroid Build Coastguard Worker         }
3234*4bdc9457SAndroid Build Coastguard Worker       }
3235*4bdc9457SAndroid Build Coastguard Worker     }
3236*4bdc9457SAndroid Build Coastguard Worker   }
3237*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,output_y_start)3238*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, output_y_start) {
3239*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3240*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
3241*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3242*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3243*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3244*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3245*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3246*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3247*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3248*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3249*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3250*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3251*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3252*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
3253*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3254*4bdc9457SAndroid Build Coastguard Worker         }
3255*4bdc9457SAndroid Build Coastguard Worker       }
3256*4bdc9457SAndroid Build Coastguard Worker     }
3257*4bdc9457SAndroid Build Coastguard Worker   }
3258*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,output_y_end)3259*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, output_y_end) {
3260*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3261*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
3262*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3263*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3264*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3265*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3266*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3267*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3268*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3269*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3270*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3271*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3272*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3273*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
3274*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3275*4bdc9457SAndroid Build Coastguard Worker         }
3276*4bdc9457SAndroid Build Coastguard Worker       }
3277*4bdc9457SAndroid Build Coastguard Worker     }
3278*4bdc9457SAndroid Build Coastguard Worker   }
3279*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,qmin)3280*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, qmin) {
3281*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3282*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3283*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3284*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3285*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3286*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3287*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3288*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3289*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3290*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3291*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3292*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3293*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
3294*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3295*4bdc9457SAndroid Build Coastguard Worker       }
3296*4bdc9457SAndroid Build Coastguard Worker     }
3297*4bdc9457SAndroid Build Coastguard Worker   }
3298*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1,qmax)3299*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEONFMA_2X1, qmax) {
3300*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON_FMA;
3301*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3302*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3303*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3304*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3305*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3306*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3307*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3308*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3309*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3310*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3311*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3312*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
3313*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neonfma_2x1);
3314*4bdc9457SAndroid Build Coastguard Worker       }
3315*4bdc9457SAndroid Build Coastguard Worker     }
3316*4bdc9457SAndroid Build Coastguard Worker   }
3317*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM64
3318*4bdc9457SAndroid Build Coastguard Worker 
3319*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,input_width_eq_2)3320*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, input_width_eq_2) {
3321*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3322*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3323*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3324*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3325*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3326*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3327*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(8)
3328*4bdc9457SAndroid Build Coastguard Worker       .output_channels(8)
3329*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
3330*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3331*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3332*4bdc9457SAndroid Build Coastguard Worker   }
3333*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,input_width_div_2)3334*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, input_width_div_2) {
3335*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3336*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
3337*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3338*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3339*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3340*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3341*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3342*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
3343*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
3344*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3345*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3346*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3347*4bdc9457SAndroid Build Coastguard Worker     }
3348*4bdc9457SAndroid Build Coastguard Worker   }
3349*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,input_width_gt_2)3350*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, input_width_gt_2) {
3351*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3352*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
3353*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3354*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3355*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3356*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3357*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3358*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(8)
3359*4bdc9457SAndroid Build Coastguard Worker         .output_channels(8)
3360*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3361*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3362*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3363*4bdc9457SAndroid Build Coastguard Worker     }
3364*4bdc9457SAndroid Build Coastguard Worker   }
3365*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,output_channels_lt_8)3366*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, output_channels_lt_8) {
3367*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3368*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels++) {
3369*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3370*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3371*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3372*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3373*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3374*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3375*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3376*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3377*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3378*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3379*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3380*4bdc9457SAndroid Build Coastguard Worker       }
3381*4bdc9457SAndroid Build Coastguard Worker     }
3382*4bdc9457SAndroid Build Coastguard Worker   }
3383*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,output_channels_div_8)3384*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, output_channels_div_8) {
3385*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3386*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 16; output_channels <= 32; output_channels += 8) {
3387*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3388*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3389*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3390*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3391*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3392*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3393*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3394*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3395*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3396*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3397*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3398*4bdc9457SAndroid Build Coastguard Worker       }
3399*4bdc9457SAndroid Build Coastguard Worker     }
3400*4bdc9457SAndroid Build Coastguard Worker   }
3401*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,output_channels_gt_8)3402*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, output_channels_gt_8) {
3403*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3404*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 9; output_channels < 16; output_channels++) {
3405*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3406*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3407*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3408*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3409*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3410*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3411*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3412*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3413*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3414*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3415*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3416*4bdc9457SAndroid Build Coastguard Worker       }
3417*4bdc9457SAndroid Build Coastguard Worker     }
3418*4bdc9457SAndroid Build Coastguard Worker   }
3419*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,input_height_lt_3)3420*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, input_height_lt_3) {
3421*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3422*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
3423*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3424*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3425*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3426*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3427*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3428*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1)
3429*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3430*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3431*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3432*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3433*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3434*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3435*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3436*4bdc9457SAndroid Build Coastguard Worker         }
3437*4bdc9457SAndroid Build Coastguard Worker       }
3438*4bdc9457SAndroid Build Coastguard Worker     }
3439*4bdc9457SAndroid Build Coastguard Worker   }
3440*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,input_height_gt_3)3441*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, input_height_gt_3) {
3442*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3443*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
3444*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3445*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3446*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3447*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3448*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3449*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3450*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3451*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3452*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3453*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3454*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3455*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3456*4bdc9457SAndroid Build Coastguard Worker         }
3457*4bdc9457SAndroid Build Coastguard Worker       }
3458*4bdc9457SAndroid Build Coastguard Worker     }
3459*4bdc9457SAndroid Build Coastguard Worker   }
3460*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,padding_top)3461*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, padding_top) {
3462*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3463*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
3464*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3465*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3466*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3467*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3468*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3469*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3470*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
3471*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3472*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3473*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3474*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3475*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3476*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3477*4bdc9457SAndroid Build Coastguard Worker         }
3478*4bdc9457SAndroid Build Coastguard Worker       }
3479*4bdc9457SAndroid Build Coastguard Worker     }
3480*4bdc9457SAndroid Build Coastguard Worker   }
3481*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,padding_bottom)3482*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, padding_bottom) {
3483*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3484*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
3485*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3486*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3487*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3488*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3489*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3490*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3491*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
3492*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3493*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3494*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3495*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3496*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3497*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3498*4bdc9457SAndroid Build Coastguard Worker         }
3499*4bdc9457SAndroid Build Coastguard Worker       }
3500*4bdc9457SAndroid Build Coastguard Worker     }
3501*4bdc9457SAndroid Build Coastguard Worker   }
3502*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,output_y_start)3503*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, output_y_start) {
3504*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3505*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
3506*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3507*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3508*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3509*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3510*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3511*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3512*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3513*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3514*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3515*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3516*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3517*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
3518*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3519*4bdc9457SAndroid Build Coastguard Worker         }
3520*4bdc9457SAndroid Build Coastguard Worker       }
3521*4bdc9457SAndroid Build Coastguard Worker     }
3522*4bdc9457SAndroid Build Coastguard Worker   }
3523*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,output_y_end)3524*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, output_y_end) {
3525*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3526*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
3527*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3528*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3529*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3530*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3531*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3532*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3533*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3534*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(8)
3535*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3536*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3537*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3538*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
3539*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3540*4bdc9457SAndroid Build Coastguard Worker         }
3541*4bdc9457SAndroid Build Coastguard Worker       }
3542*4bdc9457SAndroid Build Coastguard Worker     }
3543*4bdc9457SAndroid Build Coastguard Worker   }
3544*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,qmin)3545*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, qmin) {
3546*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3547*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3548*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3549*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3550*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3551*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3552*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3553*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3554*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3555*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3556*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3557*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3558*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
3559*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3560*4bdc9457SAndroid Build Coastguard Worker       }
3561*4bdc9457SAndroid Build Coastguard Worker     }
3562*4bdc9457SAndroid Build Coastguard Worker   }
3563*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1,qmax)3564*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X8__NEON_2X1, qmax) {
3565*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3566*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3567*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3568*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3569*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3570*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3571*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3572*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3573*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(8)
3574*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3575*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3576*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3577*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
3578*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x8__neon_2x1);
3579*4bdc9457SAndroid Build Coastguard Worker       }
3580*4bdc9457SAndroid Build Coastguard Worker     }
3581*4bdc9457SAndroid Build Coastguard Worker   }
3582*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
3583*4bdc9457SAndroid Build Coastguard Worker 
3584*4bdc9457SAndroid Build Coastguard Worker #if XNN_ARCH_ARM || XNN_ARCH_ARM64
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,input_width_eq_2)3585*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, input_width_eq_2) {
3586*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3587*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3588*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3589*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3590*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3591*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3592*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
3593*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
3594*4bdc9457SAndroid Build Coastguard Worker       .input_width(2)
3595*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3596*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3597*4bdc9457SAndroid Build Coastguard Worker   }
3598*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,input_width_div_2)3599*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, input_width_div_2) {
3600*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3601*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 4; input_width <= 16; input_width += 6) {
3602*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3603*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3604*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3605*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3606*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3607*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3608*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
3609*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3610*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3611*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3612*4bdc9457SAndroid Build Coastguard Worker     }
3613*4bdc9457SAndroid Build Coastguard Worker   }
3614*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,input_width_gt_2)3615*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, input_width_gt_2) {
3616*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3617*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 3; input_width < 4; input_width++) {
3618*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3619*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3620*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3621*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3622*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3623*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3624*4bdc9457SAndroid Build Coastguard Worker         .output_channels(4)
3625*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3626*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3627*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3628*4bdc9457SAndroid Build Coastguard Worker     }
3629*4bdc9457SAndroid Build Coastguard Worker   }
3630*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,output_channels_lt_4)3631*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, output_channels_lt_4) {
3632*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3633*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 4; output_channels++) {
3634*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3635*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3636*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3637*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3638*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3639*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3640*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3641*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3642*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3643*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3644*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3645*4bdc9457SAndroid Build Coastguard Worker       }
3646*4bdc9457SAndroid Build Coastguard Worker     }
3647*4bdc9457SAndroid Build Coastguard Worker   }
3648*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,output_channels_div_4)3649*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, output_channels_div_4) {
3650*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3651*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
3652*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3653*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3654*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3655*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3656*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3657*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3658*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3659*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3660*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3661*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3662*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3663*4bdc9457SAndroid Build Coastguard Worker       }
3664*4bdc9457SAndroid Build Coastguard Worker     }
3665*4bdc9457SAndroid Build Coastguard Worker   }
3666*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,output_channels_gt_4)3667*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, output_channels_gt_4) {
3668*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3669*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 5; output_channels < 8; output_channels++) {
3670*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3671*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3672*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3673*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3674*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3675*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3676*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3677*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3678*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3679*4bdc9457SAndroid Build Coastguard Worker           .input_height(3)
3680*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3681*4bdc9457SAndroid Build Coastguard Worker       }
3682*4bdc9457SAndroid Build Coastguard Worker     }
3683*4bdc9457SAndroid Build Coastguard Worker   }
3684*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,input_height_lt_3)3685*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, input_height_lt_3) {
3686*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3687*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 1; input_height < 3; input_height++) {
3688*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3689*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3690*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3691*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3692*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3693*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3694*4bdc9457SAndroid Build Coastguard Worker             .padding_height(1) // padded input height of at least 3 required
3695*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3696*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3697*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3698*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3699*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3700*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3701*4bdc9457SAndroid Build Coastguard Worker         }
3702*4bdc9457SAndroid Build Coastguard Worker       }
3703*4bdc9457SAndroid Build Coastguard Worker     }
3704*4bdc9457SAndroid Build Coastguard Worker   }
3705*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,input_height_gt_3)3706*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, input_height_gt_3) {
3707*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3708*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_height = 4; input_height <= 9; input_height++) {
3709*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3710*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3711*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3712*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3713*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3714*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3715*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3716*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3717*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3718*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3719*4bdc9457SAndroid Build Coastguard Worker             .input_height(input_height)
3720*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3721*4bdc9457SAndroid Build Coastguard Worker         }
3722*4bdc9457SAndroid Build Coastguard Worker       }
3723*4bdc9457SAndroid Build Coastguard Worker     }
3724*4bdc9457SAndroid Build Coastguard Worker   }
3725*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,padding_top)3726*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, padding_top) {
3727*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3728*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
3729*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3730*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3731*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3732*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3733*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3734*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3735*4bdc9457SAndroid Build Coastguard Worker             .padding_top(padding_top)
3736*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3737*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3738*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3739*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3740*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3741*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3742*4bdc9457SAndroid Build Coastguard Worker         }
3743*4bdc9457SAndroid Build Coastguard Worker       }
3744*4bdc9457SAndroid Build Coastguard Worker     }
3745*4bdc9457SAndroid Build Coastguard Worker   }
3746*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,padding_bottom)3747*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, padding_bottom) {
3748*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3749*4bdc9457SAndroid Build Coastguard Worker     for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
3750*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
3751*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3752*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3753*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3754*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3755*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3756*4bdc9457SAndroid Build Coastguard Worker             .padding_bottom(padding_bottom)
3757*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3758*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3759*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3760*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3761*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3762*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3763*4bdc9457SAndroid Build Coastguard Worker         }
3764*4bdc9457SAndroid Build Coastguard Worker       }
3765*4bdc9457SAndroid Build Coastguard Worker     }
3766*4bdc9457SAndroid Build Coastguard Worker   }
3767*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,output_y_start)3768*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, output_y_start) {
3769*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3770*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
3771*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3772*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3773*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3774*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3775*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3776*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3777*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3778*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3779*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3780*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3781*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3782*4bdc9457SAndroid Build Coastguard Worker             .output_y_start(output_y_start)
3783*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3784*4bdc9457SAndroid Build Coastguard Worker         }
3785*4bdc9457SAndroid Build Coastguard Worker       }
3786*4bdc9457SAndroid Build Coastguard Worker     }
3787*4bdc9457SAndroid Build Coastguard Worker   }
3788*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,output_y_end)3789*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, output_y_end) {
3790*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3791*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
3792*4bdc9457SAndroid Build Coastguard Worker       for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3793*4bdc9457SAndroid Build Coastguard Worker         for (size_t input_width = 1; input_width < 16; input_width += 3) {
3794*4bdc9457SAndroid Build Coastguard Worker           ConvHWCMicrokernelTester()
3795*4bdc9457SAndroid Build Coastguard Worker             .kernel_size(3)
3796*4bdc9457SAndroid Build Coastguard Worker             .subsampling(2)
3797*4bdc9457SAndroid Build Coastguard Worker             .padding_width(1)
3798*4bdc9457SAndroid Build Coastguard Worker             .input_channels(3)
3799*4bdc9457SAndroid Build Coastguard Worker             .output_channels_tile(4)
3800*4bdc9457SAndroid Build Coastguard Worker             .output_channels(output_channels)
3801*4bdc9457SAndroid Build Coastguard Worker             .input_width(input_width)
3802*4bdc9457SAndroid Build Coastguard Worker             .input_height(9)
3803*4bdc9457SAndroid Build Coastguard Worker             .output_y_end(output_y_end)
3804*4bdc9457SAndroid Build Coastguard Worker             .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3805*4bdc9457SAndroid Build Coastguard Worker         }
3806*4bdc9457SAndroid Build Coastguard Worker       }
3807*4bdc9457SAndroid Build Coastguard Worker     }
3808*4bdc9457SAndroid Build Coastguard Worker   }
3809*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,qmin)3810*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, qmin) {
3811*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3812*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3813*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3814*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3815*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3816*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3817*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3818*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3819*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3820*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3821*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3822*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3823*4bdc9457SAndroid Build Coastguard Worker           .qmin(128)
3824*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3825*4bdc9457SAndroid Build Coastguard Worker       }
3826*4bdc9457SAndroid Build Coastguard Worker     }
3827*4bdc9457SAndroid Build Coastguard Worker   }
3828*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1,qmax)3829*4bdc9457SAndroid Build Coastguard Worker   TEST(F32_CONV_3X3S2P1C3X4__NEON_2X1, qmax) {
3830*4bdc9457SAndroid Build Coastguard Worker     TEST_REQUIRES_ARM_NEON;
3831*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3832*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3833*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3834*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3835*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3836*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3837*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3838*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3839*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3840*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3841*4bdc9457SAndroid Build Coastguard Worker           .input_height(6)
3842*4bdc9457SAndroid Build Coastguard Worker           .qmax(128)
3843*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__neon_2x1);
3844*4bdc9457SAndroid Build Coastguard Worker       }
3845*4bdc9457SAndroid Build Coastguard Worker     }
3846*4bdc9457SAndroid Build Coastguard Worker   }
3847*4bdc9457SAndroid Build Coastguard Worker #endif  // XNN_ARCH_ARM || XNN_ARCH_ARM64
3848*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_width_eq_2)3849*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_width_eq_2) {
3850*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3851*4bdc9457SAndroid Build Coastguard Worker   ConvHWCMicrokernelTester()
3852*4bdc9457SAndroid Build Coastguard Worker     .kernel_size(3)
3853*4bdc9457SAndroid Build Coastguard Worker     .subsampling(2)
3854*4bdc9457SAndroid Build Coastguard Worker     .padding_width(1)
3855*4bdc9457SAndroid Build Coastguard Worker     .input_channels(3)
3856*4bdc9457SAndroid Build Coastguard Worker     .output_channels_tile(4)
3857*4bdc9457SAndroid Build Coastguard Worker     .output_channels(4)
3858*4bdc9457SAndroid Build Coastguard Worker     .input_width(2)
3859*4bdc9457SAndroid Build Coastguard Worker     .input_height(3)
3860*4bdc9457SAndroid Build Coastguard Worker     .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3861*4bdc9457SAndroid Build Coastguard Worker }
3862*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_width_div_2)3863*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_width_div_2) {
3864*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3865*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_width = 4; input_width <= 16; input_width += 6) {
3866*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3867*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3868*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3869*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3870*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3871*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
3872*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
3873*4bdc9457SAndroid Build Coastguard Worker       .input_width(input_width)
3874*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3875*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3876*4bdc9457SAndroid Build Coastguard Worker   }
3877*4bdc9457SAndroid Build Coastguard Worker }
3878*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_width_lt_2)3879*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_width_lt_2) {
3880*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3881*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_width = 1; input_width < 2; input_width++) {
3882*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3883*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3884*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3885*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3886*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3887*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
3888*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
3889*4bdc9457SAndroid Build Coastguard Worker       .input_width(input_width)
3890*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3891*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3892*4bdc9457SAndroid Build Coastguard Worker   }
3893*4bdc9457SAndroid Build Coastguard Worker }
3894*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_width_gt_2)3895*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_width_gt_2) {
3896*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3897*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_width = 3; input_width < 4; input_width++) {
3898*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
3899*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
3900*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
3901*4bdc9457SAndroid Build Coastguard Worker       .padding_width(1)
3902*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
3903*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
3904*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
3905*4bdc9457SAndroid Build Coastguard Worker       .input_width(input_width)
3906*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
3907*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3908*4bdc9457SAndroid Build Coastguard Worker   }
3909*4bdc9457SAndroid Build Coastguard Worker }
3910*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,output_channels_lt_4)3911*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, output_channels_lt_4) {
3912*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3913*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 4; output_channels++) {
3914*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 16; input_width += 3) {
3915*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3916*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3917*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3918*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3919*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3920*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3921*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
3922*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3923*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3924*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3925*4bdc9457SAndroid Build Coastguard Worker     }
3926*4bdc9457SAndroid Build Coastguard Worker   }
3927*4bdc9457SAndroid Build Coastguard Worker }
3928*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,output_channels_div_4)3929*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, output_channels_div_4) {
3930*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3931*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
3932*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 16; input_width += 3) {
3933*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3934*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3935*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3936*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3937*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3938*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3939*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
3940*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3941*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3942*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3943*4bdc9457SAndroid Build Coastguard Worker     }
3944*4bdc9457SAndroid Build Coastguard Worker   }
3945*4bdc9457SAndroid Build Coastguard Worker }
3946*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,output_channels_gt_4)3947*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, output_channels_gt_4) {
3948*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3949*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 5; output_channels < 8; output_channels++) {
3950*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 16; input_width += 3) {
3951*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
3952*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
3953*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
3954*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
3955*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
3956*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
3957*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
3958*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
3959*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
3960*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3961*4bdc9457SAndroid Build Coastguard Worker     }
3962*4bdc9457SAndroid Build Coastguard Worker   }
3963*4bdc9457SAndroid Build Coastguard Worker }
3964*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_height_lt_3)3965*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_height_lt_3) {
3966*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3967*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_height = 1; input_height < 3; input_height++) {
3968*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3969*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3970*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3971*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3972*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3973*4bdc9457SAndroid Build Coastguard Worker           .padding(1)
3974*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3) // padded input height of at least 3 required
3975*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3976*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3977*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3978*4bdc9457SAndroid Build Coastguard Worker           .input_height(input_height)
3979*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
3980*4bdc9457SAndroid Build Coastguard Worker       }
3981*4bdc9457SAndroid Build Coastguard Worker     }
3982*4bdc9457SAndroid Build Coastguard Worker   }
3983*4bdc9457SAndroid Build Coastguard Worker }
3984*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,input_height_gt_3)3985*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, input_height_gt_3) {
3986*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
3987*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_height = 4; input_height <= 9; input_height++) {
3988*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
3989*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
3990*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
3991*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
3992*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
3993*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
3994*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
3995*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
3996*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
3997*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
3998*4bdc9457SAndroid Build Coastguard Worker           .input_height(input_height)
3999*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4000*4bdc9457SAndroid Build Coastguard Worker       }
4001*4bdc9457SAndroid Build Coastguard Worker     }
4002*4bdc9457SAndroid Build Coastguard Worker   }
4003*4bdc9457SAndroid Build Coastguard Worker }
4004*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,padding_top)4005*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, padding_top) {
4006*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4007*4bdc9457SAndroid Build Coastguard Worker   for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
4008*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
4009*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
4010*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4011*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4012*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4013*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
4014*4bdc9457SAndroid Build Coastguard Worker           .padding_top(padding_top)
4015*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4016*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4017*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4018*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4019*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4020*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4021*4bdc9457SAndroid Build Coastguard Worker       }
4022*4bdc9457SAndroid Build Coastguard Worker     }
4023*4bdc9457SAndroid Build Coastguard Worker   }
4024*4bdc9457SAndroid Build Coastguard Worker }
4025*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,padding_bottom)4026*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, padding_bottom) {
4027*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4028*4bdc9457SAndroid Build Coastguard Worker   for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
4029*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
4030*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
4031*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4032*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4033*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4034*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
4035*4bdc9457SAndroid Build Coastguard Worker           .padding_bottom(padding_bottom)
4036*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4037*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4038*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4039*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4040*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4041*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4042*4bdc9457SAndroid Build Coastguard Worker       }
4043*4bdc9457SAndroid Build Coastguard Worker     }
4044*4bdc9457SAndroid Build Coastguard Worker   }
4045*4bdc9457SAndroid Build Coastguard Worker }
4046*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,output_y_start)4047*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, output_y_start) {
4048*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4049*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
4050*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4051*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
4052*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4053*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4054*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4055*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
4056*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4057*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4058*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4059*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4060*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4061*4bdc9457SAndroid Build Coastguard Worker           .output_y_start(output_y_start)
4062*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4063*4bdc9457SAndroid Build Coastguard Worker       }
4064*4bdc9457SAndroid Build Coastguard Worker     }
4065*4bdc9457SAndroid Build Coastguard Worker   }
4066*4bdc9457SAndroid Build Coastguard Worker }
4067*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,output_y_end)4068*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, output_y_end) {
4069*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4070*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
4071*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4072*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 1; input_width < 16; input_width += 3) {
4073*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4074*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4075*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4076*4bdc9457SAndroid Build Coastguard Worker           .padding_width(1)
4077*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4078*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4079*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4080*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4081*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4082*4bdc9457SAndroid Build Coastguard Worker           .output_y_end(output_y_end)
4083*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4084*4bdc9457SAndroid Build Coastguard Worker       }
4085*4bdc9457SAndroid Build Coastguard Worker     }
4086*4bdc9457SAndroid Build Coastguard Worker   }
4087*4bdc9457SAndroid Build Coastguard Worker }
4088*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,qmin)4089*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, qmin) {
4090*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4091*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4092*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 16; input_width += 3) {
4093*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4094*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4095*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4096*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
4097*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4098*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4099*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4100*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4101*4bdc9457SAndroid Build Coastguard Worker         .input_height(6)
4102*4bdc9457SAndroid Build Coastguard Worker         .qmin(128)
4103*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4104*4bdc9457SAndroid Build Coastguard Worker     }
4105*4bdc9457SAndroid Build Coastguard Worker   }
4106*4bdc9457SAndroid Build Coastguard Worker }
4107*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1,qmax)4108*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P1C3X4__SCALAR_1X1, qmax) {
4109*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4110*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4111*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 1; input_width < 16; input_width += 3) {
4112*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4113*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4114*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4115*4bdc9457SAndroid Build Coastguard Worker         .padding_width(1)
4116*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4117*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4118*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4119*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4120*4bdc9457SAndroid Build Coastguard Worker         .input_height(6)
4121*4bdc9457SAndroid Build Coastguard Worker         .qmax(128)
4122*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p1c3x4__scalar_1x1);
4123*4bdc9457SAndroid Build Coastguard Worker     }
4124*4bdc9457SAndroid Build Coastguard Worker   }
4125*4bdc9457SAndroid Build Coastguard Worker }
4126*4bdc9457SAndroid Build Coastguard Worker 
4127*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,input_width_eq_2)4128*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, input_width_eq_2) {
4129*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4130*4bdc9457SAndroid Build Coastguard Worker   ConvHWCMicrokernelTester()
4131*4bdc9457SAndroid Build Coastguard Worker     .kernel_size(3)
4132*4bdc9457SAndroid Build Coastguard Worker     .subsampling(2)
4133*4bdc9457SAndroid Build Coastguard Worker     .padding_right(1)
4134*4bdc9457SAndroid Build Coastguard Worker     .input_channels(3)
4135*4bdc9457SAndroid Build Coastguard Worker     .output_channels_tile(4)
4136*4bdc9457SAndroid Build Coastguard Worker     .output_channels(4)
4137*4bdc9457SAndroid Build Coastguard Worker     .input_width(2)
4138*4bdc9457SAndroid Build Coastguard Worker     .input_height(3)
4139*4bdc9457SAndroid Build Coastguard Worker     .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4140*4bdc9457SAndroid Build Coastguard Worker }
4141*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,input_width_div_2)4142*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, input_width_div_2) {
4143*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4144*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_width = 4; input_width <= 16; input_width += 6) {
4145*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
4146*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
4147*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
4148*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
4149*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
4150*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
4151*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
4152*4bdc9457SAndroid Build Coastguard Worker       .input_width(input_width)
4153*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
4154*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4155*4bdc9457SAndroid Build Coastguard Worker   }
4156*4bdc9457SAndroid Build Coastguard Worker }
4157*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,input_width_gt_2)4158*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, input_width_gt_2) {
4159*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4160*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_width = 3; input_width < 4; input_width++) {
4161*4bdc9457SAndroid Build Coastguard Worker     ConvHWCMicrokernelTester()
4162*4bdc9457SAndroid Build Coastguard Worker       .kernel_size(3)
4163*4bdc9457SAndroid Build Coastguard Worker       .subsampling(2)
4164*4bdc9457SAndroid Build Coastguard Worker       .padding_right(1)
4165*4bdc9457SAndroid Build Coastguard Worker       .input_channels(3)
4166*4bdc9457SAndroid Build Coastguard Worker       .output_channels_tile(4)
4167*4bdc9457SAndroid Build Coastguard Worker       .output_channels(4)
4168*4bdc9457SAndroid Build Coastguard Worker       .input_width(input_width)
4169*4bdc9457SAndroid Build Coastguard Worker       .input_height(3)
4170*4bdc9457SAndroid Build Coastguard Worker       .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4171*4bdc9457SAndroid Build Coastguard Worker   }
4172*4bdc9457SAndroid Build Coastguard Worker }
4173*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,output_channels_lt_4)4174*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, output_channels_lt_4) {
4175*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4176*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 4; output_channels++) {
4177*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 16; input_width += 3) {
4178*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4179*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4180*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4181*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
4182*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4183*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4184*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4185*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4186*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
4187*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4188*4bdc9457SAndroid Build Coastguard Worker     }
4189*4bdc9457SAndroid Build Coastguard Worker   }
4190*4bdc9457SAndroid Build Coastguard Worker }
4191*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,output_channels_div_4)4192*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, output_channels_div_4) {
4193*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4194*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 8; output_channels <= 16; output_channels += 4) {
4195*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 16; input_width += 3) {
4196*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4197*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4198*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4199*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
4200*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4201*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4202*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4203*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4204*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
4205*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4206*4bdc9457SAndroid Build Coastguard Worker     }
4207*4bdc9457SAndroid Build Coastguard Worker   }
4208*4bdc9457SAndroid Build Coastguard Worker }
4209*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,output_channels_gt_4)4210*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, output_channels_gt_4) {
4211*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4212*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 5; output_channels < 8; output_channels++) {
4213*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 16; input_width += 3) {
4214*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4215*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4216*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4217*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
4218*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4219*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4220*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4221*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4222*4bdc9457SAndroid Build Coastguard Worker         .input_height(3)
4223*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4224*4bdc9457SAndroid Build Coastguard Worker     }
4225*4bdc9457SAndroid Build Coastguard Worker   }
4226*4bdc9457SAndroid Build Coastguard Worker }
4227*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,input_height_lt_3)4228*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, input_height_lt_3) {
4229*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4230*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_height = 1; input_height < 3; input_height++) {
4231*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4232*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4233*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4234*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4235*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4236*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4237*4bdc9457SAndroid Build Coastguard Worker           .padding_height(1) // padded input height of at least 3 required
4238*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4239*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4240*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4241*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4242*4bdc9457SAndroid Build Coastguard Worker           .input_height(input_height)
4243*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4244*4bdc9457SAndroid Build Coastguard Worker       }
4245*4bdc9457SAndroid Build Coastguard Worker     }
4246*4bdc9457SAndroid Build Coastguard Worker   }
4247*4bdc9457SAndroid Build Coastguard Worker }
4248*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,input_height_gt_3)4249*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, input_height_gt_3) {
4250*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4251*4bdc9457SAndroid Build Coastguard Worker   for (size_t input_height = 4; input_height <= 9; input_height++) {
4252*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4253*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4254*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4255*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4256*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4257*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4258*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4259*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4260*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4261*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4262*4bdc9457SAndroid Build Coastguard Worker           .input_height(input_height)
4263*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4264*4bdc9457SAndroid Build Coastguard Worker       }
4265*4bdc9457SAndroid Build Coastguard Worker     }
4266*4bdc9457SAndroid Build Coastguard Worker   }
4267*4bdc9457SAndroid Build Coastguard Worker }
4268*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,padding_top)4269*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, padding_top) {
4270*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4271*4bdc9457SAndroid Build Coastguard Worker   for (size_t padding_top = 0; padding_top <= 1; padding_top++) {
4272*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
4273*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4274*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4275*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4276*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4277*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4278*4bdc9457SAndroid Build Coastguard Worker           .padding_top(padding_top)
4279*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4280*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4281*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4282*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4283*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4284*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4285*4bdc9457SAndroid Build Coastguard Worker       }
4286*4bdc9457SAndroid Build Coastguard Worker     }
4287*4bdc9457SAndroid Build Coastguard Worker   }
4288*4bdc9457SAndroid Build Coastguard Worker }
4289*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,padding_bottom)4290*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, padding_bottom) {
4291*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4292*4bdc9457SAndroid Build Coastguard Worker   for (size_t padding_bottom = 0; padding_bottom <= 1; padding_bottom++) {
4293*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 16; output_channels += 7) {
4294*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4295*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4296*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4297*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4298*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4299*4bdc9457SAndroid Build Coastguard Worker           .padding_bottom(padding_bottom)
4300*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4301*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4302*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4303*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4304*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4305*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4306*4bdc9457SAndroid Build Coastguard Worker       }
4307*4bdc9457SAndroid Build Coastguard Worker     }
4308*4bdc9457SAndroid Build Coastguard Worker   }
4309*4bdc9457SAndroid Build Coastguard Worker }
4310*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,output_y_start)4311*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, output_y_start) {
4312*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4313*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_y_start = 1; output_y_start <= 3; output_y_start++) {
4314*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4315*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4316*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4317*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4318*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4319*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4320*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4321*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4322*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4323*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4324*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4325*4bdc9457SAndroid Build Coastguard Worker           .output_y_start(output_y_start)
4326*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4327*4bdc9457SAndroid Build Coastguard Worker       }
4328*4bdc9457SAndroid Build Coastguard Worker     }
4329*4bdc9457SAndroid Build Coastguard Worker   }
4330*4bdc9457SAndroid Build Coastguard Worker }
4331*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,output_y_end)4332*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, output_y_end) {
4333*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4334*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_y_end = 2; output_y_end < 5; output_y_end++) {
4335*4bdc9457SAndroid Build Coastguard Worker     for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4336*4bdc9457SAndroid Build Coastguard Worker       for (size_t input_width = 2; input_width < 16; input_width += 3) {
4337*4bdc9457SAndroid Build Coastguard Worker         ConvHWCMicrokernelTester()
4338*4bdc9457SAndroid Build Coastguard Worker           .kernel_size(3)
4339*4bdc9457SAndroid Build Coastguard Worker           .subsampling(2)
4340*4bdc9457SAndroid Build Coastguard Worker           .padding_right(1)
4341*4bdc9457SAndroid Build Coastguard Worker           .input_channels(3)
4342*4bdc9457SAndroid Build Coastguard Worker           .output_channels_tile(4)
4343*4bdc9457SAndroid Build Coastguard Worker           .output_channels(output_channels)
4344*4bdc9457SAndroid Build Coastguard Worker           .input_width(input_width)
4345*4bdc9457SAndroid Build Coastguard Worker           .input_height(9)
4346*4bdc9457SAndroid Build Coastguard Worker           .output_y_end(output_y_end)
4347*4bdc9457SAndroid Build Coastguard Worker           .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4348*4bdc9457SAndroid Build Coastguard Worker       }
4349*4bdc9457SAndroid Build Coastguard Worker     }
4350*4bdc9457SAndroid Build Coastguard Worker   }
4351*4bdc9457SAndroid Build Coastguard Worker }
4352*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,qmin)4353*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, qmin) {
4354*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4355*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4356*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 16; input_width += 3) {
4357*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4358*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4359*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4360*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
4361*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4362*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4363*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4364*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4365*4bdc9457SAndroid Build Coastguard Worker         .input_height(6)
4366*4bdc9457SAndroid Build Coastguard Worker         .qmin(128)
4367*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4368*4bdc9457SAndroid Build Coastguard Worker     }
4369*4bdc9457SAndroid Build Coastguard Worker   }
4370*4bdc9457SAndroid Build Coastguard Worker }
4371*4bdc9457SAndroid Build Coastguard Worker 
TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1,qmax)4372*4bdc9457SAndroid Build Coastguard Worker TEST(F32_CONV_3X3S2P0P1C3X4__SCALAR_1X1, qmax) {
4373*4bdc9457SAndroid Build Coastguard Worker   TEST_REQUIRES_ARM_NEON_FMA;
4374*4bdc9457SAndroid Build Coastguard Worker   for (size_t output_channels = 1; output_channels < 8; output_channels += 3) {
4375*4bdc9457SAndroid Build Coastguard Worker     for (size_t input_width = 2; input_width < 16; input_width += 3) {
4376*4bdc9457SAndroid Build Coastguard Worker       ConvHWCMicrokernelTester()
4377*4bdc9457SAndroid Build Coastguard Worker         .kernel_size(3)
4378*4bdc9457SAndroid Build Coastguard Worker         .subsampling(2)
4379*4bdc9457SAndroid Build Coastguard Worker         .padding_right(1)
4380*4bdc9457SAndroid Build Coastguard Worker         .input_channels(3)
4381*4bdc9457SAndroid Build Coastguard Worker         .output_channels_tile(4)
4382*4bdc9457SAndroid Build Coastguard Worker         .output_channels(output_channels)
4383*4bdc9457SAndroid Build Coastguard Worker         .input_width(input_width)
4384*4bdc9457SAndroid Build Coastguard Worker         .input_height(6)
4385*4bdc9457SAndroid Build Coastguard Worker         .qmax(128)
4386*4bdc9457SAndroid Build Coastguard Worker         .Test(xnn_f32_conv_hwc_ukernel_3x3s2p0p1c3x4__scalar_1x1);
4387*4bdc9457SAndroid Build Coastguard Worker     }
4388*4bdc9457SAndroid Build Coastguard Worker   }
4389*4bdc9457SAndroid Build Coastguard Worker }
4390