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