1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2022 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker
6*4bdc9457SAndroid Build Coastguard Worker #include <assert.h>
7*4bdc9457SAndroid Build Coastguard Worker #include <stddef.h>
8*4bdc9457SAndroid Build Coastguard Worker #include <stdint.h>
9*4bdc9457SAndroid Build Coastguard Worker
10*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/math.h>
11*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/fft.h>
12*4bdc9457SAndroid Build Coastguard Worker
13*4bdc9457SAndroid Build Coastguard Worker
xnn_cs16_bfly4_samples1_ukernel__scalar(size_t samples,int16_t * data,const size_t stride,const int16_t * twiddle)14*4bdc9457SAndroid Build Coastguard Worker void xnn_cs16_bfly4_samples1_ukernel__scalar(
15*4bdc9457SAndroid Build Coastguard Worker size_t samples,
16*4bdc9457SAndroid Build Coastguard Worker int16_t* data,
17*4bdc9457SAndroid Build Coastguard Worker const size_t stride,
18*4bdc9457SAndroid Build Coastguard Worker const int16_t* twiddle)
19*4bdc9457SAndroid Build Coastguard Worker {
20*4bdc9457SAndroid Build Coastguard Worker assert(samples == 1);
21*4bdc9457SAndroid Build Coastguard Worker assert(data != NULL);
22*4bdc9457SAndroid Build Coastguard Worker assert(stride != 0);
23*4bdc9457SAndroid Build Coastguard Worker assert(twiddle != NULL);
24*4bdc9457SAndroid Build Coastguard Worker
25*4bdc9457SAndroid Build Coastguard Worker int32_t vout0r = (int32_t) data[0];
26*4bdc9457SAndroid Build Coastguard Worker int32_t vout0i = (int32_t) data[1];
27*4bdc9457SAndroid Build Coastguard Worker int32_t vout1r = (int32_t) data[2];
28*4bdc9457SAndroid Build Coastguard Worker int32_t vout1i = (int32_t) data[3];
29*4bdc9457SAndroid Build Coastguard Worker int32_t vout2r = (int32_t) data[4];
30*4bdc9457SAndroid Build Coastguard Worker int32_t vout2i = (int32_t) data[5];
31*4bdc9457SAndroid Build Coastguard Worker int32_t vout3r = (int32_t) data[6];
32*4bdc9457SAndroid Build Coastguard Worker int32_t vout3i = (int32_t) data[7];
33*4bdc9457SAndroid Build Coastguard Worker
34*4bdc9457SAndroid Build Coastguard Worker // Note 32767 / 4 = 8191. Should be 8192.
35*4bdc9457SAndroid Build Coastguard Worker vout0r = math_asr_s32(vout0r * 8191 + 16384, 15);
36*4bdc9457SAndroid Build Coastguard Worker vout0i = math_asr_s32(vout0i * 8191 + 16384, 15);
37*4bdc9457SAndroid Build Coastguard Worker vout1r = math_asr_s32(vout1r * 8191 + 16384, 15);
38*4bdc9457SAndroid Build Coastguard Worker vout1i = math_asr_s32(vout1i * 8191 + 16384, 15);
39*4bdc9457SAndroid Build Coastguard Worker vout2r = math_asr_s32(vout2r * 8191 + 16384, 15);
40*4bdc9457SAndroid Build Coastguard Worker vout2i = math_asr_s32(vout2i * 8191 + 16384, 15);
41*4bdc9457SAndroid Build Coastguard Worker vout3r = math_asr_s32(vout3r * 8191 + 16384, 15);
42*4bdc9457SAndroid Build Coastguard Worker vout3i = math_asr_s32(vout3i * 8191 + 16384, 15);
43*4bdc9457SAndroid Build Coastguard Worker
44*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp5r = vout0r - vout2r;
45*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp5i = vout0i - vout2i;
46*4bdc9457SAndroid Build Coastguard Worker vout0r += vout2r;
47*4bdc9457SAndroid Build Coastguard Worker vout0i += vout2i;
48*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp3r = vout1r + vout3r;
49*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp3i = vout1i + vout3i;
50*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp4r = vout1r - vout3r;
51*4bdc9457SAndroid Build Coastguard Worker const int32_t vtmp4i = vout1i - vout3i;
52*4bdc9457SAndroid Build Coastguard Worker vout2r = vout0r - vtmp3r;
53*4bdc9457SAndroid Build Coastguard Worker vout2i = vout0i - vtmp3i;
54*4bdc9457SAndroid Build Coastguard Worker
55*4bdc9457SAndroid Build Coastguard Worker vout0r += vtmp3r;
56*4bdc9457SAndroid Build Coastguard Worker vout0i += vtmp3i;
57*4bdc9457SAndroid Build Coastguard Worker
58*4bdc9457SAndroid Build Coastguard Worker vout1r = vtmp5r + vtmp4i;
59*4bdc9457SAndroid Build Coastguard Worker vout1i = vtmp5i - vtmp4r;
60*4bdc9457SAndroid Build Coastguard Worker vout3r = vtmp5r - vtmp4i;
61*4bdc9457SAndroid Build Coastguard Worker vout3i = vtmp5i + vtmp4r;
62*4bdc9457SAndroid Build Coastguard Worker
63*4bdc9457SAndroid Build Coastguard Worker data[0] = (int16_t) vout0r;
64*4bdc9457SAndroid Build Coastguard Worker data[1] = (int16_t) vout0i;
65*4bdc9457SAndroid Build Coastguard Worker data[2] = (int16_t) vout1r;
66*4bdc9457SAndroid Build Coastguard Worker data[3] = (int16_t) vout1i;
67*4bdc9457SAndroid Build Coastguard Worker data[4] = (int16_t) vout2r;
68*4bdc9457SAndroid Build Coastguard Worker data[5] = (int16_t) vout2i;
69*4bdc9457SAndroid Build Coastguard Worker data[6] = (int16_t) vout3r;
70*4bdc9457SAndroid Build Coastguard Worker data[7] = (int16_t) vout3i;
71*4bdc9457SAndroid Build Coastguard Worker }
72