1841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding/*
2841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * Copyright (C) 2016 The Android Open Source Project
3841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding *
4841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * Licensed under the Apache License, Version 2.0 (the "License");
5841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * you may not use this file except in compliance with the License.
6841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * You may obtain a copy of the License at
7841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding *
8841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding *      http://www.apache.org/licenses/LICENSE-2.0
9841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding *
10841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * Unless required by applicable law or agreed to in writing, software
11841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * distributed under the License is distributed on an "AS IS" BASIS,
12841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * See the License for the specific language governing permissions and
14841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding * limitations under the License.
15841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding */
16841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
17841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#ifndef ANDROID_AUDIO_RESAMPLER_FIR_PROCESS_SSE_H
18841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#define ANDROID_AUDIO_RESAMPLER_FIR_PROCESS_SSE_H
19841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
20841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingnamespace android {
21841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
22841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding// depends on AudioResamplerFirOps.h, AudioResamplerFirProcess.h
23841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
24841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#if USE_SSE
25841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
26841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#define TO_STRING2(x) #x
27841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#define TO_STRING(x) TO_STRING2(x)
28841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding// uncomment to print GCC version, may be relevant for intrinsic optimizations
29841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding/* #pragma message ("GCC version: " TO_STRING(__GNUC__) \
30841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        "." TO_STRING(__GNUC_MINOR__) \
31841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        "." TO_STRING(__GNUC_PATCHLEVEL__)) */
32841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
33841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding//
34841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding// SSEx specializations are enabled for Process() and ProcessL() in AudioResamplerFirProcess.h
35841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding//
36841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
37841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingtemplate <int CHANNELS, int STRIDE, bool FIXED>
38841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingstatic inline void ProcessSSEIntrinsic(float* out,
39841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        int count,
40841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP,
41841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN,
42841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sP,
43841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sN,
44841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* volumeLR,
45841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        float lerpP,
46841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP1,
47841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN1)
48841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding{
49841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    ALOG_ASSERT(count > 0 && (count & 7) == 0); // multiple of 8
5091164e7f94030b3e49a31d88c91d70d4bd358ebeGlenn Kasten    static_assert(CHANNELS == 1 || CHANNELS == 2, "CHANNELS must be 1 or 2");
51841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
52841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    sP -= CHANNELS*(4-1);   // adjust sP for a loop iteration of four
53841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
54841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    __m128 interp;
55841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    if (!FIXED) {
56841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        interp = _mm_set1_ps(lerpP);
57841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    }
58841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
59841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    __m128 accL, accR;
60841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    accL = _mm_setzero_ps();
61841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    if (CHANNELS == 2) {
62841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        accR = _mm_setzero_ps();
63841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    }
64841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
65841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    do {
66841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        __m128 posCoef = _mm_load_ps(coefsP);
67841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        __m128 negCoef = _mm_load_ps(coefsN);
68841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        coefsP += 4;
69841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        coefsN += 4;
70841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
71841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        if (!FIXED) { // interpolate
72841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posCoef1 = _mm_load_ps(coefsP1);
73841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negCoef1 = _mm_load_ps(coefsN1);
74841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            coefsP1 += 4;
75841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            coefsN1 += 4;
76841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
77841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            // Calculate the final coefficient for interpolation
78841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            // posCoef = interp * (posCoef1 - posCoef) + posCoef
79841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            // negCoef = interp * (negCoef - negCoef1) + negCoef1
80841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posCoef1 = _mm_sub_ps(posCoef1, posCoef);
81841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negCoef = _mm_sub_ps(negCoef, negCoef1);
82841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
83841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posCoef1 = _mm_mul_ps(posCoef1, interp);
84841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negCoef = _mm_mul_ps(negCoef, interp);
85841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
86841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posCoef = _mm_add_ps(posCoef1, posCoef);
87841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negCoef = _mm_add_ps(negCoef, negCoef1);
88841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        }
89841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        switch (CHANNELS) {
90841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        case 1: {
91841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posSamp = _mm_loadu_ps(sP);
92841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negSamp = _mm_loadu_ps(sN);
93841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            sP -= 4;
94841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            sN += 4;
95841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
96841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posSamp = _mm_shuffle_ps(posSamp, posSamp, 0x1B);
97841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posSamp = _mm_mul_ps(posSamp, posCoef);
98841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negSamp = _mm_mul_ps(negSamp, negCoef);
99841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
100841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accL = _mm_add_ps(accL, posSamp);
101841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accL = _mm_add_ps(accL, negSamp);
102841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        } break;
103841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        case 2: {
104841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posSamp0 = _mm_loadu_ps(sP);
105841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posSamp1 = _mm_loadu_ps(sP+4);
106841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negSamp0 = _mm_loadu_ps(sN);
107841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negSamp1 = _mm_loadu_ps(sN+4);
108841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            sP -= 8;
109841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            sN += 8;
110841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
111841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            // deinterleave everything and reverse the positives
112841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posSampL = _mm_shuffle_ps(posSamp1, posSamp0, 0x22);
113841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 posSampR = _mm_shuffle_ps(posSamp1, posSamp0, 0x77);
114841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negSampL = _mm_shuffle_ps(negSamp0, negSamp1, 0x88);
115841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            __m128 negSampR = _mm_shuffle_ps(negSamp0, negSamp1, 0xDD);
116841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
117841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posSampL = _mm_mul_ps(posSampL, posCoef);
118841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            posSampR = _mm_mul_ps(posSampR, posCoef);
119841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negSampL = _mm_mul_ps(negSampL, negCoef);
120841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            negSampR = _mm_mul_ps(negSampR, negCoef);
121841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
122841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accL = _mm_add_ps(accL, posSampL);
123841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accR = _mm_add_ps(accR, posSampR);
124841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accL = _mm_add_ps(accL, negSampL);
125841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            accR = _mm_add_ps(accR, negSampR);
126841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        } break;
127841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        }
128841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    } while (count -= 4);
129841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
130841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    // multiply by volume and save
131841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    __m128 vLR = _mm_setzero_ps();
132841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    __m128 outSamp;
133841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    vLR = _mm_loadl_pi(vLR, reinterpret_cast<const __m64*>(volumeLR));
134841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    outSamp = _mm_loadl_pi(vLR, reinterpret_cast<__m64*>(out));
135841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
136841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    // combine and funnel down accumulator
137841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    __m128 outAccum = _mm_setzero_ps();
138841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    if (CHANNELS == 1) {
139841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        // duplicate accL to both L and R
140841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        outAccum = _mm_add_ps(accL, _mm_movehl_ps(accL, accL));
141841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        outAccum = _mm_add_ps(outAccum, _mm_shuffle_ps(outAccum, outAccum, 0x11));
142841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    } else if (CHANNELS == 2) {
143841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        // accR contains R, fold in
144841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        outAccum = _mm_hadd_ps(accL, accR);
145841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        outAccum = _mm_hadd_ps(outAccum, outAccum);
146841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    }
147841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
148841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    outAccum = _mm_mul_ps(outAccum, vLR);
149841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    outSamp = _mm_add_ps(outSamp, outAccum);
150841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    _mm_storel_pi(reinterpret_cast<__m64*>(out), outSamp);
151841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding}
152841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
153841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingtemplate<>
154841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidinginline void ProcessL<1, 16>(float* const out,
155841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        int count,
156841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP,
157841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN,
158841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sP,
159841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sN,
160841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* const volumeLR)
161841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding{
162841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    ProcessSSEIntrinsic<1, 16, true>(out, count, coefsP, coefsN, sP, sN, volumeLR,
163841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            0 /*lerpP*/, NULL /*coefsP1*/, NULL /*coefsN1*/);
164841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding}
165841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
166841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingtemplate<>
167841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidinginline void ProcessL<2, 16>(float* const out,
168841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        int count,
169841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP,
170841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN,
171841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sP,
172841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sN,
173841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* const volumeLR)
174841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding{
175841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    ProcessSSEIntrinsic<2, 16, true>(out, count, coefsP, coefsN, sP, sN, volumeLR,
176841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            0 /*lerpP*/, NULL /*coefsP1*/, NULL /*coefsN1*/);
177841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding}
178841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
179841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingtemplate<>
180841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidinginline void Process<1, 16>(float* const out,
181841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        int count,
182841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP,
183841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN,
184841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP1,
185841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN1,
186841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sP,
187841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sN,
188841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        float lerpP,
189841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* const volumeLR)
190841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding{
191841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    ProcessSSEIntrinsic<1, 16, false>(out, count, coefsP, coefsN, sP, sN, volumeLR,
192841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            lerpP, coefsP1, coefsN1);
193841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding}
194841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
195841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidingtemplate<>
196841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smidinginline void Process<2, 16>(float* const out,
197841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        int count,
198841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP,
199841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN,
200841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsP1,
201841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* coefsN1,
202841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sP,
203841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* sN,
204841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        float lerpP,
205841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding        const float* const volumeLR)
206841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding{
207841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding    ProcessSSEIntrinsic<2, 16, false>(out, count, coefsP, coefsN, sP, sN, volumeLR,
208841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding            lerpP, coefsP1, coefsN1);
209841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding}
210841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
211841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#endif //USE_SSE
212841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
213841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding} // namespace android
214841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding
215841920db8206cc6428ab460e5fa5b7a50edd06d0Henrik Smiding#endif /*ANDROID_AUDIO_RESAMPLER_FIR_PROCESS_SSE_H*/
216