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