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