xref: /aosp_15_r20/external/XNNPACK/test/minimum-nd.cc (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1 // Copyright 2019 Google LLC
2 //
3 // This source code is licensed under the BSD-style license found in the
4 // LICENSE file in the root directory of this source tree.
5 
6 #include <gtest/gtest.h>
7 
8 #include "binary-elementwise-operator-tester.h"
9 
10 constexpr size_t kDim1 = 2;
11 constexpr size_t kDim2 = 3;
12 constexpr size_t kDim3 = 4;
13 constexpr size_t kDim4 = 5;
14 constexpr size_t kDim5 = 6;
15 constexpr size_t kDim6 = 7;
16 
17 
18 #ifndef XNN_EXCLUDE_F16_TESTS
19 TEST(MINIMUM_ND_F16, 0d_x_0d) {
20   BinaryElementwiseOperatorTester()
21     .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
22     .TestF16();
23 }
24 
25 TEST(MINIMUM_ND_F16, 1d_x_0d) {
26   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
27     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
28     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
29     BinaryElementwiseOperatorTester()
30       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
31       .input1_shape({input1_dim1})
32       .TestF16();
33   }
34 }
35 
36 TEST(MINIMUM_ND_F16, 0d_x_1d) {
37   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
38     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
39     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
40     BinaryElementwiseOperatorTester()
41       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
42       .input2_shape({input2_dim1})
43       .TestF16();
44   }
45 }
46 
47 TEST(MINIMUM_ND_F16, 1d_x_1d) {
48   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
49     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
50       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
51       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
52       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
53       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
54       BinaryElementwiseOperatorTester()
55         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
56         .input1_shape({input1_dim1})
57         .input2_shape({input2_dim1})
58         .TestF16();
59     }
60   }
61 }
62 
63 TEST(MINIMUM_ND_F16, 0d_x_2d) {
64   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
65     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
66     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
67     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
68     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
69     BinaryElementwiseOperatorTester()
70       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
71       .input2_shape({input2_dim2, input2_dim1})
72       .TestF16();
73   }
74 }
75 
76 TEST(MINIMUM_ND_F16, 1d_x_2d) {
77   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
78     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
79       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
80       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
81       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
82       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
83       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
84       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
85       BinaryElementwiseOperatorTester()
86         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
87         .input1_shape({input1_dim1})
88         .input2_shape({input2_dim2, input2_dim1})
89         .TestF16();
90     }
91   }
92 }
93 
94 TEST(MINIMUM_ND_F16, 2d_x_0d) {
95   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
96     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
97     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
98     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
99     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
100     BinaryElementwiseOperatorTester()
101       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
102       .input1_shape({input1_dim2, input1_dim1})
103       .TestF16();
104   }
105 }
106 
107 TEST(MINIMUM_ND_F16, 2d_x_1d) {
108   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
109     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
110       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
111       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
112       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
113       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
114       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
115       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
116       BinaryElementwiseOperatorTester()
117         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
118         .input1_shape({input1_dim2, input1_dim1})
119         .input2_shape({input2_dim1})
120         .TestF16();
121     }
122   }
123 }
124 
125 TEST(MINIMUM_ND_F16, 2d_x_2d) {
126   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
127     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
128       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
129       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
130       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
131       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
132       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
133       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
134       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
135       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
136       BinaryElementwiseOperatorTester()
137         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
138         .input1_shape({input1_dim2, input1_dim1})
139         .input2_shape({input2_dim2, input2_dim1})
140         .TestF16();
141     }
142   }
143 }
144 
145 TEST(MINIMUM_ND_F16, 0d_x_3d) {
146   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
147     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
148     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
149     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
150     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
151     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
152     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
153     BinaryElementwiseOperatorTester()
154       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
155       .input2_shape({input2_dim3, input2_dim2, input2_dim1})
156       .TestF16();
157   }
158 }
159 
160 TEST(MINIMUM_ND_F16, 1d_x_3d) {
161   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
162     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
163       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
164       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
165       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
166       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
167       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
168       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
169       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
170       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
171       BinaryElementwiseOperatorTester()
172         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
173         .input1_shape({input1_dim1})
174         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
175         .TestF16();
176     }
177   }
178 }
179 
180 TEST(MINIMUM_ND_F16, 2d_x_3d) {
181   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
182     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
183       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
184       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
185       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
186       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
187       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
188       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
189       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
190       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
191       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
192       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
193       BinaryElementwiseOperatorTester()
194         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
195         .input1_shape({input1_dim2, input1_dim1})
196         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
197         .TestF16();
198     }
199   }
200 }
201 
202 TEST(MINIMUM_ND_F16, 3d_x_0d) {
203   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
204     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
205     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
206     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
207     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
208     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
209     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
210     BinaryElementwiseOperatorTester()
211       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
212       .input1_shape({input1_dim3, input1_dim2, input1_dim1})
213       .TestF16();
214   }
215 }
216 
217 TEST(MINIMUM_ND_F16, 3d_x_1d) {
218   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
219     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
220       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
221       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
222       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
223       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
224       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
225       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
226       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
227       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
228       BinaryElementwiseOperatorTester()
229         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
230         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
231         .input2_shape({input2_dim1})
232         .TestF16();
233     }
234   }
235 }
236 
237 TEST(MINIMUM_ND_F16, 3d_x_2d) {
238   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
239     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
240       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
241       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
242       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
243       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
244       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
245       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
246       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
247       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
248       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
249       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
250       BinaryElementwiseOperatorTester()
251         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
252         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
253         .input2_shape({input2_dim2, input2_dim1})
254         .TestF16();
255     }
256   }
257 }
258 
259 TEST(MINIMUM_ND_F16, 3d_x_3d) {
260   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
261     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
262       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
263       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
264       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
265       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
266       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
267       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
268       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
269       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
270       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
271       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
272       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
273       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
274       BinaryElementwiseOperatorTester()
275         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
276         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
277         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
278         .TestF16();
279     }
280   }
281 }
282 
283 TEST(MINIMUM_ND_F16, 0d_x_4d) {
284   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
285     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
286     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
287     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
288     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
289     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
290     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
291     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
292     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
293     BinaryElementwiseOperatorTester()
294       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
295       .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
296       .TestF16();
297   }
298 }
299 
300 TEST(MINIMUM_ND_F16, 1d_x_4d) {
301   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
302     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
303       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
304       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
305       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
306       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
307       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
308       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
309       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
310       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
311       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
312       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
313       BinaryElementwiseOperatorTester()
314         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
315         .input1_shape({input1_dim1})
316         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
317         .TestF16();
318     }
319   }
320 }
321 
322 TEST(MINIMUM_ND_F16, 2d_x_4d) {
323   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
324     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
325       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
326       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
327       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
328       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
329       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
330       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
331       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
332       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
333       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
334       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
335       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
336       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
337       BinaryElementwiseOperatorTester()
338         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
339         .input1_shape({input1_dim2, input1_dim1})
340         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
341         .TestF16();
342     }
343   }
344 }
345 
346 TEST(MINIMUM_ND_F16, 3d_x_4d) {
347   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
348     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
349       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
350       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
351       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
352       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
353       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
354       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
355       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
356       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
357       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
358       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
359       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
360       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
361       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
362       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
363       BinaryElementwiseOperatorTester()
364         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
365         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
366         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
367         .TestF16();
368     }
369   }
370 }
371 
372 TEST(MINIMUM_ND_F16, 4d_x_0d) {
373   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
374     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
375     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
376     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
377     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
378     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
379     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
380     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
381     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
382     BinaryElementwiseOperatorTester()
383       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
384       .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
385       .TestF16();
386   }
387 }
388 
389 TEST(MINIMUM_ND_F16, 4d_x_1d) {
390   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
391     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
392       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
393       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
394       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
395       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
396       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
397       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
398       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
399       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
400       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
401       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
402       BinaryElementwiseOperatorTester()
403         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
404         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
405         .input2_shape({input2_dim1})
406         .TestF16();
407     }
408   }
409 }
410 
411 TEST(MINIMUM_ND_F16, 4d_x_2d) {
412   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
413     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
414       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
415       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
416       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
417       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
418       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
419       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
420       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
421       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
422       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
423       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
424       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
425       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
426       BinaryElementwiseOperatorTester()
427         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
428         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
429         .input2_shape({input2_dim2, input2_dim1})
430         .TestF16();
431     }
432   }
433 }
434 
435 TEST(MINIMUM_ND_F16, 4d_x_3d) {
436   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
437     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
438       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
439       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
440       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
441       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
442       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
443       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
444       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
445       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
446       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
447       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
448       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
449       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
450       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
451       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
452       BinaryElementwiseOperatorTester()
453         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
454         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
455         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
456         .TestF16();
457     }
458   }
459 }
460 
461 TEST(MINIMUM_ND_F16, 4d_x_4d) {
462   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
463     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
464       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
465       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
466       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
467       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
468       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
469       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
470       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
471       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
472       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
473       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
474       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
475       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
476       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
477       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
478       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
479       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
480       BinaryElementwiseOperatorTester()
481         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
482         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
483         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
484         .TestF16();
485     }
486   }
487 }
488 
489 TEST(MINIMUM_ND_F16, 0d_x_5d) {
490   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
491     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
492     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
493     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
494     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
495     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
496     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
497     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
498     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
499     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
500     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
501     BinaryElementwiseOperatorTester()
502       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
503       .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
504       .TestF16();
505   }
506 }
507 
508 TEST(MINIMUM_ND_F16, 1d_x_5d) {
509   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
510     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
511       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
512       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
513       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
514       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
515       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
516       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
517       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
518       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
519       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
520       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
521       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
522       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
523       BinaryElementwiseOperatorTester()
524         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
525         .input1_shape({input1_dim1})
526         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
527         .TestF16();
528     }
529   }
530 }
531 
532 TEST(MINIMUM_ND_F16, 2d_x_5d) {
533   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
534     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
535       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
536       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
537       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
538       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
539       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
540       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
541       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
542       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
543       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
544       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
545       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
546       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
547       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
548       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
549       BinaryElementwiseOperatorTester()
550         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
551         .input1_shape({input1_dim2, input1_dim1})
552         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
553         .TestF16();
554     }
555   }
556 }
557 
558 TEST(MINIMUM_ND_F16, 3d_x_5d) {
559   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
560     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
561       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
562       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
563       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
564       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
565       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
566       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
567       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
568       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
569       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
570       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
571       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
572       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
573       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
574       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
575       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
576       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
577       BinaryElementwiseOperatorTester()
578         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
579         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
580         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
581         .TestF16();
582     }
583   }
584 }
585 
586 TEST(MINIMUM_ND_F16, 4d_x_5d) {
587   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
588     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
589       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
590       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
591       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
592       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
593       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
594       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
595       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
596       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
597       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
598       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
599       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
600       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
601       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
602       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
603       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
604       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
605       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
606       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
607       BinaryElementwiseOperatorTester()
608         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
609         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
610         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
611         .TestF16();
612     }
613   }
614 }
615 
616 TEST(MINIMUM_ND_F16, 5d_x_0d) {
617   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
618     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
619     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
620     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
621     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
622     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
623     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
624     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
625     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
626     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
627     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
628     BinaryElementwiseOperatorTester()
629       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
630       .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
631       .TestF16();
632   }
633 }
634 
635 TEST(MINIMUM_ND_F16, 5d_x_1d) {
636   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
637     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
638       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
639       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
640       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
641       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
642       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
643       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
644       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
645       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
646       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
647       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
648       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
649       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
650       BinaryElementwiseOperatorTester()
651         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
652         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
653         .input2_shape({input2_dim1})
654         .TestF16();
655     }
656   }
657 }
658 
659 TEST(MINIMUM_ND_F16, 5d_x_2d) {
660   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
661     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
662       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
663       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
664       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
665       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
666       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
667       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
668       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
669       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
670       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
671       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
672       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
673       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
674       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
675       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
676       BinaryElementwiseOperatorTester()
677         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
678         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
679         .input2_shape({input2_dim2, input2_dim1})
680         .TestF16();
681     }
682   }
683 }
684 
685 TEST(MINIMUM_ND_F16, 5d_x_3d) {
686   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
687     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
688       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
689       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
690       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
691       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
692       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
693       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
694       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
695       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
696       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
697       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
698       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
699       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
700       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
701       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
702       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
703       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
704       BinaryElementwiseOperatorTester()
705         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
706         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
707         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
708         .TestF16();
709     }
710   }
711 }
712 
713 TEST(MINIMUM_ND_F16, 5d_x_4d) {
714   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
715     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
716       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
717       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
718       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
719       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
720       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
721       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
722       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
723       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
724       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
725       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
726       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
727       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
728       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
729       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
730       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
731       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
732       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
733       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
734       BinaryElementwiseOperatorTester()
735         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
736         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
737         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
738         .TestF16();
739     }
740   }
741 }
742 
743 TEST(MINIMUM_ND_F16, 5d_x_5d) {
744   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
745     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
746       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
747       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
748       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
749       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
750       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
751       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
752       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
753       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
754       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
755       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
756       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
757       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
758       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
759       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
760       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
761       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
762       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
763       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
764       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
765       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
766       BinaryElementwiseOperatorTester()
767         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
768         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
769         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
770         .iterations(1)
771         .TestF16();
772     }
773   }
774 }
775 
776 TEST(MINIMUM_ND_F16, 0d_x_6d) {
777   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
778     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
779     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
780     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
781     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
782     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
783     const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
784     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
785     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
786     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
787     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
788     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
789     const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
790     BinaryElementwiseOperatorTester()
791       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
792       .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
793       .TestF16();
794   }
795 }
796 
797 TEST(MINIMUM_ND_F16, 1d_x_6d) {
798   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
799     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
800       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
801       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
802       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
803       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
804       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
805       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
806       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
807       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
808       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
809       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
810       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
811       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
812       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
813       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
814       BinaryElementwiseOperatorTester()
815         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
816         .input1_shape({input1_dim1})
817         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
818         .TestF16();
819     }
820   }
821 }
822 
823 TEST(MINIMUM_ND_F16, 2d_x_6d) {
824   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
825     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
826       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
827       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
828       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
829       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
830       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
831       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
832       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
833       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
834       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
835       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
836       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
837       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
838       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
839       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
840       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
841       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
842       BinaryElementwiseOperatorTester()
843         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
844         .input1_shape({input1_dim2, input1_dim1})
845         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
846         .TestF16();
847     }
848   }
849 }
850 
851 TEST(MINIMUM_ND_F16, 3d_x_6d) {
852   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
853     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
854       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
855       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
856       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
857       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
858       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
859       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
860       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
861       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
862       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
863       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
864       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
865       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
866       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
867       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
868       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
869       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
870       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
871       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
872       BinaryElementwiseOperatorTester()
873         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
874         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
875         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
876         .TestF16();
877     }
878   }
879 }
880 
881 TEST(MINIMUM_ND_F16, 4d_x_6d) {
882   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
883     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
884       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
885       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
886       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
887       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
888       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
889       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
890       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
891       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
892       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
893       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
894       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
895       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
896       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
897       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
898       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
899       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
900       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
901       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
902       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
903       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
904       BinaryElementwiseOperatorTester()
905         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
906         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
907         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
908         .TestF16();
909     }
910   }
911 }
912 
913 TEST(MINIMUM_ND_F16, 5d_x_6d) {
914   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
915     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
916       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
917       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
918       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
919       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
920       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
921       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
922       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
923       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
924       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
925       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
926       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
927       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
928       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
929       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
930       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
931       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
932       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
933       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
934       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
935       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
936       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
937       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
938       BinaryElementwiseOperatorTester()
939         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
940         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
941         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
942         .iterations(1)
943         .TestF16();
944     }
945   }
946 }
947 
948 TEST(MINIMUM_ND_F16, 6d_x_0d) {
949   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
950     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
951     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
952     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
953     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
954     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
955     const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
956     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
957     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
958     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
959     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
960     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
961     const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
962     BinaryElementwiseOperatorTester()
963       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
964       .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
965       .TestF16();
966   }
967 }
968 
969 TEST(MINIMUM_ND_F16, 6d_x_1d) {
970   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
971     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
972       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
973       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
974       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
975       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
976       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
977       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
978       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
979       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
980       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
981       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
982       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
983       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
984       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
985       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
986       BinaryElementwiseOperatorTester()
987         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
988         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
989         .input2_shape({input2_dim1})
990         .TestF16();
991     }
992   }
993 }
994 
995 TEST(MINIMUM_ND_F16, 6d_x_2d) {
996   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
997     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
998       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
999       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1000       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1001       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1002       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1003       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1004       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1005       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1006       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1007       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1008       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1009       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1010       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1011       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1012       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1013       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1014       BinaryElementwiseOperatorTester()
1015         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1016         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1017         .input2_shape({input2_dim2, input2_dim1})
1018         .TestF16();
1019     }
1020   }
1021 }
1022 
1023 TEST(MINIMUM_ND_F16, 6d_x_3d) {
1024   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1025     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1026       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1027       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1028       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1029       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1030       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1031       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1032       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1033       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1034       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1035       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1036       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1037       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1038       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1039       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1040       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1041       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1042       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1043       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1044       BinaryElementwiseOperatorTester()
1045         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1046         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1047         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1048         .TestF16();
1049     }
1050   }
1051 }
1052 
1053 TEST(MINIMUM_ND_F16, 6d_x_4d) {
1054   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1055     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1056       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1057       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1058       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1059       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1060       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1061       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1062       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1063       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1064       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1065       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1066       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1067       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1068       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1069       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1070       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1071       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1072       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1073       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1074       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1075       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1076       BinaryElementwiseOperatorTester()
1077         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1078         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1079         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1080         .TestF16();
1081     }
1082   }
1083 }
1084 
1085 TEST(MINIMUM_ND_F16, 6d_x_5d) {
1086   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1087     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1088       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1089       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1090       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1091       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1092       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1093       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1094       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1095       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1096       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1097       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1098       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1099       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1100       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1101       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1102       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1103       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1104       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1105       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1106       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1107       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1108       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1109       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1110       BinaryElementwiseOperatorTester()
1111         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1112         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1113         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1114         .iterations(1)
1115         .TestF16();
1116     }
1117   }
1118 }
1119 
1120 TEST(MINIMUM_ND_F16, 6d_x_6d) {
1121   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
1122     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1123       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1124       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1125       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1126       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1127       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1128       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
1129       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1130       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1131       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1132       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1133       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1134       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1135       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1136       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1137       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1138       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1139       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1140       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
1141       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1142       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1143       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1144       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1145       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1146       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1147       BinaryElementwiseOperatorTester()
1148         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1149         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1150         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1151         .iterations(1)
1152         .TestF16();
1153     }
1154   }
1155 }
1156 #endif  // XNN_EXCLUDE_F16_TESTS
1157 
1158 TEST(MINIMUM_ND_F32, 0d_x_0d) {
1159   BinaryElementwiseOperatorTester()
1160     .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1161     .TestF32();
1162 }
1163 
1164 TEST(MINIMUM_ND_F32, 1d_x_0d) {
1165   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1166     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1167     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1168     BinaryElementwiseOperatorTester()
1169       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1170       .input1_shape({input1_dim1})
1171       .TestF32();
1172   }
1173 }
1174 
1175 TEST(MINIMUM_ND_F32, 0d_x_1d) {
1176   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1177     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1178     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1179     BinaryElementwiseOperatorTester()
1180       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1181       .input2_shape({input2_dim1})
1182       .TestF32();
1183   }
1184 }
1185 
1186 TEST(MINIMUM_ND_F32, 1d_x_1d) {
1187   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1188     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1189       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1190       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1191       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1192       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1193       BinaryElementwiseOperatorTester()
1194         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1195         .input1_shape({input1_dim1})
1196         .input2_shape({input2_dim1})
1197         .TestF32();
1198     }
1199   }
1200 }
1201 
1202 TEST(MINIMUM_ND_F32, 0d_x_2d) {
1203   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1204     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1205     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1206     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1207     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1208     BinaryElementwiseOperatorTester()
1209       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1210       .input2_shape({input2_dim2, input2_dim1})
1211       .TestF32();
1212   }
1213 }
1214 
1215 TEST(MINIMUM_ND_F32, 1d_x_2d) {
1216   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1217     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1218       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1219       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1220       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1221       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1222       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1223       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1224       BinaryElementwiseOperatorTester()
1225         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1226         .input1_shape({input1_dim1})
1227         .input2_shape({input2_dim2, input2_dim1})
1228         .TestF32();
1229     }
1230   }
1231 }
1232 
1233 TEST(MINIMUM_ND_F32, 2d_x_0d) {
1234   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1235     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1236     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1237     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1238     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1239     BinaryElementwiseOperatorTester()
1240       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1241       .input1_shape({input1_dim2, input1_dim1})
1242       .TestF32();
1243   }
1244 }
1245 
1246 TEST(MINIMUM_ND_F32, 2d_x_1d) {
1247   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1248     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1249       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1250       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1251       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1252       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1253       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1254       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1255       BinaryElementwiseOperatorTester()
1256         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1257         .input1_shape({input1_dim2, input1_dim1})
1258         .input2_shape({input2_dim1})
1259         .TestF32();
1260     }
1261   }
1262 }
1263 
1264 TEST(MINIMUM_ND_F32, 2d_x_2d) {
1265   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1266     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1267       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1268       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1269       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1270       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1271       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1272       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1273       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1274       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1275       BinaryElementwiseOperatorTester()
1276         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1277         .input1_shape({input1_dim2, input1_dim1})
1278         .input2_shape({input2_dim2, input2_dim1})
1279         .TestF32();
1280     }
1281   }
1282 }
1283 
1284 TEST(MINIMUM_ND_F32, 0d_x_3d) {
1285   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1286     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1287     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1288     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1289     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1290     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1291     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1292     BinaryElementwiseOperatorTester()
1293       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1294       .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1295       .TestF32();
1296   }
1297 }
1298 
1299 TEST(MINIMUM_ND_F32, 1d_x_3d) {
1300   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1301     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1302       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1303       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1304       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1305       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1306       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1307       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1308       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1309       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1310       BinaryElementwiseOperatorTester()
1311         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1312         .input1_shape({input1_dim1})
1313         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1314         .TestF32();
1315     }
1316   }
1317 }
1318 
1319 TEST(MINIMUM_ND_F32, 2d_x_3d) {
1320   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1321     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1322       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1323       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1324       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1325       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1326       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1327       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1328       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1329       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1330       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1331       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1332       BinaryElementwiseOperatorTester()
1333         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1334         .input1_shape({input1_dim2, input1_dim1})
1335         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1336         .TestF32();
1337     }
1338   }
1339 }
1340 
1341 TEST(MINIMUM_ND_F32, 3d_x_0d) {
1342   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1343     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1344     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1345     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1346     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1347     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1348     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1349     BinaryElementwiseOperatorTester()
1350       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1351       .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1352       .TestF32();
1353   }
1354 }
1355 
1356 TEST(MINIMUM_ND_F32, 3d_x_1d) {
1357   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1358     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1359       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1360       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1361       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1362       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1363       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1364       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1365       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1366       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1367       BinaryElementwiseOperatorTester()
1368         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1369         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1370         .input2_shape({input2_dim1})
1371         .TestF32();
1372     }
1373   }
1374 }
1375 
1376 TEST(MINIMUM_ND_F32, 3d_x_2d) {
1377   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1378     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1379       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1380       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1381       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1382       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1383       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1384       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1385       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1386       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1387       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1388       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1389       BinaryElementwiseOperatorTester()
1390         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1391         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1392         .input2_shape({input2_dim2, input2_dim1})
1393         .TestF32();
1394     }
1395   }
1396 }
1397 
1398 TEST(MINIMUM_ND_F32, 3d_x_3d) {
1399   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1400     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1401       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1402       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1403       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1404       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1405       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1406       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1407       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1408       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1409       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1410       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1411       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1412       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1413       BinaryElementwiseOperatorTester()
1414         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1415         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1416         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1417         .TestF32();
1418     }
1419   }
1420 }
1421 
1422 TEST(MINIMUM_ND_F32, 0d_x_4d) {
1423   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1424     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1425     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1426     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1427     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1428     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1429     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1430     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1431     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1432     BinaryElementwiseOperatorTester()
1433       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1434       .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1435       .TestF32();
1436   }
1437 }
1438 
1439 TEST(MINIMUM_ND_F32, 1d_x_4d) {
1440   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1441     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1442       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1443       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1444       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1445       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1446       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1447       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1448       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1449       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1450       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1451       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1452       BinaryElementwiseOperatorTester()
1453         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1454         .input1_shape({input1_dim1})
1455         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1456         .TestF32();
1457     }
1458   }
1459 }
1460 
1461 TEST(MINIMUM_ND_F32, 2d_x_4d) {
1462   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1463     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1464       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1465       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1466       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1467       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1468       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1469       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1470       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1471       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1472       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1473       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1474       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1475       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1476       BinaryElementwiseOperatorTester()
1477         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1478         .input1_shape({input1_dim2, input1_dim1})
1479         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1480         .TestF32();
1481     }
1482   }
1483 }
1484 
1485 TEST(MINIMUM_ND_F32, 3d_x_4d) {
1486   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1487     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1488       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1489       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1490       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1491       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1492       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1493       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1494       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1495       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1496       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1497       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1498       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1499       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1500       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1501       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1502       BinaryElementwiseOperatorTester()
1503         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1504         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1505         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1506         .TestF32();
1507     }
1508   }
1509 }
1510 
1511 TEST(MINIMUM_ND_F32, 4d_x_0d) {
1512   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1513     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1514     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1515     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1516     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1517     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1518     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1519     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1520     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1521     BinaryElementwiseOperatorTester()
1522       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1523       .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1524       .TestF32();
1525   }
1526 }
1527 
1528 TEST(MINIMUM_ND_F32, 4d_x_1d) {
1529   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1530     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1531       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1532       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1533       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1534       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1535       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1536       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1537       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1538       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1539       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1540       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1541       BinaryElementwiseOperatorTester()
1542         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1543         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1544         .input2_shape({input2_dim1})
1545         .TestF32();
1546     }
1547   }
1548 }
1549 
1550 TEST(MINIMUM_ND_F32, 4d_x_2d) {
1551   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1552     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1553       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1554       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1555       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1556       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1557       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1558       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1559       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1560       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1561       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1562       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1563       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1564       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1565       BinaryElementwiseOperatorTester()
1566         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1567         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1568         .input2_shape({input2_dim2, input2_dim1})
1569         .TestF32();
1570     }
1571   }
1572 }
1573 
1574 TEST(MINIMUM_ND_F32, 4d_x_3d) {
1575   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1576     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1577       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1578       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1579       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1580       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1581       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1582       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1583       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1584       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1585       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1586       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1587       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1588       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1589       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1590       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1591       BinaryElementwiseOperatorTester()
1592         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1593         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1594         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1595         .TestF32();
1596     }
1597   }
1598 }
1599 
1600 TEST(MINIMUM_ND_F32, 4d_x_4d) {
1601   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1602     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1603       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1604       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1605       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1606       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1607       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1608       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1609       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1610       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1611       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1612       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1613       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1614       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1615       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1616       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1617       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1618       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1619       BinaryElementwiseOperatorTester()
1620         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1621         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1622         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1623         .TestF32();
1624     }
1625   }
1626 }
1627 
1628 TEST(MINIMUM_ND_F32, 0d_x_5d) {
1629   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1630     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1631     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1632     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1633     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1634     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1635     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1636     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1637     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1638     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1639     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1640     BinaryElementwiseOperatorTester()
1641       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1642       .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1643       .TestF32();
1644   }
1645 }
1646 
1647 TEST(MINIMUM_ND_F32, 1d_x_5d) {
1648   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1649     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1650       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1651       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1652       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1653       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1654       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1655       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1656       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1657       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1658       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1659       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1660       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1661       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1662       BinaryElementwiseOperatorTester()
1663         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1664         .input1_shape({input1_dim1})
1665         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1666         .TestF32();
1667     }
1668   }
1669 }
1670 
1671 TEST(MINIMUM_ND_F32, 2d_x_5d) {
1672   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1673     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1674       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1675       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1676       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1677       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1678       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1679       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1680       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1681       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1682       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1683       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1684       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1685       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1686       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1687       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1688       BinaryElementwiseOperatorTester()
1689         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1690         .input1_shape({input1_dim2, input1_dim1})
1691         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1692         .TestF32();
1693     }
1694   }
1695 }
1696 
1697 TEST(MINIMUM_ND_F32, 3d_x_5d) {
1698   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1699     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1700       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1701       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1702       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1703       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1704       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1705       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1706       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1707       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1708       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1709       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1710       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1711       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1712       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1713       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1714       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1715       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1716       BinaryElementwiseOperatorTester()
1717         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1718         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
1719         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1720         .TestF32();
1721     }
1722   }
1723 }
1724 
1725 TEST(MINIMUM_ND_F32, 4d_x_5d) {
1726   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
1727     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1728       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1729       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1730       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1731       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1732       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1733       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1734       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1735       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1736       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1737       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1738       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1739       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1740       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1741       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1742       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1743       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1744       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1745       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1746       BinaryElementwiseOperatorTester()
1747         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1748         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1749         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1750         .TestF32();
1751     }
1752   }
1753 }
1754 
1755 TEST(MINIMUM_ND_F32, 5d_x_0d) {
1756   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1757     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1758     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1759     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1760     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1761     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1762     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1763     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1764     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1765     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1766     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1767     BinaryElementwiseOperatorTester()
1768       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1769       .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1770       .TestF32();
1771   }
1772 }
1773 
1774 TEST(MINIMUM_ND_F32, 5d_x_1d) {
1775   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1776     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
1777       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1778       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1779       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1780       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1781       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1782       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1783       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1784       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1785       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1786       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1787       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1788       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1789       BinaryElementwiseOperatorTester()
1790         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1791         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1792         .input2_shape({input2_dim1})
1793         .TestF32();
1794     }
1795   }
1796 }
1797 
1798 TEST(MINIMUM_ND_F32, 5d_x_2d) {
1799   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1800     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
1801       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1802       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1803       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1804       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1805       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1806       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1807       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1808       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1809       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1810       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1811       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1812       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1813       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1814       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1815       BinaryElementwiseOperatorTester()
1816         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1817         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1818         .input2_shape({input2_dim2, input2_dim1})
1819         .TestF32();
1820     }
1821   }
1822 }
1823 
1824 TEST(MINIMUM_ND_F32, 5d_x_3d) {
1825   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1826     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
1827       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1828       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1829       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1830       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1831       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1832       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1833       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1834       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1835       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1836       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1837       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1838       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1839       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1840       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1841       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1842       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1843       BinaryElementwiseOperatorTester()
1844         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1845         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1846         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
1847         .TestF32();
1848     }
1849   }
1850 }
1851 
1852 TEST(MINIMUM_ND_F32, 5d_x_4d) {
1853   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1854     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
1855       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1856       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1857       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1858       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1859       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1860       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1861       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1862       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1863       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1864       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1865       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1866       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1867       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1868       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1869       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1870       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1871       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1872       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1873       BinaryElementwiseOperatorTester()
1874         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1875         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1876         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1877         .TestF32();
1878     }
1879   }
1880 }
1881 
1882 TEST(MINIMUM_ND_F32, 5d_x_5d) {
1883   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
1884     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
1885       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1886       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1887       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1888       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
1889       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
1890       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1891       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1892       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1893       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1894       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1895       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1896       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1897       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
1898       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
1899       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
1900       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1901       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1902       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1903       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1904       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1905       BinaryElementwiseOperatorTester()
1906         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1907         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
1908         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1909         .iterations(1)
1910         .TestF32();
1911     }
1912   }
1913 }
1914 
1915 TEST(MINIMUM_ND_F32, 0d_x_6d) {
1916   for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1917     const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1918     const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1919     const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1920     const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1921     const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1922     const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1923     const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1924     const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1925     const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1926     const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1927     const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1928     const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1929     BinaryElementwiseOperatorTester()
1930       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1931       .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1932       .TestF32();
1933   }
1934 }
1935 
1936 TEST(MINIMUM_ND_F32, 1d_x_6d) {
1937   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 1); bm1++) {
1938     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1939       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1940       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1941       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1942       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1943       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1944       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1945       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1946       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1947       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1948       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1949       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1950       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1951       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1952       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1953       BinaryElementwiseOperatorTester()
1954         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1955         .input1_shape({input1_dim1})
1956         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1957         .TestF32();
1958     }
1959   }
1960 }
1961 
1962 TEST(MINIMUM_ND_F32, 2d_x_6d) {
1963   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 2); bm1++) {
1964     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1965       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1966       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1967       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1968       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1969       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1970       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
1971       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
1972       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
1973       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
1974       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
1975       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
1976       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
1977       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
1978       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
1979       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
1980       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
1981       BinaryElementwiseOperatorTester()
1982         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
1983         .input1_shape({input1_dim2, input1_dim1})
1984         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
1985         .TestF32();
1986     }
1987   }
1988 }
1989 
1990 TEST(MINIMUM_ND_F32, 3d_x_6d) {
1991   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 3); bm1++) {
1992     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
1993       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
1994       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
1995       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
1996       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
1997       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
1998       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
1999       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2000       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2001       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2002       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2003       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2004       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2005       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2006       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2007       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2008       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2009       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2010       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2011       BinaryElementwiseOperatorTester()
2012         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2013         .input1_shape({input1_dim3, input1_dim2, input1_dim1})
2014         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2015         .TestF32();
2016     }
2017   }
2018 }
2019 
2020 TEST(MINIMUM_ND_F32, 4d_x_6d) {
2021   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 4); bm1++) {
2022     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2023       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2024       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2025       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2026       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2027       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2028       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2029       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2030       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2031       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2032       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2033       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2034       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2035       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2036       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2037       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2038       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2039       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2040       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2041       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2042       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2043       BinaryElementwiseOperatorTester()
2044         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2045         .input1_shape({input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2046         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2047         .TestF32();
2048     }
2049   }
2050 }
2051 
2052 TEST(MINIMUM_ND_F32, 5d_x_6d) {
2053   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 5); bm1++) {
2054     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2055       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2056       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2057       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2058       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2059       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2060       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2061       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2062       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2063       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2064       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2065       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2066       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2067       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2068       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2069       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2070       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2071       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2072       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2073       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2074       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2075       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2076       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2077       BinaryElementwiseOperatorTester()
2078         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2079         .input1_shape({input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2080         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2081         .iterations(1)
2082         .TestF32();
2083     }
2084   }
2085 }
2086 
2087 TEST(MINIMUM_ND_F32, 6d_x_0d) {
2088   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2089     const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2090     const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2091     const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2092     const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2093     const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2094     const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2095     const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2096     const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2097     const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2098     const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2099     const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2100     const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2101     BinaryElementwiseOperatorTester()
2102       .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2103       .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2104       .TestF32();
2105   }
2106 }
2107 
2108 TEST(MINIMUM_ND_F32, 6d_x_1d) {
2109   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2110     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 1); bm2++) {
2111       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2112       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2113       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2114       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2115       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2116       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2117       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2118       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2119       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2120       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2121       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2122       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2123       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2124       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2125       BinaryElementwiseOperatorTester()
2126         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2127         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2128         .input2_shape({input2_dim1})
2129         .TestF32();
2130     }
2131   }
2132 }
2133 
2134 TEST(MINIMUM_ND_F32, 6d_x_2d) {
2135   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2136     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 2); bm2++) {
2137       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2138       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2139       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2140       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2141       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2142       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2143       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2144       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2145       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2146       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2147       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2148       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2149       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2150       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2151       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2152       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2153       BinaryElementwiseOperatorTester()
2154         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2155         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2156         .input2_shape({input2_dim2, input2_dim1})
2157         .TestF32();
2158     }
2159   }
2160 }
2161 
2162 TEST(MINIMUM_ND_F32, 6d_x_3d) {
2163   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2164     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 3); bm2++) {
2165       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2166       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2167       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2168       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2169       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2170       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2171       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2172       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2173       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2174       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2175       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2176       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2177       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2178       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2179       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2180       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2181       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2182       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2183       BinaryElementwiseOperatorTester()
2184         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2185         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2186         .input2_shape({input2_dim3, input2_dim2, input2_dim1})
2187         .TestF32();
2188     }
2189   }
2190 }
2191 
2192 TEST(MINIMUM_ND_F32, 6d_x_4d) {
2193   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2194     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 4); bm2++) {
2195       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2196       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2197       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2198       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2199       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2200       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2201       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2202       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2203       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2204       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2205       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2206       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2207       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2208       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2209       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2210       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2211       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2212       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2213       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2214       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2215       BinaryElementwiseOperatorTester()
2216         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2217         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2218         .input2_shape({input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2219         .TestF32();
2220     }
2221   }
2222 }
2223 
2224 TEST(MINIMUM_ND_F32, 6d_x_5d) {
2225   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2226     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 5); bm2++) {
2227       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2228       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2229       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2230       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2231       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2232       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2233       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2234       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2235       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2236       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2237       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2238       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2239       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2240       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2241       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2242       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2243       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2244       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2245       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2246       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2247       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2248       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2249       BinaryElementwiseOperatorTester()
2250         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2251         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2252         .input2_shape({input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2253         .iterations(1)
2254         .TestF32();
2255     }
2256   }
2257 }
2258 
2259 TEST(MINIMUM_ND_F32, 6d_x_6d) {
2260   for (uint32_t bm1 = 0; bm1 < (uint32_t(1) << 6); bm1++) {
2261     for (uint32_t bm2 = 0; bm2 < (uint32_t(1) << 6); bm2++) {
2262       const bool input1_broadcast_dim1 = bm1 & (uint32_t(1) << 0);
2263       const bool input1_broadcast_dim2 = bm1 & (uint32_t(1) << 1);
2264       const bool input1_broadcast_dim3 = bm1 & (uint32_t(1) << 2);
2265       const bool input1_broadcast_dim4 = bm1 & (uint32_t(1) << 3);
2266       const bool input1_broadcast_dim5 = bm1 & (uint32_t(1) << 4);
2267       const bool input1_broadcast_dim6 = bm1 & (uint32_t(1) << 5);
2268       const bool input2_broadcast_dim1 = bm2 & (uint32_t(1) << 0);
2269       const bool input2_broadcast_dim2 = bm2 & (uint32_t(1) << 1);
2270       const bool input2_broadcast_dim3 = bm2 & (uint32_t(1) << 2);
2271       const bool input2_broadcast_dim4 = bm2 & (uint32_t(1) << 3);
2272       const bool input2_broadcast_dim5 = bm2 & (uint32_t(1) << 4);
2273       const bool input2_broadcast_dim6 = bm2 & (uint32_t(1) << 5);
2274       const size_t input1_dim1 = input1_broadcast_dim1 ? 1 : kDim1;
2275       const size_t input1_dim2 = input1_broadcast_dim2 ? 1 : kDim2;
2276       const size_t input1_dim3 = input1_broadcast_dim3 ? 1 : kDim3;
2277       const size_t input1_dim4 = input1_broadcast_dim4 ? 1 : kDim4;
2278       const size_t input1_dim5 = input1_broadcast_dim5 ? 1 : kDim5;
2279       const size_t input1_dim6 = input1_broadcast_dim6 ? 1 : kDim6;
2280       const size_t input2_dim1 = input2_broadcast_dim1 ? 1 : kDim1;
2281       const size_t input2_dim2 = input2_broadcast_dim2 ? 1 : kDim2;
2282       const size_t input2_dim3 = input2_broadcast_dim3 ? 1 : kDim3;
2283       const size_t input2_dim4 = input2_broadcast_dim4 ? 1 : kDim4;
2284       const size_t input2_dim5 = input2_broadcast_dim5 ? 1 : kDim5;
2285       const size_t input2_dim6 = input2_broadcast_dim6 ? 1 : kDim6;
2286       BinaryElementwiseOperatorTester()
2287         .operation_type(BinaryElementwiseOperatorTester::OperationType::Minimum)
2288         .input1_shape({input1_dim6, input1_dim5, input1_dim4, input1_dim3, input1_dim2, input1_dim1})
2289         .input2_shape({input2_dim6, input2_dim5, input2_dim4, input2_dim3, input2_dim2, input2_dim1})
2290         .iterations(1)
2291         .TestF32();
2292     }
2293   }
2294 }
2295