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

$assert SSE == 4
$assert not XOP or AVX
$assert not AVX or SSE == 4
$assert REQUANTIZATION == "FP32"
$assert DATATYPE in ["QC8", "QS8", "QU8"]
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$assert CHANNEL_TILE % 8 == 0
$assert CHANNEL_TILE >= 8
$assert KERNEL_TILE >= 2
#include <assert.h>

$if XOP:
  #if defined(__GNUC__) || defined(__clang__)
    #include <x86intrin.h>
  #else
    #include <immintrin.h>
    #include <ammintrin.h>
  #endif
$else:
  #include <immintrin.h>

#include <xnnpack/dwconv.h>
#include <xnnpack/intrinsics-polyfill.h>


$PARAMS_UNION = "xnn_qs8_minmax_params" if DATATYPE == "QC8" else "xnn_%s_conv_minmax_params" % DATATYPE.lower()
$PARAMS_STRUCT = {"QC8": "sse4", "QS8": REQUANTIZATION.lower() + "_sse4", "QU8": REQUANTIZATION.lower() + "_sse2"}[DATATYPE]
$ISA = "xop" if XOP else "avx" if AVX else {4: "sse41"}[SSE]
$XINT8_T = "uint8_t" if DATATYPE == "QU8" else "int8_t"
void xnn_${DATATYPE.lower()}_dwconv_minmax_${REQUANTIZATION.lower()}_ukernel_up${CHANNEL_TILE}x${KERNEL_TILE}__${ISA}_mul32(
    size_t channels,
    size_t output_width,
    const ${XINT8_T}** input,
    const void* weights,
    ${XINT8_T}* output,
    size_t input_stride,
    size_t output_increment,
    size_t input_offset,
    const ${XINT8_T}* zero,
    const union ${PARAMS_UNION} params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS
{
  assert(channels != 0);
  assert(output_width != 0);

  $if DATATYPE == "QU8":
    const __m128i vk_zero_point = _mm_cvtepu16_epi32(_mm_loadl_epi64((const __m128i*) params->${PARAMS_STRUCT}.kernel_zero_point));
  do {
    $for K in range(KERNEL_TILE):
      const ${XINT8_T}* i${K} = input[${K}];
      assert(i${K} != NULL);
      if XNN_UNPREDICTABLE(i${K} != zero) {
        i${K} = (const ${XINT8_T}*) ((uintptr_t) i${K} + input_offset);
      }
    input = (const ${XINT8_T}**) ((uintptr_t) input + input_stride);

    size_t c = channels;
    const void* w = weights;
    for (; c >= ${CHANNEL_TILE}; c -= ${CHANNEL_TILE}) {
      __m128i vacc${ABC[0:4]} = _mm_loadu_si128((const __m128i*) w);
      $for C in range(4, CHANNEL_TILE, 4):
        __m128i vacc${ABC[C:C+4]} = _mm_loadu_si128((const __m128i*) ((const int32_t*) w + ${C}));

      $for K in range(KERNEL_TILE):

        $for C in range(0, CHANNEL_TILE, 4):
          $if DATATYPE == "QU8":
            $if C == 0:
              const __m128i vi${K}x${ABC[0:4]} = _mm_cvtepu8_epi32(_mm_loadu_si32(i${K}));
            $else:
              const __m128i vi${K}x${ABC[C:C+4]} = _mm_cvtepu8_epi32(_mm_loadu_si32(i${K} + ${C}));
            const __m128i vk${K}x${ABC[C:C+4]} = _mm_sub_epi32(_mm_cvtepu8_epi32(_mm_loadu_si32((const void*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE + C} * sizeof(${XINT8_T})))), vk_zero_point);
          $else:
            $if C == 0:
              const __m128i vi${K}x${ABC[0:4]} = _mm_cvtepi8_epi32(_mm_loadu_si32(i${K}));
            $else:
              const __m128i vi${K}x${ABC[C:C+4]} = _mm_cvtepi8_epi32(_mm_loadu_si32(i${K} + ${C}));
            const __m128i vk${K}x${ABC[C:C+4]} = _mm_cvtepi8_epi32(_mm_loadu_si32((const void*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE + C} * sizeof(${XINT8_T}))));
        i${K} += ${CHANNEL_TILE};

        $for C in range(0, CHANNEL_TILE, 4):
          $if XOP:
            vacc${ABC[C:C+4]} = _mm_macc_epi32(vi${K}x${ABC[C:C+4]}, vk${K}x${ABC[C:C+4]}, vacc${ABC[C:C+4]});
          $else:
            vacc${ABC[C:C+4]} = _mm_add_epi32(vacc${ABC[C:C+4]}, _mm_mullo_epi32(vi${K}x${ABC[C:C+4]}, vk${K}x${ABC[C:C+4]}));

      w = (const void*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${KERNEL_TILE * CHANNEL_TILE} * sizeof(${XINT8_T}));

      $for C in range(0, CHANNEL_TILE, 4):
        __m128 vscaled${ABC[C:C+4]} = _mm_cvtepi32_ps(vacc${ABC[C:C+4]});

      $if DATATYPE == "QC8":
        const __m128 vscale${ABC[0:4]} = _mm_loadu_ps((const float*) w);
        $for C in range(4, CHANNEL_TILE, 4):
          const __m128 vscale${ABC[C:C+4]} = _mm_loadu_ps((const float*) w + ${C});
        w = (const void*) ((const float*) w + ${CHANNEL_TILE});
        $for C in range(0, CHANNEL_TILE, 4):
          vscaled${ABC[C:C+4]} = _mm_mul_ps(vscaled${ABC[C:C+4]}, vscale${ABC[C:C+4]});
      $else:
        const __m128 vscale = _mm_load_ps(params->${PARAMS_STRUCT}.scale);
        $for C in range(0, CHANNEL_TILE, 4):
          vscaled${ABC[C:C+4]} = _mm_mul_ps(vscaled${ABC[C:C+4]}, vscale);

      const __m128 voutput_max_less_zero_point = _mm_load_ps(params->${PARAMS_STRUCT}.output_max_less_zero_point);
      $for C in range(0, CHANNEL_TILE, 4):
        vscaled${ABC[C:C+4]} = _mm_min_ps(vscaled${ABC[C:C+4]}, voutput_max_less_zero_point);

      $for C in range(0, CHANNEL_TILE, 4):
        vacc${ABC[C:C+4]} = _mm_cvtps_epi32(vscaled${ABC[C:C+4]});

      const __m128i voutput_zero_point = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_zero_point);
      $for C in range(0, CHANNEL_TILE, 8):
        __m128i vout${ABC[C:C+8]} = _mm_adds_epi16(_mm_packs_epi32(vacc${ABC[C:C+4]}, vacc${ABC[C+4:C+8]}), voutput_zero_point);

      const __m128i voutput_min = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min);
      $if DATATYPE == "QU8":
        $for C in range(0, CHANNEL_TILE, 16):
          $if C + 8 < CHANNEL_TILE:
            __m128i vout${ABC[C:C+16]} = _mm_packus_epi16(vout${ABC[C:C+8]}, vout${ABC[C+8:C+16]});
            vout${ABC[C:C+16]} = _mm_max_epu8(vout${ABC[C:C+16]}, voutput_min);
          $else:
            __m128i vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_packus_epi16(vout${ABC[C:C+8]}, vout${ABC[C:C+8]});
            vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_max_epu8(vout${ABC[C:C+8]}${ABC[C:C+8]}, voutput_min);
      $else:
        $for C in range(0, CHANNEL_TILE, 16):
          $if C + 8 < CHANNEL_TILE:
            __m128i vout${ABC[C:C+16]} = _mm_packs_epi16(vout${ABC[C:C+8]}, vout${ABC[C+8:C+16]});
            vout${ABC[C:C+16]} = _mm_max_epi8(vout${ABC[C:C+16]}, voutput_min);
          $else:
            __m128i vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_packs_epi16(vout${ABC[C:C+8]}, vout${ABC[C:C+8]});
            vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_max_epi8(vout${ABC[C:C+8]}${ABC[C:C+8]}, voutput_min);

      $if CHANNEL_TILE > 8:
        _mm_storeu_si128((__m128i*) output, vout${ABC[0:16]});
      $else:
        _mm_storel_epi64((__m128i*) output, vout${ABC[0:8]}${ABC[0:8]});
      $for C in range(16, CHANNEL_TILE, 16):
        $if C + 8 < CHANNEL_TILE:
          _mm_storeu_si128((__m128i*) (output + ${C}), vout${ABC[C:C+16]});
        $else:
          _mm_storel_epi64((__m128i*) (output + ${C}), vout${ABC[C:C+8]}${ABC[C:C+8]});
      output += ${CHANNEL_TILE};
    }
    if XNN_UNLIKELY(c != 0) {
      $if CHANNEL_TILE > 4:
        const ${XINT8_T}* k = (const ${XINT8_T}*) ((const int32_t*) w + ${CHANNEL_TILE});
      ${"do " if CHANNEL_TILE > 4 else ""}{
        __m128i vacc${ABC[0:4]} = _mm_loadu_si128((const __m128i*) w);

        $for K in range(KERNEL_TILE):
          $if DATATYPE == "QU8":
            const __m128i vi${K}x${ABC[0:4]} = _mm_cvtepu8_epi32(_mm_loadu_si32(i${K}));
            $if CHANNEL_TILE > 4:
              $if K == 0:
                const __m128i vk${K}x${ABC[0:4]} = _mm_sub_epi32(_mm_cvtepu8_epi32(_mm_loadu_si32(k)), vk_zero_point);
              $else:
                const __m128i vk${K}x${ABC[0:4]} = _mm_sub_epi32(_mm_cvtepu8_epi32(_mm_loadu_si32((const void*) (k + ${K * CHANNEL_TILE}))), vk_zero_point);
            $else:
              const __m128i vk${K}x${ABC[0:4]} = _mm_sub_epi32(_mm_cvtepu8_epi32(_mm_loadu_si32((const void*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE} * sizeof(${XINT8_T})))), vk_zero_point);
          $else:
            const __m128i vi${K}x${ABC[0:4]} = _mm_cvtepi8_epi32(_mm_loadu_si32(i${K}));
            $if CHANNEL_TILE > 4:
              $if K == 0:
                const __m128i vk${K}x${ABC[0:4]} = _mm_cvtepi8_epi32(_mm_loadu_si32(k));
              $else:
                const __m128i vk${K}x${ABC[0:4]} = _mm_cvtepi8_epi32(_mm_loadu_si32((const void*) (k + ${K * CHANNEL_TILE})));
            $else:
              const __m128i vk${K}x${ABC[0:4]} = _mm_cvtepi8_epi32(_mm_loadu_si32((const void*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE} * sizeof(${XINT8_T}))));
          $if CHANNEL_TILE > 4:
            i${K} += 4;

          $if XOP:
            vacc${ABC[0:4]} = _mm_macc_epi32(vi${K}x${ABC[0:4]}, vk${K}x${ABC[0:4]}, vacc${ABC[0:4]});
          $else:
            vacc${ABC[0:4]} = _mm_add_epi32(vacc${ABC[0:4]}, _mm_mullo_epi32(vi${K}x${ABC[0:4]}, vk${K}x${ABC[0:4]}));

        $if CHANNEL_TILE > 4:
          k += 4;

        __m128 vscaled${ABC[0:4]} = _mm_cvtepi32_ps(vacc${ABC[0:4]});
        $if DATATYPE == "QC8":
          const __m128 vscale${ABC[0:4]} = _mm_loadu_ps((const float*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${CHANNEL_TILE * KERNEL_TILE} * sizeof(${XINT8_T})));
          vscaled${ABC[0:4]} = _mm_mul_ps(vscaled${ABC[0:4]}, vscale${ABC[0:4]});
        $else:
          vscaled${ABC[0:4]} = _mm_mul_ps(vscaled${ABC[0:4]}, _mm_load_ps(params->${PARAMS_STRUCT}.scale));
        vscaled${ABC[0:4]} = _mm_min_ps(vscaled${ABC[0:4]}, _mm_load_ps(params->${PARAMS_STRUCT}.output_max_less_zero_point));
        vacc${ABC[0:4]} = _mm_cvtps_epi32(vscaled${ABC[0:4]});

        $if CHANNEL_TILE > 4:
          w = (const void*) ((const int32_t*) w + 4);

        const __m128i voutput_zero_point = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_zero_point);
        __m128i vout${ABC[0:4]} = _mm_adds_epi16(_mm_packs_epi32(vacc${ABC[0:4]}, vacc${ABC[0:4]}), voutput_zero_point);

        $if DATATYPE == "QU8":
          vout${ABC[0:4]} = _mm_packus_epi16(vout${ABC[0:4]}, vout${ABC[0:4]});
          vout${ABC[0:4]} = _mm_max_epu8(vout${ABC[0:4]}, _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min));
        $else:
          vout${ABC[0:4]} = _mm_packs_epi16(vout${ABC[0:4]}, vout${ABC[0:4]});
          vout${ABC[0:4]} = _mm_max_epi8(vout${ABC[0:4]}, _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min));

        $if CHANNEL_TILE > 4:
          if XNN_LIKELY(c >= 4) {
            _mm_storeu_si32(output, vout${ABC[0:4]});
            output += 4;
            c -= 4;
          } else {
            if (c & 2) {
              *((uint16_t*) output) = (uint16_t) _mm_extract_epi16(vout${ABC[0:4]}, 0);
              vout${ABC[0:4]} = _mm_srli_epi32(vout${ABC[0:4]}, 16);
              output += 2;
            }
            if (c & 1) {
              *output = (${XINT8_T}) _mm_extract_epi8(vout${ABC[0:4]}, 0);
              output += 1;
            }
            c = 0;
          }
        $else:
          if (c & 2) {
            *((uint16_t*) output) = (uint16_t) _mm_extract_epi16(vout${ABC[0:4]}, 0);
            vout${ABC[0:4]} = _mm_srli_epi32(vout${ABC[0:4]}, 16);
            output += 2;
          }
          if (c & 1) {
            *output = (${XINT8_T}) _mm_extract_epi8(vout${ABC[0:4]}, 0);
            output += 1;
          }
      }${" while (c != 0);" if CHANNEL_TILE > 4 else ""}
    }

    output = (${XINT8_T}*) ((uintptr_t) output + output_increment);
  } while (--output_width != 0);
}
