// 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.

#pragma once

#if defined(__cplusplus) && (__cplusplus >= 201103L)
  #include <cstdint>
  #include <cstddef>
  #include <cassert>
  #include <cmath>
#else
  #include <stdint.h>
  #include <stddef.h>
  #include <assert.h>
  #include <math.h>
#endif

#include <fp16.h>

#include <xnnpack/params.h>
#include <xnnpack/scalar-utils.h>


static inline union xnn_q8_gemm_params xnn_compute_scalar_q8_gemm_params(
  uint8_t input_zero_point,
  uint8_t kernel_zero_point,
  float scale,
  uint8_t output_zero_point,
  uint8_t output_min,
  uint8_t output_max)
{
  // Compute requantization parameters
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x40000000, 0x7FFFFF80] range.
  const int32_t multiplier = (int32_t)(((scale_bits & UINT32_C(0x007FFFFF)) | UINT32_C(0x00800000)) << 7);
  assert(multiplier >= INT32_C(0x40000000));
  assert(multiplier <= INT32_C(0x7FFFFF80));

  // Shift is in [0, 31] range.
  const int32_t shift = 127 + 31 - 32 - (fp32_to_bits(scale) >> 23);
  assert(shift >= 0);
  assert(shift < 32);

  const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
  const uint32_t remainder_threshold = remainder_mask >> 1;

  union xnn_q8_gemm_params params;
  params.scalar.input_zero_point = (int32_t) (uint32_t) input_zero_point;
  params.scalar.kernel_zero_point = (int32_t) (uint32_t) kernel_zero_point;
  params.scalar.multiplier = multiplier;
  params.scalar.remainder_mask = (int32_t) remainder_mask;
  params.scalar.remainder_threshold = (int32_t) remainder_threshold;
  params.scalar.shift = (uint32_t) shift;
  params.scalar.output_min_less_zero_point =
    (int32_t) (uint32_t) output_min - (int32_t) (uint32_t) output_zero_point;
  params.scalar.output_max_less_zero_point =
    (int32_t) (uint32_t) output_max - (int32_t) (uint32_t) output_zero_point;
  params.scalar.output_zero_point = (int32_t) (uint32_t) output_zero_point;
  return params;
}

static inline union xnn_q8_gemm_params xnn_compute_q8_gemm_params(
  uint8_t input_zero_point,
  uint8_t kernel_zero_point,
  float scale,
  uint8_t output_zero_point,
  uint8_t output_min,
  uint8_t output_max)
{
  // Compute requantization parameters.
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x40000000, 0x7FFFFF80] range.
  const int32_t multiplier = (int32_t)(((scale_bits & UINT32_C(0x007FFFFF)) | UINT32_C(0x00800000)) << 7);
  assert(multiplier >= INT32_C(0x40000000));
  assert(multiplier <= INT32_C(0x7FFFFF80));

  // Shift is in [0, 31] range.
  const int32_t shift = 127 + 31 - 32 - (fp32_to_bits(scale) >> 23);
  assert(shift >= 0);
  assert(shift < 32);

  union xnn_q8_gemm_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.input_zero_point[i] = (int16_t) (uint16_t) input_zero_point;
      params.sse2.kernel_zero_point[i] = (int16_t) (uint16_t) kernel_zero_point;
    }
    params.sse2.multiplier[0] = multiplier;
    params.sse2.multiplier[1] = multiplier;
    params.sse2.multiplier[2] = multiplier;
    params.sse2.multiplier[3] = multiplier;
    params.sse2.rounding[0] = UINT64_C(0x40000000);
    params.sse2.rounding[1] = UINT64_C(0x40000000);
    params.sse2.remainder_mask[0] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[1] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[2] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[3] = (int32_t) remainder_mask;
    params.sse2.remainder_threshold[0] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[1] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[2] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[3] = (int32_t) remainder_threshold;
    params.sse2.shift[0] = (uint64_t) (uint32_t) shift;
    params.sse2.shift[1] = (uint64_t) (uint32_t) shift;
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.output_zero_point[i] = (int16_t) (uint16_t) output_zero_point;
    }
    for (uint32_t i = 0; i < 16; i++) {
      params.sse2.output_max[i] = output_max;
      params.sse2.output_min[i] = output_min;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params.neon.input_zero_point = (int16_t) (uint16_t) input_zero_point;
    params.neon.kernel_zero_point = (int16_t) (uint16_t) kernel_zero_point;
    params.neon.multiplier = multiplier;
    params.neon.right_shift = -shift;
    params.neon.output_zero_point = (int16_t) (uint16_t) output_zero_point;
    params.neon.output_max = output_max;
    params.neon.output_min = output_min;
  #else
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    params.scalar.input_zero_point = (int32_t) (uint32_t) input_zero_point;
    params.scalar.kernel_zero_point = (int32_t) (uint32_t) kernel_zero_point;
    params.scalar.multiplier = multiplier;
    params.scalar.remainder_mask = (int32_t) remainder_mask;
    params.scalar.remainder_threshold = (int32_t) remainder_threshold;
    params.scalar.shift = (uint32_t) shift;
    params.scalar.output_min_less_zero_point =
      (int32_t) (uint32_t) output_min - (int32_t) (uint32_t) output_zero_point;
    params.scalar.output_max_less_zero_point =
      (int32_t) (uint32_t) output_max - (int32_t) (uint32_t) output_zero_point;
    params.scalar.output_zero_point = (int32_t) (uint32_t) output_zero_point;
  #endif
  return params;
}

