• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)11 void 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