// 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 in [2, 4]
$assert not XOP or AVX
$assert not AVX or SSE == 4
$assert REQUANTIZATION == "FP32"
$assert DATATYPE in ["QC8", "QS8", "QU8"]
$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
$SSE_HEADER = {2: "emmintrin.h", 4: "smmintrin.h"}[SSE]
$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 <${SSE_HEADER}>

#include <xnnpack/dwconv.h>
#include <xnnpack/unaligned.h>


$PARAMS_STRUCT = REQUANTIZATION.lower() + "_" + ("sse4" if SSE == 4 and DATATYPE != "QU8" else "sse2")
$PARAMS_UNION = "xnn_%s_conv_minmax_params" % DATATYPE.lower()
$ISA = "xop" if XOP else "avx" if AVX else {2: "sse2", 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}_mul16${"_add16" if ADD16 else ""}(
    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);

  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;
    $if DATATYPE == "QU8":
      const __m128i vk_zero_point = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.kernel_zero_point);
    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, 8):
          $if C == 0:
            const __m128i vi${K}x${ABC[0:8]} = _mm_loadl_epi64((const __m128i*) i${K});
          $else:
            const __m128i vi${K}x${ABC[C:C+8]} = _mm_loadl_epi64((const __m128i*) (i${K} + ${C}));
          $if SSE == 4:
            $if DATATYPE == "QU8":
              const __m128i vxi${K}x${ABC[C:C+8]} = _mm_cvtepu8_epi16(vi${K}x${ABC[C:C+8]});
            $else:
              const __m128i vxi${K}x${ABC[C:C+8]} = _mm_cvtepi8_epi16(vi${K}x${ABC[C:C+8]});
          const __m128i vk${K}x${ABC[C:C+8]} = _mm_loadl_epi64((const __m128i*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE + C} * sizeof(${XINT8_T})));
          $if SSE == 4:
            $if DATATYPE == "QU8":
              const __m128i vxk${K}x${ABC[C:C+8]} = _mm_sub_epi16(_mm_cvtepu8_epi16(vk${K}x${ABC[C:C+8]}), vk_zero_point);
            $else:
              const __m128i vxk${K}x${ABC[C:C+8]} = _mm_cvtepi8_epi16(vk${K}x${ABC[C:C+8]});
        i${K} += ${CHANNEL_TILE};

        $if SSE < 4:
          $if DATATYPE == "QU8":
            $if K == 0:
              const __m128i vzero = _mm_setzero_si128();
            $for C in range(0, CHANNEL_TILE, 8):
              const __m128i vxi${K}x${ABC[C:C+8]} = _mm_unpacklo_epi8(vi${K}x${ABC[C:C+8]}, vzero);
              const __m128i vxk${K}x${ABC[C:C+8]} = _mm_sub_epi16(_mm_unpacklo_epi8(vk${K}x${ABC[C:C+8]}, vzero), vk_zero_point);
          $else:
            $for C in range(0, CHANNEL_TILE, 8):
              const __m128i vxi${K}x${ABC[C:C+8]} = _mm_srai_epi16(_mm_unpacklo_epi8(vi${K}x${ABC[C:C+8]}, vi${K}x${ABC[C:C+8]}), 8);
              const __m128i vxk${K}x${ABC[C:C+8]} = _mm_srai_epi16(_mm_unpacklo_epi8(vk${K}x${ABC[C:C+8]}, vk${K}x${ABC[C:C+8]}), 8);

        $for C in range(0, CHANNEL_TILE, 8):
          $if DATATYPE == "QU8" or SSE < 4 and not ADD16:
            const __m128i vprod${K}x${ABC[C:C+8]}lo = _mm_mullo_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]});
            const __m128i vprod${K}x${ABC[C:C+8]}hi = _mm_mulhi_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]});
          $elif K == 0:
            __m128i vprod${ABC[C:C+8]} = _mm_mullo_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]});
          $elif K % 2 == 0 or K + 1 == KERNEL_TILE or not ADD16:
            vprod${ABC[C:C+8]} = _mm_mullo_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]});
          $elif XOP:
            vprod${ABC[C:C+8]} = _mm_macc_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]}, vprod${ABC[C:C+8]});
          $else:
            vprod${ABC[C:C+8]} = _mm_add_epi16(vprod${ABC[C:C+8]}, _mm_mullo_epi16(vxi${K}x${ABC[C:C+8]}, vxk${K}x${ABC[C:C+8]}));

        $if not ADD16 or K % 2 == 1 or K + 1 == KERNEL_TILE:
          $for C in range(0, CHANNEL_TILE, 8):
            $if DATATYPE == "QU8" or SSE < 4 and not ADD16:
              vacc${ABC[C:C+4]} = _mm_add_epi32(vacc${ABC[C:C+4]}, _mm_unpacklo_epi16(vprod${K}x${ABC[C:C+8]}lo, vprod${K}x${ABC[C:C+8]}hi));
              vacc${ABC[C+4:C+8]} = _mm_add_epi32(vacc${ABC[C+4:C+8]}, _mm_unpackhi_epi16(vprod${K}x${ABC[C:C+8]}lo, vprod${K}x${ABC[C:C+8]}hi));
            $elif SSE < 4:
              const __m128i vsignprod${K}x${ABC[C:C+8]} = _mm_cmpgt_epi16(_mm_setzero_si128(), vprod${ABC[C:C+8]});
              vacc${ABC[C:C+4]} = _mm_add_epi32(vacc${ABC[C:C+4]}, _mm_unpacklo_epi16(vprod${ABC[C:C+8]}, vsignprod${K}x${ABC[C:C+8]}));
              vacc${ABC[C+4:C+8]} = _mm_add_epi32(vacc${ABC[C+4:C+8]}, _mm_unpackhi_epi16(vprod${ABC[C:C+8]}, vsignprod${K}x${ABC[C:C+8]}));
            $else:
              vacc${ABC[C:C+4]} = _mm_add_epi32(vacc${ABC[C:C+4]}, _mm_cvtepi16_epi32(vprod${ABC[C:C+8]}));
              vacc${ABC[C+4:C+8]} = _mm_add_epi32(vacc${ABC[C+4:C+8]}, _mm_srai_epi32(_mm_unpackhi_epi16(vprod${ABC[C:C+8]}, vprod${ABC[C:C+8]}), 16));

      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);

      $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]});
          $else:
            __m128i vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_packus_epi16(vout${ABC[C:C+8]}, vout${ABC[C:C+8]});

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

        $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]});
          $else:
            __m128i vout${ABC[C:C+8]}${ABC[C:C+8]} = _mm_packs_epi16(vout${ABC[C:C+8]}, vout${ABC[C:C+8]});

        $if SSE == 4:
          const __m128i voutput_min = _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min);
          $for C in range(0, CHANNEL_TILE, 16):
            $if C + 8 < CHANNEL_TILE:
              vout${ABC[C:C+16]} = _mm_max_epi8(vout${ABC[C:C+16]}, voutput_min);
            $else:
              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 > 8:
        const ${XINT8_T}* k = (const ${XINT8_T}*) ((const int32_t*) w + ${CHANNEL_TILE});
      ${"do " if CHANNEL_TILE > 8 else ""}{
        __m128i vacc${ABC[0:4]} = _mm_loadu_si128((const __m128i*) w);
        __m128i vacc${ABC[4:8]} = _mm_loadu_si128((const __m128i*) ((const int32_t*) w + 4));

        $for K in range(KERNEL_TILE):

          const __m128i vi${K}x${ABC[0:8]} = _mm_loadl_epi64((const __m128i*) i${K});
          $if SSE == 4:
            $if DATATYPE == "QU8":
              const __m128i vxi${K}x${ABC[0:8]} = _mm_cvtepu8_epi16(vi${K}x${ABC[0:8]});
            $else:
              const __m128i vxi${K}x${ABC[0:8]} = _mm_cvtepi8_epi16(vi${K}x${ABC[0:8]});
          $if CHANNEL_TILE > 8:
            $if K == 0:
              const __m128i vk${K}x${ABC[0:8]} = _mm_loadl_epi64((const __m128i*) k);
            $else:
              const __m128i vk${K}x${ABC[0:8]} = _mm_loadl_epi64((const __m128i*) (k + ${K * CHANNEL_TILE}));
          $else:
            const __m128i vk${K}x${ABC[0:8]} = _mm_loadl_epi64((const __m128i*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${K * CHANNEL_TILE} * sizeof(${XINT8_T})));
          $if SSE == 4:
            $if DATATYPE == "QU8":
              const __m128i vxk${K}x${ABC[0:8]} = _mm_sub_epi16(_mm_cvtepu8_epi16(vk${K}x${ABC[0:8]}), vk_zero_point);
            $else:
              const __m128i vxk${K}x${ABC[0:8]} = _mm_cvtepi8_epi16(vk${K}x${ABC[0:8]});
          $if CHANNEL_TILE > 8:
            i${K} += 8;

          $if SSE < 4:
            $if DATATYPE == "QU8":
              $if K == 0:
                const __m128i vzero = _mm_setzero_si128();
              const __m128i vxi${K}x${ABC[0:8]} = _mm_unpacklo_epi8(vi${K}x${ABC[0:8]}, vzero);
              const __m128i vxk${K}x${ABC[0:8]} = _mm_sub_epi16(_mm_unpacklo_epi8(vk${K}x${ABC[0:8]}, vzero), vk_zero_point);
            $else:
              const __m128i vxi${K}x${ABC[0:8]} = _mm_srai_epi16(_mm_unpacklo_epi8(vi${K}x${ABC[0:8]}, vi${K}x${ABC[0:8]}), 8);
              const __m128i vxk${K}x${ABC[0:8]} = _mm_srai_epi16(_mm_unpacklo_epi8(vk${K}x${ABC[0:8]}, vk${K}x${ABC[0:8]}), 8);

          $if DATATYPE == "QU8" or SSE < 4 and not ADD16:
            const __m128i vprod${K}x${ABC[0:8]}lo = _mm_mullo_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]});
            const __m128i vprod${K}x${ABC[0:8]}hi = _mm_mulhi_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]});
          $elif K == 0:
            __m128i vprod${ABC[0:8]} = _mm_mullo_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]});
          $elif K % 2 == 0 or K + 1 == KERNEL_TILE or not ADD16:
            vprod${ABC[0:8]} = _mm_mullo_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]});
          $elif XOP:
            vprod${ABC[0:8]} = _mm_macc_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]}, vprod${ABC[0:8]});
          $else:
            vprod${ABC[0:8]} = _mm_add_epi16(vprod${ABC[0:8]}, _mm_mullo_epi16(vxi${K}x${ABC[0:8]}, vxk${K}x${ABC[0:8]}));

          $if not ADD16 or K % 2 == 1 or K + 1 == KERNEL_TILE:
            $if DATATYPE == "QU8" or SSE < 4 and not ADD16:
              vacc${ABC[0:4]} = _mm_add_epi32(vacc${ABC[0:4]}, _mm_unpacklo_epi16(vprod${K}x${ABC[0:8]}lo, vprod${K}x${ABC[0:8]}hi));
              vacc${ABC[4:8]} = _mm_add_epi32(vacc${ABC[4:8]}, _mm_unpackhi_epi16(vprod${K}x${ABC[0:8]}lo, vprod${K}x${ABC[0:8]}hi));
            $elif SSE < 4:
              const __m128i vsignprod${K}x${ABC[0:8]} = _mm_cmpgt_epi16(_mm_setzero_si128(), vprod${ABC[0:8]});
              vacc${ABC[0:4]} = _mm_add_epi32(vacc${ABC[0:4]}, _mm_unpacklo_epi16(vprod${ABC[0:8]}, vsignprod${K}x${ABC[0:8]}));
              vacc${ABC[4:8]} = _mm_add_epi32(vacc${ABC[4:8]}, _mm_unpackhi_epi16(vprod${ABC[0:8]}, vsignprod${K}x${ABC[0:8]}));
            $else:
              vacc${ABC[0:4]} = _mm_add_epi32(vacc${ABC[0:4]}, _mm_cvtepi16_epi32(vprod${ABC[0:8]}));
              vacc${ABC[4:8]} = _mm_add_epi32(vacc${ABC[4:8]}, _mm_srai_epi32(_mm_unpackhi_epi16(vprod${ABC[0:8]}, vprod${ABC[0:8]}), 16));

        $if CHANNEL_TILE > 8:
          k += 8;

        __m128 vscaled${ABC[0:4]} = _mm_cvtepi32_ps(vacc${ABC[0:4]});
        __m128 vscaled${ABC[4:8]} = _mm_cvtepi32_ps(vacc${ABC[4:8]});

        $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})));
          const __m128 vscale${ABC[4:8]} = _mm_loadu_ps((const float*) ((uintptr_t) w + ${CHANNEL_TILE} * sizeof(int32_t) + ${CHANNEL_TILE * KERNEL_TILE} * sizeof(${XINT8_T}) + 4 * sizeof(float)));
          vscaled${ABC[0:4]} = _mm_mul_ps(vscaled${ABC[0:4]}, vscale${ABC[0:4]});
          vscaled${ABC[4:8]} = _mm_mul_ps(vscaled${ABC[4:8]}, vscale${ABC[4:8]});
        $else:
          const __m128 vscale = _mm_load_ps(params->${PARAMS_STRUCT}.scale);
          vscaled${ABC[0:4]} = _mm_mul_ps(vscaled${ABC[0:4]}, vscale);
          vscaled${ABC[4:8]} = _mm_mul_ps(vscaled${ABC[4:8]}, vscale);

        const __m128 voutput_max_less_zero_point = _mm_load_ps(params->${PARAMS_STRUCT}.output_max_less_zero_point);
        vscaled${ABC[0:4]} = _mm_min_ps(vscaled${ABC[0:4]}, voutput_max_less_zero_point);
        vscaled${ABC[4:8]} = _mm_min_ps(vscaled${ABC[4:8]}, voutput_max_less_zero_point);

        vacc${ABC[0:4]} = _mm_cvtps_epi32(vscaled${ABC[0:4]});
        vacc${ABC[4:8]} = _mm_cvtps_epi32(vscaled${ABC[4:8]});

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

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

        $if DATATYPE == "QU8":
          __m128i vout${ABC[0:8]}${ABC[0:8]} = _mm_packus_epi16(vout${ABC[0:8]}, vout${ABC[0:8]});

          vout${ABC[0:8]}${ABC[0:8]} = _mm_max_epu8(vout${ABC[0:8]}${ABC[0:8]}, _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min));
        $else:
          $if SSE < 4:
            vout${ABC[0:8]} = _mm_max_epi16(vout${ABC[0:8]}, _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min));

          __m128i vout${ABC[0:8]}${ABC[0:8]} = _mm_packs_epi16(vout${ABC[0:8]}, vout${ABC[0:8]});

          $if SSE == 4:
            vout${ABC[0:8]}${ABC[0:8]} = _mm_max_epi8(vout${ABC[0:8]}${ABC[0:8]}, _mm_load_si128((const __m128i*) params->${PARAMS_STRUCT}.output_min));

        $if CHANNEL_TILE > 8:
          if XNN_LIKELY(c >= 8) {
            _mm_storel_epi64((__m128i*) output, vout${ABC[0:8]}${ABC[0:8]});
            output += 8;
            c -= 8;
          } else {
            if (c & 4) {
              unaligned_store_u32(output, (uint32_t) _mm_cvtsi128_si32(vout${ABC[0:8]}${ABC[0:8]}));
              vout${ABC[0:8]}${ABC[0:8]} = _mm_srli_epi64(vout${ABC[0:8]}${ABC[0:8]}, 32);
              output += 4;
            }
            if (c & 2) {
              unaligned_store_u16(output, (uint16_t) _mm_extract_epi16(vout${ABC[0:8]}${ABC[0:8]}, 0));
              vout${ABC[0:8]}${ABC[0:8]} = _mm_srli_epi32(vout${ABC[0:8]}${ABC[0:8]}, 16);
              output += 2;
            }
            if (c & 1) {
              $if SSE == 4:
                *output = (${XINT8_T}) _mm_extract_epi8(vout${ABC[0:8]}${ABC[0:8]}, 0);
              $else:
                *output = (${XINT8_T}) _mm_cvtsi128_si32(vout${ABC[0:8]}${ABC[0:8]});
              output += 1;
            }
            c = 0;
          }
        $else:
          if (c & 4) {
            unaligned_store_u32(output, (uint32_t) _mm_cvtsi128_si32(vout${ABC[0:8]}${ABC[0:8]}));
            vout${ABC[0:8]}${ABC[0:8]} = _mm_srli_epi64(vout${ABC[0:8]}${ABC[0:8]}, 32);
            output += 4;
          }
          if (c & 2) {
            unaligned_store_u16(output, (uint16_t) _mm_extract_epi16(vout${ABC[0:8]}${ABC[0:8]}, 0));
            vout${ABC[0:8]}${ABC[0:8]} = _mm_srli_epi32(vout${ABC[0:8]}${ABC[0:8]}, 16);
            output += 2;
          }
          if (c & 1) {
            $if SSE == 4:
              *output = (${XINT8_T}) _mm_extract_epi8(vout${ABC[0:8]}${ABC[0:8]}, 0);
            $else:
              *output = (${XINT8_T}) _mm_cvtsi128_si32(vout${ABC[0:8]}${ABC[0:8]});
            output += 1;
          }
      }${" while (c != 0);" if CHANNEL_TILE > 8 else ""}
    }

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