static inline union xnn_q8_avgpool_params xnn_compute_q8_avgpool_params(
  int32_t bias,
  float scale,
  uint8_t output_zero_point,
  uint8_t output_min,
  uint8_t output_max)
{
  // Compute requantization parameters.
  assert(scale >= 0x1.0p-32f);
  assert(scale < 256.0f);
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x00800000, 0x00FFFFFF] range.
  const int32_t multiplier = ((int32_t) scale_bits & INT32_C(0x007FFFFF)) | INT32_C(0x00800000);
  assert(multiplier >= INT32_C(0x00800000));
  assert(multiplier <= INT32_C(0x00FFFFFF));

  // Shift is in [16, 55] range.
  const int32_t shift = 127 + 23 - (scale_bits >> 23);
  assert(shift >= 16);
  assert(shift < 64);

  union xnn_q8_avgpool_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    const uint32_t right_shift = (uint32_t) shift;
    const uint64_t rounding = UINT64_C(1) << (right_shift - 1);
    params.sse2.bias[0] = bias;
    params.sse2.bias[1] = bias;
    params.sse2.bias[2] = bias;
    params.sse2.bias[3] = bias;
    params.sse2.multiplier[0] = (uint32_t) multiplier;
    params.sse2.multiplier[1] = (uint32_t) multiplier;
    params.sse2.multiplier[2] = (uint32_t) multiplier;
    params.sse2.multiplier[3] = (uint32_t) multiplier;
    params.sse2.rounding[0] = rounding;
    params.sse2.rounding[1] = rounding;
    params.sse2.right_shift[0] = (uint64_t) right_shift;
    params.sse2.right_shift[1] = (uint64_t) right_shift;
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.output_zero_point[i] = (int16_t) (uint16_t) output_zero_point;
    }
    for (uint32_t i = 0; i < 16; i++) {
      params.sse2.output_max[i] = output_max;
      params.sse2.output_min[i] = output_min;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params.neon.bias = bias;
    params.neon.multiplier = multiplier;
    params.neon.left_shift = (int64_t) -shift;
    params.neon.output_zero_point = (int16_t) (uint16_t) output_zero_point;
    params.neon.output_max = output_max;
    params.neon.output_min = output_min;
  #else
    const uint32_t right_shift = (uint32_t) shift;
    const int64_t rounding = INT64_C(1) << (right_shift - 1);
    params.scalar.bias = bias;
    params.scalar.multiplier = multiplier;
    params.scalar.rounding = rounding;
    params.scalar.right_shift = right_shift;
    params.scalar.output_min_less_zero_point =
      (int32_t) (uint32_t) output_min - (int32_t) (uint32_t) output_zero_point;
    params.scalar.output_max_less_zero_point =
      (int32_t) (uint32_t) output_max - (int32_t) (uint32_t) output_zero_point;
    params.scalar.output_zero_point = (int32_t) (uint32_t) output_zero_point;
  #endif
  return params;
}

static inline union xnn_q8_avgpool_params xnn_compute_scalar_q8_avgpool_params(
  int32_t bias,
  float scale,
  uint8_t output_zero_point,
  uint8_t output_min,
  uint8_t output_max)
{
  // Compute requantization parameters.
  assert(scale >= 0x1.0p-32f);
  assert(scale < 256.0f);
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x00800000, 0x00FFFFFF] range.
  const int32_t multiplier = ((int32_t) scale_bits & INT32_C(0x007FFFFF)) | INT32_C(0x00800000);
  assert(multiplier >= INT32_C(0x00800000));
  assert(multiplier <= INT32_C(0x00FFFFFF));

  // Shift is in [16, 55] range.
  const int32_t shift = 127 + 23 - (scale_bits >> 23);
  assert(shift >= 16);
  assert(shift < 64);

  union xnn_q8_avgpool_params params;
  const uint32_t right_shift = (uint32_t) shift;
  const int64_t rounding = INT64_C(1) << (right_shift - 1);
  params.scalar.bias = bias;
  params.scalar.rounding = rounding;
  params.scalar.multiplier = multiplier;
  params.scalar.right_shift = right_shift;
  params.scalar.output_min_less_zero_point =
    (int32_t) (uint32_t) output_min - (int32_t) (uint32_t) output_zero_point;
  params.scalar.output_max_less_zero_point =
    (int32_t) (uint32_t) output_max - (int32_t) (uint32_t) output_zero_point;
  params.scalar.output_zero_point = (int32_t) (uint32_t) output_zero_point;
  return params;
}

