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