1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ This file contains the function WebRtcSpl_ComplexBitReverse(), optimized
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ for ARMv5 platforms.
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ Reference C code is in file complex_bit_reverse.c. Bit-exact.
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org#include "webrtc/system_wrappers/interface/asm_defines.h"
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgGLOBAL_FUNCTION WebRtcSpl_ComplexBitReverse
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org.align  2
19b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.orgDEFINE_FUNCTION WebRtcSpl_ComplexBitReverse
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  push {r4-r7}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r1, #7
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  adr r3, index_7                 @ Table pointer.
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r4, #112                    @ Number of interations.
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  beq PRE_LOOP_STAGES_7_OR_8
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r1, #8
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  adr r3, index_8                 @ Table pointer.
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r4, #240                    @ Number of interations.
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  beq PRE_LOOP_STAGES_7_OR_8
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r3, #1                      @ Initialize m.
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r1, r3, asl r1              @ n = 1 << stages;
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  subs r6, r1, #1                 @ nn = n - 1;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ble END
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r5, r0                      @ &complex_data
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r4, #0                      @ ml
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_GENERIC:
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  rsb r12, r4, r6                 @ l > nn - mr
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r2, r1                      @ n
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_SHIFT:
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  asr r2, #1                      @ l >>= 1;
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r2, r12
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bgt LOOP_SHIFT
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  sub r12, r2, #1
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  and r4, r12, r4
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  add r4, r2                      @ mr = (mr & (l - 1)) + l;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r4, r3                      @ mr <= m ?
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ble UPDATE_REGISTERS
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  mov r12, r4, asl #2
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldr r7, [r5, #4]                @ complex_data[2 * m, 2 * m + 1].
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  @   Offset 4 due to m incrementing from 1.
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldr r2, [r0, r12]               @ complex_data[2 * mr, 2 * mr + 1].
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  str r7, [r0, r12]
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  str r2, [r5, #4]
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgUPDATE_REGISTERS:
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  add r3, r3, #1
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  add r5, #4
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r3, r1
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bne LOOP_GENERIC
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  b END
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgPRE_LOOP_STAGES_7_OR_8:
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  add r4, r3, r4, asl #1
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgLOOP_STAGES_7_OR_8:
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldrsh r2, [r3], #2              @ index[m]
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldrsh r5, [r3], #2              @ index[m + 1]
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldr r1, [r0, r2]                @ complex_data[index[m], index[m] + 1]
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ldr r12, [r0, r5]               @ complex_data[index[m + 1], index[m + 1] + 1]
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  cmp r3, r4
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  str r1, [r0, r5]
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  str r12, [r0, r2]
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bne LOOP_STAGES_7_OR_8
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgEND:
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  pop {r4-r7}
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  bx lr
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ The index tables. Note the values are doubles of the actual indexes for 16-bit
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ elements, different from the generic C code. It actually provides byte offsets
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org@ for the indexes.
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org.align  2
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgindex_7:  @ Indexes for stages == 7.
93b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 4, 256, 8, 128, 12, 384, 16, 64, 20, 320, 24, 192, 28, 448, 36, 288
94b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 40, 160, 44, 416, 48, 96, 52, 352, 56, 224, 60, 480, 68, 272, 72, 144
95b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 76, 400, 84, 336, 88, 208, 92, 464, 100, 304, 104, 176, 108, 432, 116
96b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 368, 120, 240, 124, 496, 132, 264, 140, 392, 148, 328, 152, 200, 156
97b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 456, 164, 296, 172, 424, 180, 360, 184, 232, 188, 488, 196, 280, 204
98b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 408, 212, 344, 220, 472, 228, 312, 236, 440, 244, 376, 252, 504, 268
99b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 388, 276, 324, 284, 452, 300, 420, 308, 356, 316, 484, 332, 404, 348
100b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 468, 364, 436, 380, 500, 412, 460, 444, 492
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgindex_8:  @ Indexes for stages == 8.
103b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 4, 512, 8, 256, 12, 768, 16, 128, 20, 640, 24, 384, 28, 896, 32, 64
104b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 36, 576, 40, 320, 44, 832, 48, 192, 52, 704, 56, 448, 60, 960, 68, 544
105b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 72, 288, 76, 800, 80, 160, 84, 672, 88, 416, 92, 928, 100, 608, 104
106b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 352, 108, 864, 112, 224, 116, 736, 120, 480, 124, 992, 132, 528, 136
107b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 272, 140, 784, 148, 656, 152, 400, 156, 912, 164, 592, 168, 336, 172
108b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 848, 176, 208, 180, 720, 184, 464, 188, 976, 196, 560, 200, 304, 204
109b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 816, 212, 688, 216, 432, 220, 944, 228, 624, 232, 368, 236, 880, 244
110b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 752, 248, 496, 252, 1008, 260, 520, 268, 776, 276, 648, 280, 392, 284
111b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 904, 292, 584, 296, 328, 300, 840, 308, 712, 312, 456, 316, 968, 324
112b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 552, 332, 808, 340, 680, 344, 424, 348, 936, 356, 616, 364, 872, 372
113b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 744, 376, 488, 380, 1000, 388, 536, 396, 792, 404, 664, 412, 920, 420
114b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 600, 428, 856, 436, 728, 440, 472, 444, 984, 452, 568, 460, 824, 468
115b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 696, 476, 952, 484, 632, 492, 888, 500, 760, 508, 1016, 524, 772, 532
116b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 644, 540, 900, 548, 580, 556, 836, 564, 708, 572, 964, 588, 804, 596
117b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 676, 604, 932, 620, 868, 628, 740, 636, 996, 652, 788, 668, 916, 684
118b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 852, 692, 724, 700, 980, 716, 820, 732, 948, 748, 884, 764, 1012, 796
119b238acaca55b4b345f0e37b82f8bbd9851c8bb6dkma@webrtc.org  .short 908, 812, 844, 828, 972, 860, 940, 892, 1004, 956, 988
120