1e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
2e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
4e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  Use of this source code is governed by a BSD-style license
5e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  that can be found in the LICENSE file in the root of the source
6e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  tree. An additional intellectual property rights grant can be found
7e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  in the file PATENTS.  All contributing project authors may
8e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *  be found in the AUTHORS file in the root of the source tree.
9e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
10e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
11e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent/*
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * This file contains the function WebRtcSpl_CrossCorrelation().
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent * The description header can be found in signal_processing_library.h
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent */
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
18e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "signal_processing_library.h"
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid WebRtcSpl_CrossCorrelation(WebRtc_Word32* cross_correlation, WebRtc_Word16* seq1,
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                WebRtc_Word16* seq2, WebRtc_Word16 dim_seq,
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                WebRtc_Word16 dim_cross_correlation,
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                WebRtc_Word16 right_shifts,
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                WebRtc_Word16 step_seq2)
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent{
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int i, j;
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word16* seq1Ptr;
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word16* seq2Ptr;
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word32* CrossCorrPtr;
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _XSCALE_OPT_
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#pragma message("NOTE: _XSCALE_OPT_ optimizations are used (overrides _ARM_OPT_ and requires /QRxscale compiler flag)")
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    __int64 macc40;
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int iseq1[250];
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int iseq2[250];
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int iseq3[250];
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int * iseq1Ptr;
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int * iseq2Ptr;
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int * iseq3Ptr;
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int len, i_len;
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    seq1Ptr = seq1;
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq1Ptr = iseq1;
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    for(i = 0; i < ((dim_seq + 1) >> 1); i++)
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq1Ptr = (unsigned short)*seq1Ptr++;
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq1Ptr++ |= (WebRtc_Word32)*seq1Ptr++ << 16;
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(dim_seq%2)
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *(iseq1Ptr-1) &= 0x0000ffff;
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    *iseq1Ptr = 0;
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq1Ptr++;
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    *iseq1Ptr = 0;
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq1Ptr++;
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    *iseq1Ptr = 0;
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(step_seq2 < 0)
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        seq2Ptr = seq2 - dim_cross_correlation + 1;
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        CrossCorrPtr = &cross_correlation[dim_cross_correlation - 1];
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    else
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        seq2Ptr = seq2;
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        CrossCorrPtr = cross_correlation;
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    len = dim_seq + dim_cross_correlation - 1;
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    i_len = (len + 1) >> 1;
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq2Ptr = iseq2;
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3Ptr = iseq3;
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    for(i = 0; i < i_len; i++)
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq2Ptr = (unsigned short)*seq2Ptr++;
85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq3Ptr = (unsigned short)*seq2Ptr;
86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq2Ptr++ |= (WebRtc_Word32)*seq2Ptr++ << 16;
87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *iseq3Ptr++ |= (WebRtc_Word32)*seq2Ptr << 16;
88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(len % 2)
91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        iseq2[i_len - 1] &= 0x0000ffff;
93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        iseq3[i_len - 1] = 0;
94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    else
96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3[i_len - 1] &= 0x0000ffff;
97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq2[i_len] = 0;
99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3[i_len] = 0;
100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq2[i_len + 1] = 0;
101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3[i_len + 1] = 0;
102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq2[i_len + 2] = 0;
103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3[i_len + 2] = 0;
104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Set pointer to start value
106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq2Ptr = iseq2;
107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    iseq3Ptr = iseq3;
108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    i_len = (dim_seq + 7) >> 3;
110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    for (i = 0; i < dim_cross_correlation; i++)
111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        iseq1Ptr = iseq1;
114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        macc40 = 0;
116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        _WriteCoProcessor(macc40, 0);
118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if((i & 1))
120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            iseq3Ptr = iseq3 + (i >> 1);
122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = i_len; j > 0; j--)
123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq3Ptr++);
128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        else
131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            iseq2Ptr = iseq2 + (i >> 1);
133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = i_len; j > 0; j--)
134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                _SmulAddPack_2SW_ACC(*iseq1Ptr++, *iseq2Ptr++);
139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        macc40 = _ReadCoProcessor(0);
144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *CrossCorrPtr = (WebRtc_Word32)(macc40 >> right_shifts);
145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        CrossCorrPtr += step_seq2;
146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else // #ifdef _XSCALE_OPT_
148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _ARM_OPT_
149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    WebRtc_Word16 dim_seq8 = (dim_seq >> 3) << 3;
150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    CrossCorrPtr = cross_correlation;
153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    for (i = 0; i < dim_cross_correlation; i++)
155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    {
156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        // Set the pointer to the static vector, set the pointer to the sliding vector
157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        // and initialize cross_correlation
158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        seq1Ptr = seq1;
159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        seq2Ptr = seq2 + (step_seq2 * i);
160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        (*CrossCorrPtr) = 0;
161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifndef _ARM_OPT_
163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32
164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#pragma message("NOTE: default implementation is used")
165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        // Perform the cross correlation
167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        for (j = 0; j < dim_seq; j++)
168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr), right_shifts);
170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            seq1Ptr++;
171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            seq2Ptr++;
172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#else
174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#ifdef _WIN32
175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#pragma message("NOTE: _ARM_OPT_ optimizations are used")
176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (right_shifts == 0)
178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            // Perform the optimized cross correlation
180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = 0; j < dim_seq8; j = j + 8)
181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = dim_seq8; j < dim_seq; j++)
209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16((*seq1Ptr), (*seq2Ptr));
211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        else // right_shifts != 0
216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        {
218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            // Perform the optimized cross correlation
219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = 0; j < dim_seq8; j = j + 8)
220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
245e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
246e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
247e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
248e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
250e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
251e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
252e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
254e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
255e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            for (j = dim_seq8; j < dim_seq; j++)
256e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            {
257e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                (*CrossCorrPtr) += WEBRTC_SPL_MUL_16_16_RSFT((*seq1Ptr), (*seq2Ptr),
258e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                                                             right_shifts);
259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq1Ptr++;
260e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                seq2Ptr++;
261e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            }
262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
264e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        CrossCorrPtr++;
265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
266e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#endif
267e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
268