static inline void xnn_update_f32_avgpool_params(
  union xnn_f32_avgpool_params* params,
  float multiplier)
{
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    for (uint32_t i = 0; i < 4; i++) {
      params->sse2.multiplier[i] = multiplier;
    }
  #else
    params->scalar.multiplier = multiplier;
  #endif
}

static inline union xnn_f32_avgpool_params xnn_compute_f32_avgpool_params(
  float multiplier,
  float output_min,
  float output_max)
{
  union xnn_f32_avgpool_params params;
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
  for (uint32_t i = 0; i < 4; i++) {
    params.sse2.multiplier[i] = multiplier;
    params.sse2.output_min[i] = output_min;
    params.sse2.output_max[i] = output_max;
  }
#else
  params.scalar.multiplier = multiplier;
  params.scalar.output_min = output_min;
  params.scalar.output_max = output_max;
#endif
return params;
}

static inline union xnn_f32_gavgpool_params xnn_compute_f32_gavgpool_params(
  float multiplier,
  float output_min,
  float output_max,
  uint32_t width)
{
  union xnn_f32_gavgpool_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    for (uint32_t i = 0; i < 4; i++) {
      params.sse.multiplier[i] = multiplier;
      params.sse.output_min[i] = output_min;
      params.sse.output_max[i] = output_max;
    }
  switch (width % 4) {
    case 0:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[3] = UINT32_C(0xFFFFFFFF);
      break;
    case 1:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = 0;
      params.sse.mask[2] = 0;
      params.sse.mask[3] = 0;
      break;
    case 2:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = 0;
      params.sse.mask[3] = 0;
      break;
    case 3:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[3] = 0;
      break;
  }
#elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    switch (width % 4) {
      case 0:
        params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[1] = 0;
        params.neon.mask[2] = 0;
        params.neon.mask[3] = 0;
        break;
      case 2:
        params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[2] = 0;
        params.neon.mask[3] = 0;
        break;
      case 3:
        params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params.neon.mask[3] = 0;
        break;
    }
    params.neon.multiplier = multiplier;
    params.neon.output_min = output_min;
    params.neon.output_max = output_max;
  #else
    params.scalar.multiplier = multiplier;
    params.scalar.output_min = output_min;
    params.scalar.output_max = output_max;
  #endif
  return params;
}

