1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2020 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 <assert.h>
7*4bdc9457SAndroid Build Coastguard Worker #include <math.h>
8*4bdc9457SAndroid Build Coastguard Worker #include <stddef.h>
9*4bdc9457SAndroid Build Coastguard Worker #include <stdint.h>
10*4bdc9457SAndroid Build Coastguard Worker #include <stdlib.h>
11*4bdc9457SAndroid Build Coastguard Worker
12*4bdc9457SAndroid Build Coastguard Worker #include <fp16.h>
13*4bdc9457SAndroid Build Coastguard Worker
14*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
15*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/allocator.h>
16*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/log.h>
17*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/operator.h>
18*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/microparams-init.h>
19*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/params.h>
20*4bdc9457SAndroid Build Coastguard Worker
21*4bdc9457SAndroid Build Coastguard Worker
create_unary_elementwise_nc(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,const void * params,size_t params_size,uint32_t datatype_init_flags,enum xnn_operator_type operator_type,xnn_vunary_ukernel_function ukernel,xnn_operator_t * unary_elementwise_op_out)22*4bdc9457SAndroid Build Coastguard Worker static enum xnn_status create_unary_elementwise_nc(
23*4bdc9457SAndroid Build Coastguard Worker size_t channels,
24*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
25*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
26*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
27*4bdc9457SAndroid Build Coastguard Worker const void* params,
28*4bdc9457SAndroid Build Coastguard Worker size_t params_size,
29*4bdc9457SAndroid Build Coastguard Worker uint32_t datatype_init_flags,
30*4bdc9457SAndroid Build Coastguard Worker enum xnn_operator_type operator_type,
31*4bdc9457SAndroid Build Coastguard Worker xnn_vunary_ukernel_function ukernel,
32*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* unary_elementwise_op_out)
33*4bdc9457SAndroid Build Coastguard Worker {
34*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t unary_elementwise_op = NULL;
35*4bdc9457SAndroid Build Coastguard Worker
36*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) == 0) {
37*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to create %s operator: XNNPACK is not initialized",
38*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(operator_type));
39*4bdc9457SAndroid Build Coastguard Worker return xnn_status_uninitialized;
40*4bdc9457SAndroid Build Coastguard Worker }
41*4bdc9457SAndroid Build Coastguard Worker
42*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & datatype_init_flags) != datatype_init_flags) {
43*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to create %s operator: operations on data type are not supported",
44*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(operator_type));
45*4bdc9457SAndroid Build Coastguard Worker return xnn_status_unsupported_hardware;
46*4bdc9457SAndroid Build Coastguard Worker }
47*4bdc9457SAndroid Build Coastguard Worker
48*4bdc9457SAndroid Build Coastguard Worker if (channels == 0) {
49*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
50*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %zu channels: number of channels must be non-zero",
51*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(operator_type), channels);
52*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
53*4bdc9457SAndroid Build Coastguard Worker }
54*4bdc9457SAndroid Build Coastguard Worker
55*4bdc9457SAndroid Build Coastguard Worker if (input_stride < channels) {
56*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
57*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with input element stride of %zu: "
58*4bdc9457SAndroid Build Coastguard Worker "stride must be at least as large as the number of channels (%zu)",
59*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(operator_type), input_stride, channels);
60*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
61*4bdc9457SAndroid Build Coastguard Worker }
62*4bdc9457SAndroid Build Coastguard Worker
63*4bdc9457SAndroid Build Coastguard Worker if (output_stride < channels) {
64*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
65*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with output element stride of %zu: "
66*4bdc9457SAndroid Build Coastguard Worker "stride must be at least as large as the number of channels (%zu)",
67*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(operator_type), output_stride, channels);
68*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
69*4bdc9457SAndroid Build Coastguard Worker }
70*4bdc9457SAndroid Build Coastguard Worker
71*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op = xnn_allocate_zero_simd_memory(sizeof(struct xnn_operator));
72*4bdc9457SAndroid Build Coastguard Worker if (unary_elementwise_op == NULL) {
73*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
74*4bdc9457SAndroid Build Coastguard Worker "failed to allocate %zu bytes for %s operator descriptor",
75*4bdc9457SAndroid Build Coastguard Worker sizeof(struct xnn_operator), xnn_operator_type_to_string(operator_type));
76*4bdc9457SAndroid Build Coastguard Worker return xnn_status_out_of_memory;
77*4bdc9457SAndroid Build Coastguard Worker }
78*4bdc9457SAndroid Build Coastguard Worker
79*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->channels = channels;
80*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->input_pixel_stride = input_stride;
81*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->output_pixel_stride = output_stride;
82*4bdc9457SAndroid Build Coastguard Worker if (params_size != 0) {
83*4bdc9457SAndroid Build Coastguard Worker memcpy(&unary_elementwise_op->params, params, params_size);
84*4bdc9457SAndroid Build Coastguard Worker }
85*4bdc9457SAndroid Build Coastguard Worker
86*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->ukernel.vunary.function = ukernel;
87*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->type = operator_type;
88*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->flags = flags;
89*4bdc9457SAndroid Build Coastguard Worker
90*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->state = xnn_run_state_invalid;
91*4bdc9457SAndroid Build Coastguard Worker
92*4bdc9457SAndroid Build Coastguard Worker *unary_elementwise_op_out = unary_elementwise_op;
93*4bdc9457SAndroid Build Coastguard Worker return xnn_status_success;
94*4bdc9457SAndroid Build Coastguard Worker }
95*4bdc9457SAndroid Build Coastguard Worker
setup_unary_elementwise_nc(xnn_operator_t unary_elementwise_op,enum xnn_operator_type expected_operator_type,size_t batch_size,const void * input,void * output,uint32_t log2_input_size,uint32_t log2_output_size,const void * params,size_t params_size,size_t num_threads)96*4bdc9457SAndroid Build Coastguard Worker static enum xnn_status setup_unary_elementwise_nc(
97*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t unary_elementwise_op,
98*4bdc9457SAndroid Build Coastguard Worker enum xnn_operator_type expected_operator_type,
99*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
100*4bdc9457SAndroid Build Coastguard Worker const void* input,
101*4bdc9457SAndroid Build Coastguard Worker void* output,
102*4bdc9457SAndroid Build Coastguard Worker uint32_t log2_input_size,
103*4bdc9457SAndroid Build Coastguard Worker uint32_t log2_output_size,
104*4bdc9457SAndroid Build Coastguard Worker const void* params,
105*4bdc9457SAndroid Build Coastguard Worker size_t params_size,
106*4bdc9457SAndroid Build Coastguard Worker size_t num_threads)
107*4bdc9457SAndroid Build Coastguard Worker {
108*4bdc9457SAndroid Build Coastguard Worker if (unary_elementwise_op->type != expected_operator_type) {
109*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to setup operator: operator type mismatch (expected %s, got %s)",
110*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(expected_operator_type),
111*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(unary_elementwise_op->type));
112*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
113*4bdc9457SAndroid Build Coastguard Worker }
114*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->state = xnn_run_state_invalid;
115*4bdc9457SAndroid Build Coastguard Worker
116*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) == 0) {
117*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to setup %s operator: XNNPACK is not initialized",
118*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(unary_elementwise_op->type));
119*4bdc9457SAndroid Build Coastguard Worker return xnn_status_uninitialized;
120*4bdc9457SAndroid Build Coastguard Worker }
121*4bdc9457SAndroid Build Coastguard Worker
122*4bdc9457SAndroid Build Coastguard Worker if (batch_size == 0) {
123*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->state = xnn_run_state_skip;
124*4bdc9457SAndroid Build Coastguard Worker return xnn_status_success;
125*4bdc9457SAndroid Build Coastguard Worker }
126*4bdc9457SAndroid Build Coastguard Worker
127*4bdc9457SAndroid Build Coastguard Worker const size_t channels = unary_elementwise_op->channels;
128*4bdc9457SAndroid Build Coastguard Worker const size_t input_stride = unary_elementwise_op->input_pixel_stride;
129*4bdc9457SAndroid Build Coastguard Worker const size_t output_stride = unary_elementwise_op->output_pixel_stride;
130*4bdc9457SAndroid Build Coastguard Worker
131*4bdc9457SAndroid Build Coastguard Worker xnn_vunary_ukernel_function ukernel = unary_elementwise_op->ukernel.vunary.function;
132*4bdc9457SAndroid Build Coastguard Worker
133*4bdc9457SAndroid Build Coastguard Worker if ((((input_stride ^ channels) | (output_stride ^ channels)) == 0) || batch_size == 1) {
134*4bdc9457SAndroid Build Coastguard Worker const size_t block_size = 4096;
135*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->context.univector_contiguous = (struct univector_contiguous_context) {
136*4bdc9457SAndroid Build Coastguard Worker .x = input,
137*4bdc9457SAndroid Build Coastguard Worker .y = output,
138*4bdc9457SAndroid Build Coastguard Worker .log2_xsize = log2_input_size,
139*4bdc9457SAndroid Build Coastguard Worker .log2_ysize = log2_output_size,
140*4bdc9457SAndroid Build Coastguard Worker .ukernel = ukernel,
141*4bdc9457SAndroid Build Coastguard Worker };
142*4bdc9457SAndroid Build Coastguard Worker if (params_size != 0) {
143*4bdc9457SAndroid Build Coastguard Worker memcpy(&unary_elementwise_op->context.univector_contiguous.params, params, params_size);
144*4bdc9457SAndroid Build Coastguard Worker }
145*4bdc9457SAndroid Build Coastguard Worker
146*4bdc9457SAndroid Build Coastguard Worker const size_t range = (batch_size * channels) << log2_input_size;
147*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.type = xnn_parallelization_type_1d_tile_1d;
148*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.task_1d_tile_1d = (pthreadpool_task_1d_tile_1d_t) xnn_compute_univector_contiguous;
149*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.range[0] = range;
150*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.tile[0] = (num_threads == 1) ? range : block_size;
151*4bdc9457SAndroid Build Coastguard Worker } else {
152*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->context.univector_strided = (struct univector_strided_context) {
153*4bdc9457SAndroid Build Coastguard Worker .n = channels << log2_input_size,
154*4bdc9457SAndroid Build Coastguard Worker .x = input,
155*4bdc9457SAndroid Build Coastguard Worker .x_stride = input_stride << log2_input_size,
156*4bdc9457SAndroid Build Coastguard Worker .y = output,
157*4bdc9457SAndroid Build Coastguard Worker .y_stride = output_stride << log2_output_size,
158*4bdc9457SAndroid Build Coastguard Worker .ukernel = ukernel,
159*4bdc9457SAndroid Build Coastguard Worker };
160*4bdc9457SAndroid Build Coastguard Worker if (params_size != 0) {
161*4bdc9457SAndroid Build Coastguard Worker memcpy(&unary_elementwise_op->context.univector_strided.params, params, params_size);
162*4bdc9457SAndroid Build Coastguard Worker }
163*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.type = xnn_parallelization_type_1d_tile_1d;
164*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.task_1d_tile_1d = (pthreadpool_task_1d_tile_1d_t) xnn_compute_univector_strided;
165*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.range[0] = batch_size;
166*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->compute.tile[0] = (num_threads == 1) ? batch_size : 1;
167*4bdc9457SAndroid Build Coastguard Worker }
168*4bdc9457SAndroid Build Coastguard Worker unary_elementwise_op->state = xnn_run_state_ready;
169*4bdc9457SAndroid Build Coastguard Worker
170*4bdc9457SAndroid Build Coastguard Worker return xnn_status_success;
171*4bdc9457SAndroid Build Coastguard Worker }
172*4bdc9457SAndroid Build Coastguard Worker
xnn_create_clamp_nc_f16(size_t channels,size_t input_stride,size_t output_stride,float output_min,float output_max,uint32_t flags,xnn_operator_t * clamp_op_out)173*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_clamp_nc_f16(
174*4bdc9457SAndroid Build Coastguard Worker size_t channels,
175*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
176*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
177*4bdc9457SAndroid Build Coastguard Worker float output_min,
178*4bdc9457SAndroid Build Coastguard Worker float output_max,
179*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
180*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* clamp_op_out)
181*4bdc9457SAndroid Build Coastguard Worker {
182*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & XNN_INIT_FLAG_XNNPACK) == 0) {
183*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to create %s operator: XNNPACK is not initialized",
184*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f16));
185*4bdc9457SAndroid Build Coastguard Worker return xnn_status_uninitialized;
186*4bdc9457SAndroid Build Coastguard Worker }
187*4bdc9457SAndroid Build Coastguard Worker
188*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & XNN_INIT_FLAG_F16) != XNN_INIT_FLAG_F16) {
189*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to create %s operator: operations on data type are not supported",
190*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f16));
191*4bdc9457SAndroid Build Coastguard Worker return xnn_status_unsupported_hardware;
192*4bdc9457SAndroid Build Coastguard Worker }
193*4bdc9457SAndroid Build Coastguard Worker
194*4bdc9457SAndroid Build Coastguard Worker if (isnan(output_min)) {
195*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
196*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with NaN output lower bound: lower bound must be non-NaN",
197*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f16));
198*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
199*4bdc9457SAndroid Build Coastguard Worker }
200*4bdc9457SAndroid Build Coastguard Worker
201*4bdc9457SAndroid Build Coastguard Worker if (isnan(output_max)) {
202*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
203*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with NaN output upper bound: upper bound must be non-NaN",
204*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f16));
205*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
206*4bdc9457SAndroid Build Coastguard Worker }
207*4bdc9457SAndroid Build Coastguard Worker
208*4bdc9457SAndroid Build Coastguard Worker const uint16_t output_min_as_half = fp16_ieee_from_fp32_value(output_min);
209*4bdc9457SAndroid Build Coastguard Worker const uint16_t output_max_as_half = fp16_ieee_from_fp32_value(output_max);
210*4bdc9457SAndroid Build Coastguard Worker output_min = fp16_ieee_to_fp32_value(output_min_as_half);
211*4bdc9457SAndroid Build Coastguard Worker output_max = fp16_ieee_to_fp32_value(output_max_as_half);
212*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
213*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
214*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%.7g, %.7g] output range: lower bound must be below upper bound",
215*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f16), output_min, output_max);
216*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
217*4bdc9457SAndroid Build Coastguard Worker }
218*4bdc9457SAndroid Build Coastguard Worker
219*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_minmax_params params;
220*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.clamp.init.f16_minmax != NULL) {
221*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.clamp.init.f16_minmax(¶ms, output_min_as_half, output_max_as_half);
222*4bdc9457SAndroid Build Coastguard Worker }
223*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
224*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
225*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
226*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_clamp_nc_f16,
227*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.clamp.ukernel,
228*4bdc9457SAndroid Build Coastguard Worker clamp_op_out);
229*4bdc9457SAndroid Build Coastguard Worker }
230*4bdc9457SAndroid Build Coastguard Worker
xnn_create_clamp_nc_f32(size_t channels,size_t input_stride,size_t output_stride,float output_min,float output_max,uint32_t flags,xnn_operator_t * clamp_op_out)231*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_clamp_nc_f32(
232*4bdc9457SAndroid Build Coastguard Worker size_t channels,
233*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
234*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
235*4bdc9457SAndroid Build Coastguard Worker float output_min,
236*4bdc9457SAndroid Build Coastguard Worker float output_max,
237*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
238*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* clamp_op_out)
239*4bdc9457SAndroid Build Coastguard Worker {
240*4bdc9457SAndroid Build Coastguard Worker if (isnan(output_min)) {
241*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
242*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with NaN output lower bound: lower bound must be non-NaN",
243*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f32));
244*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
245*4bdc9457SAndroid Build Coastguard Worker }
246*4bdc9457SAndroid Build Coastguard Worker
247*4bdc9457SAndroid Build Coastguard Worker if (isnan(output_max)) {
248*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
249*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with NaN output upper bound: upper bound must be non-NaN",
250*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f32));
251*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
252*4bdc9457SAndroid Build Coastguard Worker }
253*4bdc9457SAndroid Build Coastguard Worker
254*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
255*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
256*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%.7g, %.7g] output range: lower bound must be below upper bound",
257*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_f32), output_min, output_max);
258*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
259*4bdc9457SAndroid Build Coastguard Worker }
260*4bdc9457SAndroid Build Coastguard Worker
261*4bdc9457SAndroid Build Coastguard Worker const bool relu_activation = (output_max == INFINITY) && (output_min == 0.0f);
262*4bdc9457SAndroid Build Coastguard Worker xnn_vunary_ukernel_function clamp_ukernel = xnn_params.f32.clamp.ukernel;
263*4bdc9457SAndroid Build Coastguard Worker if (relu_activation && xnn_params.f32.relu.ukernel != NULL) {
264*4bdc9457SAndroid Build Coastguard Worker clamp_ukernel = xnn_params.f32.relu.ukernel;
265*4bdc9457SAndroid Build Coastguard Worker }
266*4bdc9457SAndroid Build Coastguard Worker
267*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_minmax_params params;
268*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.clamp.init.f32_minmax != NULL) {
269*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.clamp.init.f32_minmax(¶ms, output_min, output_max);
270*4bdc9457SAndroid Build Coastguard Worker }
271*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
272*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
273*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
274*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_clamp_nc_f32,
275*4bdc9457SAndroid Build Coastguard Worker clamp_ukernel,
276*4bdc9457SAndroid Build Coastguard Worker clamp_op_out);
277*4bdc9457SAndroid Build Coastguard Worker }
278*4bdc9457SAndroid Build Coastguard Worker
xnn_create_clamp_nc_s8(size_t channels,size_t input_stride,size_t output_stride,int8_t output_min,int8_t output_max,uint32_t flags,xnn_operator_t * clamp_op_out)279*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_clamp_nc_s8(
280*4bdc9457SAndroid Build Coastguard Worker size_t channels,
281*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
282*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
283*4bdc9457SAndroid Build Coastguard Worker int8_t output_min,
284*4bdc9457SAndroid Build Coastguard Worker int8_t output_max,
285*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
286*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* clamp_op_out)
287*4bdc9457SAndroid Build Coastguard Worker {
288*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
289*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
290*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%" PRId8 ", %" PRId8 "] output range: range min must be below range max",
291*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_s8), output_min, output_max);
292*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
293*4bdc9457SAndroid Build Coastguard Worker }
294*4bdc9457SAndroid Build Coastguard Worker
295*4bdc9457SAndroid Build Coastguard Worker union xnn_s8_minmax_params params;
296*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.s8.clamp.init.s8_minmax != NULL) {
297*4bdc9457SAndroid Build Coastguard Worker xnn_params.s8.clamp.init.s8_minmax(¶ms, output_min, output_max);
298*4bdc9457SAndroid Build Coastguard Worker }
299*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
300*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
301*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_S8,
302*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_clamp_nc_s8,
303*4bdc9457SAndroid Build Coastguard Worker xnn_params.s8.clamp.ukernel,
304*4bdc9457SAndroid Build Coastguard Worker clamp_op_out);
305*4bdc9457SAndroid Build Coastguard Worker }
306*4bdc9457SAndroid Build Coastguard Worker
xnn_create_clamp_nc_u8(size_t channels,size_t input_stride,size_t output_stride,uint8_t output_min,uint8_t output_max,uint32_t flags,xnn_operator_t * clamp_op_out)307*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_clamp_nc_u8(
308*4bdc9457SAndroid Build Coastguard Worker size_t channels,
309*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
310*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
311*4bdc9457SAndroid Build Coastguard Worker uint8_t output_min,
312*4bdc9457SAndroid Build Coastguard Worker uint8_t output_max,
313*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
314*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* clamp_op_out)
315*4bdc9457SAndroid Build Coastguard Worker {
316*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
317*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
318*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%" PRIu8 ", %" PRIu8 "] output range: range min must be below range max",
319*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_clamp_nc_u8), output_min, output_max);
320*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
321*4bdc9457SAndroid Build Coastguard Worker }
322*4bdc9457SAndroid Build Coastguard Worker
323*4bdc9457SAndroid Build Coastguard Worker union xnn_u8_minmax_params params;
324*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.u8.clamp.init.u8_minmax != NULL) {
325*4bdc9457SAndroid Build Coastguard Worker xnn_params.u8.clamp.init.u8_minmax(¶ms, output_min, output_max);
326*4bdc9457SAndroid Build Coastguard Worker }
327*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
328*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
329*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_U8,
330*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_clamp_nc_u8,
331*4bdc9457SAndroid Build Coastguard Worker xnn_params.u8.clamp.ukernel,
332*4bdc9457SAndroid Build Coastguard Worker clamp_op_out);
333*4bdc9457SAndroid Build Coastguard Worker }
334*4bdc9457SAndroid Build Coastguard Worker
xnn_create_abs_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * abs_op_out)335*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_abs_nc_f16(
336*4bdc9457SAndroid Build Coastguard Worker size_t channels,
337*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
338*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
339*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
340*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* abs_op_out)
341*4bdc9457SAndroid Build Coastguard Worker {
342*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_abs_params params;
343*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.abs.init.f16_abs != NULL) {
344*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.abs.init.f16_abs(¶ms);
345*4bdc9457SAndroid Build Coastguard Worker }
346*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
347*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
348*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
349*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_abs_nc_f16,
350*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.abs.ukernel,
351*4bdc9457SAndroid Build Coastguard Worker abs_op_out);
352*4bdc9457SAndroid Build Coastguard Worker }
353*4bdc9457SAndroid Build Coastguard Worker
xnn_create_abs_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * abs_op_out)354*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_abs_nc_f32(
355*4bdc9457SAndroid Build Coastguard Worker size_t channels,
356*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
357*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
358*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
359*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* abs_op_out)
360*4bdc9457SAndroid Build Coastguard Worker {
361*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_abs_params params;
362*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.abs.init.f32_abs != NULL) {
363*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.abs.init.f32_abs(¶ms);
364*4bdc9457SAndroid Build Coastguard Worker }
365*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
366*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
367*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
368*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_abs_nc_f32,
369*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.abs.ukernel,
370*4bdc9457SAndroid Build Coastguard Worker abs_op_out);
371*4bdc9457SAndroid Build Coastguard Worker }
372*4bdc9457SAndroid Build Coastguard Worker
xnn_create_bankers_rounding_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * rounding_op_out)373*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_bankers_rounding_nc_f16(
374*4bdc9457SAndroid Build Coastguard Worker size_t channels,
375*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
376*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
377*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
378*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* rounding_op_out)
379*4bdc9457SAndroid Build Coastguard Worker {
380*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
381*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
382*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
383*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_bankers_rounding_nc_f16,
384*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.rndne.ukernel,
385*4bdc9457SAndroid Build Coastguard Worker rounding_op_out);
386*4bdc9457SAndroid Build Coastguard Worker }
387*4bdc9457SAndroid Build Coastguard Worker
xnn_create_bankers_rounding_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * rounding_op_out)388*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_bankers_rounding_nc_f32(
389*4bdc9457SAndroid Build Coastguard Worker size_t channels,
390*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
391*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
392*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
393*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* rounding_op_out)
394*4bdc9457SAndroid Build Coastguard Worker {
395*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_rnd_params params;
396*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.rndne.init.f32_rnd != NULL) {
397*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndne.init.f32_rnd(¶ms);
398*4bdc9457SAndroid Build Coastguard Worker }
399*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
400*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
401*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
402*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_bankers_rounding_nc_f32,
403*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndne.ukernel,
404*4bdc9457SAndroid Build Coastguard Worker rounding_op_out);
405*4bdc9457SAndroid Build Coastguard Worker }
406*4bdc9457SAndroid Build Coastguard Worker
xnn_create_ceiling_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * ceiling_op_out)407*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_ceiling_nc_f16(
408*4bdc9457SAndroid Build Coastguard Worker size_t channels,
409*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
410*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
411*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
412*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* ceiling_op_out)
413*4bdc9457SAndroid Build Coastguard Worker {
414*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
415*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
416*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
417*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_ceiling_nc_f16,
418*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.rndu.ukernel,
419*4bdc9457SAndroid Build Coastguard Worker ceiling_op_out);
420*4bdc9457SAndroid Build Coastguard Worker }
421*4bdc9457SAndroid Build Coastguard Worker
xnn_create_ceiling_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * ceiling_op_out)422*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_ceiling_nc_f32(
423*4bdc9457SAndroid Build Coastguard Worker size_t channels,
424*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
425*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
426*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
427*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* ceiling_op_out)
428*4bdc9457SAndroid Build Coastguard Worker {
429*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_rnd_params params;
430*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.rndu.init.f32_rnd != NULL) {
431*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndu.init.f32_rnd(¶ms);
432*4bdc9457SAndroid Build Coastguard Worker }
433*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
434*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
435*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
436*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_ceiling_nc_f32,
437*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndu.ukernel,
438*4bdc9457SAndroid Build Coastguard Worker ceiling_op_out);
439*4bdc9457SAndroid Build Coastguard Worker }
440*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_f16_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * convert_op_out)441*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_f16_f32(
442*4bdc9457SAndroid Build Coastguard Worker size_t channels,
443*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
444*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
445*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
446*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
447*4bdc9457SAndroid Build Coastguard Worker {
448*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_f32_cvt_params params;
449*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.f16_to_f32.init.f16_f32_cvt != NULL) {
450*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f16_to_f32.init.f16_f32_cvt(¶ms);
451*4bdc9457SAndroid Build Coastguard Worker }
452*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
453*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
454*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
455*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_f16_f32,
456*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f16_to_f32.ukernel,
457*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
458*4bdc9457SAndroid Build Coastguard Worker }
459*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_f32_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * convert_op_out)460*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_f32_f16(
461*4bdc9457SAndroid Build Coastguard Worker size_t channels,
462*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
463*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
464*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
465*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
466*4bdc9457SAndroid Build Coastguard Worker {
467*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_f16_cvt_params params;
468*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.f32_to_f16.init.f32_f16_cvt != NULL) {
469*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_f16.init.f32_f16_cvt(¶ms);
470*4bdc9457SAndroid Build Coastguard Worker }
471*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
472*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
473*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
474*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_f32_f16,
475*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_f16.ukernel,
476*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
477*4bdc9457SAndroid Build Coastguard Worker }
478*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_f32_qs8(size_t channels,size_t input_stride,size_t output_stride,float output_scale,int8_t output_zero_point,int8_t output_min,int8_t output_max,uint32_t flags,xnn_operator_t * convert_op_out)479*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_f32_qs8(
480*4bdc9457SAndroid Build Coastguard Worker size_t channels,
481*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
482*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
483*4bdc9457SAndroid Build Coastguard Worker float output_scale,
484*4bdc9457SAndroid Build Coastguard Worker int8_t output_zero_point,
485*4bdc9457SAndroid Build Coastguard Worker int8_t output_min,
486*4bdc9457SAndroid Build Coastguard Worker int8_t output_max,
487*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
488*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
489*4bdc9457SAndroid Build Coastguard Worker {
490*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
491*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
492*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g output scale parameter: scale must be finite, normalized, and positive",
493*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_f32_qs8), output_scale);
494*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
495*4bdc9457SAndroid Build Coastguard Worker }
496*4bdc9457SAndroid Build Coastguard Worker
497*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
498*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
499*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%" PRId8 ", %" PRId8 "] output range: range min must be below range max",
500*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_f32_qs8), output_min, output_max);
501*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
502*4bdc9457SAndroid Build Coastguard Worker }
503*4bdc9457SAndroid Build Coastguard Worker
504*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_qs8_cvt_params params;
505*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.f32_to_qs8.init.f32_qs8_cvt != NULL) {
506*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_qs8.init.f32_qs8_cvt(¶ms, 1.0f / output_scale, output_zero_point, output_min, output_max);
507*4bdc9457SAndroid Build Coastguard Worker }
508*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
509*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
510*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
511*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_f32_qs8,
512*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_qs8.ukernel,
513*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
514*4bdc9457SAndroid Build Coastguard Worker }
515*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_f32_qu8(size_t channels,size_t input_stride,size_t output_stride,float output_scale,uint8_t output_zero_point,uint8_t output_min,uint8_t output_max,uint32_t flags,xnn_operator_t * convert_op_out)516*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_f32_qu8(
517*4bdc9457SAndroid Build Coastguard Worker size_t channels,
518*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
519*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
520*4bdc9457SAndroid Build Coastguard Worker float output_scale,
521*4bdc9457SAndroid Build Coastguard Worker uint8_t output_zero_point,
522*4bdc9457SAndroid Build Coastguard Worker uint8_t output_min,
523*4bdc9457SAndroid Build Coastguard Worker uint8_t output_max,
524*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
525*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
526*4bdc9457SAndroid Build Coastguard Worker {
527*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
528*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
529*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g output scale parameter: scale must be finite, normalized, and positive",
530*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_f32_qu8), output_scale);
531*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
532*4bdc9457SAndroid Build Coastguard Worker }
533*4bdc9457SAndroid Build Coastguard Worker
534*4bdc9457SAndroid Build Coastguard Worker if (output_min >= output_max) {
535*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
536*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with [%" PRIu8 ", %" PRIu8 "] output range: range min must be below range max",
537*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_f32_qu8), output_min, output_max);
538*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
539*4bdc9457SAndroid Build Coastguard Worker }
540*4bdc9457SAndroid Build Coastguard Worker
541*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_qu8_cvt_params params;
542*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.f32_to_qu8.init.f32_qu8_cvt != NULL) {
543*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_qu8.init.f32_qu8_cvt(¶ms, 1.0f / output_scale, output_zero_point, output_min, output_max);
544*4bdc9457SAndroid Build Coastguard Worker }
545*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
546*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
547*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
548*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_f32_qu8,
549*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.f32_to_qu8.ukernel,
550*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
551*4bdc9457SAndroid Build Coastguard Worker }
552*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_qs8(size_t channels,size_t input_stride,size_t output_stride,float input_scale,int8_t input_zero_point,float output_scale,int8_t output_zero_point,uint32_t flags,xnn_operator_t * convert_op_out)553*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_qs8(
554*4bdc9457SAndroid Build Coastguard Worker size_t channels,
555*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
556*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
557*4bdc9457SAndroid Build Coastguard Worker float input_scale,
558*4bdc9457SAndroid Build Coastguard Worker int8_t input_zero_point,
559*4bdc9457SAndroid Build Coastguard Worker float output_scale,
560*4bdc9457SAndroid Build Coastguard Worker int8_t output_zero_point,
561*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
562*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
563*4bdc9457SAndroid Build Coastguard Worker {
564*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
565*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
566*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
567*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qs8), input_scale);
568*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
569*4bdc9457SAndroid Build Coastguard Worker }
570*4bdc9457SAndroid Build Coastguard Worker
571*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
572*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
573*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
574*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qs8), output_scale);
575*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
576*4bdc9457SAndroid Build Coastguard Worker }
577*4bdc9457SAndroid Build Coastguard Worker
578*4bdc9457SAndroid Build Coastguard Worker const float input_output_scale = input_scale / output_scale;
579*4bdc9457SAndroid Build Coastguard Worker if (input_output_scale < 0x1.0p-8f || input_output_scale > 0x1.0p+7f) {
580*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
581*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input-to-output scale ratio: scale ratio must be in [2**-8, 2**7] range",
582*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qs8), input_output_scale);
583*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
584*4bdc9457SAndroid Build Coastguard Worker }
585*4bdc9457SAndroid Build Coastguard Worker
586*4bdc9457SAndroid Build Coastguard Worker union xnn_qs8_cvt_params params;
587*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.qs8.init.qs8_cvt != NULL) {
588*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qs8.init.qs8_cvt(¶ms, input_output_scale, input_zero_point, output_zero_point);
589*4bdc9457SAndroid Build Coastguard Worker }
590*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
591*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
592*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
593*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_qs8,
594*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qs8.ukernel,
595*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
596*4bdc9457SAndroid Build Coastguard Worker }
597*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_qs8_f32(size_t channels,size_t input_stride,size_t output_stride,float input_scale,int8_t input_zero_point,uint32_t flags,xnn_operator_t * convert_op_out)598*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_qs8_f32(
599*4bdc9457SAndroid Build Coastguard Worker size_t channels,
600*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
601*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
602*4bdc9457SAndroid Build Coastguard Worker float input_scale,
603*4bdc9457SAndroid Build Coastguard Worker int8_t input_zero_point,
604*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
605*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
606*4bdc9457SAndroid Build Coastguard Worker {
607*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
608*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
609*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
610*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qs8_f32), input_scale);
611*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
612*4bdc9457SAndroid Build Coastguard Worker }
613*4bdc9457SAndroid Build Coastguard Worker
614*4bdc9457SAndroid Build Coastguard Worker union xnn_qs8_f32_cvt_params params;
615*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.qs8_to_f32.init.qs8_f32_cvt != NULL) {
616*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qs8_to_f32.init.qs8_f32_cvt(¶ms, input_scale, input_zero_point);
617*4bdc9457SAndroid Build Coastguard Worker }
618*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
619*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
620*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
621*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_qs8_f32,
622*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qs8_to_f32.ukernel,
623*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
624*4bdc9457SAndroid Build Coastguard Worker }
625*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_qu8(size_t channels,size_t input_stride,size_t output_stride,float input_scale,uint8_t input_zero_point,float output_scale,uint8_t output_zero_point,uint32_t flags,xnn_operator_t * convert_op_out)626*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_qu8(
627*4bdc9457SAndroid Build Coastguard Worker size_t channels,
628*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
629*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
630*4bdc9457SAndroid Build Coastguard Worker float input_scale,
631*4bdc9457SAndroid Build Coastguard Worker uint8_t input_zero_point,
632*4bdc9457SAndroid Build Coastguard Worker float output_scale,
633*4bdc9457SAndroid Build Coastguard Worker uint8_t output_zero_point,
634*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
635*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
636*4bdc9457SAndroid Build Coastguard Worker {
637*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
638*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
639*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
640*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qu8), input_scale);
641*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
642*4bdc9457SAndroid Build Coastguard Worker }
643*4bdc9457SAndroid Build Coastguard Worker
644*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
645*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
646*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
647*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qu8), output_scale);
648*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
649*4bdc9457SAndroid Build Coastguard Worker }
650*4bdc9457SAndroid Build Coastguard Worker
651*4bdc9457SAndroid Build Coastguard Worker const float input_output_scale = input_scale / output_scale;
652*4bdc9457SAndroid Build Coastguard Worker if (input_output_scale < 0x1.0p-8f || input_output_scale > 0x1.0p+7f) {
653*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
654*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input-to-output scale ratio: scale ratio must be in [2**-8, 2**7] range",
655*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qu8), input_output_scale);
656*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
657*4bdc9457SAndroid Build Coastguard Worker }
658*4bdc9457SAndroid Build Coastguard Worker
659*4bdc9457SAndroid Build Coastguard Worker union xnn_qu8_cvt_params params;
660*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.qu8.init.qu8_cvt != NULL) {
661*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qu8.init.qu8_cvt(¶ms, input_output_scale, input_zero_point, output_zero_point);
662*4bdc9457SAndroid Build Coastguard Worker }
663*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
664*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
665*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
666*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_qu8,
667*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qu8.ukernel,
668*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
669*4bdc9457SAndroid Build Coastguard Worker }
670*4bdc9457SAndroid Build Coastguard Worker
xnn_create_convert_nc_qu8_f32(size_t channels,size_t input_stride,size_t output_stride,float input_scale,uint8_t input_zero_point,uint32_t flags,xnn_operator_t * convert_op_out)671*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_convert_nc_qu8_f32(
672*4bdc9457SAndroid Build Coastguard Worker size_t channels,
673*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
674*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
675*4bdc9457SAndroid Build Coastguard Worker float input_scale,
676*4bdc9457SAndroid Build Coastguard Worker uint8_t input_zero_point,
677*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
678*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* convert_op_out)
679*4bdc9457SAndroid Build Coastguard Worker {
680*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
681*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
682*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
683*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_convert_nc_qu8_f32), input_scale);
684*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
685*4bdc9457SAndroid Build Coastguard Worker }
686*4bdc9457SAndroid Build Coastguard Worker
687*4bdc9457SAndroid Build Coastguard Worker union xnn_qu8_f32_cvt_params params;
688*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.vcvt.qu8_to_f32.init.qu8_f32_cvt != NULL) {
689*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qu8_to_f32.init.qu8_f32_cvt(¶ms, input_scale, input_zero_point);
690*4bdc9457SAndroid Build Coastguard Worker }
691*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
692*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
693*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_VCVT,
694*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_convert_nc_qu8_f32,
695*4bdc9457SAndroid Build Coastguard Worker xnn_params.vcvt.qu8_to_f32.ukernel,
696*4bdc9457SAndroid Build Coastguard Worker convert_op_out);
697*4bdc9457SAndroid Build Coastguard Worker }
698*4bdc9457SAndroid Build Coastguard Worker
xnn_create_copy_nc_x8(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * copy_op_out)699*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_copy_nc_x8(
700*4bdc9457SAndroid Build Coastguard Worker size_t channels,
701*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
702*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
703*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
704*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* copy_op_out)
705*4bdc9457SAndroid Build Coastguard Worker {
706*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
707*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
708*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_X8,
709*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_copy_nc_x8,
710*4bdc9457SAndroid Build Coastguard Worker xnn_params.xx.copy,
711*4bdc9457SAndroid Build Coastguard Worker copy_op_out);
712*4bdc9457SAndroid Build Coastguard Worker }
713*4bdc9457SAndroid Build Coastguard Worker
xnn_create_copy_nc_x16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * copy_op_out)714*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_copy_nc_x16(
715*4bdc9457SAndroid Build Coastguard Worker size_t channels,
716*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
717*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
718*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
719*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* copy_op_out)
720*4bdc9457SAndroid Build Coastguard Worker {
721*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
722*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
723*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_X16,
724*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_copy_nc_x16,
725*4bdc9457SAndroid Build Coastguard Worker xnn_params.xx.copy,
726*4bdc9457SAndroid Build Coastguard Worker copy_op_out);
727*4bdc9457SAndroid Build Coastguard Worker }
728*4bdc9457SAndroid Build Coastguard Worker
xnn_create_copy_nc_x32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * copy_op_out)729*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_copy_nc_x32(
730*4bdc9457SAndroid Build Coastguard Worker size_t channels,
731*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
732*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
733*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
734*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* copy_op_out)
735*4bdc9457SAndroid Build Coastguard Worker {
736*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
737*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
738*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_X32,
739*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_copy_nc_x32,
740*4bdc9457SAndroid Build Coastguard Worker xnn_params.xx.copy,
741*4bdc9457SAndroid Build Coastguard Worker copy_op_out);
742*4bdc9457SAndroid Build Coastguard Worker }
743*4bdc9457SAndroid Build Coastguard Worker
xnn_create_elu_nc_f16(size_t channels,size_t input_stride,size_t output_stride,float alpha,uint32_t flags,xnn_operator_t * elu_op_out)744*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_elu_nc_f16(
745*4bdc9457SAndroid Build Coastguard Worker size_t channels,
746*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
747*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
748*4bdc9457SAndroid Build Coastguard Worker float alpha,
749*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
750*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* elu_op_out)
751*4bdc9457SAndroid Build Coastguard Worker {
752*4bdc9457SAndroid Build Coastguard Worker const uint16_t alpha_as_half = fp16_ieee_from_fp32_value(alpha);
753*4bdc9457SAndroid Build Coastguard Worker alpha = fp16_ieee_to_fp32_value(alpha_as_half);
754*4bdc9457SAndroid Build Coastguard Worker if (alpha <= 0.0f || !isnormal(alpha)) {
755*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
756*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g alpha parameter: alpha must be finite, normalized, and positive",
757*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_elu_nc_f16), alpha);
758*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
759*4bdc9457SAndroid Build Coastguard Worker }
760*4bdc9457SAndroid Build Coastguard Worker
761*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_elu_params params;
762*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.elu.init.f16_elu != NULL) {
763*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.elu.init.f16_elu(¶ms,
764*4bdc9457SAndroid Build Coastguard Worker UINT16_C(0x3C00) /* prescale = 1.0h */, alpha_as_half, UINT16_C(0x3C00) /* beta = 1.0h */);
765*4bdc9457SAndroid Build Coastguard Worker }
766*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
767*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
768*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
769*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_elu_nc_f16,
770*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.elu.ukernel,
771*4bdc9457SAndroid Build Coastguard Worker elu_op_out);
772*4bdc9457SAndroid Build Coastguard Worker }
773*4bdc9457SAndroid Build Coastguard Worker
xnn_create_elu_nc_f32(size_t channels,size_t input_stride,size_t output_stride,float alpha,uint32_t flags,xnn_operator_t * elu_op_out)774*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_elu_nc_f32(
775*4bdc9457SAndroid Build Coastguard Worker size_t channels,
776*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
777*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
778*4bdc9457SAndroid Build Coastguard Worker float alpha,
779*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
780*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* elu_op_out)
781*4bdc9457SAndroid Build Coastguard Worker {
782*4bdc9457SAndroid Build Coastguard Worker if (alpha <= 0.0f || !isnormal(alpha)) {
783*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
784*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g alpha parameter: alpha must be finite, normalized, and positive",
785*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_elu_nc_f32), alpha);
786*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
787*4bdc9457SAndroid Build Coastguard Worker }
788*4bdc9457SAndroid Build Coastguard Worker
789*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_elu_params params;
790*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.elu.init.f32_elu != NULL) {
791*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.elu.init.f32_elu(¶ms, 1.0f /* prescale */, alpha, 1.0f /* beta */);
792*4bdc9457SAndroid Build Coastguard Worker }
793*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
794*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
795*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
796*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_elu_nc_f32,
797*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.elu.ukernel,
798*4bdc9457SAndroid Build Coastguard Worker elu_op_out);
799*4bdc9457SAndroid Build Coastguard Worker }
800*4bdc9457SAndroid Build Coastguard Worker
xnn_create_floor_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * floor_op_out)801*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_floor_nc_f16(
802*4bdc9457SAndroid Build Coastguard Worker size_t channels,
803*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
804*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
805*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
806*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* floor_op_out)
807*4bdc9457SAndroid Build Coastguard Worker {
808*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
809*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
810*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
811*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_floor_nc_f16,
812*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.rndd.ukernel,
813*4bdc9457SAndroid Build Coastguard Worker floor_op_out);
814*4bdc9457SAndroid Build Coastguard Worker }
815*4bdc9457SAndroid Build Coastguard Worker
xnn_create_floor_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * floor_op_out)816*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_floor_nc_f32(
817*4bdc9457SAndroid Build Coastguard Worker size_t channels,
818*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
819*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
820*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
821*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* floor_op_out)
822*4bdc9457SAndroid Build Coastguard Worker {
823*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_rnd_params params;
824*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.rndd.init.f32_rnd != NULL) {
825*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndd.init.f32_rnd(¶ms);
826*4bdc9457SAndroid Build Coastguard Worker }
827*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
828*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
829*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
830*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_floor_nc_f32,
831*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndd.ukernel,
832*4bdc9457SAndroid Build Coastguard Worker floor_op_out);
833*4bdc9457SAndroid Build Coastguard Worker }
834*4bdc9457SAndroid Build Coastguard Worker
xnn_create_hardswish_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * hardswish_op_out)835*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_hardswish_nc_f16(
836*4bdc9457SAndroid Build Coastguard Worker size_t channels,
837*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
838*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
839*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
840*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* hardswish_op_out)
841*4bdc9457SAndroid Build Coastguard Worker {
842*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_hswish_params params;
843*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.hswish.init.f16_hswish != NULL) {
844*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.hswish.init.f16_hswish(¶ms);
845*4bdc9457SAndroid Build Coastguard Worker }
846*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
847*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
848*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
849*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_hardswish_nc_f16,
850*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.hswish.ukernel,
851*4bdc9457SAndroid Build Coastguard Worker hardswish_op_out);
852*4bdc9457SAndroid Build Coastguard Worker }
853*4bdc9457SAndroid Build Coastguard Worker
xnn_create_hardswish_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * hardswish_op_out)854*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_hardswish_nc_f32(
855*4bdc9457SAndroid Build Coastguard Worker size_t channels,
856*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
857*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
858*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
859*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* hardswish_op_out)
860*4bdc9457SAndroid Build Coastguard Worker {
861*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_hswish_params params;
862*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.hswish.init.f32_hswish != NULL) {
863*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.hswish.init.f32_hswish(¶ms);
864*4bdc9457SAndroid Build Coastguard Worker }
865*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
866*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
867*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
868*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_hardswish_nc_f32,
869*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.hswish.ukernel,
870*4bdc9457SAndroid Build Coastguard Worker hardswish_op_out);
871*4bdc9457SAndroid Build Coastguard Worker }
872*4bdc9457SAndroid Build Coastguard Worker
xnn_create_leaky_relu_nc_f16(size_t channels,size_t input_stride,size_t output_stride,float negative_slope,uint32_t flags,xnn_operator_t * leaky_relu_op_out)873*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_leaky_relu_nc_f16(
874*4bdc9457SAndroid Build Coastguard Worker size_t channels,
875*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
876*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
877*4bdc9457SAndroid Build Coastguard Worker float negative_slope,
878*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
879*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* leaky_relu_op_out)
880*4bdc9457SAndroid Build Coastguard Worker {
881*4bdc9457SAndroid Build Coastguard Worker const uint16_t negative_slope_as_half = fp16_ieee_from_fp32_value(negative_slope);
882*4bdc9457SAndroid Build Coastguard Worker negative_slope = fp16_ieee_to_fp32_value(negative_slope_as_half);
883*4bdc9457SAndroid Build Coastguard Worker if (!isfinite(negative_slope)) {
884*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
885*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %f negative slope: finite number expected",
886*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_f32),
887*4bdc9457SAndroid Build Coastguard Worker negative_slope);
888*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
889*4bdc9457SAndroid Build Coastguard Worker }
890*4bdc9457SAndroid Build Coastguard Worker
891*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_lrelu_params params;
892*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.lrelu.init.f16_lrelu != NULL) {
893*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.lrelu.init.f16_lrelu(¶ms, negative_slope_as_half);
894*4bdc9457SAndroid Build Coastguard Worker }
895*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
896*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
897*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
898*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_leaky_relu_nc_f16,
899*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.lrelu.ukernel,
900*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op_out);
901*4bdc9457SAndroid Build Coastguard Worker }
902*4bdc9457SAndroid Build Coastguard Worker
xnn_create_leaky_relu_nc_f32(size_t channels,size_t input_stride,size_t output_stride,float negative_slope,uint32_t flags,xnn_operator_t * leaky_relu_op_out)903*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_leaky_relu_nc_f32(
904*4bdc9457SAndroid Build Coastguard Worker size_t channels,
905*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
906*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
907*4bdc9457SAndroid Build Coastguard Worker float negative_slope,
908*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
909*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* leaky_relu_op_out)
910*4bdc9457SAndroid Build Coastguard Worker {
911*4bdc9457SAndroid Build Coastguard Worker if (!isfinite(negative_slope)) {
912*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
913*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %f negative slope: finite number expected",
914*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_f32),
915*4bdc9457SAndroid Build Coastguard Worker negative_slope);
916*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
917*4bdc9457SAndroid Build Coastguard Worker }
918*4bdc9457SAndroid Build Coastguard Worker
919*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_lrelu_params params;
920*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.lrelu.init.f32_lrelu != NULL) {
921*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.lrelu.init.f32_lrelu(¶ms, negative_slope);
922*4bdc9457SAndroid Build Coastguard Worker }
923*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
924*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
925*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
926*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_leaky_relu_nc_f32,
927*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.lrelu.ukernel,
928*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op_out);
929*4bdc9457SAndroid Build Coastguard Worker }
930*4bdc9457SAndroid Build Coastguard Worker
xnn_create_leaky_relu_nc_qs8(size_t channels,size_t input_stride,size_t output_stride,float negative_slope,int8_t input_zero_point,float input_scale,int8_t output_zero_point,float output_scale,uint32_t flags,xnn_operator_t * leaky_relu_op_out)931*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_leaky_relu_nc_qs8(
932*4bdc9457SAndroid Build Coastguard Worker size_t channels,
933*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
934*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
935*4bdc9457SAndroid Build Coastguard Worker float negative_slope,
936*4bdc9457SAndroid Build Coastguard Worker int8_t input_zero_point,
937*4bdc9457SAndroid Build Coastguard Worker float input_scale,
938*4bdc9457SAndroid Build Coastguard Worker int8_t output_zero_point,
939*4bdc9457SAndroid Build Coastguard Worker float output_scale,
940*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
941*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* leaky_relu_op_out)
942*4bdc9457SAndroid Build Coastguard Worker {
943*4bdc9457SAndroid Build Coastguard Worker if (!isfinite(negative_slope)) {
944*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
945*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %f negative slope: finite number expected",
946*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8),
947*4bdc9457SAndroid Build Coastguard Worker negative_slope);
948*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
949*4bdc9457SAndroid Build Coastguard Worker }
950*4bdc9457SAndroid Build Coastguard Worker
951*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
952*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
953*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
954*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8), input_scale);
955*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
956*4bdc9457SAndroid Build Coastguard Worker }
957*4bdc9457SAndroid Build Coastguard Worker
958*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
959*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
960*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g output scale parameter: scale must be finite, normalized, and positive",
961*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8), input_scale);
962*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
963*4bdc9457SAndroid Build Coastguard Worker }
964*4bdc9457SAndroid Build Coastguard Worker
965*4bdc9457SAndroid Build Coastguard Worker const float positive_input_output_scale = input_scale / output_scale;
966*4bdc9457SAndroid Build Coastguard Worker if (positive_input_output_scale < 0x1.0p-8f || positive_input_output_scale > 0x1.0p+7f) {
967*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
968*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g positive-input-to-output scale ratio: scale ratio must be in [2**-8, 2**7] range",
969*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8), positive_input_output_scale);
970*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
971*4bdc9457SAndroid Build Coastguard Worker }
972*4bdc9457SAndroid Build Coastguard Worker
973*4bdc9457SAndroid Build Coastguard Worker const float negative_input_output_scale = positive_input_output_scale * negative_slope;
974*4bdc9457SAndroid Build Coastguard Worker if (negative_input_output_scale < -0x1.FFFC00p+6f || negative_input_output_scale > 0x1.0p+7f) {
975*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
976*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g negative-input-to-output scale ratio: scale ratio must be in (-2**7, 2**7] range and ",
977*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8), negative_input_output_scale);
978*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
979*4bdc9457SAndroid Build Coastguard Worker }
980*4bdc9457SAndroid Build Coastguard Worker
981*4bdc9457SAndroid Build Coastguard Worker if (fabsf(negative_input_output_scale) < 0x1.0p-8f) {
982*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
983*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g negative-input-to-output scale ratio: scale ratio must be at least 2**-8 in absolute value",
984*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qs8), negative_input_output_scale);
985*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
986*4bdc9457SAndroid Build Coastguard Worker }
987*4bdc9457SAndroid Build Coastguard Worker
988*4bdc9457SAndroid Build Coastguard Worker union xnn_qs8_lrelu_params params;
989*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.qs8.lrelu.init.qs8_lrelu != NULL) {
990*4bdc9457SAndroid Build Coastguard Worker xnn_params.qs8.lrelu.init.qs8_lrelu(¶ms, positive_input_output_scale, negative_input_output_scale, input_zero_point, output_zero_point);
991*4bdc9457SAndroid Build Coastguard Worker }
992*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
993*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
994*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_QS8,
995*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_leaky_relu_nc_qs8,
996*4bdc9457SAndroid Build Coastguard Worker xnn_params.qs8.lrelu.ukernel,
997*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op_out);
998*4bdc9457SAndroid Build Coastguard Worker }
999*4bdc9457SAndroid Build Coastguard Worker
xnn_create_leaky_relu_nc_qu8(size_t channels,size_t input_stride,size_t output_stride,float negative_slope,uint8_t input_zero_point,float input_scale,uint8_t output_zero_point,float output_scale,uint32_t flags,xnn_operator_t * leaky_relu_op_out)1000*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_leaky_relu_nc_qu8(
1001*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1002*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1003*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1004*4bdc9457SAndroid Build Coastguard Worker float negative_slope,
1005*4bdc9457SAndroid Build Coastguard Worker uint8_t input_zero_point,
1006*4bdc9457SAndroid Build Coastguard Worker float input_scale,
1007*4bdc9457SAndroid Build Coastguard Worker uint8_t output_zero_point,
1008*4bdc9457SAndroid Build Coastguard Worker float output_scale,
1009*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1010*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* leaky_relu_op_out)
1011*4bdc9457SAndroid Build Coastguard Worker {
1012*4bdc9457SAndroid Build Coastguard Worker if (!isfinite(negative_slope)) {
1013*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1014*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %f negative slope: finite number expected",
1015*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8),
1016*4bdc9457SAndroid Build Coastguard Worker negative_slope);
1017*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1018*4bdc9457SAndroid Build Coastguard Worker }
1019*4bdc9457SAndroid Build Coastguard Worker
1020*4bdc9457SAndroid Build Coastguard Worker if (input_scale <= 0.0f || !isnormal(input_scale)) {
1021*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1022*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g input scale parameter: scale must be finite, normalized, and positive",
1023*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8), input_scale);
1024*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1025*4bdc9457SAndroid Build Coastguard Worker }
1026*4bdc9457SAndroid Build Coastguard Worker
1027*4bdc9457SAndroid Build Coastguard Worker if (output_scale <= 0.0f || !isnormal(output_scale)) {
1028*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1029*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g output scale parameter: scale must be finite, normalized, and positive",
1030*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8), input_scale);
1031*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1032*4bdc9457SAndroid Build Coastguard Worker }
1033*4bdc9457SAndroid Build Coastguard Worker
1034*4bdc9457SAndroid Build Coastguard Worker const float positive_input_output_scale = input_scale / output_scale;
1035*4bdc9457SAndroid Build Coastguard Worker if (positive_input_output_scale < 0x1.0p-8f || positive_input_output_scale > 0x1.0p+7f) {
1036*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1037*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g positive-input-to-output scale ratio: scale ratio must be in [2**-8, 2**7] range",
1038*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8), positive_input_output_scale);
1039*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1040*4bdc9457SAndroid Build Coastguard Worker }
1041*4bdc9457SAndroid Build Coastguard Worker
1042*4bdc9457SAndroid Build Coastguard Worker const float negative_input_output_scale = positive_input_output_scale * negative_slope;
1043*4bdc9457SAndroid Build Coastguard Worker if (negative_input_output_scale < -0x1.FFFC00p+6f || negative_input_output_scale > 0x1.0p+7f) {
1044*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1045*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g negative-input-to-output scale ratio: scale ratio must be in (-2**7, 2**7] range and ",
1046*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8), negative_input_output_scale);
1047*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1048*4bdc9457SAndroid Build Coastguard Worker }
1049*4bdc9457SAndroid Build Coastguard Worker
1050*4bdc9457SAndroid Build Coastguard Worker if (fabsf(negative_input_output_scale) < 0x1.0p-8f) {
1051*4bdc9457SAndroid Build Coastguard Worker xnn_log_error(
1052*4bdc9457SAndroid Build Coastguard Worker "failed to create %s operator with %.7g negative-input-to-output scale ratio: scale ratio must be at least 2**-8 in absolute value",
1053*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_leaky_relu_nc_qu8), negative_input_output_scale);
1054*4bdc9457SAndroid Build Coastguard Worker return xnn_status_invalid_parameter;
1055*4bdc9457SAndroid Build Coastguard Worker }
1056*4bdc9457SAndroid Build Coastguard Worker
1057*4bdc9457SAndroid Build Coastguard Worker union xnn_qu8_lrelu_params params;
1058*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.qu8.lrelu.init.qu8_lrelu != NULL) {
1059*4bdc9457SAndroid Build Coastguard Worker xnn_params.qu8.lrelu.init.qu8_lrelu(¶ms, positive_input_output_scale, negative_input_output_scale, input_zero_point, output_zero_point);
1060*4bdc9457SAndroid Build Coastguard Worker }
1061*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1062*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1063*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_QU8,
1064*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_leaky_relu_nc_qu8,
1065*4bdc9457SAndroid Build Coastguard Worker xnn_params.qu8.lrelu.ukernel,
1066*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op_out);
1067*4bdc9457SAndroid Build Coastguard Worker }
1068*4bdc9457SAndroid Build Coastguard Worker
xnn_create_negate_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * negate_op_out)1069*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_negate_nc_f16(
1070*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1071*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1072*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1073*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1074*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* negate_op_out)
1075*4bdc9457SAndroid Build Coastguard Worker {
1076*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_neg_params params;
1077*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.neg.init.f16_neg != NULL) {
1078*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.neg.init.f16_neg(¶ms);
1079*4bdc9457SAndroid Build Coastguard Worker }
1080*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1081*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1082*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
1083*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_negate_nc_f16,
1084*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.neg.ukernel,
1085*4bdc9457SAndroid Build Coastguard Worker negate_op_out);
1086*4bdc9457SAndroid Build Coastguard Worker }
1087*4bdc9457SAndroid Build Coastguard Worker
xnn_create_negate_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * negate_op_out)1088*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_negate_nc_f32(
1089*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1090*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1091*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1092*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1093*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* negate_op_out)
1094*4bdc9457SAndroid Build Coastguard Worker {
1095*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_neg_params params;
1096*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.neg.init.f32_neg != NULL) {
1097*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.neg.init.f32_neg(¶ms);
1098*4bdc9457SAndroid Build Coastguard Worker }
1099*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1100*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1101*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
1102*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_negate_nc_f32,
1103*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.neg.ukernel,
1104*4bdc9457SAndroid Build Coastguard Worker negate_op_out);
1105*4bdc9457SAndroid Build Coastguard Worker }
1106*4bdc9457SAndroid Build Coastguard Worker
xnn_create_sigmoid_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * sigmoid_op_out)1107*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_sigmoid_nc_f16(
1108*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1109*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1110*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1111*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1112*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* sigmoid_op_out)
1113*4bdc9457SAndroid Build Coastguard Worker {
1114*4bdc9457SAndroid Build Coastguard Worker if ((xnn_params.init_flags & XNN_INIT_FLAG_F16) != XNN_INIT_FLAG_F16) {
1115*4bdc9457SAndroid Build Coastguard Worker xnn_log_error("failed to create %s operator: operations on data type are not supported",
1116*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_to_string(xnn_operator_type_sigmoid_nc_f16));
1117*4bdc9457SAndroid Build Coastguard Worker return xnn_status_unsupported_hardware;
1118*4bdc9457SAndroid Build Coastguard Worker }
1119*4bdc9457SAndroid Build Coastguard Worker
1120*4bdc9457SAndroid Build Coastguard Worker union xnn_f16_sigmoid_params params;
1121*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f16.sigmoid.init.f16_sigmoid != NULL) {
1122*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.sigmoid.init.f16_sigmoid(¶ms);
1123*4bdc9457SAndroid Build Coastguard Worker }
1124*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1125*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1126*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F16,
1127*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_sigmoid_nc_f16,
1128*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.sigmoid.ukernel,
1129*4bdc9457SAndroid Build Coastguard Worker sigmoid_op_out);
1130*4bdc9457SAndroid Build Coastguard Worker }
1131*4bdc9457SAndroid Build Coastguard Worker
xnn_create_sigmoid_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * sigmoid_op_out)1132*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_sigmoid_nc_f32(
1133*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1134*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1135*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1136*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1137*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* sigmoid_op_out)
1138*4bdc9457SAndroid Build Coastguard Worker {
1139*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_sigmoid_params params;
1140*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.sigmoid.init.f32_sigmoid != NULL) {
1141*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sigmoid.init.f32_sigmoid(¶ms);
1142*4bdc9457SAndroid Build Coastguard Worker }
1143*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1144*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1145*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
1146*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_sigmoid_nc_f32,
1147*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sigmoid.ukernel,
1148*4bdc9457SAndroid Build Coastguard Worker sigmoid_op_out);
1149*4bdc9457SAndroid Build Coastguard Worker }
1150*4bdc9457SAndroid Build Coastguard Worker
xnn_create_square_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * square_op_out)1151*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_square_nc_f16(
1152*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1153*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1154*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1155*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1156*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* square_op_out)
1157*4bdc9457SAndroid Build Coastguard Worker {
1158*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1159*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1160*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
1161*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_square_nc_f16,
1162*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.sqr.ukernel,
1163*4bdc9457SAndroid Build Coastguard Worker square_op_out);
1164*4bdc9457SAndroid Build Coastguard Worker }
1165*4bdc9457SAndroid Build Coastguard Worker
xnn_create_square_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * square_op_out)1166*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_square_nc_f32(
1167*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1168*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1169*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1170*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1171*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* square_op_out)
1172*4bdc9457SAndroid Build Coastguard Worker {
1173*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_default_params params;
1174*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.sqr.init.f32_default != NULL) {
1175*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sqr.init.f32_default(¶ms);
1176*4bdc9457SAndroid Build Coastguard Worker }
1177*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1178*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1179*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
1180*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_square_nc_f32,
1181*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sqr.ukernel,
1182*4bdc9457SAndroid Build Coastguard Worker square_op_out);
1183*4bdc9457SAndroid Build Coastguard Worker }
1184*4bdc9457SAndroid Build Coastguard Worker
xnn_create_square_root_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * sqrt_op_out)1185*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_square_root_nc_f16(
1186*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1187*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1188*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1189*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1190*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* sqrt_op_out)
1191*4bdc9457SAndroid Build Coastguard Worker {
1192*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1193*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1194*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
1195*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_square_root_nc_f16,
1196*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.sqrt.ukernel,
1197*4bdc9457SAndroid Build Coastguard Worker sqrt_op_out);
1198*4bdc9457SAndroid Build Coastguard Worker }
1199*4bdc9457SAndroid Build Coastguard Worker
xnn_create_square_root_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * sqrt_op_out)1200*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_square_root_nc_f32(
1201*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1202*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1203*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1204*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1205*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* sqrt_op_out)
1206*4bdc9457SAndroid Build Coastguard Worker {
1207*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_sqrt_params params;
1208*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.sqrt.init.f32_sqrt != NULL) {
1209*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sqrt.init.f32_sqrt(¶ms);
1210*4bdc9457SAndroid Build Coastguard Worker }
1211*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1212*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1213*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
1214*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_square_root_nc_f32,
1215*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.sqrt.ukernel,
1216*4bdc9457SAndroid Build Coastguard Worker sqrt_op_out);
1217*4bdc9457SAndroid Build Coastguard Worker }
1218*4bdc9457SAndroid Build Coastguard Worker
xnn_create_truncation_nc_f16(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * truncation_op_out)1219*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_truncation_nc_f16(
1220*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1221*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1222*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1223*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1224*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* truncation_op_out)
1225*4bdc9457SAndroid Build Coastguard Worker {
1226*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1227*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1228*4bdc9457SAndroid Build Coastguard Worker NULL, 0, XNN_INIT_FLAG_F16,
1229*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_truncation_nc_f16,
1230*4bdc9457SAndroid Build Coastguard Worker xnn_params.f16.rndz.ukernel,
1231*4bdc9457SAndroid Build Coastguard Worker truncation_op_out);
1232*4bdc9457SAndroid Build Coastguard Worker }
1233*4bdc9457SAndroid Build Coastguard Worker
xnn_create_truncation_nc_f32(size_t channels,size_t input_stride,size_t output_stride,uint32_t flags,xnn_operator_t * truncation_op_out)1234*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_create_truncation_nc_f32(
1235*4bdc9457SAndroid Build Coastguard Worker size_t channels,
1236*4bdc9457SAndroid Build Coastguard Worker size_t input_stride,
1237*4bdc9457SAndroid Build Coastguard Worker size_t output_stride,
1238*4bdc9457SAndroid Build Coastguard Worker uint32_t flags,
1239*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t* truncation_op_out)
1240*4bdc9457SAndroid Build Coastguard Worker {
1241*4bdc9457SAndroid Build Coastguard Worker union xnn_f32_rnd_params params;
1242*4bdc9457SAndroid Build Coastguard Worker if (xnn_params.f32.rndz.init.f32_rnd != NULL) {
1243*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndz.init.f32_rnd(¶ms);
1244*4bdc9457SAndroid Build Coastguard Worker }
1245*4bdc9457SAndroid Build Coastguard Worker return create_unary_elementwise_nc(
1246*4bdc9457SAndroid Build Coastguard Worker channels, input_stride, output_stride, flags,
1247*4bdc9457SAndroid Build Coastguard Worker ¶ms, sizeof(params), XNN_INIT_FLAG_F32,
1248*4bdc9457SAndroid Build Coastguard Worker xnn_operator_type_truncation_nc_f32,
1249*4bdc9457SAndroid Build Coastguard Worker xnn_params.f32.rndz.ukernel,
1250*4bdc9457SAndroid Build Coastguard Worker truncation_op_out);
1251*4bdc9457SAndroid Build Coastguard Worker }
1252*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_abs_nc_f16(xnn_operator_t abs_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1253*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_abs_nc_f16(
1254*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t abs_op,
1255*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1256*4bdc9457SAndroid Build Coastguard Worker const void* input,
1257*4bdc9457SAndroid Build Coastguard Worker void* output,
1258*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1259*4bdc9457SAndroid Build Coastguard Worker {
1260*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1261*4bdc9457SAndroid Build Coastguard Worker abs_op, xnn_operator_type_abs_nc_f16,
1262*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1263*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1264*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1265*4bdc9457SAndroid Build Coastguard Worker &abs_op->params.f16_abs, sizeof(abs_op->params.f16_abs),
1266*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1267*4bdc9457SAndroid Build Coastguard Worker }
1268*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_abs_nc_f32(xnn_operator_t abs_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1269*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_abs_nc_f32(
1270*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t abs_op,
1271*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1272*4bdc9457SAndroid Build Coastguard Worker const float* input,
1273*4bdc9457SAndroid Build Coastguard Worker float* output,
1274*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1275*4bdc9457SAndroid Build Coastguard Worker {
1276*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1277*4bdc9457SAndroid Build Coastguard Worker abs_op, xnn_operator_type_abs_nc_f32,
1278*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1279*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1280*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1281*4bdc9457SAndroid Build Coastguard Worker &abs_op->params.f32_abs, sizeof(abs_op->params.f32_abs),
1282*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1283*4bdc9457SAndroid Build Coastguard Worker }
1284*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_bankers_rounding_nc_f16(xnn_operator_t rounding_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1285*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_bankers_rounding_nc_f16(
1286*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t rounding_op,
1287*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1288*4bdc9457SAndroid Build Coastguard Worker const void* input,
1289*4bdc9457SAndroid Build Coastguard Worker void* output,
1290*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1291*4bdc9457SAndroid Build Coastguard Worker {
1292*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1293*4bdc9457SAndroid Build Coastguard Worker rounding_op, xnn_operator_type_bankers_rounding_nc_f16,
1294*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1295*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1296*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1297*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1298*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1299*4bdc9457SAndroid Build Coastguard Worker }
1300*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_bankers_rounding_nc_f32(xnn_operator_t rounding_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1301*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_bankers_rounding_nc_f32(
1302*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t rounding_op,
1303*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1304*4bdc9457SAndroid Build Coastguard Worker const float* input,
1305*4bdc9457SAndroid Build Coastguard Worker float* output,
1306*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1307*4bdc9457SAndroid Build Coastguard Worker {
1308*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1309*4bdc9457SAndroid Build Coastguard Worker rounding_op, xnn_operator_type_bankers_rounding_nc_f32,
1310*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1311*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1312*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1313*4bdc9457SAndroid Build Coastguard Worker &rounding_op->params.f32_rnd, sizeof(rounding_op->params.f32_rnd),
1314*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1315*4bdc9457SAndroid Build Coastguard Worker }
1316*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_ceiling_nc_f16(xnn_operator_t ceiling_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1317*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_ceiling_nc_f16(
1318*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t ceiling_op,
1319*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1320*4bdc9457SAndroid Build Coastguard Worker const void* input,
1321*4bdc9457SAndroid Build Coastguard Worker void* output,
1322*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1323*4bdc9457SAndroid Build Coastguard Worker {
1324*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1325*4bdc9457SAndroid Build Coastguard Worker ceiling_op, xnn_operator_type_ceiling_nc_f16,
1326*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1327*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1328*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1329*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1330*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1331*4bdc9457SAndroid Build Coastguard Worker }
1332*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_ceiling_nc_f32(xnn_operator_t ceiling_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1333*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_ceiling_nc_f32(
1334*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t ceiling_op,
1335*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1336*4bdc9457SAndroid Build Coastguard Worker const float* input,
1337*4bdc9457SAndroid Build Coastguard Worker float* output,
1338*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1339*4bdc9457SAndroid Build Coastguard Worker {
1340*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1341*4bdc9457SAndroid Build Coastguard Worker ceiling_op, xnn_operator_type_ceiling_nc_f32,
1342*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1343*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1344*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1345*4bdc9457SAndroid Build Coastguard Worker &ceiling_op->params.f32_rnd, sizeof(ceiling_op->params.f32_rnd),
1346*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1347*4bdc9457SAndroid Build Coastguard Worker }
1348*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_clamp_nc_f16(xnn_operator_t clamp_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1349*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_clamp_nc_f16(
1350*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t clamp_op,
1351*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1352*4bdc9457SAndroid Build Coastguard Worker const void* input,
1353*4bdc9457SAndroid Build Coastguard Worker void* output,
1354*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1355*4bdc9457SAndroid Build Coastguard Worker {
1356*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1357*4bdc9457SAndroid Build Coastguard Worker clamp_op, xnn_operator_type_clamp_nc_f16,
1358*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1359*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1360*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1361*4bdc9457SAndroid Build Coastguard Worker &clamp_op->params.f16_minmax, sizeof(clamp_op->params.f16_minmax),
1362*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1363*4bdc9457SAndroid Build Coastguard Worker }
1364*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_clamp_nc_f32(xnn_operator_t clamp_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1365*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_clamp_nc_f32(
1366*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t clamp_op,
1367*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1368*4bdc9457SAndroid Build Coastguard Worker const float* input,
1369*4bdc9457SAndroid Build Coastguard Worker float* output,
1370*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1371*4bdc9457SAndroid Build Coastguard Worker {
1372*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1373*4bdc9457SAndroid Build Coastguard Worker clamp_op, xnn_operator_type_clamp_nc_f32,
1374*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1375*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1376*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1377*4bdc9457SAndroid Build Coastguard Worker &clamp_op->params.f32_minmax, sizeof(clamp_op->params.f32_minmax),
1378*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1379*4bdc9457SAndroid Build Coastguard Worker }
1380*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_clamp_nc_s8(xnn_operator_t clamp_op,size_t batch_size,const int8_t * input,int8_t * output,pthreadpool_t threadpool)1381*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_clamp_nc_s8(
1382*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t clamp_op,
1383*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1384*4bdc9457SAndroid Build Coastguard Worker const int8_t* input,
1385*4bdc9457SAndroid Build Coastguard Worker int8_t* output,
1386*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1387*4bdc9457SAndroid Build Coastguard Worker {
1388*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1389*4bdc9457SAndroid Build Coastguard Worker clamp_op, xnn_operator_type_clamp_nc_s8,
1390*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1391*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1392*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1393*4bdc9457SAndroid Build Coastguard Worker &clamp_op->params.s8_minmax, sizeof(clamp_op->params.s8_minmax),
1394*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1395*4bdc9457SAndroid Build Coastguard Worker }
1396*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_clamp_nc_u8(xnn_operator_t clamp_op,size_t batch_size,const uint8_t * input,uint8_t * output,pthreadpool_t threadpool)1397*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_clamp_nc_u8(
1398*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t clamp_op,
1399*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1400*4bdc9457SAndroid Build Coastguard Worker const uint8_t* input,
1401*4bdc9457SAndroid Build Coastguard Worker uint8_t* output,
1402*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1403*4bdc9457SAndroid Build Coastguard Worker {
1404*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1405*4bdc9457SAndroid Build Coastguard Worker clamp_op, xnn_operator_type_clamp_nc_u8,
1406*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1407*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1408*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1409*4bdc9457SAndroid Build Coastguard Worker &clamp_op->params.u8_minmax, sizeof(clamp_op->params.u8_minmax),
1410*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1411*4bdc9457SAndroid Build Coastguard Worker }
1412*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_f16_f32(xnn_operator_t convert_op,size_t batch_size,const void * input,float * output,pthreadpool_t threadpool)1413*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_f16_f32(
1414*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1415*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1416*4bdc9457SAndroid Build Coastguard Worker const void* input,
1417*4bdc9457SAndroid Build Coastguard Worker float* output,
1418*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1419*4bdc9457SAndroid Build Coastguard Worker {
1420*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1421*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_f16_f32,
1422*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1423*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1424*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1425*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.f16_f32_cvt, sizeof(convert_op->params.f16_f32_cvt),
1426*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1427*4bdc9457SAndroid Build Coastguard Worker }
1428*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_f32_f16(xnn_operator_t convert_op,size_t batch_size,const float * input,void * output,pthreadpool_t threadpool)1429*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_f32_f16(
1430*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1431*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1432*4bdc9457SAndroid Build Coastguard Worker const float* input,
1433*4bdc9457SAndroid Build Coastguard Worker void* output,
1434*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1435*4bdc9457SAndroid Build Coastguard Worker {
1436*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1437*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_f32_f16,
1438*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1439*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1440*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1441*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.f32_f16_cvt, sizeof(convert_op->params.f32_f16_cvt),
1442*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1443*4bdc9457SAndroid Build Coastguard Worker }
1444*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_f32_qs8(xnn_operator_t convert_op,size_t batch_size,const float * input,int8_t * output,pthreadpool_t threadpool)1445*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_f32_qs8(
1446*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1447*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1448*4bdc9457SAndroid Build Coastguard Worker const float* input,
1449*4bdc9457SAndroid Build Coastguard Worker int8_t* output,
1450*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1451*4bdc9457SAndroid Build Coastguard Worker {
1452*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1453*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_f32_qs8,
1454*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1455*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1456*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1457*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.f32_qs8_cvt, sizeof(convert_op->params.f32_qs8_cvt),
1458*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1459*4bdc9457SAndroid Build Coastguard Worker }
1460*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_f32_qu8(xnn_operator_t convert_op,size_t batch_size,const float * input,uint8_t * output,pthreadpool_t threadpool)1461*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_f32_qu8(
1462*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1463*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1464*4bdc9457SAndroid Build Coastguard Worker const float* input,
1465*4bdc9457SAndroid Build Coastguard Worker uint8_t* output,
1466*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1467*4bdc9457SAndroid Build Coastguard Worker {
1468*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1469*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_f32_qu8,
1470*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1471*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1472*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1473*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.f32_qu8_cvt, sizeof(convert_op->params.f32_qu8_cvt),
1474*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1475*4bdc9457SAndroid Build Coastguard Worker }
1476*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_qs8(xnn_operator_t convert_op,size_t batch_size,const int8_t * input,int8_t * output,pthreadpool_t threadpool)1477*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_qs8(
1478*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1479*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1480*4bdc9457SAndroid Build Coastguard Worker const int8_t* input,
1481*4bdc9457SAndroid Build Coastguard Worker int8_t* output,
1482*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1483*4bdc9457SAndroid Build Coastguard Worker {
1484*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1485*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_qs8,
1486*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1487*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1488*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1489*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.qs8_cvt, sizeof(convert_op->params.qs8_cvt),
1490*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1491*4bdc9457SAndroid Build Coastguard Worker }
1492*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_qs8_f32(xnn_operator_t convert_op,size_t batch_size,const int8_t * input,float * output,pthreadpool_t threadpool)1493*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_qs8_f32(
1494*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1495*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1496*4bdc9457SAndroid Build Coastguard Worker const int8_t* input,
1497*4bdc9457SAndroid Build Coastguard Worker float* output,
1498*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1499*4bdc9457SAndroid Build Coastguard Worker {
1500*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1501*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_qs8_f32,
1502*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1503*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1504*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1505*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.qs8_f32_cvt, sizeof(convert_op->params.qs8_f32_cvt),
1506*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1507*4bdc9457SAndroid Build Coastguard Worker }
1508*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_qu8(xnn_operator_t convert_op,size_t batch_size,const uint8_t * input,uint8_t * output,pthreadpool_t threadpool)1509*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_qu8(
1510*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1511*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1512*4bdc9457SAndroid Build Coastguard Worker const uint8_t* input,
1513*4bdc9457SAndroid Build Coastguard Worker uint8_t* output,
1514*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1515*4bdc9457SAndroid Build Coastguard Worker {
1516*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1517*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_qu8,
1518*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1519*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1520*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1521*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.qu8_cvt, sizeof(convert_op->params.qu8_cvt),
1522*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1523*4bdc9457SAndroid Build Coastguard Worker }
1524*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_convert_nc_qu8_f32(xnn_operator_t convert_op,size_t batch_size,const uint8_t * input,float * output,pthreadpool_t threadpool)1525*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_convert_nc_qu8_f32(
1526*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t convert_op,
1527*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1528*4bdc9457SAndroid Build Coastguard Worker const uint8_t* input,
1529*4bdc9457SAndroid Build Coastguard Worker float* output,
1530*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1531*4bdc9457SAndroid Build Coastguard Worker {
1532*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1533*4bdc9457SAndroid Build Coastguard Worker convert_op, xnn_operator_type_convert_nc_qu8_f32,
1534*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1535*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1536*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1537*4bdc9457SAndroid Build Coastguard Worker &convert_op->params.qu8_f32_cvt, sizeof(convert_op->params.qu8_f32_cvt),
1538*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1539*4bdc9457SAndroid Build Coastguard Worker }
1540*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_copy_nc_x8(xnn_operator_t copy_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1541*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_copy_nc_x8(
1542*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t copy_op,
1543*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1544*4bdc9457SAndroid Build Coastguard Worker const void* input,
1545*4bdc9457SAndroid Build Coastguard Worker void* output,
1546*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1547*4bdc9457SAndroid Build Coastguard Worker {
1548*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1549*4bdc9457SAndroid Build Coastguard Worker copy_op, xnn_operator_type_copy_nc_x8,
1550*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1551*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint16_t)) */,
1552*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint16_t)) */,
1553*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1554*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1555*4bdc9457SAndroid Build Coastguard Worker }
1556*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_copy_nc_x16(xnn_operator_t copy_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1557*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_copy_nc_x16(
1558*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t copy_op,
1559*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1560*4bdc9457SAndroid Build Coastguard Worker const void* input,
1561*4bdc9457SAndroid Build Coastguard Worker void* output,
1562*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1563*4bdc9457SAndroid Build Coastguard Worker {
1564*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1565*4bdc9457SAndroid Build Coastguard Worker copy_op, xnn_operator_type_copy_nc_x16,
1566*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1567*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1568*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1569*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1570*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1571*4bdc9457SAndroid Build Coastguard Worker }
1572*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_copy_nc_x32(xnn_operator_t copy_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1573*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_copy_nc_x32(
1574*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t copy_op,
1575*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1576*4bdc9457SAndroid Build Coastguard Worker const void* input,
1577*4bdc9457SAndroid Build Coastguard Worker void* output,
1578*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1579*4bdc9457SAndroid Build Coastguard Worker {
1580*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1581*4bdc9457SAndroid Build Coastguard Worker copy_op, xnn_operator_type_copy_nc_x32,
1582*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1583*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(uint32_t)) */,
1584*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(uint32_t)) */,
1585*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1586*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1587*4bdc9457SAndroid Build Coastguard Worker }
1588*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_elu_nc_f16(xnn_operator_t elu_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1589*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_elu_nc_f16(
1590*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t elu_op,
1591*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1592*4bdc9457SAndroid Build Coastguard Worker const void* input,
1593*4bdc9457SAndroid Build Coastguard Worker void* output,
1594*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1595*4bdc9457SAndroid Build Coastguard Worker {
1596*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1597*4bdc9457SAndroid Build Coastguard Worker elu_op, xnn_operator_type_elu_nc_f16,
1598*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1599*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1600*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1601*4bdc9457SAndroid Build Coastguard Worker &elu_op->params.f16_elu, sizeof(elu_op->params.f16_elu),
1602*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1603*4bdc9457SAndroid Build Coastguard Worker }
1604*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_elu_nc_f32(xnn_operator_t elu_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1605*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_elu_nc_f32(
1606*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t elu_op,
1607*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1608*4bdc9457SAndroid Build Coastguard Worker const float* input,
1609*4bdc9457SAndroid Build Coastguard Worker float* output,
1610*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1611*4bdc9457SAndroid Build Coastguard Worker {
1612*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1613*4bdc9457SAndroid Build Coastguard Worker elu_op, xnn_operator_type_elu_nc_f32,
1614*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1615*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1616*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1617*4bdc9457SAndroid Build Coastguard Worker &elu_op->params.f32_elu, sizeof(elu_op->params.f32_elu),
1618*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1619*4bdc9457SAndroid Build Coastguard Worker }
1620*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_floor_nc_f16(xnn_operator_t floor_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1621*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_floor_nc_f16(
1622*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t floor_op,
1623*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1624*4bdc9457SAndroid Build Coastguard Worker const void* input,
1625*4bdc9457SAndroid Build Coastguard Worker void* output,
1626*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1627*4bdc9457SAndroid Build Coastguard Worker {
1628*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1629*4bdc9457SAndroid Build Coastguard Worker floor_op, xnn_operator_type_floor_nc_f16,
1630*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1631*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1632*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1633*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1634*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1635*4bdc9457SAndroid Build Coastguard Worker }
1636*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_floor_nc_f32(xnn_operator_t floor_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1637*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_floor_nc_f32(
1638*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t floor_op,
1639*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1640*4bdc9457SAndroid Build Coastguard Worker const float* input,
1641*4bdc9457SAndroid Build Coastguard Worker float* output,
1642*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1643*4bdc9457SAndroid Build Coastguard Worker {
1644*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1645*4bdc9457SAndroid Build Coastguard Worker floor_op, xnn_operator_type_floor_nc_f32,
1646*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1647*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1648*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1649*4bdc9457SAndroid Build Coastguard Worker &floor_op->params.f32_rnd, sizeof(floor_op->params.f32_rnd),
1650*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1651*4bdc9457SAndroid Build Coastguard Worker }
1652*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_hardswish_nc_f16(xnn_operator_t hardswish_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1653*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_hardswish_nc_f16(
1654*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t hardswish_op,
1655*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1656*4bdc9457SAndroid Build Coastguard Worker const void* input,
1657*4bdc9457SAndroid Build Coastguard Worker void* output,
1658*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1659*4bdc9457SAndroid Build Coastguard Worker {
1660*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1661*4bdc9457SAndroid Build Coastguard Worker hardswish_op, xnn_operator_type_hardswish_nc_f16,
1662*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1663*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1664*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1665*4bdc9457SAndroid Build Coastguard Worker &hardswish_op->params.f16_hswish, sizeof(hardswish_op->params.f16_hswish),
1666*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1667*4bdc9457SAndroid Build Coastguard Worker }
1668*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_hardswish_nc_f32(xnn_operator_t hardswish_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1669*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_hardswish_nc_f32(
1670*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t hardswish_op,
1671*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1672*4bdc9457SAndroid Build Coastguard Worker const float* input,
1673*4bdc9457SAndroid Build Coastguard Worker float* output,
1674*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1675*4bdc9457SAndroid Build Coastguard Worker {
1676*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1677*4bdc9457SAndroid Build Coastguard Worker hardswish_op, xnn_operator_type_hardswish_nc_f32,
1678*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1679*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1680*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1681*4bdc9457SAndroid Build Coastguard Worker &hardswish_op->params.f32_hswish, sizeof(hardswish_op->params.f32_hswish),
1682*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1683*4bdc9457SAndroid Build Coastguard Worker }
1684*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_leaky_relu_nc_f16(xnn_operator_t leaky_relu_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1685*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_leaky_relu_nc_f16(
1686*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t leaky_relu_op,
1687*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1688*4bdc9457SAndroid Build Coastguard Worker const void* input,
1689*4bdc9457SAndroid Build Coastguard Worker void* output,
1690*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1691*4bdc9457SAndroid Build Coastguard Worker {
1692*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1693*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op, xnn_operator_type_leaky_relu_nc_f16,
1694*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1695*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1696*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1697*4bdc9457SAndroid Build Coastguard Worker &leaky_relu_op->params.f16_lrelu, sizeof(leaky_relu_op->params.f16_lrelu),
1698*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1699*4bdc9457SAndroid Build Coastguard Worker }
1700*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_leaky_relu_nc_f32(xnn_operator_t leaky_relu_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1701*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_leaky_relu_nc_f32(
1702*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t leaky_relu_op,
1703*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1704*4bdc9457SAndroid Build Coastguard Worker const float* input,
1705*4bdc9457SAndroid Build Coastguard Worker float* output,
1706*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1707*4bdc9457SAndroid Build Coastguard Worker {
1708*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1709*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op, xnn_operator_type_leaky_relu_nc_f32,
1710*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1711*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1712*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1713*4bdc9457SAndroid Build Coastguard Worker &leaky_relu_op->params.f32_lrelu, sizeof(leaky_relu_op->params.f32_lrelu),
1714*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1715*4bdc9457SAndroid Build Coastguard Worker }
1716*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_leaky_relu_nc_qs8(xnn_operator_t leaky_relu_op,size_t batch_size,const int8_t * input,int8_t * output,pthreadpool_t threadpool)1717*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_leaky_relu_nc_qs8(
1718*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t leaky_relu_op,
1719*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1720*4bdc9457SAndroid Build Coastguard Worker const int8_t* input,
1721*4bdc9457SAndroid Build Coastguard Worker int8_t* output,
1722*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1723*4bdc9457SAndroid Build Coastguard Worker {
1724*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1725*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op, xnn_operator_type_leaky_relu_nc_qs8,
1726*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1727*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1728*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(int8_t)) */,
1729*4bdc9457SAndroid Build Coastguard Worker &leaky_relu_op->params.qs8_lrelu, sizeof(leaky_relu_op->params.qs8_lrelu),
1730*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1731*4bdc9457SAndroid Build Coastguard Worker }
1732*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_leaky_relu_nc_qu8(xnn_operator_t leaky_relu_op,size_t batch_size,const uint8_t * input,uint8_t * output,pthreadpool_t threadpool)1733*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_leaky_relu_nc_qu8(
1734*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t leaky_relu_op,
1735*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1736*4bdc9457SAndroid Build Coastguard Worker const uint8_t* input,
1737*4bdc9457SAndroid Build Coastguard Worker uint8_t* output,
1738*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1739*4bdc9457SAndroid Build Coastguard Worker {
1740*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1741*4bdc9457SAndroid Build Coastguard Worker leaky_relu_op, xnn_operator_type_leaky_relu_nc_qu8,
1742*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1743*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1744*4bdc9457SAndroid Build Coastguard Worker 0 /* log2(sizeof(uint8_t)) */,
1745*4bdc9457SAndroid Build Coastguard Worker &leaky_relu_op->params.qu8_lrelu, sizeof(leaky_relu_op->params.qu8_lrelu),
1746*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1747*4bdc9457SAndroid Build Coastguard Worker }
1748*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_negate_nc_f16(xnn_operator_t negate_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1749*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_negate_nc_f16(
1750*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t negate_op,
1751*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1752*4bdc9457SAndroid Build Coastguard Worker const void* input,
1753*4bdc9457SAndroid Build Coastguard Worker void* output,
1754*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1755*4bdc9457SAndroid Build Coastguard Worker {
1756*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1757*4bdc9457SAndroid Build Coastguard Worker negate_op, xnn_operator_type_negate_nc_f16,
1758*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1759*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1760*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1761*4bdc9457SAndroid Build Coastguard Worker &negate_op->params.f16_neg, sizeof(negate_op->params.f16_neg),
1762*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1763*4bdc9457SAndroid Build Coastguard Worker }
1764*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_negate_nc_f32(xnn_operator_t negate_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1765*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_negate_nc_f32(
1766*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t negate_op,
1767*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1768*4bdc9457SAndroid Build Coastguard Worker const float* input,
1769*4bdc9457SAndroid Build Coastguard Worker float* output,
1770*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1771*4bdc9457SAndroid Build Coastguard Worker {
1772*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1773*4bdc9457SAndroid Build Coastguard Worker negate_op, xnn_operator_type_negate_nc_f32,
1774*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1775*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1776*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1777*4bdc9457SAndroid Build Coastguard Worker &negate_op->params.f32_neg, sizeof(negate_op->params.f32_neg),
1778*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1779*4bdc9457SAndroid Build Coastguard Worker }
1780*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_sigmoid_nc_f16(xnn_operator_t sigmoid_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1781*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_sigmoid_nc_f16(
1782*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op,
1783*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1784*4bdc9457SAndroid Build Coastguard Worker const void* input,
1785*4bdc9457SAndroid Build Coastguard Worker void* output,
1786*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1787*4bdc9457SAndroid Build Coastguard Worker {
1788*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1789*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, xnn_operator_type_sigmoid_nc_f16,
1790*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1791*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1792*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1793*4bdc9457SAndroid Build Coastguard Worker &sigmoid_op->params.f16_sigmoid, sizeof(sigmoid_op->params.f16_sigmoid),
1794*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1795*4bdc9457SAndroid Build Coastguard Worker }
1796*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_sigmoid_nc_f32(xnn_operator_t sigmoid_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1797*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_sigmoid_nc_f32(
1798*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sigmoid_op,
1799*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1800*4bdc9457SAndroid Build Coastguard Worker const float* input,
1801*4bdc9457SAndroid Build Coastguard Worker float* output,
1802*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1803*4bdc9457SAndroid Build Coastguard Worker {
1804*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1805*4bdc9457SAndroid Build Coastguard Worker sigmoid_op, xnn_operator_type_sigmoid_nc_f32,
1806*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1807*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1808*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1809*4bdc9457SAndroid Build Coastguard Worker &sigmoid_op->params.f32_sigmoid, sizeof(sigmoid_op->params.f32_sigmoid),
1810*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1811*4bdc9457SAndroid Build Coastguard Worker }
1812*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_square_nc_f16(xnn_operator_t square_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1813*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_square_nc_f16(
1814*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t square_op,
1815*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1816*4bdc9457SAndroid Build Coastguard Worker const void* input,
1817*4bdc9457SAndroid Build Coastguard Worker void* output,
1818*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1819*4bdc9457SAndroid Build Coastguard Worker {
1820*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1821*4bdc9457SAndroid Build Coastguard Worker square_op, xnn_operator_type_square_nc_f16,
1822*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1823*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1824*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(uint16_t)) */,
1825*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1826*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1827*4bdc9457SAndroid Build Coastguard Worker }
1828*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_square_nc_f32(xnn_operator_t square_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1829*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_square_nc_f32(
1830*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t square_op,
1831*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1832*4bdc9457SAndroid Build Coastguard Worker const float* input,
1833*4bdc9457SAndroid Build Coastguard Worker float* output,
1834*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1835*4bdc9457SAndroid Build Coastguard Worker {
1836*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1837*4bdc9457SAndroid Build Coastguard Worker square_op, xnn_operator_type_square_nc_f32,
1838*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1839*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1840*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1841*4bdc9457SAndroid Build Coastguard Worker &square_op->params.f32_default, sizeof(square_op->params.f32_default),
1842*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1843*4bdc9457SAndroid Build Coastguard Worker }
1844*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_square_root_nc_f16(xnn_operator_t sqrt_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1845*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_square_root_nc_f16(
1846*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sqrt_op,
1847*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1848*4bdc9457SAndroid Build Coastguard Worker const void* input,
1849*4bdc9457SAndroid Build Coastguard Worker void* output,
1850*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1851*4bdc9457SAndroid Build Coastguard Worker {
1852*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1853*4bdc9457SAndroid Build Coastguard Worker sqrt_op, xnn_operator_type_square_root_nc_f16,
1854*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1855*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1856*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1857*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1858*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1859*4bdc9457SAndroid Build Coastguard Worker }
1860*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_square_root_nc_f32(xnn_operator_t sqrt_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1861*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_square_root_nc_f32(
1862*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t sqrt_op,
1863*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1864*4bdc9457SAndroid Build Coastguard Worker const float* input,
1865*4bdc9457SAndroid Build Coastguard Worker float* output,
1866*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1867*4bdc9457SAndroid Build Coastguard Worker {
1868*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1869*4bdc9457SAndroid Build Coastguard Worker sqrt_op, xnn_operator_type_square_root_nc_f32,
1870*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1871*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1872*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1873*4bdc9457SAndroid Build Coastguard Worker &sqrt_op->params.f32_sqrt, sizeof(sqrt_op->params.f32_sqrt),
1874*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1875*4bdc9457SAndroid Build Coastguard Worker }
1876*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_truncation_nc_f16(xnn_operator_t truncation_op,size_t batch_size,const void * input,void * output,pthreadpool_t threadpool)1877*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_truncation_nc_f16(
1878*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t truncation_op,
1879*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1880*4bdc9457SAndroid Build Coastguard Worker const void* input,
1881*4bdc9457SAndroid Build Coastguard Worker void* output,
1882*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1883*4bdc9457SAndroid Build Coastguard Worker {
1884*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1885*4bdc9457SAndroid Build Coastguard Worker truncation_op, xnn_operator_type_truncation_nc_f16,
1886*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1887*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1888*4bdc9457SAndroid Build Coastguard Worker 1 /* log2(sizeof(half)) */,
1889*4bdc9457SAndroid Build Coastguard Worker NULL, 0,
1890*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1891*4bdc9457SAndroid Build Coastguard Worker }
1892*4bdc9457SAndroid Build Coastguard Worker
xnn_setup_truncation_nc_f32(xnn_operator_t truncation_op,size_t batch_size,const float * input,float * output,pthreadpool_t threadpool)1893*4bdc9457SAndroid Build Coastguard Worker enum xnn_status xnn_setup_truncation_nc_f32(
1894*4bdc9457SAndroid Build Coastguard Worker xnn_operator_t truncation_op,
1895*4bdc9457SAndroid Build Coastguard Worker size_t batch_size,
1896*4bdc9457SAndroid Build Coastguard Worker const float* input,
1897*4bdc9457SAndroid Build Coastguard Worker float* output,
1898*4bdc9457SAndroid Build Coastguard Worker pthreadpool_t threadpool)
1899*4bdc9457SAndroid Build Coastguard Worker {
1900*4bdc9457SAndroid Build Coastguard Worker return setup_unary_elementwise_nc(
1901*4bdc9457SAndroid Build Coastguard Worker truncation_op, xnn_operator_type_truncation_nc_f32,
1902*4bdc9457SAndroid Build Coastguard Worker batch_size, input, output,
1903*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1904*4bdc9457SAndroid Build Coastguard Worker 2 /* log2(sizeof(float)) */,
1905*4bdc9457SAndroid Build Coastguard Worker &truncation_op->params.f32_rnd, sizeof(truncation_op->params.f32_rnd),
1906*4bdc9457SAndroid Build Coastguard Worker pthreadpool_get_threads_count(threadpool));
1907*4bdc9457SAndroid Build Coastguard Worker }
1908