Coverage Report

Created: 2026-09-28 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xnnpack/src/qs8-packw/gen/qs8-packw-x4c8-gemm-goi-scalar.c
Line
Count
Source
1
// clang-format off
2
// Auto-generated file. Do not edit!
3
//   Template: src/x8-packw/kr-scalar.c.in
4
//   Generator: tools/xngen
5
//
6
// Copyright 2023 Google LLC
7
//
8
// This source code is licensed under the BSD-style license found in the
9
// LICENSE file in the root directory of this source tree.
10
11
#include <assert.h>
12
#include <stddef.h>
13
#include <stdint.h>
14
15
#include "src/xnnpack/common.h"
16
#include "src/xnnpack/microparams.h"
17
#include "src/xnnpack/packw.h"
18
19
void xnn_qs8_packw_gemm_goi_ukernel_x4c8__scalar(
20
  size_t g,
21
  size_t nc,
22
  size_t kc,
23
  size_t nr,
24
  size_t kr,
25
  size_t sr,
26
  size_t n_stride,
27
  const int8_t* weights,
28
  const int32_t* bias,
29
  const void* scale,
30
  int8_t* packed_weights,
31
  size_t extra_bytes,
32
  const void* params)
33
0
{
34
0
  assert(g != 0);
35
0
  assert(nc != 0);
36
0
  assert(kc != 0);
37
0
  assert(nr == 4);
38
0
  assert(kr == 8);
39
0
  assert(sr == 1);
40
0
  assert(weights != NULL);
41
0
  assert(packed_weights != NULL);
42
43
0
  int8_t* out = (int8_t*) packed_weights;
44
0
  const int32_t* b = (const int32_t*) bias;
45
0
  const uint32_t izp = (uint32_t) (params ? (((const struct xnn_qs8_packw_params*) params)->input_zero_point + 0): 0);
46
47
0
  do {
48
    // NC main loop multiple of 4
49
0
    const int8_t* w0 = (const int8_t*) weights;
50
0
    size_t n = nc;
51
0
    for (;n >= 4; n -= 4) {
52
0
      int32_t* packed_b = (int32_t*) out;
53
0
      if XNN_LIKELY(b != NULL) {
54
0
        ((int32_t*) out)[0] = b[0];
55
0
        ((int32_t*) out)[1] = b[1];
56
0
        ((int32_t*) out)[2] = b[2];
57
0
        ((int32_t*) out)[3] = b[3];
58
0
        b += 4;
59
0
      } else {
60
0
        ((int32_t*) out)[0] = 0;
61
0
        ((int32_t*) out)[1] = 0;
62
0
        ((int32_t*) out)[2] = 0;
63
0
        ((int32_t*) out)[3] = 0;
64
0
      }
65
0
      out += 4 * sizeof(int32_t);
66
67
0
      const int8_t* w1 = w0 + n_stride;
68
0
      const int8_t* w2 = w1 + n_stride;
69
0
      const int8_t* w3 = w2 + n_stride;
70
0
      uint32_t ksum0 = 0;
71
0
      uint32_t ksum1 = 0;
72
0
      uint32_t ksum2 = 0;
73
0
      uint32_t ksum3 = 0;
74
75
      // KC main loop multiple of 4x8
76
0
      size_t k = kc;
77
0
      for (; k >= 8; k -= 8) {
78
0
        const int8_t v0x0 = w0[0];
79
0
        const int8_t v0x1 = w0[1];
80
0
        const int8_t v0x2 = w0[2];
81
0
        const int8_t v0x3 = w0[3];
82
0
        const int8_t v0x4 = w0[4];
83
0
        const int8_t v0x5 = w0[5];
84
0
        const int8_t v0x6 = w0[6];
85
0
        const int8_t v0x7 = w0[7];
86
0
        ksum0 += (uint32_t) v0x0;
87
0
        ksum0 += (uint32_t) v0x1;
88
0
        ksum0 += (uint32_t) v0x2;
89
0
        ksum0 += (uint32_t) v0x3;
90
0
        ksum0 += (uint32_t) v0x4;
91
0
        ksum0 += (uint32_t) v0x5;
92
0
        ksum0 += (uint32_t) v0x6;
93
0
        ksum0 += (uint32_t) v0x7;
94
0
        out[0] = v0x0;
95
0
        out[1] = v0x1;
96
0
        out[2] = v0x2;
97
0
        out[3] = v0x3;
98
0
        out[4] = v0x4;
99
0
        out[5] = v0x5;
100
0
        out[6] = v0x6;
101
0
        out[7] = v0x7;
102
0
        w0 += 8;
103
0
        const int8_t v1x0 = w1[0];
104
0
        const int8_t v1x1 = w1[1];
105
0
        const int8_t v1x2 = w1[2];
106
0
        const int8_t v1x3 = w1[3];
107
0
        const int8_t v1x4 = w1[4];
108
0
        const int8_t v1x5 = w1[5];
109
0
        const int8_t v1x6 = w1[6];
110
0
        const int8_t v1x7 = w1[7];
111
0
        ksum1 += (uint32_t) v1x0;
112
0
        ksum1 += (uint32_t) v1x1;
113
0
        ksum1 += (uint32_t) v1x2;
114
0
        ksum1 += (uint32_t) v1x3;
115
0
        ksum1 += (uint32_t) v1x4;
116
0
        ksum1 += (uint32_t) v1x5;
117
0
        ksum1 += (uint32_t) v1x6;
118
0
        ksum1 += (uint32_t) v1x7;
119
0
        out[8] = v1x0;
120
0
        out[9] = v1x1;
121
0
        out[10] = v1x2;
122
0
        out[11] = v1x3;
123
0
        out[12] = v1x4;
124
0
        out[13] = v1x5;
125
0
        out[14] = v1x6;
126
0
        out[15] = v1x7;
127
0
        w1 += 8;
128
0
        const int8_t v2x0 = w2[0];
129
0
        const int8_t v2x1 = w2[1];
130
0
        const int8_t v2x2 = w2[2];
131
0
        const int8_t v2x3 = w2[3];
132
0
        const int8_t v2x4 = w2[4];
133
0
        const int8_t v2x5 = w2[5];
134
0
        const int8_t v2x6 = w2[6];
135
0
        const int8_t v2x7 = w2[7];
136
0
        ksum2 += (uint32_t) v2x0;
137
0
        ksum2 += (uint32_t) v2x1;
138
0
        ksum2 += (uint32_t) v2x2;
139
0
        ksum2 += (uint32_t) v2x3;
140
0
        ksum2 += (uint32_t) v2x4;
141
0
        ksum2 += (uint32_t) v2x5;
142
0
        ksum2 += (uint32_t) v2x6;
143
0
        ksum2 += (uint32_t) v2x7;
144
0
        out[16] = v2x0;
145
0
        out[17] = v2x1;
146
0
        out[18] = v2x2;
147
0
        out[19] = v2x3;
148
0
        out[20] = v2x4;
149
0
        out[21] = v2x5;
150
0
        out[22] = v2x6;
151
0
        out[23] = v2x7;
152
0
        w2 += 8;
153
0
        const int8_t v3x0 = w3[0];
154
0
        const int8_t v3x1 = w3[1];
155
0
        const int8_t v3x2 = w3[2];
156
0
        const int8_t v3x3 = w3[3];
157
0
        const int8_t v3x4 = w3[4];
158
0
        const int8_t v3x5 = w3[5];
159
0
        const int8_t v3x6 = w3[6];
160
0
        const int8_t v3x7 = w3[7];
161
0
        ksum3 += (uint32_t) v3x0;
162
0
        ksum3 += (uint32_t) v3x1;
163
0
        ksum3 += (uint32_t) v3x2;
164
0
        ksum3 += (uint32_t) v3x3;
165
0
        ksum3 += (uint32_t) v3x4;
166
0
        ksum3 += (uint32_t) v3x5;
167
0
        ksum3 += (uint32_t) v3x6;
168
0
        ksum3 += (uint32_t) v3x7;
169
0
        out[24] = v3x0;
170
0
        out[25] = v3x1;
171
0
        out[26] = v3x2;
172
0
        out[27] = v3x3;
173
0
        out[28] = v3x4;
174
0
        out[29] = v3x5;
175
0
        out[30] = v3x6;
176
0
        out[31] = v3x7;
177
0
        w3 += 8;
178
0
        out += 32;
179
0
      }
180
181
      // KC remainder of 1..7
182
0
      if (k != 0) {
183
0
        assert(k >= 1 && k <= 7);
184
0
        const int8_t v0x0 = w0[0];
185
0
        const int8_t v0x1 = 1 < k ? w0[1] : 0;
186
0
        const int8_t v0x2 = 2 < k ? w0[2] : 0;
187
0
        const int8_t v0x3 = 3 < k ? w0[3] : 0;
188
0
        const int8_t v0x4 = 4 < k ? w0[4] : 0;
189
0
        const int8_t v0x5 = 5 < k ? w0[5] : 0;
190
0
        const int8_t v0x6 = 6 < k ? w0[6] : 0;
191
0
        const int8_t v0x7 = 7 < k ? w0[7] : 0;
192
0
        ksum0 += (uint32_t) v0x0;
193
0
        ksum0 += (uint32_t) v0x1;
194
0
        ksum0 += (uint32_t) v0x2;
195
0
        ksum0 += (uint32_t) v0x3;
196
0
        ksum0 += (uint32_t) v0x4;
197
0
        ksum0 += (uint32_t) v0x5;
198
0
        ksum0 += (uint32_t) v0x6;
199
0
        ksum0 += (uint32_t) v0x7;
200
0
        out[0] = v0x0;
201
0
        out[1] = v0x1;
202
0
        out[2] = v0x2;
203
0
        out[3] = v0x3;
204
0
        out[4] = v0x4;
205
0
        out[5] = v0x5;
206
0
        out[6] = v0x6;
207
0
        out[7] = v0x7;
208
0
        w0 += k;
209
0
        const int8_t v1x0 = w1[0];
210
0
        const int8_t v1x1 = 1 < k ? w1[1] : 0;
211
0
        const int8_t v1x2 = 2 < k ? w1[2] : 0;
212
0
        const int8_t v1x3 = 3 < k ? w1[3] : 0;
213
0
        const int8_t v1x4 = 4 < k ? w1[4] : 0;
214
0
        const int8_t v1x5 = 5 < k ? w1[5] : 0;
215
0
        const int8_t v1x6 = 6 < k ? w1[6] : 0;
216
0
        const int8_t v1x7 = 7 < k ? w1[7] : 0;
217
0
        ksum1 += (uint32_t) v1x0;
218
0
        ksum1 += (uint32_t) v1x1;
219
0
        ksum1 += (uint32_t) v1x2;
220
0
        ksum1 += (uint32_t) v1x3;
221
0
        ksum1 += (uint32_t) v1x4;
222
0
        ksum1 += (uint32_t) v1x5;
223
0
        ksum1 += (uint32_t) v1x6;
224
0
        ksum1 += (uint32_t) v1x7;
225
0
        out[8] = v1x0;
226
0
        out[9] = v1x1;
227
0
        out[10] = v1x2;
228
0
        out[11] = v1x3;
229
0
        out[12] = v1x4;
230
0
        out[13] = v1x5;
231
0
        out[14] = v1x6;
232
0
        out[15] = v1x7;
233
0
        w1 += k;
234
0
        const int8_t v2x0 = w2[0];
235
0
        const int8_t v2x1 = 1 < k ? w2[1] : 0;
236
0
        const int8_t v2x2 = 2 < k ? w2[2] : 0;
237
0
        const int8_t v2x3 = 3 < k ? w2[3] : 0;
238
0
        const int8_t v2x4 = 4 < k ? w2[4] : 0;
239
0
        const int8_t v2x5 = 5 < k ? w2[5] : 0;
240
0
        const int8_t v2x6 = 6 < k ? w2[6] : 0;
241
0
        const int8_t v2x7 = 7 < k ? w2[7] : 0;
242
0
        ksum2 += (uint32_t) v2x0;
243
0
        ksum2 += (uint32_t) v2x1;
244
0
        ksum2 += (uint32_t) v2x2;
245
0
        ksum2 += (uint32_t) v2x3;
246
0
        ksum2 += (uint32_t) v2x4;
247
0
        ksum2 += (uint32_t) v2x5;
248
0
        ksum2 += (uint32_t) v2x6;
249
0
        ksum2 += (uint32_t) v2x7;
250
0
        out[16] = v2x0;
251
0
        out[17] = v2x1;
252
0
        out[18] = v2x2;
253
0
        out[19] = v2x3;
254
0
        out[20] = v2x4;
255
0
        out[21] = v2x5;
256
0
        out[22] = v2x6;
257
0
        out[23] = v2x7;
258
0
        w2 += k;
259
0
        const int8_t v3x0 = w3[0];
260
0
        const int8_t v3x1 = 1 < k ? w3[1] : 0;
261
0
        const int8_t v3x2 = 2 < k ? w3[2] : 0;
262
0
        const int8_t v3x3 = 3 < k ? w3[3] : 0;
263
0
        const int8_t v3x4 = 4 < k ? w3[4] : 0;
264
0
        const int8_t v3x5 = 5 < k ? w3[5] : 0;
265
0
        const int8_t v3x6 = 6 < k ? w3[6] : 0;
266
0
        const int8_t v3x7 = 7 < k ? w3[7] : 0;
267
0
        ksum3 += (uint32_t) v3x0;
268
0
        ksum3 += (uint32_t) v3x1;
269
0
        ksum3 += (uint32_t) v3x2;
270
0
        ksum3 += (uint32_t) v3x3;
271
0
        ksum3 += (uint32_t) v3x4;
272
0
        ksum3 += (uint32_t) v3x5;
273
0
        ksum3 += (uint32_t) v3x6;
274
0
        ksum3 += (uint32_t) v3x7;
275
0
        out[24] = v3x0;
276
0
        out[25] = v3x1;
277
0
        out[26] = v3x2;
278
0
        out[27] = v3x3;
279
0
        out[28] = v3x4;
280
0
        out[29] = v3x5;
281
0
        out[30] = v3x6;
282
0
        out[31] = v3x7;
283
0
        w3 += k;
284
0
        out += 32;
285
0
      }
286
287
0
      packed_b[0] -= ksum0 * izp;
288
0
      packed_b[1] -= ksum1 * izp;
289
0
      packed_b[2] -= ksum2 * izp;
290
0
      packed_b[3] -= ksum3 * izp;
291
0
      out = (int8_t*) ((uintptr_t) out + extra_bytes);
292
0
      w0 = w3 + n_stride - kc;
293
0
    }
294
295
    // NC remainder (1..3)
296
0
    if XNN_UNLIKELY(n != 0) {
297
0
      int32_t* packed_b = (int32_t*) out;
298
0
      if XNN_LIKELY(b != NULL) {
299
0
        size_t nb = n;
300
0
        do {
301
0
          *((int32_t*) out) = *b++;
302
0
          out += sizeof(int32_t);
303
0
        } while (--nb != 0);
304
0
      } else {
305
0
        size_t nb = n;
306
0
        do {
307
0
          *((int32_t*) out) = 0;
308
0
          out += sizeof(int32_t);
309
0
        } while (--nb != 0);
310
0
      }
311
0
      out += (4 - n) * sizeof(int32_t);
312
313
      // NR remainder has less than 4 rows so last row is not loaded
314
0
      const int8_t* w1 = w0 + n_stride;
315
0
      if XNN_UNPREDICTABLE(n < 2) {
316
0
        w1 = w0;
317
0
      }
318
0
      const int8_t* w2 = w1 + n_stride;
319
0
      if XNN_UNPREDICTABLE(n <= 2) {
320
0
        w2 = w1;
321
0
      }
322
0
      uint32_t ksum0 = 0;
323
0
      uint32_t ksum1 = 0;
324
0
      uint32_t ksum2 = 0;
325
326
      // KC main loop multiple of 4x8
327
0
      size_t k = kc;
328
0
      for (; k >= 8; k -= 8) {
329
0
        const int8_t v0x0 = w0[0];
330
0
        const int8_t v0x1 = w0[1];
331
0
        const int8_t v0x2 = w0[2];
332
0
        const int8_t v0x3 = w0[3];
333
0
        const int8_t v0x4 = w0[4];
334
0
        const int8_t v0x5 = w0[5];
335
0
        const int8_t v0x6 = w0[6];
336
0
        const int8_t v0x7 = w0[7];
337
0
        ksum0 += (uint32_t) v0x0;
338
0
        ksum0 += (uint32_t) v0x1;
339
0
        ksum0 += (uint32_t) v0x2;
340
0
        ksum0 += (uint32_t) v0x3;
341
0
        ksum0 += (uint32_t) v0x4;
342
0
        ksum0 += (uint32_t) v0x5;
343
0
        ksum0 += (uint32_t) v0x6;
344
0
        ksum0 += (uint32_t) v0x7;
345
0
        out[0] = v0x0;
346
0
        out[1] = v0x1;
347
0
        out[2] = v0x2;
348
0
        out[3] = v0x3;
349
0
        out[4] = v0x4;
350
0
        out[5] = v0x5;
351
0
        out[6] = v0x6;
352
0
        out[7] = v0x7;
353
0
        w0 += 8;
354
0
        const int8_t v1x0 = w1[0];
355
0
        const int8_t v1x1 = w1[1];
356
0
        const int8_t v1x2 = w1[2];
357
0
        const int8_t v1x3 = w1[3];
358
0
        const int8_t v1x4 = w1[4];
359
0
        const int8_t v1x5 = w1[5];
360
0
        const int8_t v1x6 = w1[6];
361
0
        const int8_t v1x7 = w1[7];
362
0
        ksum1 += (uint32_t) v1x0;
363
0
        ksum1 += (uint32_t) v1x1;
364
0
        ksum1 += (uint32_t) v1x2;
365
0
        ksum1 += (uint32_t) v1x3;
366
0
        ksum1 += (uint32_t) v1x4;
367
0
        ksum1 += (uint32_t) v1x5;
368
0
        ksum1 += (uint32_t) v1x6;
369
0
        ksum1 += (uint32_t) v1x7;
370
0
        out[8] = v1x0;
371
0
        out[9] = v1x1;
372
0
        out[10] = v1x2;
373
0
        out[11] = v1x3;
374
0
        out[12] = v1x4;
375
0
        out[13] = v1x5;
376
0
        out[14] = v1x6;
377
0
        out[15] = v1x7;
378
0
        w1 += 8;
379
0
        const int8_t v2x0 = w2[0];
380
0
        const int8_t v2x1 = w2[1];
381
0
        const int8_t v2x2 = w2[2];
382
0
        const int8_t v2x3 = w2[3];
383
0
        const int8_t v2x4 = w2[4];
384
0
        const int8_t v2x5 = w2[5];
385
0
        const int8_t v2x6 = w2[6];
386
0
        const int8_t v2x7 = w2[7];
387
0
        ksum2 += (uint32_t) v2x0;
388
0
        ksum2 += (uint32_t) v2x1;
389
0
        ksum2 += (uint32_t) v2x2;
390
0
        ksum2 += (uint32_t) v2x3;
391
0
        ksum2 += (uint32_t) v2x4;
392
0
        ksum2 += (uint32_t) v2x5;
393
0
        ksum2 += (uint32_t) v2x6;
394
0
        ksum2 += (uint32_t) v2x7;
395
0
        out[16] = v2x0;
396
0
        out[17] = v2x1;
397
0
        out[18] = v2x2;
398
0
        out[19] = v2x3;
399
0
        out[20] = v2x4;
400
0
        out[21] = v2x5;
401
0
        out[22] = v2x6;
402
0
        out[23] = v2x7;
403
0
        w2 += 8;
404
0
        out += 32;
405
0
      }
406
407
      // KC remainder of 1..7
408
0
      if (k != 0) {
409
0
        assert(k >= 1 && k <= 7);
410
0
        const int8_t v0x0 = w0[0];
411
0
        const int8_t v0x1 = 1 < k ? w0[1] : 0;
412
0
        const int8_t v0x2 = 2 < k ? w0[2] : 0;
413
0
        const int8_t v0x3 = 3 < k ? w0[3] : 0;
414
0
        const int8_t v0x4 = 4 < k ? w0[4] : 0;
415
0
        const int8_t v0x5 = 5 < k ? w0[5] : 0;
416
0
        const int8_t v0x6 = 6 < k ? w0[6] : 0;
417
0
        const int8_t v0x7 = 7 < k ? w0[7] : 0;
418
0
        ksum0 += (uint32_t) v0x0;
419
0
        ksum0 += (uint32_t) v0x1;
420
0
        ksum0 += (uint32_t) v0x2;
421
0
        ksum0 += (uint32_t) v0x3;
422
0
        ksum0 += (uint32_t) v0x4;
423
0
        ksum0 += (uint32_t) v0x5;
424
0
        ksum0 += (uint32_t) v0x6;
425
0
        ksum0 += (uint32_t) v0x7;
426
0
        out[0] = v0x0;
427
0
        out[1] = v0x1;
428
0
        out[2] = v0x2;
429
0
        out[3] = v0x3;
430
0
        out[4] = v0x4;
431
0
        out[5] = v0x5;
432
0
        out[6] = v0x6;
433
0
        out[7] = v0x7;
434
0
        w0 += k;
435
0
        const int8_t v1x0 = w1[0];
436
0
        const int8_t v1x1 = 1 < k ? w1[1] : 0;
437
0
        const int8_t v1x2 = 2 < k ? w1[2] : 0;
438
0
        const int8_t v1x3 = 3 < k ? w1[3] : 0;
439
0
        const int8_t v1x4 = 4 < k ? w1[4] : 0;
440
0
        const int8_t v1x5 = 5 < k ? w1[5] : 0;
441
0
        const int8_t v1x6 = 6 < k ? w1[6] : 0;
442
0
        const int8_t v1x7 = 7 < k ? w1[7] : 0;
443
0
        ksum1 += (uint32_t) v1x0;
444
0
        ksum1 += (uint32_t) v1x1;
445
0
        ksum1 += (uint32_t) v1x2;
446
0
        ksum1 += (uint32_t) v1x3;
447
0
        ksum1 += (uint32_t) v1x4;
448
0
        ksum1 += (uint32_t) v1x5;
449
0
        ksum1 += (uint32_t) v1x6;
450
0
        ksum1 += (uint32_t) v1x7;
451
0
        out[8] = v1x0;
452
0
        out[9] = v1x1;
453
0
        out[10] = v1x2;
454
0
        out[11] = v1x3;
455
0
        out[12] = v1x4;
456
0
        out[13] = v1x5;
457
0
        out[14] = v1x6;
458
0
        out[15] = v1x7;
459
0
        w1 += k;
460
0
        const int8_t v2x0 = w2[0];
461
0
        const int8_t v2x1 = 1 < k ? w2[1] : 0;
462
0
        const int8_t v2x2 = 2 < k ? w2[2] : 0;
463
0
        const int8_t v2x3 = 3 < k ? w2[3] : 0;
464
0
        const int8_t v2x4 = 4 < k ? w2[4] : 0;
465
0
        const int8_t v2x5 = 5 < k ? w2[5] : 0;
466
0
        const int8_t v2x6 = 6 < k ? w2[6] : 0;
467
0
        const int8_t v2x7 = 7 < k ? w2[7] : 0;
468
0
        ksum2 += (uint32_t) v2x0;
469
0
        ksum2 += (uint32_t) v2x1;
470
0
        ksum2 += (uint32_t) v2x2;
471
0
        ksum2 += (uint32_t) v2x3;
472
0
        ksum2 += (uint32_t) v2x4;
473
0
        ksum2 += (uint32_t) v2x5;
474
0
        ksum2 += (uint32_t) v2x6;
475
0
        ksum2 += (uint32_t) v2x7;
476
0
        out[16] = v2x0;
477
0
        out[17] = v2x1;
478
0
        out[18] = v2x2;
479
0
        out[19] = v2x3;
480
0
        out[20] = v2x4;
481
0
        out[21] = v2x5;
482
0
        out[22] = v2x6;
483
0
        out[23] = v2x7;
484
0
        w2 += k;
485
0
        out[24] = 0;
486
0
        out[25] = 0;
487
0
        out[26] = 0;
488
0
        out[27] = 0;
489
0
        out[28] = 0;
490
0
        out[29] = 0;
491
0
        out[30] = 0;
492
0
        out[31] = 0;
493
0
        out += 32;
494
0
      }
495
496
0
      packed_b[0] -= ksum0 * izp;
497
0
      packed_b[1] -= ksum1 * izp;
498
0
      packed_b[2] -= ksum2 * izp;
499
0
      out = (int8_t*) ((uintptr_t) out + extra_bytes);
500
0
    }
501
0
    weights += nc * n_stride;
502
0
  } while (--g != 0);
503
0
}