1e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org/*
2e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *
4e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org */
10e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
11e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#include "webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h"
12e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
13e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org#include "webrtc/system_wrappers/interface/compile_assert_c.h"
14e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
15e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.orgextern int32_t WebRtcIsacfix_Log2Q8(uint32_t x);
16e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
17e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.orgvoid WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8) {
18e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  int16_t scaling,n,k;
19e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  int32_t ysum32,csum32, lys, lcs;
20e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  int32_t oneQ8;
21e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  const int16_t* x;
22e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  const int16_t* inptr;
23e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
24e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  oneQ8 = WEBRTC_SPL_LSHIFT_W32((int32_t)1, 8);  // 1.00 in Q8
25e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  x = in + PITCH_MAX_LAG / 2 + 2;
26e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  scaling = WebRtcSpl_GetScalingSquare((int16_t*)in,
27e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org                                       PITCH_CORR_LEN2,
28e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org                                       PITCH_CORR_LEN2);
29e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  ysum32 = 1;
30e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  csum32 = 0;
31e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  x = in + PITCH_MAX_LAG / 2 + 2;
32e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  {
33e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    const int16_t* tmp_x = x;
34e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    const int16_t* tmp_in = in;
35e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    int32_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
36e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    n = PITCH_CORR_LEN2;
37e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    COMPILE_ASSERT(PITCH_CORR_LEN2 % 4 == 0);
38e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    __asm __volatile (
39e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       push                                          \n\t"
40e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       noreorder                                     \n\t"
41e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org     "1:                                                        \n\t"
42e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp1],       0(%[tmp_in])                   \n\t"
43e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp2],       2(%[tmp_in])                   \n\t"
44e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp3],       4(%[tmp_in])                   \n\t"
45e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp4],       6(%[tmp_in])                   \n\t"
46e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp5],       0(%[tmp_x])                    \n\t"
47e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp6],       2(%[tmp_x])                    \n\t"
48e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp7],       4(%[tmp_x])                    \n\t"
49e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp8],       6(%[tmp_x])                    \n\t"
50e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp5],       %[tmp1],        %[tmp5]        \n\t"
51e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp1],       %[tmp1],        %[tmp1]        \n\t"
52e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp6],       %[tmp2],        %[tmp6]        \n\t"
53e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp2],       %[tmp2],        %[tmp2]        \n\t"
54e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp7],       %[tmp3],        %[tmp7]        \n\t"
55e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp3],       %[tmp3],        %[tmp3]        \n\t"
56e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp8],       %[tmp4],        %[tmp8]        \n\t"
57e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp4],       %[tmp4],        %[tmp4]        \n\t"
58e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[n],          %[n],           -4             \n\t"
59e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp5],       %[tmp5],        %[scaling]     \n\t"
60e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp1],       %[tmp1],        %[scaling]     \n\t"
61e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp6],       %[tmp6],        %[scaling]     \n\t"
62e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp2],       %[tmp2],        %[scaling]     \n\t"
63e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp7],       %[tmp7],        %[scaling]     \n\t"
64e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp3],       %[tmp3],        %[scaling]     \n\t"
65e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp8],       %[tmp8],        %[scaling]     \n\t"
66e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp4],       %[tmp4],        %[scaling]     \n\t"
67e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[ysum32],     %[ysum32],      %[tmp1]        \n\t"
68e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],     %[csum32],      %[tmp5]        \n\t"
69e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[ysum32],     %[ysum32],      %[tmp2]        \n\t"
70e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],     %[csum32],      %[tmp6]        \n\t"
71e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[ysum32],     %[ysum32],      %[tmp3]        \n\t"
72e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],     %[csum32],      %[tmp7]        \n\t"
73e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[ysum32],     %[ysum32],      %[tmp4]        \n\t"
74e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],     %[csum32],      %[tmp8]        \n\t"
75e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[tmp_in],     %[tmp_in],      8              \n\t"
76e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "bgtz       %[n],          1b                             \n\t"
77e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      " addiu     %[tmp_x],      %[tmp_x],       8              \n\t"
78e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       pop                                           \n\t"
79e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
80e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
81e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [tmp7] "=&r" (tmp7), [tmp8] "=&r" (tmp8), [tmp_in] "+r" (tmp_in),
82e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [ysum32] "+r" (ysum32), [tmp_x] "+r" (tmp_x), [csum32] "+r" (csum32),
83e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [n] "+r" (n)
84e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : [scaling] "r" (scaling)
85e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : "memory", "hi", "lo"
86e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    );
87e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  }
88e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  logcorQ8 += PITCH_LAG_SPAN2 - 1;
89e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32); // Q8
90e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  lys = WEBRTC_SPL_RSHIFT_W32(lys, 1); //sqrt(ysum);
91e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  if (csum32 > 0) {
92e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32);  // 2log(csum) in Q8
93e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    if (lcs > (lys + oneQ8)) {  // csum/sqrt(ysum) > 2 in Q8
94e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      *logcorQ8 = lcs - lys;  // log2(csum/sqrt(ysum))
95e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    } else {
96e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      *logcorQ8 = oneQ8;  // 1.00
97e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    }
98e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  } else {
99e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    *logcorQ8 = 0;
100e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  }
101e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
102e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  for (k = 1; k < PITCH_LAG_SPAN2; k++) {
103e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    inptr = &in[k];
104e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    const int16_t* tmp_in1 = &in[k - 1];
105e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    const int16_t* tmp_in2 = &in[PITCH_CORR_LEN2 + k - 1];
106e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    const int16_t* tmp_x = x;
107e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    int32_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
108e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    n = PITCH_CORR_LEN2;
109e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    csum32 = 0;
110e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    __asm __volatile (
111e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       push                                             \n\t"
112e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       noreorder                                        \n\t"
113e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp1],        0(%[tmp_in1])                    \n\t"
114e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp2],        0(%[tmp_in2])                    \n\t"
115e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp1],        %[tmp1],         %[tmp1]         \n\t"
116e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp2],        %[tmp2],         %[tmp2]         \n\t"
117e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp1],        %[tmp1],         %[scaling]      \n\t"
118e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp2],        %[tmp2],         %[scaling]      \n\t"
119e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "subu       %[ysum32],      %[ysum32],       %[tmp1]         \n\t"
120e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "bnez       %[scaling],     2f                               \n\t"
121e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      " addu      %[ysum32],      %[ysum32],       %[tmp2]         \n\t"
122e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org     "1:                                                           \n\t"
123e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp1],        0(%[inptr])                      \n\t"
124e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp2],        0(%[tmp_x])                      \n\t"
125e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp3],        2(%[inptr])                      \n\t"
126e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp4],        2(%[tmp_x])                      \n\t"
127e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp5],        4(%[inptr])                      \n\t"
128e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp6],        4(%[tmp_x])                      \n\t"
129e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp7],        6(%[inptr])                      \n\t"
130e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp8],        6(%[tmp_x])                      \n\t"
131e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp1],        %[tmp1],         %[tmp2]         \n\t"
132e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp2],        %[tmp3],         %[tmp4]         \n\t"
133e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp3],        %[tmp5],         %[tmp6]         \n\t"
134e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp4],        %[tmp7],         %[tmp8]         \n\t"
135e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[n],           %[n],            -4              \n\t"
136e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[inptr],       %[inptr],        8               \n\t"
137e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[tmp_x],       %[tmp_x],        8               \n\t"
138e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp1]         \n\t"
139e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp2]         \n\t"
140e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp3]         \n\t"
141e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "bgtz       %[n],           1b                               \n\t"
142e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      " addu      %[csum32],      %[csum32],       %[tmp4]         \n\t"
143e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "b          3f                                               \n\t"
144e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      " nop                                                        \n\t"
145e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org     "2:                                                           \n\t"
146e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp1],        0(%[inptr])                      \n\t"
147e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp2],        0(%[tmp_x])                      \n\t"
148e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp3],        2(%[inptr])                      \n\t"
149e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp4],        2(%[tmp_x])                      \n\t"
150e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp5],        4(%[inptr])                      \n\t"
151e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp6],        4(%[tmp_x])                      \n\t"
152e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp7],        6(%[inptr])                      \n\t"
153e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "lh         %[tmp8],        6(%[tmp_x])                      \n\t"
154e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp1],        %[tmp1],         %[tmp2]         \n\t"
155e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp2],        %[tmp3],         %[tmp4]         \n\t"
156e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp3],        %[tmp5],         %[tmp6]         \n\t"
157e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "mul        %[tmp4],        %[tmp7],         %[tmp8]         \n\t"
158e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[n],           %[n],            -4              \n\t"
159e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[inptr],       %[inptr],        8               \n\t"
160e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addiu      %[tmp_x],       %[tmp_x],        8               \n\t"
161e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp1],        %[tmp1],         %[scaling]      \n\t"
162e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp2],        %[tmp2],         %[scaling]      \n\t"
163e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp3],        %[tmp3],         %[scaling]      \n\t"
164e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "srav       %[tmp4],        %[tmp4],         %[scaling]      \n\t"
165e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp1]         \n\t"
166e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp2]         \n\t"
167e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "addu       %[csum32],      %[csum32],       %[tmp3]         \n\t"
168e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      "bgtz       %[n],           2b                               \n\t"
169e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      " addu      %[csum32],      %[csum32],       %[tmp4]         \n\t"
170e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org     "3:                                                           \n\t"
171e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      ".set       pop                                              \n\t"
172e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
173e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
174e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [tmp7] "=&r" (tmp7), [tmp8] "=&r" (tmp8), [inptr] "+r" (inptr),
175e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [csum32] "+r" (csum32), [tmp_x] "+r" (tmp_x), [ysum32] "+r" (ysum32),
176e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [n] "+r" (n)
177e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : [tmp_in1] "r" (tmp_in1), [tmp_in2] "r" (tmp_in2),
178e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        [scaling] "r" (scaling)
179e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      : "memory", "hi", "lo"
180e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    );
181e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org
182e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    logcorQ8--;
183e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32); // Q8
184e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    lys = WEBRTC_SPL_RSHIFT_W32(lys, 1); //sqrt(ysum);
185e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    if (csum32 > 0) {
186e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32); // 2log(csum) in Q8
187e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      if (lcs > (lys + oneQ8)) { // csum/sqrt(ysum) > 2
188e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        *logcorQ8 = lcs - lys;  // log2(csum/sqrt(ysum))
189e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      } else {
190e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org        *logcorQ8 = oneQ8;  // 1.00
191e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      }
192e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    } else {
193e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org      *logcorQ8 = 0;
194e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org    }
195e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org  }
196e4834e042a794dbf042bfd0934e335598d7ce4b8andrew@webrtc.org}
197