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