blob: cfaea383768260c0c3e37d30b652eb8d16f27223 [file] [log] [blame]
Marat Dukhan00a10852021-12-02 13:00:40 -08001// Auto-generated file. Do not edit!
Marat Dukhanbdf10992022-01-04 09:20:14 -08002// Template: src/f32-qs8-vcvt/scalar-imagic.c.in
Marat Dukhan00a10852021-12-02 13:00:40 -08003// Generator: tools/xngen
4//
5// Copyright 2021 Google LLC
6//
7// This source code is licensed under the BSD-style license found in the
8// LICENSE file in the root directory of this source tree.
9
10#include <assert.h>
11
12#include <xnnpack/common.h>
13#include <xnnpack/math.h>
14#include <xnnpack/vcvt.h>
15
16#include <fp16.h>
17
18
Marat Dukhanbdf10992022-01-04 09:20:14 -080019void xnn_f32_qu8_vcvt_ukernel__scalar_imagic_x1(
Marat Dukhan00a10852021-12-02 13:00:40 -080020 size_t n,
21 const float* x,
22 uint8_t* y,
Marat Dukhand541fc02021-12-14 00:14:27 -080023 const union xnn_f32_qu8_cvt_params params[restrict XNN_MIN_ELEMENTS(1)])
Marat Dukhan00a10852021-12-02 13:00:40 -080024{
25 assert(n != 0);
Marat Dukhan4bdc9f52021-12-09 15:36:06 -080026 assert(n % sizeof(float) == 0);
Marat Dukhan00a10852021-12-02 13:00:40 -080027 assert(x != NULL);
28 assert(y != NULL);
29
Marat Dukhanbdf10992022-01-04 09:20:14 -080030 const float vscale = params->scalar_imagic.scale;
31 const float vmagic_bias = params->scalar_imagic.magic_bias;
32 const int32_t vmagic_min = params->scalar_imagic.magic_min;
33 const int32_t vmagic_max = params->scalar_imagic.magic_max;
34 const int32_t vmagic_bias_less_zero_point = params->scalar_imagic.magic_bias_less_zero_point;
Marat Dukhan00a10852021-12-02 13:00:40 -080035
36 do {
37 float vx = *x++;
38 vx *= vscale;
39 vx += vmagic_bias;
40
41 int32_t vy = (int32_t) fp32_to_bits(vx);
42 vy = math_max_s32(vy, vmagic_min);
43 vy = math_min_s32(vy, vmagic_max);
44 vy -= vmagic_bias_less_zero_point;
45
46 *y++ = (uint8_t) vy;
47
Marat Dukhan4bdc9f52021-12-09 15:36:06 -080048 n -= sizeof(float);
Marat Dukhan00a10852021-12-02 13:00:40 -080049 } while (n != 0);
50}