blob: bc545a4526652e0fde816341ee8fc79da0801fca [file] [log] [blame]
Marat Dukhan436ebe62019-12-04 15:10:12 -08001// Auto-generated file. Do not edit!
2// Template: src/f32-dwconv/up-scalar.c.in
3// Generator: tools/xngen
4//
5// Copyright 2019 Google LLC
6//
7// This source code is licensed under the BSD-style license found in the
8// LICENSE file in the root directory of this source tree.
9
10#include <assert.h>
11
12#include <xnnpack/dwconv.h>
13#include <xnnpack/math.h>
14
15
16void xnn_f32_dwconv_ukernel_up2x9__wasm_acc2(
17 size_t channels,
18 size_t output_width,
19 const float** input,
20 const float* weights,
21 float* output,
22 size_t input_stride,
23 size_t output_increment,
Marat Dukhaneb09a6b2020-04-08 17:34:32 -070024 const union xnn_f32_minmax_params params[restrict static 1])
Marat Dukhan436ebe62019-12-04 15:10:12 -080025{
26 assert(channels != 0);
27 assert(output_width != 0);
28
29 const float vmin = params->scalar.min;
30 const float vmax = params->scalar.max;
31 do {
32 const float* i0 = input[0];
Marat Dukhan68660992020-02-03 13:31:12 -080033 assert(i0 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080034 const float* i1 = input[1];
Marat Dukhan68660992020-02-03 13:31:12 -080035 assert(i1 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080036 const float* i2 = input[2];
Marat Dukhan68660992020-02-03 13:31:12 -080037 assert(i2 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080038 const float* i3 = input[3];
Marat Dukhan68660992020-02-03 13:31:12 -080039 assert(i3 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080040 const float* i4 = input[4];
Marat Dukhan68660992020-02-03 13:31:12 -080041 assert(i4 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080042 const float* i5 = input[5];
Marat Dukhan68660992020-02-03 13:31:12 -080043 assert(i5 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080044 const float* i6 = input[6];
Marat Dukhan68660992020-02-03 13:31:12 -080045 assert(i6 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080046 const float* i7 = input[7];
Marat Dukhan68660992020-02-03 13:31:12 -080047 assert(i7 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080048 const float* i8 = input[8];
Marat Dukhan68660992020-02-03 13:31:12 -080049 assert(i8 != NULL);
Marat Dukhan436ebe62019-12-04 15:10:12 -080050 input = (const float**) ((uintptr_t) input + input_stride);
51
52 size_t c = channels;
53 const float* w = weights;
54 for (; c >= 2; c -= 2) {
55 float vacc0p0 = w[0];
56 float vacc1p0 = w[1];
57
58
59 const float vi0x0 = i0[0];
60 const float vi0x1 = i0[1];
61 i0 += 2;
62
63 const float vk0x0 = w[2];
64 vacc0p0 += vi0x0 * vk0x0;
65 const float vk0x1 = w[3];
66 vacc1p0 += vi0x1 * vk0x1;
67
68 const float vi1x0 = i1[0];
69 const float vi1x1 = i1[1];
70 i1 += 2;
71
72 const float vk1x0 = w[4];
73 float vacc0p1 = vi1x0 * vk1x0;
74 const float vk1x1 = w[5];
75 float vacc1p1 = vi1x1 * vk1x1;
76
77 const float vi2x0 = i2[0];
78 const float vi2x1 = i2[1];
79 i2 += 2;
80
81 const float vk2x0 = w[6];
82 vacc0p0 += vi2x0 * vk2x0;
83 const float vk2x1 = w[7];
84 vacc1p0 += vi2x1 * vk2x1;
85
86 const float vi3x0 = i3[0];
87 const float vi3x1 = i3[1];
88 i3 += 2;
89
90 const float vk3x0 = w[8];
91 vacc0p1 += vi3x0 * vk3x0;
92 const float vk3x1 = w[9];
93 vacc1p1 += vi3x1 * vk3x1;
94
95 const float vi4x0 = i4[0];
96 const float vi4x1 = i4[1];
97 i4 += 2;
98
99 const float vk4x0 = w[10];
100 vacc0p0 += vi4x0 * vk4x0;
101 const float vk4x1 = w[11];
102 vacc1p0 += vi4x1 * vk4x1;
103
104 const float vi5x0 = i5[0];
105 const float vi5x1 = i5[1];
106 i5 += 2;
107
108 const float vk5x0 = w[12];
109 vacc0p1 += vi5x0 * vk5x0;
110 const float vk5x1 = w[13];
111 vacc1p1 += vi5x1 * vk5x1;
112
113 const float vi6x0 = i6[0];
114 const float vi6x1 = i6[1];
115 i6 += 2;
116
117 const float vk6x0 = w[14];
118 vacc0p0 += vi6x0 * vk6x0;
119 const float vk6x1 = w[15];
120 vacc1p0 += vi6x1 * vk6x1;
121
122 const float vi7x0 = i7[0];
123 const float vi7x1 = i7[1];
124 i7 += 2;
125
126 const float vk7x0 = w[16];
127 vacc0p1 += vi7x0 * vk7x0;
128 const float vk7x1 = w[17];
129 vacc1p1 += vi7x1 * vk7x1;
130
131 const float vi8x0 = i8[0];
132 const float vi8x1 = i8[1];
133 i8 += 2;
134
135 const float vk8x0 = w[18];
136 vacc0p0 += vi8x0 * vk8x0;
137 const float vk8x1 = w[19];
138 vacc1p0 += vi8x1 * vk8x1;
139
140 w += 20;
141
142 // Add up all accumulators to vacc01p0
143 vacc0p0 = vacc0p0 + vacc0p1;
144 vacc1p0 = vacc1p0 + vacc1p1;
145
146 float vacc0 = __builtin_wasm_max_f32(vacc0p0, vmin);
147 float vacc1 = __builtin_wasm_max_f32(vacc1p0, vmin);
148
149 vacc0 = __builtin_wasm_min_f32(vacc0, vmax);
150 vacc1 = __builtin_wasm_min_f32(vacc1, vmax);
151
152 output[0] = vacc0;
153 output[1] = vacc1;
154 output += 2;
155 }
156 for (; c >= 1; c -= 1) {
157 float vacc0p0 = *w++;
158
159 const float vi0 = *i0++;
160 const float vk0 = w[1];
161 vacc0p0 += vi0 * vk0;
162 const float vi1 = *i1++;
163 const float vk1 = w[3];
164 float vacc0p1 = vi1 * vk1;
165 const float vi2 = *i2++;
166 const float vk2 = w[5];
167 vacc0p0 += vi2 * vk2;
168 const float vi3 = *i3++;
169 const float vk3 = w[7];
170 vacc0p1 += vi3 * vk3;
171 const float vi4 = *i4++;
172 const float vk4 = w[9];
173 vacc0p0 += vi4 * vk4;
174 const float vi5 = *i5++;
175 const float vk5 = w[11];
176 vacc0p1 += vi5 * vk5;
177 const float vi6 = *i6++;
178 const float vk6 = w[13];
179 vacc0p0 += vi6 * vk6;
180 const float vi7 = *i7++;
181 const float vk7 = w[15];
182 vacc0p1 += vi7 * vk7;
183 const float vi8 = *i8++;
184 const float vk8 = w[17];
185 vacc0p0 += vi8 * vk8;
186
187 // Add up all accumulators to vacc01p0
188 vacc0p0 = vacc0p0 + vacc0p1;
189
190 float vacc0 = __builtin_wasm_max_f32(vacc0p0, vmin);
191 vacc0 = __builtin_wasm_min_f32(vacc0, vmax);
192 *output++ = vacc0;
193 }
194
195 output = (float*) ((uintptr_t) output + output_increment);
196 } while (--output_width != 0);
197}