Home | History | Annotate | Download | only in signal_processing
      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 
     15 #include "webrtc/system_wrappers/interface/asm_defines.h"
     16 
     17 GLOBAL_FUNCTION WebRtcSpl_ComplexBitReverse
     18 .align  2
     19 DEFINE_FUNCTION WebRtcSpl_ComplexBitReverse
     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 
     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.
     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
    101 
    102 index_8:  @ Indexes for stages == 8.
    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
    120