Home | History | Annotate | Download | only in signal_processing
      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 #include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
     12 
     13 void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation,
     14                                      const int16_t* seq1,
     15                                      const int16_t* seq2,
     16                                      size_t dim_seq,
     17                                      size_t dim_cross_correlation,
     18                                      int right_shifts,
     19                                      int step_seq2) {
     20 
     21   int32_t t0 = 0, t1 = 0, t2 = 0, t3 = 0, sum = 0;
     22   int16_t *pseq2 = NULL;
     23   int16_t *pseq1 = NULL;
     24   int16_t *pseq1_0 = (int16_t*)&seq1[0];
     25   int16_t *pseq2_0 = (int16_t*)&seq2[0];
     26   int k = 0;
     27 
     28   __asm __volatile (
     29     ".set        push                                           \n\t"
     30     ".set        noreorder                                      \n\t"
     31     "sll         %[step_seq2], %[step_seq2],   1                \n\t"
     32     "andi        %[t0],        %[dim_seq],     1                \n\t"
     33     "bgtz        %[t0],        3f                               \n\t"
     34     " nop                                                       \n\t"
     35    "1:                                                          \n\t"
     36     "move        %[pseq1],     %[pseq1_0]                       \n\t"
     37     "move        %[pseq2],     %[pseq2_0]                       \n\t"
     38     "sra         %[k],         %[dim_seq],     1                \n\t"
     39     "addiu       %[dim_cc],    %[dim_cc],      -1               \n\t"
     40     "xor         %[sum],       %[sum],         %[sum]           \n\t"
     41    "2:                                                          \n\t"
     42     "lh          %[t0],        0(%[pseq1])                      \n\t"
     43     "lh          %[t1],        0(%[pseq2])                      \n\t"
     44     "lh          %[t2],        2(%[pseq1])                      \n\t"
     45     "lh          %[t3],        2(%[pseq2])                      \n\t"
     46     "mul         %[t0],        %[t0],          %[t1]            \n\t"
     47     "addiu       %[k],         %[k],           -1               \n\t"
     48     "mul         %[t2],        %[t2],          %[t3]            \n\t"
     49     "addiu       %[pseq1],     %[pseq1],       4                \n\t"
     50     "addiu       %[pseq2],     %[pseq2],       4                \n\t"
     51     "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
     52     "addu        %[sum],       %[sum],         %[t0]            \n\t"
     53     "srav        %[t2],        %[t2],          %[right_shifts]  \n\t"
     54     "bgtz        %[k],         2b                               \n\t"
     55     " addu       %[sum],       %[sum],         %[t2]            \n\t"
     56     "addu        %[pseq2_0],   %[pseq2_0],     %[step_seq2]     \n\t"
     57     "sw          %[sum],       0(%[cc])                         \n\t"
     58     "bgtz        %[dim_cc],    1b                               \n\t"
     59     " addiu      %[cc],        %[cc],          4                \n\t"
     60     "b           6f                                             \n\t"
     61     " nop                                                       \n\t"
     62    "3:                                                          \n\t"
     63     "move        %[pseq1],     %[pseq1_0]                       \n\t"
     64     "move        %[pseq2],     %[pseq2_0]                       \n\t"
     65     "sra         %[k],         %[dim_seq],     1                \n\t"
     66     "addiu       %[dim_cc],    %[dim_cc],      -1               \n\t"
     67     "beqz        %[k],         5f                               \n\t"
     68     " xor        %[sum],       %[sum],         %[sum]           \n\t"
     69    "4:                                                          \n\t"
     70     "lh          %[t0],        0(%[pseq1])                      \n\t"
     71     "lh          %[t1],        0(%[pseq2])                      \n\t"
     72     "lh          %[t2],        2(%[pseq1])                      \n\t"
     73     "lh          %[t3],        2(%[pseq2])                      \n\t"
     74     "mul         %[t0],        %[t0],          %[t1]            \n\t"
     75     "addiu       %[k],         %[k],           -1               \n\t"
     76     "mul         %[t2],        %[t2],          %[t3]            \n\t"
     77     "addiu       %[pseq1],     %[pseq1],       4                \n\t"
     78     "addiu       %[pseq2],     %[pseq2],       4                \n\t"
     79     "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
     80     "addu        %[sum],       %[sum],         %[t0]            \n\t"
     81     "srav        %[t2],        %[t2],          %[right_shifts]  \n\t"
     82     "bgtz        %[k],         4b                               \n\t"
     83     " addu       %[sum],       %[sum],         %[t2]            \n\t"
     84    "5:                                                          \n\t"
     85     "lh          %[t0],        0(%[pseq1])                      \n\t"
     86     "lh          %[t1],        0(%[pseq2])                      \n\t"
     87     "mul         %[t0],        %[t0],          %[t1]            \n\t"
     88     "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
     89     "addu        %[sum],       %[sum],         %[t0]            \n\t"
     90     "addu        %[pseq2_0],   %[pseq2_0],     %[step_seq2]     \n\t"
     91     "sw          %[sum],       0(%[cc])                         \n\t"
     92     "bgtz        %[dim_cc],    3b                               \n\t"
     93     " addiu      %[cc],        %[cc],          4                \n\t"
     94    "6:                                                          \n\t"
     95     ".set        pop                                            \n\t"
     96     : [step_seq2] "+r" (step_seq2), [t0] "=&r" (t0), [t1] "=&r" (t1),
     97       [t2] "=&r" (t2), [t3] "=&r" (t3), [pseq1] "=&r" (pseq1),
     98       [pseq2] "=&r" (pseq2), [pseq1_0] "+r" (pseq1_0), [pseq2_0] "+r" (pseq2_0),
     99       [k] "=&r" (k), [dim_cc] "+r" (dim_cross_correlation), [sum] "=&r" (sum),
    100       [cc] "+r" (cross_correlation)
    101     : [dim_seq] "r" (dim_seq), [right_shifts] "r" (right_shifts)
    102     : "hi", "lo", "memory"
    103   );
    104 }
    105