xref: /aosp_15_r20/external/XNNPACK/src/qs8-f32-vcvt/scalar.c.in (revision 4bdc94577ba0e567308109d787f7fec7b531ce36)
1// Copyright 2021 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6$assert BATCH_TILE >= 1
7#include <assert.h>
8
9#include <xnnpack/common.h>
10#include <xnnpack/math.h>
11#include <xnnpack/vcvt.h>
12
13
14$XINT8_T = {"QS8": "int8_t", "QU8": "uint8_t"}[DATATYPE]
15void xnn_${DATATYPE.lower()}_f32_vcvt_ukernel__scalar_x${BATCH_TILE}(
16    size_t n,
17    const ${XINT8_T}* x,
18    float* y,
19    const union xnn_${DATATYPE.lower()}_f32_cvt_params params[restrict XNN_MIN_ELEMENTS(1)])
20{
21  assert(n != 0);
22  assert(n % sizeof(${XINT8_T}) == 0);
23  assert(x != NULL);
24  assert(y != NULL);
25
26  const int32_t vzero_point = params->scalar.zero_point;
27  const float vscale = params->scalar.scale;
28
29  $if BATCH_TILE > 1:
30    for (; n >= ${BATCH_TILE} * sizeof(${XINT8_T}); n -= ${BATCH_TILE} * sizeof(${XINT8_T})) {
31      $for N in range(BATCH_TILE):
32        int32_t vx${N} = (int32_t) x[${N}];
33      x += ${BATCH_TILE};
34
35      $for N in range(BATCH_TILE):
36        vx${N} -= vzero_point;
37
38      $for N in range(BATCH_TILE):
39        float vy${N} = (float) vx${N};
40
41      $for N in range(BATCH_TILE):
42        vy${N} *= vscale;
43
44      $for N in range(BATCH_TILE):
45        y[${N}] = vy${N};
46      y += ${BATCH_TILE};
47    }
48  $if BATCH_TILE == 1:
49    do {
50      int32_t vx = *x++;
51      vx -= vzero_point;
52
53      float vy = (float) vx;
54      vy *= vscale;
55      *y++ = vy;
56
57      n -= sizeof(${XINT8_T});
58    } while (n != 0);
59  $elif BATCH_TILE == 2:
60    if XNN_UNLIKELY(n != 0) {
61      int32_t vx = *x;
62      vx -= vzero_point;
63
64      float vy = (float) vx;
65      vy *= vscale;
66      *y = vy;
67    }
68  $else:
69    if XNN_UNLIKELY(n != 0) {
70      do {
71        int32_t vx = *x++;
72        vx -= vzero_point;
73
74        float vy = (float) vx;
75        vy *= vscale;
76        *y++ = vy;
77
78        n -= sizeof(${XINT8_T});
79      } while (n != 0);
80    }
81}
82