1*c217d954SCole Faust /*
2*c217d954SCole Faust * Copyright (c) 2018-2021 Arm Limited.
3*c217d954SCole Faust *
4*c217d954SCole Faust * SPDX-License-Identifier: MIT
5*c217d954SCole Faust *
6*c217d954SCole Faust * Permission is hereby granted, free of charge, to any person obtaining a copy
7*c217d954SCole Faust * of this software and associated documentation files (the "Software"), to
8*c217d954SCole Faust * deal in the Software without restriction, including without limitation the
9*c217d954SCole Faust * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10*c217d954SCole Faust * sell copies of the Software, and to permit persons to whom the Software is
11*c217d954SCole Faust * furnished to do so, subject to the following conditions:
12*c217d954SCole Faust *
13*c217d954SCole Faust * The above copyright notice and this permission notice shall be included in all
14*c217d954SCole Faust * copies or substantial portions of the Software.
15*c217d954SCole Faust *
16*c217d954SCole Faust * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*c217d954SCole Faust * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*c217d954SCole Faust * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19*c217d954SCole Faust * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*c217d954SCole Faust * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21*c217d954SCole Faust * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22*c217d954SCole Faust * SOFTWARE.
23*c217d954SCole Faust */
24*c217d954SCole Faust #include "arm_compute/runtime/NEON/functions/NEElementwiseOperations.h"
25*c217d954SCole Faust #include "arm_compute/core/Validate.h"
26*c217d954SCole Faust #include "src/cpu/operators/CpuElementwise.h"
27*c217d954SCole Faust
28*c217d954SCole Faust #include "arm_compute/core/ITensor.h"
29*c217d954SCole Faust
30*c217d954SCole Faust #include <utility>
31*c217d954SCole Faust
32*c217d954SCole Faust namespace arm_compute
33*c217d954SCole Faust {
34*c217d954SCole Faust struct NEElementwiseMax::Impl
35*c217d954SCole Faust {
36*c217d954SCole Faust const ITensor *src_0{ nullptr };
37*c217d954SCole Faust const ITensor *src_1{ nullptr };
38*c217d954SCole Faust ITensor *dst{ nullptr };
39*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseMax> op{ nullptr };
40*c217d954SCole Faust };
41*c217d954SCole Faust
NEElementwiseMax()42*c217d954SCole Faust NEElementwiseMax::NEElementwiseMax()
43*c217d954SCole Faust : _impl(std::make_unique<Impl>())
44*c217d954SCole Faust {
45*c217d954SCole Faust }
46*c217d954SCole Faust NEElementwiseMax::NEElementwiseMax(NEElementwiseMax &&) = default;
47*c217d954SCole Faust NEElementwiseMax &NEElementwiseMax::operator=(NEElementwiseMax &&) = default;
48*c217d954SCole Faust NEElementwiseMax::~NEElementwiseMax() = default;
49*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,const ActivationLayerInfo & act_info)50*c217d954SCole Faust void NEElementwiseMax::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
51*c217d954SCole Faust {
52*c217d954SCole Faust ARM_COMPUTE_UNUSED(act_info);
53*c217d954SCole Faust _impl->src_0 = input1;
54*c217d954SCole Faust _impl->src_1 = input2;
55*c217d954SCole Faust _impl->dst = output;
56*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseMax>();
57*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
58*c217d954SCole Faust }
59*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,const ActivationLayerInfo & act_info)60*c217d954SCole Faust Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
61*c217d954SCole Faust {
62*c217d954SCole Faust ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
63*c217d954SCole Faust return cpu::CpuElementwiseMax::validate(input1, input2, output);
64*c217d954SCole Faust }
65*c217d954SCole Faust
run()66*c217d954SCole Faust void NEElementwiseMax::run()
67*c217d954SCole Faust {
68*c217d954SCole Faust ITensorPack pack;
69*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
70*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
71*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
72*c217d954SCole Faust _impl->op->run(pack);
73*c217d954SCole Faust }
74*c217d954SCole Faust
75*c217d954SCole Faust struct NEElementwiseMin::Impl
76*c217d954SCole Faust {
77*c217d954SCole Faust const ITensor *src_0{ nullptr };
78*c217d954SCole Faust const ITensor *src_1{ nullptr };
79*c217d954SCole Faust ITensor *dst{ nullptr };
80*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseMin> op{ nullptr };
81*c217d954SCole Faust };
82*c217d954SCole Faust
NEElementwiseMin()83*c217d954SCole Faust NEElementwiseMin::NEElementwiseMin()
84*c217d954SCole Faust : _impl(std::make_unique<Impl>())
85*c217d954SCole Faust {
86*c217d954SCole Faust }
87*c217d954SCole Faust NEElementwiseMin::NEElementwiseMin(NEElementwiseMin &&) = default;
88*c217d954SCole Faust NEElementwiseMin &NEElementwiseMin::operator=(NEElementwiseMin &&) = default;
89*c217d954SCole Faust NEElementwiseMin::~NEElementwiseMin() = default;
90*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,const ActivationLayerInfo & act_info)91*c217d954SCole Faust void NEElementwiseMin::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
92*c217d954SCole Faust {
93*c217d954SCole Faust ARM_COMPUTE_UNUSED(act_info);
94*c217d954SCole Faust _impl->src_0 = input1;
95*c217d954SCole Faust _impl->src_1 = input2;
96*c217d954SCole Faust _impl->dst = output;
97*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseMin>();
98*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
99*c217d954SCole Faust }
100*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,const ActivationLayerInfo & act_info)101*c217d954SCole Faust Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
102*c217d954SCole Faust {
103*c217d954SCole Faust ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
104*c217d954SCole Faust return cpu::CpuElementwiseMin::validate(input1, input2, output);
105*c217d954SCole Faust }
106*c217d954SCole Faust
run()107*c217d954SCole Faust void NEElementwiseMin::run()
108*c217d954SCole Faust {
109*c217d954SCole Faust ITensorPack pack;
110*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
111*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
112*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
113*c217d954SCole Faust _impl->op->run(pack);
114*c217d954SCole Faust }
115*c217d954SCole Faust
116*c217d954SCole Faust struct NEElementwiseSquaredDiff::Impl
117*c217d954SCole Faust {
118*c217d954SCole Faust const ITensor *src_0{ nullptr };
119*c217d954SCole Faust const ITensor *src_1{ nullptr };
120*c217d954SCole Faust ITensor *dst{ nullptr };
121*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseSquaredDiff> op{ nullptr };
122*c217d954SCole Faust };
123*c217d954SCole Faust
NEElementwiseSquaredDiff()124*c217d954SCole Faust NEElementwiseSquaredDiff::NEElementwiseSquaredDiff()
125*c217d954SCole Faust : _impl(std::make_unique<Impl>())
126*c217d954SCole Faust {
127*c217d954SCole Faust }
128*c217d954SCole Faust NEElementwiseSquaredDiff::NEElementwiseSquaredDiff(NEElementwiseSquaredDiff &&) = default;
129*c217d954SCole Faust NEElementwiseSquaredDiff &NEElementwiseSquaredDiff::operator=(NEElementwiseSquaredDiff &&) = default;
130*c217d954SCole Faust NEElementwiseSquaredDiff::~NEElementwiseSquaredDiff() = default;
131*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,const ActivationLayerInfo & act_info)132*c217d954SCole Faust void NEElementwiseSquaredDiff::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
133*c217d954SCole Faust {
134*c217d954SCole Faust ARM_COMPUTE_UNUSED(act_info);
135*c217d954SCole Faust _impl->src_0 = input1;
136*c217d954SCole Faust _impl->src_1 = input2;
137*c217d954SCole Faust _impl->dst = output;
138*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseSquaredDiff>();
139*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
140*c217d954SCole Faust }
141*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,const ActivationLayerInfo & act_info)142*c217d954SCole Faust Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
143*c217d954SCole Faust {
144*c217d954SCole Faust ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
145*c217d954SCole Faust return cpu::CpuElementwiseSquaredDiff::validate(input1, input2, output);
146*c217d954SCole Faust }
147*c217d954SCole Faust
run()148*c217d954SCole Faust void NEElementwiseSquaredDiff::run()
149*c217d954SCole Faust {
150*c217d954SCole Faust ITensorPack pack;
151*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
152*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
153*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
154*c217d954SCole Faust _impl->op->run(pack);
155*c217d954SCole Faust }
156*c217d954SCole Faust
157*c217d954SCole Faust struct NEElementwiseDivision::Impl
158*c217d954SCole Faust {
159*c217d954SCole Faust const ITensor *src_0{ nullptr };
160*c217d954SCole Faust const ITensor *src_1{ nullptr };
161*c217d954SCole Faust ITensor *dst{ nullptr };
162*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseDivision> op{ nullptr };
163*c217d954SCole Faust };
164*c217d954SCole Faust
NEElementwiseDivision()165*c217d954SCole Faust NEElementwiseDivision::NEElementwiseDivision()
166*c217d954SCole Faust : _impl(std::make_unique<Impl>())
167*c217d954SCole Faust {
168*c217d954SCole Faust }
169*c217d954SCole Faust NEElementwiseDivision::NEElementwiseDivision(NEElementwiseDivision &&) = default;
170*c217d954SCole Faust NEElementwiseDivision &NEElementwiseDivision::operator=(NEElementwiseDivision &&) = default;
171*c217d954SCole Faust NEElementwiseDivision::~NEElementwiseDivision() = default;
172*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,const ActivationLayerInfo & act_info)173*c217d954SCole Faust void NEElementwiseDivision::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
174*c217d954SCole Faust {
175*c217d954SCole Faust ARM_COMPUTE_UNUSED(act_info);
176*c217d954SCole Faust _impl->src_0 = input1;
177*c217d954SCole Faust _impl->src_1 = input2;
178*c217d954SCole Faust _impl->dst = output;
179*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseDivision>();
180*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
181*c217d954SCole Faust }
182*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,const ActivationLayerInfo & act_info)183*c217d954SCole Faust Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
184*c217d954SCole Faust {
185*c217d954SCole Faust ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
186*c217d954SCole Faust return cpu::CpuElementwiseDivision::validate(input1, input2, output);
187*c217d954SCole Faust }
188*c217d954SCole Faust
run()189*c217d954SCole Faust void NEElementwiseDivision::run()
190*c217d954SCole Faust {
191*c217d954SCole Faust ITensorPack pack;
192*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
193*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
194*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
195*c217d954SCole Faust _impl->op->run(pack);
196*c217d954SCole Faust }
197*c217d954SCole Faust
198*c217d954SCole Faust struct NEElementwisePower::Impl
199*c217d954SCole Faust {
200*c217d954SCole Faust const ITensor *src_0{ nullptr };
201*c217d954SCole Faust const ITensor *src_1{ nullptr };
202*c217d954SCole Faust ITensor *dst{ nullptr };
203*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwisePower> op{ nullptr };
204*c217d954SCole Faust };
205*c217d954SCole Faust
NEElementwisePower()206*c217d954SCole Faust NEElementwisePower::NEElementwisePower()
207*c217d954SCole Faust : _impl(std::make_unique<Impl>())
208*c217d954SCole Faust {
209*c217d954SCole Faust }
210*c217d954SCole Faust NEElementwisePower::NEElementwisePower(NEElementwisePower &&) = default;
211*c217d954SCole Faust NEElementwisePower &NEElementwisePower::operator=(NEElementwisePower &&) = default;
212*c217d954SCole Faust NEElementwisePower::~NEElementwisePower() = default;
213*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,const ActivationLayerInfo & act_info)214*c217d954SCole Faust void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
215*c217d954SCole Faust {
216*c217d954SCole Faust ARM_COMPUTE_UNUSED(act_info);
217*c217d954SCole Faust _impl->src_0 = input1;
218*c217d954SCole Faust _impl->src_1 = input2;
219*c217d954SCole Faust _impl->dst = output;
220*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwisePower>();
221*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
222*c217d954SCole Faust }
223*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,const ActivationLayerInfo & act_info)224*c217d954SCole Faust Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
225*c217d954SCole Faust {
226*c217d954SCole Faust ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
227*c217d954SCole Faust return cpu::CpuElementwisePower::validate(input1, input2, output);
228*c217d954SCole Faust }
229*c217d954SCole Faust
run()230*c217d954SCole Faust void NEElementwisePower::run()
231*c217d954SCole Faust {
232*c217d954SCole Faust ITensorPack pack;
233*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
234*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
235*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
236*c217d954SCole Faust _impl->op->run(pack);
237*c217d954SCole Faust }
238*c217d954SCole Faust
239*c217d954SCole Faust template <ComparisonOperation COP>
240*c217d954SCole Faust struct NEElementwiseComparisonStatic<COP>::Impl
241*c217d954SCole Faust {
242*c217d954SCole Faust const ITensor *src_0{ nullptr };
243*c217d954SCole Faust const ITensor *src_1{ nullptr };
244*c217d954SCole Faust ITensor *dst{ nullptr };
245*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseComparisonStatic<COP>> op{ nullptr };
246*c217d954SCole Faust };
247*c217d954SCole Faust
248*c217d954SCole Faust template <ComparisonOperation COP>
NEElementwiseComparisonStatic()249*c217d954SCole Faust NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic()
250*c217d954SCole Faust : _impl(std::make_unique<Impl>())
251*c217d954SCole Faust {
252*c217d954SCole Faust }
253*c217d954SCole Faust template <ComparisonOperation COP>
254*c217d954SCole Faust NEElementwiseComparisonStatic<COP>::NEElementwiseComparisonStatic(NEElementwiseComparisonStatic &&) = default;
255*c217d954SCole Faust template <ComparisonOperation COP>
256*c217d954SCole Faust NEElementwiseComparisonStatic<COP> &NEElementwiseComparisonStatic<COP>::operator=(NEElementwiseComparisonStatic &&) = default;
257*c217d954SCole Faust template <ComparisonOperation COP>
258*c217d954SCole Faust NEElementwiseComparisonStatic<COP>::~NEElementwiseComparisonStatic() = default;
259*c217d954SCole Faust
260*c217d954SCole Faust template <ComparisonOperation COP>
configure(ITensor * input1,ITensor * input2,ITensor * output)261*c217d954SCole Faust void NEElementwiseComparisonStatic<COP>::configure(ITensor *input1, ITensor *input2, ITensor *output)
262*c217d954SCole Faust {
263*c217d954SCole Faust _impl->src_0 = input1;
264*c217d954SCole Faust _impl->src_1 = input2;
265*c217d954SCole Faust _impl->dst = output;
266*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseComparisonStatic<COP>>();
267*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info());
268*c217d954SCole Faust }
269*c217d954SCole Faust
270*c217d954SCole Faust template <ComparisonOperation COP>
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output)271*c217d954SCole Faust Status NEElementwiseComparisonStatic<COP>::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
272*c217d954SCole Faust {
273*c217d954SCole Faust return cpu::CpuElementwiseComparisonStatic<COP>::validate(input1, input2, output);
274*c217d954SCole Faust }
275*c217d954SCole Faust
276*c217d954SCole Faust template <ComparisonOperation COP>
run()277*c217d954SCole Faust void NEElementwiseComparisonStatic<COP>::run()
278*c217d954SCole Faust {
279*c217d954SCole Faust ITensorPack pack;
280*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
281*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
282*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
283*c217d954SCole Faust _impl->op->run(pack);
284*c217d954SCole Faust }
285*c217d954SCole Faust
286*c217d954SCole Faust struct NEElementwiseComparison::Impl
287*c217d954SCole Faust {
288*c217d954SCole Faust const ITensor *src_0{ nullptr };
289*c217d954SCole Faust const ITensor *src_1{ nullptr };
290*c217d954SCole Faust ITensor *dst{ nullptr };
291*c217d954SCole Faust std::unique_ptr<cpu::CpuElementwiseComparison> op{ nullptr };
292*c217d954SCole Faust };
293*c217d954SCole Faust
NEElementwiseComparison()294*c217d954SCole Faust NEElementwiseComparison::NEElementwiseComparison()
295*c217d954SCole Faust : _impl(std::make_unique<Impl>())
296*c217d954SCole Faust {
297*c217d954SCole Faust }
298*c217d954SCole Faust NEElementwiseComparison::NEElementwiseComparison(NEElementwiseComparison &&) = default;
299*c217d954SCole Faust NEElementwiseComparison &NEElementwiseComparison::operator=(NEElementwiseComparison &&) = default;
300*c217d954SCole Faust NEElementwiseComparison::~NEElementwiseComparison() = default;
301*c217d954SCole Faust
configure(ITensor * input1,ITensor * input2,ITensor * output,ComparisonOperation op)302*c217d954SCole Faust void NEElementwiseComparison::configure(ITensor *input1, ITensor *input2, ITensor *output, ComparisonOperation op)
303*c217d954SCole Faust {
304*c217d954SCole Faust _impl->src_0 = input1;
305*c217d954SCole Faust _impl->src_1 = input2;
306*c217d954SCole Faust _impl->dst = output;
307*c217d954SCole Faust _impl->op = std::make_unique<cpu::CpuElementwiseComparison>();
308*c217d954SCole Faust _impl->op->configure(input1->info(), input2->info(), output->info(), op);
309*c217d954SCole Faust }
310*c217d954SCole Faust
validate(const ITensorInfo * input1,const ITensorInfo * input2,const ITensorInfo * output,ComparisonOperation op)311*c217d954SCole Faust Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
312*c217d954SCole Faust {
313*c217d954SCole Faust return cpu::CpuElementwiseComparison::validate(input1, input2, output, op);
314*c217d954SCole Faust }
315*c217d954SCole Faust
run()316*c217d954SCole Faust void NEElementwiseComparison::run()
317*c217d954SCole Faust {
318*c217d954SCole Faust ITensorPack pack;
319*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_0, _impl->src_0);
320*c217d954SCole Faust pack.add_tensor(TensorType::ACL_SRC_1, _impl->src_1);
321*c217d954SCole Faust pack.add_tensor(TensorType::ACL_DST, _impl->dst);
322*c217d954SCole Faust _impl->op->run(pack);
323*c217d954SCole Faust }
324*c217d954SCole Faust
325*c217d954SCole Faust // Supported Specializations
326*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::Equal>;
327*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
328*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::Greater>;
329*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
330*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::Less>;
331*c217d954SCole Faust template class NEElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
332*c217d954SCole Faust } // namespace arm_compute
333