1*4bdc9457SAndroid Build Coastguard Worker// Copyright 2022 Google LLC 2*4bdc9457SAndroid Build Coastguard Worker// 3*4bdc9457SAndroid Build Coastguard Worker// This source code is licensed under the BSD-style license found in the 4*4bdc9457SAndroid Build Coastguard Worker// LICENSE file in the root directory of this source tree. 5*4bdc9457SAndroid Build Coastguard Worker 6*4bdc9457SAndroid Build Coastguard Worker$assert CHANNEL_TILE % 8 == 0 7*4bdc9457SAndroid Build Coastguard Worker$assert CHANNEL_TILE >= 8 8*4bdc9457SAndroid Build Coastguard Worker$assert ROW_TILE >= 3 9*4bdc9457SAndroid Build Coastguard Worker$assert ROW_SUBTILE >= 3 10*4bdc9457SAndroid Build Coastguard Worker$assert ROW_SUBTILE <= ROW_TILE 11*4bdc9457SAndroid Build Coastguard Worker$ABC = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 12*4bdc9457SAndroid Build Coastguard Worker#include <assert.h> 13*4bdc9457SAndroid Build Coastguard Worker 14*4bdc9457SAndroid Build Coastguard Worker#include <immintrin.h> 15*4bdc9457SAndroid Build Coastguard Worker 16*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/gavgpool.h> 17*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/intrinsics-polyfill.h> 18*4bdc9457SAndroid Build Coastguard Worker#include <xnnpack/math.h> 19*4bdc9457SAndroid Build Coastguard Worker 20*4bdc9457SAndroid Build Coastguard Worker 21*4bdc9457SAndroid Build Coastguard Workervoid xnn_f16_gavgpool_minmax_ukernel_${ROW_TILE}p${ROW_SUBTILE}x__f16c_c${CHANNEL_TILE}( 22*4bdc9457SAndroid Build Coastguard Worker size_t rows, 23*4bdc9457SAndroid Build Coastguard Worker size_t channels, 24*4bdc9457SAndroid Build Coastguard Worker const void* input, 25*4bdc9457SAndroid Build Coastguard Worker size_t input_stride, 26*4bdc9457SAndroid Build Coastguard Worker const void* zero, 27*4bdc9457SAndroid Build Coastguard Worker void* buffer, 28*4bdc9457SAndroid Build Coastguard Worker void* output, 29*4bdc9457SAndroid Build Coastguard Worker const union xnn_f16_scaleminmax_params params[restrict XNN_MIN_ELEMENTS(1)]) XNN_OOB_READS 30*4bdc9457SAndroid Build Coastguard Worker{ 31*4bdc9457SAndroid Build Coastguard Worker assert(rows > ${ROW_TILE}); 32*4bdc9457SAndroid Build Coastguard Worker assert(channels != 0); 33*4bdc9457SAndroid Build Coastguard Worker 34*4bdc9457SAndroid Build Coastguard Worker const uint16_t* i0 = input; 35*4bdc9457SAndroid Build Coastguard Worker $for M in range(1, ROW_TILE): 36*4bdc9457SAndroid Build Coastguard Worker const uint16_t* i${M} = (const uint16_t*) ((uintptr_t) i${M-1} + input_stride); 37*4bdc9457SAndroid Build Coastguard Worker const size_t input_increment = ${ROW_TILE} * input_stride - round_up_po2(channels, 8) * sizeof(uint16_t); 38*4bdc9457SAndroid Build Coastguard Worker 39*4bdc9457SAndroid Build Coastguard Worker uint16_t* b = buffer; 40*4bdc9457SAndroid Build Coastguard Worker size_t c = channels; 41*4bdc9457SAndroid Build Coastguard Worker for (; ${"c >= %d" % CHANNEL_TILE if CHANNEL_TILE > 8 else "c != 0"}; ${("c -= %d" if CHANNEL_TILE > 8 else "c = doz(c, %d)") % CHANNEL_TILE}) { 42*4bdc9457SAndroid Build Coastguard Worker $for M in range(2): 43*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 44*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M})); i${M} += 8; 45*4bdc9457SAndroid Build Coastguard Worker 46*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 47*4bdc9457SAndroid Build Coastguard Worker const __m256 vi2x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i2)); i2 += 8; 48*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(vi0x${ABC[C:C+8]}, vi1x${ABC[C:C+8]}), _MM_FROUND_NO_EXC); 49*4bdc9457SAndroid Build Coastguard Worker 50*4bdc9457SAndroid Build Coastguard Worker $for M in range(2, ROW_TILE): 51*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 52*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 53*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 54*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vi${M}x${ABC[C:C+8]}), _MM_FROUND_NO_EXC); 55*4bdc9457SAndroid Build Coastguard Worker 56*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 57*4bdc9457SAndroid Build Coastguard Worker _mm_store_si128((__m128i*) b, vacc${ABC[C:C+8]}); b += 8; 58*4bdc9457SAndroid Build Coastguard Worker } 59*4bdc9457SAndroid Build Coastguard Worker $if CHANNEL_TILE > 8: 60*4bdc9457SAndroid Build Coastguard Worker if XNN_UNLIKELY(c != 0) { 61*4bdc9457SAndroid Build Coastguard Worker do { 62*4bdc9457SAndroid Build Coastguard Worker $for M in range(3): 63*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M})); i${M} += 8; 64*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(vi0x${ABC[0:8]}, vi1x${ABC[0:8]}), _MM_FROUND_NO_EXC); 65*4bdc9457SAndroid Build Coastguard Worker 66*4bdc9457SAndroid Build Coastguard Worker $for M in range(2, ROW_TILE): 67*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 68*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 69*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vi${M}x${ABC[0:8]}), _MM_FROUND_NO_EXC); 70*4bdc9457SAndroid Build Coastguard Worker 71*4bdc9457SAndroid Build Coastguard Worker _mm_store_si128((__m128i*) b, vacc${ABC[0:8]}); b += 8; 72*4bdc9457SAndroid Build Coastguard Worker 73*4bdc9457SAndroid Build Coastguard Worker c = doz(c, 8); 74*4bdc9457SAndroid Build Coastguard Worker } while (c != 0); 75*4bdc9457SAndroid Build Coastguard Worker } 76*4bdc9457SAndroid Build Coastguard Worker 77*4bdc9457SAndroid Build Coastguard Worker for (rows -= ${ROW_TILE}; rows > ${ROW_SUBTILE}; rows -= ${ROW_SUBTILE}) { 78*4bdc9457SAndroid Build Coastguard Worker $for M in range(ROW_SUBTILE): 79*4bdc9457SAndroid Build Coastguard Worker i${M} = (const uint16_t*) ((uintptr_t) i${M + ROW_TILE - ROW_SUBTILE} + input_increment); 80*4bdc9457SAndroid Build Coastguard Worker 81*4bdc9457SAndroid Build Coastguard Worker uint16_t* b = buffer; 82*4bdc9457SAndroid Build Coastguard Worker size_t c = channels; 83*4bdc9457SAndroid Build Coastguard Worker for (; ${"c >= %d" % CHANNEL_TILE if CHANNEL_TILE > 8 else "c != 0"}; ${("c -= %d" if CHANNEL_TILE > 8 else "c = doz(c, %d)") % CHANNEL_TILE}) { 84*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[0:8]} = _mm_loadu_si128((const __m128i*) b); 85*4bdc9457SAndroid Build Coastguard Worker $for C in range(8, CHANNEL_TILE, 8): 86*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[C:C+8]} = _mm_loadu_si128((const __m128i*) (b + ${C})); 87*4bdc9457SAndroid Build Coastguard Worker 88*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 89*4bdc9457SAndroid Build Coastguard Worker const __m256 vi0x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i0)); i0 += 8; 90*4bdc9457SAndroid Build Coastguard Worker 91*4bdc9457SAndroid Build Coastguard Worker $for M in range(ROW_TILE): 92*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 93*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 94*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 95*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vi${M}x${ABC[C:C+8]}), _MM_FROUND_NO_EXC); 96*4bdc9457SAndroid Build Coastguard Worker 97*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 98*4bdc9457SAndroid Build Coastguard Worker _mm_store_si128((__m128i*) b, vacc${ABC[C:C+8]}); b += 8; 99*4bdc9457SAndroid Build Coastguard Worker } 100*4bdc9457SAndroid Build Coastguard Worker $if CHANNEL_TILE > 8: 101*4bdc9457SAndroid Build Coastguard Worker if XNN_UNLIKELY(c != 0) { 102*4bdc9457SAndroid Build Coastguard Worker do { 103*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[0:8]} = _mm_loadu_si128((const __m128i*) b); 104*4bdc9457SAndroid Build Coastguard Worker const __m256 vi0x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i0)); i0 += 8; 105*4bdc9457SAndroid Build Coastguard Worker 106*4bdc9457SAndroid Build Coastguard Worker $for M in range(ROW_TILE): 107*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 108*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 109*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vi${M}x${ABC[0:8]}), _MM_FROUND_NO_EXC); 110*4bdc9457SAndroid Build Coastguard Worker 111*4bdc9457SAndroid Build Coastguard Worker _mm_store_si128((__m128i*) b, vacc${ABC[0:8]}); 112*4bdc9457SAndroid Build Coastguard Worker b += 8; 113*4bdc9457SAndroid Build Coastguard Worker 114*4bdc9457SAndroid Build Coastguard Worker c = doz(c, 8); 115*4bdc9457SAndroid Build Coastguard Worker } while (c != 0); 116*4bdc9457SAndroid Build Coastguard Worker } 117*4bdc9457SAndroid Build Coastguard Worker } 118*4bdc9457SAndroid Build Coastguard Worker 119*4bdc9457SAndroid Build Coastguard Worker i0 = (const uint16_t*) ((uintptr_t) i${ROW_TILE - ROW_SUBTILE} + input_increment); 120*4bdc9457SAndroid Build Coastguard Worker $for M in range(1, ROW_SUBTILE): 121*4bdc9457SAndroid Build Coastguard Worker i${M} = (const uint16_t*) ((uintptr_t) i${M + ROW_TILE - ROW_SUBTILE} + input_increment); 122*4bdc9457SAndroid Build Coastguard Worker $if M % 2 == 1: 123*4bdc9457SAndroid Build Coastguard Worker if XNN_UNPREDICTABLE(rows < ${M+1}) { 124*4bdc9457SAndroid Build Coastguard Worker i${M} = (const uint16_t*) zero; 125*4bdc9457SAndroid Build Coastguard Worker } 126*4bdc9457SAndroid Build Coastguard Worker $else: 127*4bdc9457SAndroid Build Coastguard Worker if XNN_UNPREDICTABLE(rows <= ${M}) { 128*4bdc9457SAndroid Build Coastguard Worker i${M} = (const uint16_t*) zero; 129*4bdc9457SAndroid Build Coastguard Worker } 130*4bdc9457SAndroid Build Coastguard Worker uint16_t* o = (uint16_t*) output; 131*4bdc9457SAndroid Build Coastguard Worker 132*4bdc9457SAndroid Build Coastguard Worker const __m256 vscale = _mm256_load_ps(params->avx.scale); 133*4bdc9457SAndroid Build Coastguard Worker const __m256 vmin = _mm256_load_ps(params->avx.min); 134*4bdc9457SAndroid Build Coastguard Worker const __m256 vmax = _mm256_load_ps(params->avx.max); 135*4bdc9457SAndroid Build Coastguard Worker for (; channels >= ${CHANNEL_TILE}; channels -= ${CHANNEL_TILE}) { 136*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 137*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[C:C+8]} = _mm_loadu_si128((const __m128i*) buffer); buffer = (uint16_t*) buffer + 8; 138*4bdc9457SAndroid Build Coastguard Worker 139*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 140*4bdc9457SAndroid Build Coastguard Worker const __m256 vi0x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i0)); i0 += 8; 141*4bdc9457SAndroid Build Coastguard Worker 142*4bdc9457SAndroid Build Coastguard Worker $for M in range(ROW_TILE): 143*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 144*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 145*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[C:C+8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 146*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vi${M}x${ABC[C:C+8]}), _MM_FROUND_NO_EXC); 147*4bdc9457SAndroid Build Coastguard Worker 148*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 149*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[C:C+8]} = _mm256_cvtps_ph(_mm256_mul_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vscale), _MM_FROUND_NO_EXC); 150*4bdc9457SAndroid Build Coastguard Worker 151*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 152*4bdc9457SAndroid Build Coastguard Worker __m256 vout${ABC[C:C+8]} = _mm256_max_ps(_mm256_cvtph_ps(vacc${ABC[C:C+8]}), vmin); 153*4bdc9457SAndroid Build Coastguard Worker 154*4bdc9457SAndroid Build Coastguard Worker $for C in range(0, CHANNEL_TILE, 8): 155*4bdc9457SAndroid Build Coastguard Worker vout${ABC[C:C+8]} = _mm256_min_ps(vout${ABC[C:C+8]}, vmax); 156*4bdc9457SAndroid Build Coastguard Worker 157*4bdc9457SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i*) o, _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC)); 158*4bdc9457SAndroid Build Coastguard Worker $for C in range(8, CHANNEL_TILE, 8): 159*4bdc9457SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i*) ((uint16_t*) o + ${C}), _mm256_cvtps_ph(vout${ABC[C:C+8]}, _MM_FROUND_NO_EXC)); 160*4bdc9457SAndroid Build Coastguard Worker o += ${CHANNEL_TILE}; 161*4bdc9457SAndroid Build Coastguard Worker } 162*4bdc9457SAndroid Build Coastguard Worker if XNN_UNLIKELY(channels != 0) { 163*4bdc9457SAndroid Build Coastguard Worker ${"do " if CHANNEL_TILE > 8 else ""}{ 164*4bdc9457SAndroid Build Coastguard Worker __m128i vacc${ABC[0:8]} = _mm_loadu_si128((const __m128i*) buffer); buffer = (uint16_t*) buffer + 8; 165*4bdc9457SAndroid Build Coastguard Worker 166*4bdc9457SAndroid Build Coastguard Worker const __m256 vi0x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i0)); i0 += 8; 167*4bdc9457SAndroid Build Coastguard Worker $for M in range(ROW_TILE): 168*4bdc9457SAndroid Build Coastguard Worker $if M + 1 != ROW_TILE: 169*4bdc9457SAndroid Build Coastguard Worker const __m256 vi${M+1}x${ABC[0:8]} = _mm256_cvtph_ps(_mm_loadu_si128((const __m128i*) i${M+1})); i${M+1} += 8; 170*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_add_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vi${M}x${ABC[0:8]}), _MM_FROUND_NO_EXC); 171*4bdc9457SAndroid Build Coastguard Worker 172*4bdc9457SAndroid Build Coastguard Worker vacc${ABC[0:8]} = _mm256_cvtps_ph(_mm256_mul_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vscale), _MM_FROUND_NO_EXC); 173*4bdc9457SAndroid Build Coastguard Worker __m256 vout${ABC[0:8]} = _mm256_max_ps(_mm256_cvtph_ps(vacc${ABC[0:8]}), vmin); 174*4bdc9457SAndroid Build Coastguard Worker vout${ABC[0:8]} = _mm256_min_ps(vout${ABC[0:8]}, vmax); 175*4bdc9457SAndroid Build Coastguard Worker 176*4bdc9457SAndroid Build Coastguard Worker $if CHANNEL_TILE > 8: 177*4bdc9457SAndroid Build Coastguard Worker if XNN_LIKELY(channels >= 8) { 178*4bdc9457SAndroid Build Coastguard Worker _mm_storeu_si128((__m128i*) o, _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC)); 179*4bdc9457SAndroid Build Coastguard Worker o += 8; 180*4bdc9457SAndroid Build Coastguard Worker channels -= 8; 181*4bdc9457SAndroid Build Coastguard Worker } else { 182*4bdc9457SAndroid Build Coastguard Worker __m128i vh${ABC[0:8]} = _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC); 183*4bdc9457SAndroid Build Coastguard Worker if (channels & 4) { 184*4bdc9457SAndroid Build Coastguard Worker _mm_storel_epi64((__m128i*) o, vh${ABC[0:8]}); 185*4bdc9457SAndroid Build Coastguard Worker o += 4; 186*4bdc9457SAndroid Build Coastguard Worker vh${ABC[0:8]} = _mm_unpackhi_epi64(vh${ABC[0:8]}, vh${ABC[0:8]}); 187*4bdc9457SAndroid Build Coastguard Worker } 188*4bdc9457SAndroid Build Coastguard Worker if (channels & 2) { 189*4bdc9457SAndroid Build Coastguard Worker _mm_storeu_si32(o, vh${ABC[0:8]}); 190*4bdc9457SAndroid Build Coastguard Worker o += 2; 191*4bdc9457SAndroid Build Coastguard Worker vh${ABC[0:8]} = _mm_srli_epi64(vh${ABC[0:8]}, 32); 192*4bdc9457SAndroid Build Coastguard Worker } 193*4bdc9457SAndroid Build Coastguard Worker if (channels & 1) { 194*4bdc9457SAndroid Build Coastguard Worker *o = (uint16_t) _mm_extract_epi16(vh${ABC[0:8]}, 0); 195*4bdc9457SAndroid Build Coastguard Worker } 196*4bdc9457SAndroid Build Coastguard Worker channels = 0; 197*4bdc9457SAndroid Build Coastguard Worker } 198*4bdc9457SAndroid Build Coastguard Worker $else: 199*4bdc9457SAndroid Build Coastguard Worker __m128i vh${ABC[0:8]} = _mm256_cvtps_ph(vout${ABC[0:8]}, _MM_FROUND_NO_EXC); 200*4bdc9457SAndroid Build Coastguard Worker if (channels & 4) { 201*4bdc9457SAndroid Build Coastguard Worker _mm_storel_epi64((__m128i*) o, vh${ABC[0:8]}); 202*4bdc9457SAndroid Build Coastguard Worker o += 4; 203*4bdc9457SAndroid Build Coastguard Worker vh${ABC[0:8]} = _mm_unpackhi_epi64(vh${ABC[0:8]}, vh${ABC[0:8]}); 204*4bdc9457SAndroid Build Coastguard Worker } 205*4bdc9457SAndroid Build Coastguard Worker if (channels & 2) { 206*4bdc9457SAndroid Build Coastguard Worker _mm_storeu_si32(o, vh${ABC[0:8]}); 207*4bdc9457SAndroid Build Coastguard Worker o += 2; 208*4bdc9457SAndroid Build Coastguard Worker vh${ABC[0:8]} = _mm_srli_epi64(vh${ABC[0:8]}, 32); 209*4bdc9457SAndroid Build Coastguard Worker } 210*4bdc9457SAndroid Build Coastguard Worker if (channels & 1) { 211*4bdc9457SAndroid Build Coastguard Worker *o = (uint16_t) _mm_extract_epi16(vh${ABC[0:8]}, 0); 212*4bdc9457SAndroid Build Coastguard Worker } 213*4bdc9457SAndroid Build Coastguard Worker }${" while (channels != 0);" if CHANNEL_TILE > 8 else ""} 214*4bdc9457SAndroid Build Coastguard Worker } 215*4bdc9457SAndroid Build Coastguard Worker} 216