// Copyright (c) Facebook, Inc. and its affiliates.
// All rights reserved.
//
// Copyright 2019 Google LLC
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.

#include <assert.h>
#include <stdint.h>
#include <stddef.h>

#include <xnnpack/math.h>
#include <xnnpack/requantization-stubs.h>


void xnn_qu8_requantize_rndna__scalar_unsigned32(
    size_t n,
    const int32_t* input,
    float scale,
    uint8_t zero_point,
    uint8_t qmin,
    uint8_t qmax,
    uint8_t* output)
{
  assert(n % 4 == 0);
  assert(scale < 1.0f);
  assert(scale >= 0x1.0p-32f);

  const uint32_t scale_bits = float_as_uint32(scale);
  const uint32_t multiplier = (scale_bits << 8) | UINT32_C(0x80000000);
  const uint32_t shift = 127 + 31 - (scale_bits >> 23);
  assert(shift >= 32);
  assert(shift < 64);

  const uint64_t rounding = UINT64_C(1) << (shift - 1);
  const uint32_t rounding_hi = (uint32_t) (rounding >> 32);
  const uint32_t rounding_lo = (uint32_t) rounding;
  const uint32_t shift_minus_32 = shift - 32;
  const int32_t smin = (int32_t) (uint32_t) qmin - (int32_t) (uint32_t) zero_point;
  const int32_t smax = (int32_t) (uint32_t) qmax - (int32_t) (uint32_t) zero_point;
  for (; n != 0; n -= 4) {
    const int32_t x = input[0];
    const int32_t y = input[1];
    const int32_t z = input[2];
    const int32_t w = input[3];
    input += 4;

    // Compute absolute value of input as unsigned 32-bit int.
    // All further computations will work with unsigned values to avoid undefined behaviour on signed operations.
    const uint32_t x_abs = (x >= 0) ? (uint32_t) x : -(uint32_t) x;
    const uint32_t y_abs = (y >= 0) ? (uint32_t) y : -(uint32_t) y;
    const uint32_t z_abs = (z >= 0) ? (uint32_t) z : -(uint32_t) z;
    const uint32_t w_abs = (w >= 0) ? (uint32_t) w : -(uint32_t) w;

    // Compute full 64-bit product of 32-bit factors.
    const uint64_t x_product = (uint64_t) x_abs * (uint64_t) multiplier;
    const uint64_t y_product = (uint64_t) y_abs * (uint64_t) multiplier;
    const uint64_t z_product = (uint64_t) z_abs * (uint64_t) multiplier;
    const uint64_t w_product = (uint64_t) w_abs * (uint64_t) multiplier;

    // Shift the full 64-bit product right with rounding.
    // Rounding is performed towards closest integer, with midpoints rounded up (same as away from zero).
    //
    // Generally, this operation requires both 64-bit addition and 64-bit shift, but we use two tricks to replace
    // 64-bit operations with 32-bit operations.
    //
    // To avoid full 64-bit addition we make use of three facts:
    // - 64-bit rounding value added before the shift is a power of 2, and thus has only one bit set.
    // - When 0x1.0p-32f <= scale < 0x1.0p-31f, then the non-zero bit in rounding is in the low 32 bits, and
    //   rounding is exactly 0x80000000 (2**31), because rounding is 2**(scale-1) and scale >= 32. In this case,
    //   addition of rounding can affect high 32 bits of the product only through overflow, which happens if
    //   low 32-bit part of the product equals or exceeds 0x80000000. We can reformulate the latter condition
    //   as low 32-bit part of the product has the bit 31 set, and then overflow happens if both the low 32-bit part
    //   of the product and the low 32-bit part of the rounding value have bit 31 set. Since 32-bit numbers with the
    //   bit 31 set are negative when interpreted as signed integers, we can check the overflow condition as
    //      (int32_t) (LOW(product) & LOW(rounding)) < 0
    // - When 0x1.0p-31f <= scale < 1.0f, then the non-zero bit is in the high 32 bits of rounding. We just need
    //   to do 32-bit addition of high 32 bits of rounding and high 32 bits of product. This addition never
    //   overflows because product <= 0x80000000 * 0xFFFFFF00 < 2**63 and rounding = 2**(scale-1) <= 2**62.
    //
    // To avoid full 64-bit shift, we leverage the fact that shift >= 32, and do it in two steps:
    // - Shift by 32, which can be implemented by extacting the high 32-bit word on 32-bit systems.
    // - Shift by (shift - 32), which can be implemented as a 32-bit shift of high word of addition result.
    const uint32_t x_carry_lo = (uint32_t) ((int32_t)((uint32_t) x_product & rounding_lo) < 0);
    const uint32_t y_carry_lo = (uint32_t) ((int32_t)((uint32_t) y_product & rounding_lo) < 0);
    const uint32_t z_carry_lo = (uint32_t) ((int32_t)((uint32_t) z_product & rounding_lo) < 0);
    const uint32_t w_carry_lo = (uint32_t) ((int32_t)((uint32_t) w_product & rounding_lo) < 0);

    const uint32_t x_product_hi = (uint32_t) (x_product >> 32);
    const uint32_t y_product_hi = (uint32_t) (y_product >> 32);
    const uint32_t z_product_hi = (uint32_t) (z_product >> 32);
    const uint32_t w_product_hi = (uint32_t) (w_product >> 32);

    const uint32_t x_abs_scaled = (uint32_t) (x_product_hi + rounding_hi + x_carry_lo) >> shift_minus_32;
    const uint32_t y_abs_scaled = (uint32_t) (y_product_hi + rounding_hi + y_carry_lo) >> shift_minus_32;
    const uint32_t z_abs_scaled = (uint32_t) (z_product_hi + rounding_hi + z_carry_lo) >> shift_minus_32;
    const uint32_t w_abs_scaled = (uint32_t) (w_product_hi + rounding_hi + w_carry_lo) >> shift_minus_32;

    // Copy the sign of input to scaled absolute input value.
    const int32_t x_scaled = (int32_t) (x >= 0 ? x_abs_scaled : -x_abs_scaled);
    const int32_t y_scaled = (int32_t) (y >= 0 ? y_abs_scaled : -y_abs_scaled);
    const int32_t z_scaled = (int32_t) (z >= 0 ? z_abs_scaled : -z_abs_scaled);
    const int32_t w_scaled = (int32_t) (w >= 0 ? w_abs_scaled : -w_abs_scaled);

    // Clamp scaled value with zero point between (qmin - zero point) and (qmax - zero point).
    const int32_t x_clamped = math_min_s32(math_max_s32(x_scaled, smin), smax);
    const int32_t y_clamped = math_min_s32(math_max_s32(y_scaled, smin), smax);
    const int32_t z_clamped = math_min_s32(math_max_s32(z_scaled, smin), smax);
    const int32_t w_clamped = math_min_s32(math_max_s32(w_scaled, smin), smax);

    // Add zero point to clamped value.
    // The result is guaranteed to be in [qmin, qmax] range.
    //
    // This addition can not be safely done before clamping, because scaled values are in [-2147483520, 2147483519]
    // range, so addition of zero point (which can be up to 255) can overflow signed 32-bit integer.
    const int32_t x_biased = x_clamped + zero_point;
    const int32_t y_biased = y_clamped + zero_point;
    const int32_t z_biased = z_clamped + zero_point;
    const int32_t w_biased = w_clamped + zero_point;

    output[0] = (uint8_t) x_biased;
    output[1] = (uint8_t) y_biased;
    output[2] = (uint8_t) z_biased;
    output[3] = (uint8_t) w_biased;
    output += 4;
  }
}