static inline void xnn_update_f32_gavgpool_params(
  union xnn_f32_gavgpool_params* params,
  float multiplier,
  uint32_t width)
{
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    for (uint32_t i = 0; i < 4; i++) {
      params->sse.multiplier[i] = multiplier;
    }
    switch (width % 4) {
      case 0:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = 0;
        params->sse.mask[2] = 0;
        params->sse.mask[3] = 0;
        break;
      case 2:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = 0;
        params->sse.mask[3] = 0;
        break;
      case 3:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[3] = 0;
        break;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params->neon.multiplier = multiplier;
    switch (width % 4) {
      case 0:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = 0;
        params->neon.mask[2] = 0;
        params->neon.mask[3] = 0;
        break;
      case 2:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = 0;
        params->neon.mask[3] = 0;
        break;
      case 3:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[3] = 0;
        break;
    }
  #endif
}

static inline union xnn_f32_avgpool_params xnn_compute_scalar_f32_avgpool_params(
  float multiplier,
  float output_min,
  float output_max)
{
  union xnn_f32_avgpool_params params;
  params.scalar.multiplier = multiplier;
  params.scalar.output_min = output_min;
  params.scalar.output_max = output_max;
  return params;
}

static inline union xnn_f32_gavgpool_params xnn_compute_scalar_f32_gavgpool_params(
  float multiplier,
  float output_min,
  float output_max,
  uint32_t width)
{
  union xnn_f32_gavgpool_params params;
  params.scalar.multiplier = multiplier;
  params.scalar.output_min = output_min;
  params.scalar.output_max = output_max;
  return params;
}

static inline union xnn_f32_output_params xnn_compute_f32_output_params(
  float output_min,
  float output_max)
{
  union xnn_f32_output_params params;
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
  for (uint32_t i = 0; i < 4; i++) {
    params.sse.min[i] = output_min;
    params.sse.max[i] = output_max;
  }
#else
  params.scalar.min = output_min;
  params.scalar.max = output_max;
#endif
  return params;
}

static inline union xnn_f32_output_params xnn_compute_scalar_f32_output_params(
  float output_min,
  float output_max)
{
  union xnn_f32_output_params params;
  params.scalar.min = output_min;
  params.scalar.max = output_max;
  return params;
}

static inline union xnn_f32_hswish_params xnn_compute_f32_hswish_params(void)
{
  union xnn_f32_hswish_params params;
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
  for (uint32_t i = 0; i < 4; i++) {
    params.sse.sixth[i] = 0x1.555556p-3f;
    params.sse.half[i] = 0.5f;
    params.sse.one[i] = 1.0f;
  }
#else
  params.scalar.sixth = 0x1.555556p-3f;
  params.scalar.half = 0.5f;
  params.scalar.one = 1.0f;
#endif
  return params;
}

static inline union xnn_f32_hswish_params xnn_compute_scalar_f32_hswish_params(void)
{
  union xnn_f32_hswish_params params;
  params.scalar.sixth = 0x1.555556p-3f;
  params.scalar.half = 0.5f;
  params.scalar.one = 1.0f;
  return params;
}

static inline union xnn_f32_spchw_params xnn_compute_f32_spchw_params(
  uint32_t width,
  float output_min,
  float output_max)
{
  union xnn_f32_spchw_params params;
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
  switch (width % 4) {
    case 0:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[3] = UINT32_C(0xFFFFFFFF);
      break;
    case 1:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = 0;
      params.sse.mask[2] = 0;
      params.sse.mask[3] = 0;
      break;
    case 2:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = 0;
      params.sse.mask[3] = 0;
      break;
    case 3:
      params.sse.mask[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask[3] = 0;
      break;
  }
  switch (width % 8) {
    case 0:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[3] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[3] = UINT32_C(0xFFFFFFFF);
      break;
    case 1:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = 0;
      params.sse.mask_even[2] = 0;
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = 0;
      params.sse.mask_odd[1] = 0;
      params.sse.mask_odd[2] = 0;
      params.sse.mask_odd[3] = 0;
      break;
    case 2:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = 0;
      params.sse.mask_even[2] = 0;
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = 0;
      params.sse.mask_odd[2] = 0;
      params.sse.mask_odd[3] = 0;
      break;
    case 3:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = 0;
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = 0;
      params.sse.mask_odd[2] = 0;
      params.sse.mask_odd[3] = 0;
      break;
    case 4:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = 0;
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[2] = 0;
      params.sse.mask_odd[3] = 0;
      break;
    case 5:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[2] = 0;
      params.sse.mask_odd[3] = 0;
      break;
    case 6:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[3] = 0;
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[3] = 0;
      break;
    case 7:
      params.sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_even[3] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.sse.mask_odd[3] = 0;
      break;
  }
  for (uint32_t i = 0; i < 4; i++) {
    params.sse.max[i] = output_max;
    params.sse.min[i] = output_min;
  }
#elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
  switch (width % 4) {
    case 0:
      params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[3] = UINT32_C(0xFFFFFFFF);
      break;
    case 1:
      params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[1] = 0;
      params.neon.mask[2] = 0;
      params.neon.mask[3] = 0;
      break;
    case 2:
      params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[2] = 0;
      params.neon.mask[3] = 0;
      break;
    case 3:
      params.neon.mask[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask[3] = 0;
      break;
  }
  switch (width % 8) {
    case 0:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[3] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[3] = UINT32_C(0xFFFFFFFF);
      break;
    case 1:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = 0;
      params.neon.mask_even[2] = 0;
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = 0;
      params.neon.mask_odd[1] = 0;
      params.neon.mask_odd[2] = 0;
      params.neon.mask_odd[3] = 0;
      break;
    case 2:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = 0;
      params.neon.mask_even[2] = 0;
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = 0;
      params.neon.mask_odd[2] = 0;
      params.neon.mask_odd[3] = 0;
      break;
    case 3:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = 0;
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = 0;
      params.neon.mask_odd[2] = 0;
      params.neon.mask_odd[3] = 0;
      break;
    case 4:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = 0;
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[2] = 0;
      params.neon.mask_odd[3] = 0;
      break;
    case 5:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[2] = 0;
      params.neon.mask_odd[3] = 0;
      break;
    case 6:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[3] = 0;
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[3] = 0;
      break;
    case 7:
      params.neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_even[3] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
      params.neon.mask_odd[3] = 0;
      break;
  }
  params.neon.max = output_max;
  params.neon.min = output_min;
#else
  params.scalar.max = output_max;
  params.scalar.min = output_min;
#endif
  return params;
}

static inline void xnn_update_f32_spchw_params(
  union xnn_f32_spchw_params* params,
  uint32_t width)
{
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    switch (width % 4) {
      case 0:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = 0;
        params->sse.mask[2] = 0;
        params->sse.mask[3] = 0;
        break;
      case 2:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = 0;
        params->sse.mask[3] = 0;
        break;
      case 3:
        params->sse.mask[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask[3] = 0;
        break;
    }
    switch (width % 8) {
      case 0:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[3] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = 0;
        params->sse.mask_even[2] = 0;
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = 0;
        params->sse.mask_odd[1] = 0;
        params->sse.mask_odd[2] = 0;
        params->sse.mask_odd[3] = 0;
        break;
      case 2:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = 0;
        params->sse.mask_even[2] = 0;
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = 0;
        params->sse.mask_odd[2] = 0;
        params->sse.mask_odd[3] = 0;
        break;
      case 3:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = 0;
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = 0;
        params->sse.mask_odd[2] = 0;
        params->sse.mask_odd[3] = 0;
        break;
      case 4:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = 0;
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[2] = 0;
        params->sse.mask_odd[3] = 0;
        break;
      case 5:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[2] = 0;
        params->sse.mask_odd[3] = 0;
        break;
      case 6:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[3] = 0;
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[3] = 0;
        break;
      case 7:
        params->sse.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_even[3] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->sse.mask_odd[3] = 0;
        break;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    switch (width % 4) {
      case 0:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = 0;
        params->neon.mask[2] = 0;
        params->neon.mask[3] = 0;
        break;
      case 2:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = 0;
        params->neon.mask[3] = 0;
        break;
      case 3:
        params->neon.mask[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask[3] = 0;
        break;
    }
    switch (width % 8) {
      case 0:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[3] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[3] = UINT32_C(0xFFFFFFFF);
        break;
      case 1:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = 0;
        params->neon.mask_even[2] = 0;
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = 0;
        params->neon.mask_odd[1] = 0;
        params->neon.mask_odd[2] = 0;
        params->neon.mask_odd[3] = 0;
        break;
      case 2:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = 0;
        params->neon.mask_even[2] = 0;
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = 0;
        params->neon.mask_odd[2] = 0;
        params->neon.mask_odd[3] = 0;
        break;
      case 3:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = 0;
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = 0;
        params->neon.mask_odd[2] = 0;
        params->neon.mask_odd[3] = 0;
        break;
      case 4:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = 0;
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[2] = 0;
        params->neon.mask_odd[3] = 0;
        break;
      case 5:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[2] = 0;
        params->neon.mask_odd[3] = 0;
        break;
      case 6:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[3] = 0;
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[3] = 0;
        break;
      case 7:
        params->neon.mask_even[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_even[3] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[0] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[1] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[2] = UINT32_C(0xFFFFFFFF);
        params->neon.mask_odd[3] = 0;
        break;
    }
  #endif
}

static inline union xnn_f32_spchw_params xnn_compute_scalar_f32_spchw_params(
  uint32_t width,
  float output_min,
  float output_max)
{
  union xnn_f32_spchw_params params;
  params.scalar.max = output_max;
  params.scalar.min = output_min;
  return params;
}

static inline union xnn_u8_output_params xnn_compute_u8_output_params(
  uint8_t output_min,
  uint8_t output_max)
{
  assert(output_min < output_max);

  union xnn_u8_output_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    for (uint32_t i = 0; i < 16; i++) {
      params.sse2.max[i] = output_max;
      params.sse2.min[i] = output_min;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params.neon.max = output_max;
    params.neon.min = output_min;
  #else
    params.scalar.min = (int32_t) (uint32_t) output_min;
    params.scalar.max = (int32_t) (uint32_t) output_max;
  #endif
  return params;
}

static inline union xnn_u8_output_params xnn_compute_scalar_u8_output_params(
  uint8_t output_min,
  uint8_t output_max)
{
  assert(output_min < output_max);

  union xnn_u8_output_params params;
  params.scalar.min = (int32_t) (uint32_t) output_min;
  params.scalar.max = (int32_t) (uint32_t) output_max;
  return params;
}

static inline union xnn_q8_add_params xnn_compute_q8_add_params(
  uint8_t a_zero_point,
  uint8_t b_zero_point,
  uint8_t output_zero_point,
  float a_output_scale,
  float b_output_scale,
  uint8_t output_min,
  uint8_t output_max)
{
  assert(a_output_scale >= 0x1.0p-14f);
  assert(b_output_scale >= 0x1.0p-14f);
  assert(a_output_scale < 0x1.0p+8f);
  assert(b_output_scale < 0x1.0p+8f);

  // Compute requantization parameters.
  const float max_output_scale = a_output_scale > b_output_scale ? a_output_scale : b_output_scale;
  assert(max_output_scale >= 0x1.0p-14f);
  assert(max_output_scale < 0x1.0p+8f);
  const uint32_t max_scale_bits = fp32_to_bits(max_output_scale);
  const int32_t max_scale_exponent = (int32_t) (max_scale_bits >> 23) - 127;
  // Shift is in [13, 31] range.
  const uint32_t shift = (uint32_t) (21 - max_scale_exponent);
  assert(shift < 32);
  assert(shift >= 13);

  const float scale_multiplier = fp32_from_bits((uint32_t) (21 - max_scale_exponent + 127) << 23);

  // Multipliers are in [0, 2**22) range, largest multiplier is in [2**21, 2**22) range.
  const uint32_t a_multiplier = (uint32_t) (int32_t) __builtin_lrintf(a_output_scale * scale_multiplier);
  const uint32_t b_multiplier = (uint32_t) (int32_t) __builtin_lrintf(b_output_scale * scale_multiplier);
  assert((a_multiplier > b_multiplier ? a_multiplier : b_multiplier) >= UINT32_C(0x00200000));
  assert(a_multiplier < UINT32_C(0x00400000));
  assert(b_multiplier < UINT32_C(0x00400000));

  union xnn_q8_add_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    const int32_t zero_point_product =
      (int32_t) -(a_multiplier * (uint32_t) a_zero_point + b_multiplier * (uint32_t) b_zero_point);
    for (uint32_t i = 0; i < 4; i++) {
      params.sse2.zero_point_product[i] = zero_point_product;
    }
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.y_zero_point[i] = (int16_t) (uint16_t) output_zero_point;
    }
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.a_multiplier_lo[i] = (uint16_t) (uint32_t) a_multiplier;
      params.sse2.a_multiplier_hi[i] = (uint16_t) ((uint32_t) a_multiplier >> 16);
      params.sse2.b_multiplier_lo[i] = (uint16_t) (uint32_t) b_multiplier;
      params.sse2.b_multiplier_hi[i] = (uint16_t) ((uint32_t) b_multiplier >> 16);
    }
    params.sse2.a_multiplier = a_multiplier;
    params.sse2.b_multiplier = b_multiplier;
    for (uint32_t i = 0; i < 4; i++) {
      params.sse2.remainder_mask[i] = remainder_mask;
      params.sse2.remainder_threshold[i] = remainder_threshold;
    }
    params.sse2.shift = shift;
    for (uint32_t i = 0; i < 16; i++) {
      params.sse2.y_max[i] = output_max;
      params.sse2.y_min[i] = output_min;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params.neon.a_zero_point = a_zero_point;
    params.neon.b_zero_point = b_zero_point;
    params.neon.y_zero_point = (int16_t) (uint16_t) output_zero_point;
    params.neon.a_multiplier = (int32_t) a_multiplier;
    params.neon.b_multiplier = (int32_t) b_multiplier;
    params.neon.right_shift = (int32_t) -shift;
    params.neon.y_max = output_max;
    params.neon.y_min = output_min;
  #else
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    params.scalar.zero_point_product =
      (int32_t) -(a_multiplier * (uint32_t) a_zero_point + b_multiplier * (uint32_t) b_zero_point);
    params.scalar.a_multiplier = a_multiplier;
    params.scalar.b_multiplier = b_multiplier;
    params.scalar.remainder_mask = (int32_t) remainder_mask;
    params.scalar.remainder_threshold = (int32_t) remainder_threshold;
    params.scalar.shift = shift;
    params.scalar.y_zero_point = (int32_t) (uint32_t) output_zero_point;
    params.scalar.y_max = (int32_t) (uint32_t) output_max;
    params.scalar.y_min = (int32_t) (uint32_t) output_min;
  #endif
  return params;
}

static inline union xnn_q8_add_params xnn_compute_scalar_q8_add_params(
  uint8_t a_zero_point,
  uint8_t b_zero_point,
  uint8_t output_zero_point,
  float a_output_scale,
  float b_output_scale,
  uint8_t output_min,
  uint8_t output_max)
{
  assert(a_output_scale >= 0x1.0p-10f);
  assert(b_output_scale >= 0x1.0p-10f);
  assert(a_output_scale < 0x1.0p+8f);
  assert(b_output_scale < 0x1.0p+8f);

  // Compute requantization parameters.
  const float max_output_scale = a_output_scale > b_output_scale ? a_output_scale : b_output_scale;
  assert(max_output_scale >= 0x1.0p-10f);
  assert(max_output_scale < 0x1.0p+8f);
  const uint32_t max_scale_bits = fp32_to_bits(max_output_scale);
  const int32_t max_scale_exponent = (int32_t) (max_scale_bits >> 23) - 127;
  // Shift is in [13, 31] range.
  const uint32_t shift = (uint32_t) (21 - max_scale_exponent);
  assert(shift < 32);
  assert(shift >= 13);

  // Multipliers are in [0, 2**22) range, largest multiplier is in [2**21, 2**22) range.
  const uint32_t a_multiplier = (uint32_t) (int32_t) __builtin_lrintf(fp32_from_bits(fp32_to_bits(a_output_scale) + (shift << 23)));
  const uint32_t b_multiplier = (uint32_t) (int32_t) __builtin_lrintf(fp32_from_bits(fp32_to_bits(b_output_scale) + (shift << 23)));
  assert((a_multiplier > b_multiplier ? a_multiplier : b_multiplier) >= UINT32_C(0x00200000));
  assert(a_multiplier < UINT32_C(0x00400000));
  assert(b_multiplier < UINT32_C(0x00400000));

  union xnn_q8_add_params params;
  const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
  const uint32_t remainder_threshold = remainder_mask >> 1;
  params.scalar.zero_point_product =
    (int32_t) -(a_multiplier * (uint32_t) a_zero_point + b_multiplier * (uint32_t) b_zero_point);
  params.scalar.a_multiplier = a_multiplier;
  params.scalar.b_multiplier = b_multiplier;
  params.scalar.remainder_mask = (int32_t) remainder_mask;
  params.scalar.remainder_threshold = (int32_t) remainder_threshold;
  params.scalar.shift = shift;
  params.scalar.y_zero_point = (int32_t) (uint32_t) output_zero_point;
  params.scalar.y_max = (int32_t) (uint32_t) output_max;
  params.scalar.y_min = (int32_t) (uint32_t) output_min;
  return params;
}

static inline union xnn_q31_requantization_params xnn_compute_scalar_requantization_params(
  float scale,
  uint8_t zero_point,
  uint8_t min,
  uint8_t max)
{
  // Compute requantization parameters.
  assert(scale < 1.0f);
  assert(scale >= 0x1.0p-32f);
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x40000000, 0x7FFFFF80] range.
  const int32_t multiplier = (int32_t)(((scale_bits & UINT32_C(0x007FFFFF)) | UINT32_C(0x00800000)) << 7);
  assert(multiplier >= INT32_C(0x40000000));
  assert(multiplier <= INT32_C(0x7FFFFF80));

  // Shift is in [0, 31] range.
  const int32_t shift = 127 + 31 - 32 - (fp32_to_bits(scale) >> 23);
  assert(shift >= 0);
  assert(shift < 32);

  union xnn_q31_requantization_params params;
  const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
  const uint32_t remainder_threshold = remainder_mask >> 1;
  params.scalar.multiplier = multiplier;
  params.scalar.remainder_mask = (int32_t) remainder_mask;
  params.scalar.remainder_threshold = (int32_t) remainder_threshold;
  params.scalar.shift = (uint32_t) shift;
  params.scalar.min_less_zero_point = (int32_t) (uint32_t) min - (int32_t) (uint32_t) zero_point;
  params.scalar.max_less_zero_point = (int32_t) (uint32_t) max - (int32_t) (uint32_t) zero_point;
  params.scalar.zero_point = (int32_t) (uint32_t) zero_point;
  return params;
}

static inline union xnn_q31_requantization_params xnn_compute_requantization_params(
  float scale,
  uint8_t zero_point,
  uint8_t min,
  uint8_t max)
{
  // Compute requantization parameters.
  const uint32_t scale_bits = fp32_to_bits(scale);

  // Multiplier is in [0x40000000, 0x7FFFFF80] range.
  const int32_t multiplier = (int32_t)(((scale_bits & UINT32_C(0x007FFFFF)) | UINT32_C(0x00800000)) << 7);
  assert(multiplier >= INT32_C(0x40000000));
  assert(multiplier <= INT32_C(0x7FFFFF80));

  // Shift is in [0, 31] range.
  const int32_t shift = 127 + 31 - 32 - (fp32_to_bits(scale) >> 23);
  assert(shift >= 0);
  assert(shift < 32);

  union xnn_q31_requantization_params params;
  #if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    params.sse2.multiplier[0] = multiplier;
    params.sse2.multiplier[1] = multiplier;
    params.sse2.multiplier[2] = multiplier;
    params.sse2.multiplier[3] = multiplier;
    params.sse2.rounding[0] = UINT64_C(0x40000000);
    params.sse2.rounding[1] = UINT64_C(0x40000000);
    params.sse2.remainder_mask[0] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[1] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[2] = (int32_t) remainder_mask;
    params.sse2.remainder_mask[3] = (int32_t) remainder_mask;
    params.sse2.remainder_threshold[0] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[1] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[2] = (int32_t) remainder_threshold;
    params.sse2.remainder_threshold[3] = (int32_t) remainder_threshold;
    params.sse2.shift[0] = (uint64_t) (uint32_t) shift;
    params.sse2.shift[1] = (uint64_t) (uint32_t) shift;
    for (uint32_t i = 0; i < 8; i++) {
      params.sse2.zero_point[i] = (int16_t) (uint16_t) zero_point;
    }
    for (uint32_t i = 0; i < 16; i++) {
      params.sse2.max[i] = max;
      params.sse2.min[i] = min;
    }
  #elif CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
    params.neon.multiplier = multiplier;
    params.neon.right_shift = -shift;
    params.neon.zero_point = (int16_t) (uint16_t) zero_point;
    params.neon.max = max;
    params.neon.min = min;
  #else
    const uint32_t remainder_mask = (UINT32_C(1) << shift) - UINT32_C(1);
    const uint32_t remainder_threshold = remainder_mask >> 1;
    params.scalar.multiplier = multiplier;
    params.scalar.remainder_mask = (int32_t) remainder_mask;
    params.scalar.remainder_threshold = (int32_t) remainder_threshold;
    params.scalar.shift = (uint32_t) shift;
    params.scalar.min_less_zero_point = (int32_t) (uint32_t) min - (int32_t) (uint32_t) zero_point;
    params.scalar.max_less_zero_point = (int32_t) (uint32_t) max - (int32_t) (uint32_t) zero_point;
    params.scalar.zero_point = (int32_t) (uint32_t) zero_point;
  #endif
  return params;
}

static inline uint8_t xnn_q31_requantize(
  int32_t n,
  union xnn_q31_requantization_params params)
{
  const int64_t product = (int64_t) n * (int64_t) params.scalar.multiplier;
  const int32_t q31product = (int32_t) (uint32_t) ((uint64_t) (product + INT64_C(0x40000000)) >> 31);
  const int32_t remainder = (q31product & params.scalar.remainder_mask) - (int32_t) (n < 0);
  n = asr_s32(q31product, params.scalar.shift) + (int32_t) (remainder > params.scalar.remainder_threshold);
  if (n < params.scalar.min_less_zero_point) {
    n = params.scalar.min_less_zero_point;
  }
  if (n > params.scalar.max_less_zero_point) {
    n = params.scalar.max_less_zero_point;
  }

  return (uint8_t) (n + params.scalar.zero_point);
}

static inline uint8_t xnn_avgpool_quantize(
  int32_t n,
  union xnn_q8_avgpool_params params)
{
  const int64_t product = (int64_t) n * (int64_t) params.scalar.multiplier;
  const int64_t adjusted_product = product - (int64_t) (n < 0);

  n = (int32_t) asr_s64(adjusted_product + params.scalar.rounding, params.scalar.right_shift);
  if (n < params.scalar.output_min_less_zero_point) {
    n = params.scalar.output_min_less_zero_point;
  }
  if (n > params.scalar.output_max_less_zero_point) {
    n = params.scalar.output_max_less_zero_point;
  }

  return (uint8_t) (n + params.scalar.output_zero_point);
}

static inline uint8_t xnn_add_quantize(
  uint8_t a, uint8_t b,
  union xnn_q8_add_params params)
{
  // Multiply by factors and accumulate products.
  int32_t acc = params.scalar.zero_point_product +
    (int32_t) ((uint32_t) a * params.scalar.a_multiplier) +
    (int32_t) ((uint32_t) b * params.scalar.b_multiplier);

  // Shift right and round.
  const int32_t rem = (acc & params.scalar.remainder_mask) - (int32_t) (acc < 0);
  acc = asr_s32(acc, params.scalar.shift) + (int32_t) (rem > params.scalar.remainder_threshold);

  // Clamp and add output zero point.
  int32_t y = acc + params.scalar.y_zero_point;
  if (y >= params.scalar.y_max) {
    y = params.scalar.y_max;
  }
  if (y <= params.scalar.y_min) {
    y = params.scalar.y_min;
  }
  return (uint8_t) y;
}
