1 // Copyright 2020 Google LLC 2 // 3 // This source code is licensed under the BSD-style license found in the 4 // LICENSE file in the root directory of this source tree. 5 6 #include <assert.h> 7 8 #include <xnnpack/fill.h> 9 10 xnn_xx_fill_ukernel__scalar_x16(size_t rows,size_t channels,void * output,size_t output_stride,const uint32_t fill_pattern)11void xnn_xx_fill_ukernel__scalar_x16( 12 size_t rows, 13 size_t channels, 14 void* output, 15 size_t output_stride, 16 const uint32_t fill_pattern) 17 { 18 assert(rows != 0); 19 assert(channels != 0); 20 21 const size_t output_increment = output_stride - channels; 22 23 do { 24 uint32_t vfill_pattern = fill_pattern; 25 size_t c = channels; 26 for (; c >= 16 * sizeof(uint8_t); c -= 16 * sizeof(uint8_t)) { 27 ((uint32_t*) output)[0] = vfill_pattern; 28 ((uint32_t*) output)[1] = vfill_pattern; 29 ((uint32_t*) output)[2] = vfill_pattern; 30 ((uint32_t*) output)[3] = vfill_pattern; 31 output = ((uint8_t*) output + 16); 32 } 33 if XNN_UNLIKELY(c != 0) { 34 if XNN_LIKELY(c & (8 * sizeof(uint8_t))) { 35 ((uint32_t*) output)[0] = vfill_pattern; 36 ((uint32_t*) output)[1] = vfill_pattern; 37 output = ((uint8_t*) output + 8); 38 } 39 if XNN_LIKELY(c & (4 * sizeof(uint8_t))) { 40 *((uint32_t*) output) = vfill_pattern; 41 output = ((uint8_t*) output + 4); 42 } 43 if XNN_LIKELY(c & (2 * sizeof(uint8_t))) { 44 *((uint16_t*) output) = (uint16_t) vfill_pattern; 45 vfill_pattern >>= 16; 46 output = ((uint8_t*) output + 2); 47 } 48 if XNN_LIKELY(c & (1 * sizeof(uint8_t))) { 49 *((uint8_t*) output) = (uint8_t) vfill_pattern; 50 output = ((uint8_t*) output + 1); 51 } 52 } 53 output = (void*) ((uintptr_t) output + output_increment); 54 } while (--rows != 0); 55 } 56