1/*
2 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11
12#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
13
14static int16_t coefTable_7[] = {
15    4, 256,   8, 128,  12, 384,  16,  64,
16   20, 320,  24, 192,  28, 448,  36, 288,
17   40, 160,  44, 416,  48,  96,  52, 352,
18   56, 224,  60, 480,  68, 272,  72, 144,
19   76, 400,  84, 336,  88, 208,  92, 464,
20  100, 304, 104, 176, 108, 432, 116, 368,
21  120, 240, 124, 496, 132, 264, 140, 392,
22  148, 328, 152, 200, 156, 456, 164, 296,
23  172, 424, 180, 360, 184, 232, 188, 488,
24  196, 280, 204, 408, 212, 344, 220, 472,
25  228, 312, 236, 440, 244, 376, 252, 504,
26  268, 388, 276, 324, 284, 452, 300, 420,
27  308, 356, 316, 484, 332, 404, 348, 468,
28  364, 436, 380, 500, 412, 460, 444, 492
29};
30
31static int16_t coefTable_8[] = {
32    4,  512,    8,  256,   12,  768,   16,  128,
33   20,  640,   24,  384,   28,  896,   32,   64,
34   36,  576,   40,  320,   44,  832,   48,  192,
35   52,  704,   56,  448,   60,  960,   68,  544,
36   72,  288,   76,  800,   80,  160,   84,  672,
37   88,  416,   92,  928,  100,  608,  104,  352,
38  108,  864,  112,  224,  116,  736,  120,  480,
39  124,  992,  132,  528,  136,  272,  140,  784,
40  148,  656,  152,  400,  156,  912,  164,  592,
41  168,  336,  172,  848,  176,  208,  180,  720,
42  184,  464,  188,  976,  196,  560,  200,  304,
43  204,  816,  212,  688,  216,  432,  220,  944,
44  228,  624,  232,  368,  236,  880,  244,  752,
45  248,  496,  252, 1008,  260,  520,  268,  776,
46  276,  648,  280,  392,  284,  904,  292,  584,
47  296,  328,  300,  840,  308,  712,  312,  456,
48  316,  968,  324,  552,  332,  808,  340,  680,
49  344,  424,  348,  936,  356,  616,  364,  872,
50  372,  744,  376,  488,  380, 1000,  388,  536,
51  396,  792,  404,  664,  412,  920,  420,  600,
52  428,  856,  436,  728,  440,  472,  444,  984,
53  452,  568,  460,  824,  468,  696,  476,  952,
54  484,  632,  492,  888,  500,  760,  508, 1016,
55  524,  772,  532,  644,  540,  900,  548,  580,
56  556,  836,  564,  708,  572,  964,  588,  804,
57  596,  676,  604,  932,  620,  868,  628,  740,
58  636,  996,  652,  788,  668,  916,  684,  852,
59  692,  724,  700,  980,  716,  820,  732,  948,
60  748,  884,  764, 1012,  796,  908,  812,  844,
61  828,  972,  860,  940,  892, 1004,  956,  988
62};
63
64void WebRtcSpl_ComplexBitReverse(int16_t frfi[], int stages) {
65  int l;
66  int16_t tr, ti;
67  int32_t tmp1, tmp2, tmp3, tmp4;
68  int32_t* ptr_i;
69  int32_t* ptr_j;
70
71  if (stages == 8) {
72    int16_t* pcoeftable_8 = coefTable_8;
73
74    __asm __volatile (
75      ".set         push                                             \n\t"
76      ".set         noreorder                                        \n\t"
77      "addiu        %[l],            $zero,               120        \n\t"
78     "1:                                                             \n\t"
79      "addiu        %[l],            %[l],                -4         \n\t"
80      "lh           %[tr],           0(%[pcoeftable_8])              \n\t"
81      "lh           %[ti],           2(%[pcoeftable_8])              \n\t"
82      "lh           %[tmp3],         4(%[pcoeftable_8])              \n\t"
83      "lh           %[tmp4],         6(%[pcoeftable_8])              \n\t"
84      "addu         %[ptr_i],        %[frfi],             %[tr]      \n\t"
85      "addu         %[ptr_j],        %[frfi],             %[ti]      \n\t"
86      "addu         %[tr],           %[frfi],             %[tmp3]    \n\t"
87      "addu         %[ti],           %[frfi],             %[tmp4]    \n\t"
88      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
89      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
90      "ulw          %[tmp3],         0(%[tr])                        \n\t"
91      "ulw          %[tmp4],         0(%[ti])                        \n\t"
92      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
93      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
94      "usw          %[tmp4],         0(%[tr])                        \n\t"
95      "usw          %[tmp3],         0(%[ti])                        \n\t"
96      "lh           %[tmp1],         8(%[pcoeftable_8])              \n\t"
97      "lh           %[tmp2],         10(%[pcoeftable_8])             \n\t"
98      "lh           %[tr],           12(%[pcoeftable_8])             \n\t"
99      "lh           %[ti],           14(%[pcoeftable_8])             \n\t"
100      "addu         %[ptr_i],        %[frfi],             %[tmp1]    \n\t"
101      "addu         %[ptr_j],        %[frfi],             %[tmp2]    \n\t"
102      "addu         %[tr],           %[frfi],             %[tr]      \n\t"
103      "addu         %[ti],           %[frfi],             %[ti]      \n\t"
104      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
105      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
106      "ulw          %[tmp3],         0(%[tr])                        \n\t"
107      "ulw          %[tmp4],         0(%[ti])                        \n\t"
108      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
109      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
110      "usw          %[tmp4],         0(%[tr])                        \n\t"
111      "usw          %[tmp3],         0(%[ti])                        \n\t"
112      "bgtz         %[l],            1b                              \n\t"
113      " addiu       %[pcoeftable_8], %[pcoeftable_8],     16         \n\t"
114      ".set         pop                                              \n\t"
115
116      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [ptr_i] "=&r" (ptr_i),
117        [ptr_j] "=&r" (ptr_j), [tr] "=&r" (tr), [l] "=&r" (l),
118        [tmp3] "=&r" (tmp3), [pcoeftable_8] "+r" (pcoeftable_8),
119        [ti] "=&r" (ti), [tmp4] "=&r" (tmp4)
120      : [frfi] "r" (frfi)
121      : "memory"
122    );
123  } else if (stages == 7) {
124    int16_t* pcoeftable_7 = coefTable_7;
125
126    __asm __volatile (
127      ".set push                                                     \n\t"
128      ".set noreorder                                                \n\t"
129      "addiu        %[l],            $zero,               56         \n\t"
130     "1:                                                             \n\t"
131      "addiu        %[l],            %[l],                -4         \n\t"
132      "lh           %[tr],           0(%[pcoeftable_7])              \n\t"
133      "lh           %[ti],           2(%[pcoeftable_7])              \n\t"
134      "lh           %[tmp3],         4(%[pcoeftable_7])              \n\t"
135      "lh           %[tmp4],         6(%[pcoeftable_7])              \n\t"
136      "addu         %[ptr_i],        %[frfi],             %[tr]      \n\t"
137      "addu         %[ptr_j],        %[frfi],             %[ti]      \n\t"
138      "addu         %[tr],           %[frfi],             %[tmp3]    \n\t"
139      "addu         %[ti],           %[frfi],             %[tmp4]    \n\t"
140      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
141      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
142      "ulw          %[tmp3],         0(%[tr])                        \n\t"
143      "ulw          %[tmp4],         0(%[ti])                        \n\t"
144      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
145      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
146      "usw          %[tmp4],         0(%[tr])                        \n\t"
147      "usw          %[tmp3],         0(%[ti])                        \n\t"
148      "lh           %[tmp1],         8(%[pcoeftable_7])              \n\t"
149      "lh           %[tmp2],         10(%[pcoeftable_7])             \n\t"
150      "lh           %[tr],           12(%[pcoeftable_7])             \n\t"
151      "lh           %[ti],           14(%[pcoeftable_7])             \n\t"
152      "addu         %[ptr_i],        %[frfi],             %[tmp1]    \n\t"
153      "addu         %[ptr_j],        %[frfi],             %[tmp2]    \n\t"
154      "addu         %[tr],           %[frfi],             %[tr]      \n\t"
155      "addu         %[ti],           %[frfi],             %[ti]      \n\t"
156      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
157      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
158      "ulw          %[tmp3],         0(%[tr])                        \n\t"
159      "ulw          %[tmp4],         0(%[ti])                        \n\t"
160      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
161      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
162      "usw          %[tmp4],         0(%[tr])                        \n\t"
163      "usw          %[tmp3],         0(%[ti])                        \n\t"
164      "bgtz         %[l],            1b                              \n\t"
165      " addiu       %[pcoeftable_7], %[pcoeftable_7],     16         \n\t"
166      ".set pop                                                      \n\t"
167
168      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [ptr_i] "=&r" (ptr_i),
169        [ptr_j] "=&r" (ptr_j), [ti] "=&r" (ti), [tr] "=&r" (tr),
170        [l] "=&r" (l), [pcoeftable_7] "+r" (pcoeftable_7),
171        [tmp3] "=&r" (tmp3), [tmp4] "=&r" (tmp4)
172      : [frfi] "r" (frfi)
173      : "memory"
174    );
175  }
176}
177