blob: 6932907568a5be97156bc2aa4591a7b120f70bbe [file] [log] [blame]
Marat Dukhan436ebe62019-12-04 15:10:12 -08001// Copyright 2019 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/pavgpool.h>
9#include <xnnpack/math.h>
10
11
12void xnn_f32_pavgpool_ukernel_up9__wasm(
13 size_t n,
14 size_t ks,
15 size_t kc,
16 const float** input,
17 const float* zero,
18 const float* multiplier,
19 float* output,
20 size_t input_increment,
21 size_t output_increment,
22 const union xnn_f32_output_params params[restrict static 1])
23{
24 assert(n != 0);
25 assert(ks != 0);
26 assert(ks <= 9);
27 assert(kc != 0);
28
29 const float voutput_min = params->scalar.min;
30 const float voutput_max = params->scalar.max;
31
32 do {
33 const float* i0 = input[0];
34 const float* i1 = input[1];
35 const float* i2 = input[2];
36 const float* i3 = input[3];
37 const float* i4 = input[4];
38 const float* i5 = input[5];
39 const float* i6 = input[6];
40 const float* i7 = input[7];
41 const float* i8 = input[8];
42 input = (const float**) ((uintptr_t) input + input_increment);
43 if (ks < 2) {
44 i1 = zero;
45 }
46 if (ks <= 2) {
47 i2 = zero;
48 }
49 if (ks < 4) {
50 i3 = zero;
51 }
52 if (ks <= 4) {
53 i4 = zero;
54 }
55 if (ks < 6) {
56 i5 = zero;
57 }
58 if (ks <= 6) {
59 i6 = zero;
60 }
61 if (ks < 8) {
62 i7 = zero;
63 }
64 if (ks <= 8) {
65 i8 = zero;
66 }
67
68 const float vmultiplier = *multiplier++;
69
70 size_t k = kc;
71 do {
72 const float vi0 = *i0++;
73 const float vi1 = *i1++;
74 const float vi2 = *i2++;
75 const float vi3 = *i3++;
76 const float vi4 = *i4++;
77 const float vi5 = *i5++;
78 const float vi6 = *i6++;
79 const float vi7 = *i7++;
80 const float vi8 = *i8++;
81
82 const float vsum01 = vi0 + vi1;
83 const float vsum23 = vi2 + vi3;
84 const float vsum45 = vi4 + vi5;
85 const float vsum67 = vi6 + vi7;
86 const float vsum018 = vsum01 + vi8;
87 const float vsum2345 = vsum23 + vsum45;
88 const float vsum01678 = vsum018 + vsum67;
89 const float vsum = vsum2345 + vsum01678;
90
91 float vout = vsum * vmultiplier;
92 vout = __builtin_wasm_max_f32(vout, voutput_min);
93 vout = __builtin_wasm_min_f32(vout, voutput_max);
94
95 *output++ = vout;
96 } while (--k != 0);
97 output = (float*) ((uintptr_t) output + output_increment);
98 } while (--n != 0);
99}