1 // Auto-generated file. Do not edit!
2 // Template: src/cs16-fftr/scalar.c.in
3 // Generator: tools/xngen
4 //
5 // Copyright 2022 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 #include <stddef.h>
12 #include <stdint.h>
13
14 #include <xnnpack/math.h>
15 #include <xnnpack/fft.h>
16
17
xnn_cs16_fftr_ukernel__scalar_x1(size_t samples,int16_t * data,const int16_t * twiddle)18 void xnn_cs16_fftr_ukernel__scalar_x1(
19 size_t samples,
20 int16_t* data,
21 const int16_t* twiddle)
22 {
23 assert(samples >= 2);
24 assert(samples % 2 == 0);
25 assert(data != NULL);
26 assert(data != NULL);
27 assert(twiddle != NULL);
28
29 int16_t* dl = data;
30 int16_t* dr = data + samples * 2;
31 int32_t vdcr = (int32_t) dl[0];
32 int32_t vdci = (int32_t) dl[1];
33
34 vdcr = math_asr_s32(vdcr * 16383 + 16384, 15);
35 vdci = math_asr_s32(vdci * 16383 + 16384, 15);
36
37 dl[0] = vdcr + vdci;
38 dl[1] = 0;
39 dl += 2;
40 dr[0] = vdcr - vdci;
41 dr[1] = 0;
42
43 samples >>= 1;
44
45
46 if XNN_UNLIKELY(samples != 0) {
47 do {
48 dr -= 2;
49 int32_t vilr = dl[0];
50 int32_t vili = dl[1];
51 int32_t virr = (int32_t) dr[0];
52 int32_t viri = -(int32_t) dr[1];
53 const int32_t vtwr = twiddle[0];
54 const int32_t vtwi = twiddle[1];
55 twiddle += 2;
56
57 vilr = math_asr_s32(vilr * 16383 + 16384, 15);
58 vili = math_asr_s32(vili * 16383 + 16384, 15);
59 virr = math_asr_s32(virr * 16383 + 16384, 15);
60 viri = math_asr_s32(viri * 16383 + 16384, 15);
61 const int32_t vacc1r = vilr + virr;
62 const int32_t vacc1i = vili + viri;
63 const int32_t vacc2r = vilr - virr;
64 const int32_t vacc2i = vili - viri;
65
66 const int32_t twr = math_asr_s32(vacc2r * vtwr - vacc2i * vtwi + 16384, 15);
67 const int32_t twi = math_asr_s32(vacc2r * vtwi + vacc2i * vtwr + 16384, 15);
68
69 dl[0] = math_asr_s32(vacc1r + twr, 1);
70 dl[1] = math_asr_s32(vacc1i + twi, 1);
71 dr[0] = math_asr_s32(vacc1r - twr, 1);
72 dr[1] = math_asr_s32(twi - vacc1i, 1);
73 dl += 2;
74 } while (--samples != 0);
75 }
76 }
77