[tbb-commits] [tor-browser] 22/34: Bug 1762614: Remove unneccessary files r=kinetik, a=dsmith
gitolite role
git at cupani.torproject.org
Wed Apr 27 16:05:03 UTC 2022
This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch tor-browser-91.9esr-11.0-1
in repository tor-browser.
commit cb6f44feab79b27d4141bd7a4045f98f33f7148f
Author: Tom Ritter <tom at mozilla.com>
AuthorDate: Mon Apr 11 16:51:56 2022 +0000
Bug 1762614: Remove unneccessary files r=kinetik,a=dsmith
Differential Revision: https://phabricator.services.mozilla.com/D142718
---
media/libopus/celt/arm/celt_ne10_fft.c | 173 -----
media/libopus/celt/arm/celt_ne10_mdct.c | 258 -------
media/libopus/celt/x86/celt_lpc_sse.c | 89 ---
.../libopus/silk/fixed/x86/burg_modified_FIX_sse.c | 377 ---------
media/libopus/silk/fixed/x86/vector_ops_FIX_sse.c | 88 ---
media/libopus/silk/x86/NSQ_del_dec_sse.c | 859 ---------------------
media/libopus/silk/x86/NSQ_sse.c | 719 -----------------
media/libopus/silk/x86/VAD_sse.c | 277 -------
media/libopus/silk/x86/VQ_WMat_EC_sse.c | 142 ----
9 files changed, 2982 deletions(-)
diff --git a/media/libopus/celt/arm/celt_ne10_fft.c b/media/libopus/celt/arm/celt_ne10_fft.c
deleted file mode 100644
index b8c60abe98b83..0000000000000
--- a/media/libopus/celt/arm/celt_ne10_fft.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/* Copyright (c) 2015 Xiph.Org Foundation
- Written by Viswanath Puttagunta */
-/**
- @file celt_ne10_fft.c
- @brief ARM Neon optimizations for fft using NE10 library
- */
-
-/*
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef SKIP_CONFIG_H
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#endif
-
-#include <NE10_dsp.h>
-#include "os_support.h"
-#include "kiss_fft.h"
-#include "stack_alloc.h"
-
-#if !defined(FIXED_POINT)
-# define NE10_FFT_ALLOC_C2C_TYPE_NEON ne10_fft_alloc_c2c_float32_neon
-# define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_float32_t
-# define NE10_FFT_STATE_TYPE_T ne10_fft_state_float32_t
-# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_float32
-# define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_float32_t
-# define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_float32_neon
-#else
-# define NE10_FFT_ALLOC_C2C_TYPE_NEON(nfft) ne10_fft_alloc_c2c_int32_neon(nfft)
-# define NE10_FFT_CFG_TYPE_T ne10_fft_cfg_int32_t
-# define NE10_FFT_STATE_TYPE_T ne10_fft_state_int32_t
-# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32
-# define NE10_FFT_DESTROY_C2C_TYPE ne10_fft_destroy_c2c_int32
-# define NE10_FFT_CPX_TYPE_T ne10_fft_cpx_int32_t
-# define NE10_FFT_C2C_1D_TYPE_NEON ne10_fft_c2c_1d_int32_neon
-#endif
-
-#if defined(CUSTOM_MODES)
-
-/* nfft lengths in NE10 that support scaled fft */
-# define NE10_FFTSCALED_SUPPORT_MAX 4
-static const int ne10_fft_scaled_support[NE10_FFTSCALED_SUPPORT_MAX] = {
- 480, 240, 120, 60
-};
-
-int opus_fft_alloc_arm_neon(kiss_fft_state *st)
-{
- int i;
- size_t memneeded = sizeof(struct arch_fft_state);
-
- st->arch_fft = (arch_fft_state *)opus_alloc(memneeded);
- if (!st->arch_fft)
- return -1;
-
- for (i = 0; i < NE10_FFTSCALED_SUPPORT_MAX; i++) {
- if(st->nfft == ne10_fft_scaled_support[i])
- break;
- }
- if (i == NE10_FFTSCALED_SUPPORT_MAX) {
- /* This nfft length (scaled fft) is not supported in NE10 */
- st->arch_fft->is_supported = 0;
- st->arch_fft->priv = NULL;
- }
- else {
- st->arch_fft->is_supported = 1;
- st->arch_fft->priv = (void *)NE10_FFT_ALLOC_C2C_TYPE_NEON(st->nfft);
- if (st->arch_fft->priv == NULL) {
- return -1;
- }
- }
- return 0;
-}
-
-void opus_fft_free_arm_neon(kiss_fft_state *st)
-{
- NE10_FFT_CFG_TYPE_T cfg;
-
- if (!st->arch_fft)
- return;
-
- cfg = (NE10_FFT_CFG_TYPE_T)st->arch_fft->priv;
- if (cfg)
- NE10_FFT_DESTROY_C2C_TYPE(cfg);
- opus_free(st->arch_fft);
-}
-#endif
-
-void opus_fft_neon(const kiss_fft_state *st,
- const kiss_fft_cpx *fin,
- kiss_fft_cpx *fout)
-{
- NE10_FFT_STATE_TYPE_T state;
- NE10_FFT_CFG_TYPE_T cfg = &state;
- VARDECL(NE10_FFT_CPX_TYPE_T, buffer);
- SAVE_STACK;
- ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T);
-
- if (!st->arch_fft->is_supported) {
- /* This nfft length (scaled fft) not supported in NE10 */
- opus_fft_c(st, fin, fout);
- }
- else {
- memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T));
- state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0];
-#if !defined(FIXED_POINT)
- state.is_forward_scaled = 1;
-
- NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
- (NE10_FFT_CPX_TYPE_T *)fin,
- cfg, 0);
-#else
- NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
- (NE10_FFT_CPX_TYPE_T *)fin,
- cfg, 0, 1);
-#endif
- }
- RESTORE_STACK;
-}
-
-void opus_ifft_neon(const kiss_fft_state *st,
- const kiss_fft_cpx *fin,
- kiss_fft_cpx *fout)
-{
- NE10_FFT_STATE_TYPE_T state;
- NE10_FFT_CFG_TYPE_T cfg = &state;
- VARDECL(NE10_FFT_CPX_TYPE_T, buffer);
- SAVE_STACK;
- ALLOC(buffer, st->nfft, NE10_FFT_CPX_TYPE_T);
-
- if (!st->arch_fft->is_supported) {
- /* This nfft length (scaled fft) not supported in NE10 */
- opus_ifft_c(st, fin, fout);
- }
- else {
- memcpy((void *)cfg, st->arch_fft->priv, sizeof(NE10_FFT_STATE_TYPE_T));
- state.buffer = (NE10_FFT_CPX_TYPE_T *)&buffer[0];
-#if !defined(FIXED_POINT)
- state.is_backward_scaled = 0;
-
- NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
- (NE10_FFT_CPX_TYPE_T *)fin,
- cfg, 1);
-#else
- NE10_FFT_C2C_1D_TYPE_NEON((NE10_FFT_CPX_TYPE_T *)fout,
- (NE10_FFT_CPX_TYPE_T *)fin,
- cfg, 1, 0);
-#endif
- }
- RESTORE_STACK;
-}
diff --git a/media/libopus/celt/arm/celt_ne10_mdct.c b/media/libopus/celt/arm/celt_ne10_mdct.c
deleted file mode 100644
index 293c3efd7a242..0000000000000
--- a/media/libopus/celt/arm/celt_ne10_mdct.c
+++ /dev/null
@@ -1,258 +0,0 @@
-/* Copyright (c) 2015 Xiph.Org Foundation
- Written by Viswanath Puttagunta */
-/**
- @file celt_ne10_mdct.c
- @brief ARM Neon optimizations for mdct using NE10 library
- */
-
-/*
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef SKIP_CONFIG_H
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-#endif
-
-#include "kiss_fft.h"
-#include "_kiss_fft_guts.h"
-#include "mdct.h"
-#include "stack_alloc.h"
-
-void clt_mdct_forward_neon(const mdct_lookup *l,
- kiss_fft_scalar *in,
- kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 *window,
- int overlap, int shift, int stride, int arch)
-{
- int i;
- int N, N2, N4;
- VARDECL(kiss_fft_scalar, f);
- VARDECL(kiss_fft_cpx, f2);
- const kiss_fft_state *st = l->kfft[shift];
- const kiss_twiddle_scalar *trig;
-
- SAVE_STACK;
-
- N = l->n;
- trig = l->trig;
- for (i=0;i<shift;i++)
- {
- N >>= 1;
- trig += N;
- }
- N2 = N>>1;
- N4 = N>>2;
-
- ALLOC(f, N2, kiss_fft_scalar);
- ALLOC(f2, N4, kiss_fft_cpx);
-
- /* Consider the input to be composed of four blocks: [a, b, c, d] */
- /* Window, shuffle, fold */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_scalar * OPUS_RESTRICT xp1 = in+(overlap>>1);
- const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+N2-1+(overlap>>1);
- kiss_fft_scalar * OPUS_RESTRICT yp = f;
- const opus_val16 * OPUS_RESTRICT wp1 = window+(overlap>>1);
- const opus_val16 * OPUS_RESTRICT wp2 = window+(overlap>>1)-1;
- for(i=0;i<((overlap+3)>>2);i++)
- {
- /* Real part arranged as -d-cR, Imag part arranged as -b+aR*/
- *yp++ = MULT16_32_Q15(*wp2, xp1[N2]) + MULT16_32_Q15(*wp1,*xp2);
- *yp++ = MULT16_32_Q15(*wp1, *xp1) - MULT16_32_Q15(*wp2, xp2[-N2]);
- xp1+=2;
- xp2-=2;
- wp1+=2;
- wp2-=2;
- }
- wp1 = window;
- wp2 = window+overlap-1;
- for(;i<N4-((overlap+3)>>2);i++)
- {
- /* Real part arranged as a-bR, Imag part arranged as -c-dR */
- *yp++ = *xp2;
- *yp++ = *xp1;
- xp1+=2;
- xp2-=2;
- }
- for(;i<N4;i++)
- {
- /* Real part arranged as a-bR, Imag part arranged as -c-dR */
- *yp++ = -MULT16_32_Q15(*wp1, xp1[-N2]) + MULT16_32_Q15(*wp2, *xp2);
- *yp++ = MULT16_32_Q15(*wp2, *xp1) + MULT16_32_Q15(*wp1, xp2[N2]);
- xp1+=2;
- xp2-=2;
- wp1+=2;
- wp2-=2;
- }
- }
- /* Pre-rotation */
- {
- kiss_fft_scalar * OPUS_RESTRICT yp = f;
- const kiss_twiddle_scalar *t = &trig[0];
- for(i=0;i<N4;i++)
- {
- kiss_fft_cpx yc;
- kiss_twiddle_scalar t0, t1;
- kiss_fft_scalar re, im, yr, yi;
- t0 = t[i];
- t1 = t[N4+i];
- re = *yp++;
- im = *yp++;
- yr = S_MUL(re,t0) - S_MUL(im,t1);
- yi = S_MUL(im,t0) + S_MUL(re,t1);
- yc.r = yr;
- yc.i = yi;
- f2[i] = yc;
- }
- }
-
- opus_fft(st, f2, (kiss_fft_cpx *)f, arch);
-
- /* Post-rotate */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_cpx * OPUS_RESTRICT fp = (kiss_fft_cpx *)f;
- kiss_fft_scalar * OPUS_RESTRICT yp1 = out;
- kiss_fft_scalar * OPUS_RESTRICT yp2 = out+stride*(N2-1);
- const kiss_twiddle_scalar *t = &trig[0];
- /* Temp pointers to make it really clear to the compiler what we're doing */
- for(i=0;i<N4;i++)
- {
- kiss_fft_scalar yr, yi;
- yr = S_MUL(fp->i,t[N4+i]) - S_MUL(fp->r,t[i]);
- yi = S_MUL(fp->r,t[N4+i]) + S_MUL(fp->i,t[i]);
- *yp1 = yr;
- *yp2 = yi;
- fp++;
- yp1 += 2*stride;
- yp2 -= 2*stride;
- }
- }
- RESTORE_STACK;
-}
-
-void clt_mdct_backward_neon(const mdct_lookup *l,
- kiss_fft_scalar *in,
- kiss_fft_scalar * OPUS_RESTRICT out,
- const opus_val16 * OPUS_RESTRICT window,
- int overlap, int shift, int stride, int arch)
-{
- int i;
- int N, N2, N4;
- VARDECL(kiss_fft_scalar, f);
- const kiss_twiddle_scalar *trig;
- const kiss_fft_state *st = l->kfft[shift];
-
- N = l->n;
- trig = l->trig;
- for (i=0;i<shift;i++)
- {
- N >>= 1;
- trig += N;
- }
- N2 = N>>1;
- N4 = N>>2;
-
- ALLOC(f, N2, kiss_fft_scalar);
-
- /* Pre-rotate */
- {
- /* Temp pointers to make it really clear to the compiler what we're doing */
- const kiss_fft_scalar * OPUS_RESTRICT xp1 = in;
- const kiss_fft_scalar * OPUS_RESTRICT xp2 = in+stride*(N2-1);
- kiss_fft_scalar * OPUS_RESTRICT yp = f;
- const kiss_twiddle_scalar * OPUS_RESTRICT t = &trig[0];
- for(i=0;i<N4;i++)
- {
- kiss_fft_scalar yr, yi;
- yr = S_MUL(*xp2, t[i]) + S_MUL(*xp1, t[N4+i]);
- yi = S_MUL(*xp1, t[i]) - S_MUL(*xp2, t[N4+i]);
- yp[2*i] = yr;
- yp[2*i+1] = yi;
- xp1+=2*stride;
- xp2-=2*stride;
- }
- }
-
- opus_ifft(st, (kiss_fft_cpx *)f, (kiss_fft_cpx*)(out+(overlap>>1)), arch);
-
- /* Post-rotate and de-shuffle from both ends of the buffer at once to make
- it in-place. */
- {
- kiss_fft_scalar * yp0 = out+(overlap>>1);
- kiss_fft_scalar * yp1 = out+(overlap>>1)+N2-2;
- const kiss_twiddle_scalar *t = &trig[0];
- /* Loop to (N4+1)>>1 to handle odd N4. When N4 is odd, the
- middle pair will be computed twice. */
- for(i=0;i<(N4+1)>>1;i++)
- {
- kiss_fft_scalar re, im, yr, yi;
- kiss_twiddle_scalar t0, t1;
- re = yp0[0];
- im = yp0[1];
- t0 = t[i];
- t1 = t[N4+i];
- /* We'd scale up by 2 here, but instead it's done when mixing the windows */
- yr = S_MUL(re,t0) + S_MUL(im,t1);
- yi = S_MUL(re,t1) - S_MUL(im,t0);
- re = yp1[0];
- im = yp1[1];
- yp0[0] = yr;
- yp1[1] = yi;
-
- t0 = t[(N4-i-1)];
- t1 = t[(N2-i-1)];
- /* We'd scale up by 2 here, but instead it's done when mixing the windows */
- yr = S_MUL(re,t0) + S_MUL(im,t1);
- yi = S_MUL(re,t1) - S_MUL(im,t0);
- yp1[0] = yr;
- yp0[1] = yi;
- yp0 += 2;
- yp1 -= 2;
- }
- }
-
- /* Mirror on both sides for TDAC */
- {
- kiss_fft_scalar * OPUS_RESTRICT xp1 = out+overlap-1;
- kiss_fft_scalar * OPUS_RESTRICT yp1 = out;
- const opus_val16 * OPUS_RESTRICT wp1 = window;
- const opus_val16 * OPUS_RESTRICT wp2 = window+overlap-1;
-
- for(i = 0; i < overlap/2; i++)
- {
- kiss_fft_scalar x1, x2;
- x1 = *xp1;
- x2 = *yp1;
- *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1);
- *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1);
- wp1++;
- wp2--;
- }
- }
- RESTORE_STACK;
-}
diff --git a/media/libopus/celt/x86/celt_lpc_sse.c b/media/libopus/celt/x86/celt_lpc_sse.c
deleted file mode 100644
index 5478568849aa4..0000000000000
--- a/media/libopus/celt/x86/celt_lpc_sse.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-#include "celt_lpc.h"
-#include "stack_alloc.h"
-#include "mathops.h"
-#include "pitch.h"
-#include "x86cpu.h"
-
-#if defined(FIXED_POINT)
-
-void celt_fir_sse4_1(const opus_val16 *x,
- const opus_val16 *num,
- opus_val16 *y,
- int N,
- int ord,
- int arch)
-{
- int i,j;
- VARDECL(opus_val16, rnum);
-
- __m128i vecNoA;
- opus_int32 noA ;
- SAVE_STACK;
-
- ALLOC(rnum, ord, opus_val16);
- for(i=0;i<ord;i++)
- rnum[i] = num[ord-i-1];
- noA = EXTEND32(1) << SIG_SHIFT >> 1;
- vecNoA = _mm_set_epi32(noA, noA, noA, noA);
-
- for (i=0;i<N-3;i+=4)
- {
- opus_val32 sums[4] = {0};
- __m128i vecSum, vecX;
-
- xcorr_kernel(rnum, x+i-ord, sums, ord, arch);
-
- vecSum = _mm_loadu_si128((__m128i *)sums);
- vecSum = _mm_add_epi32(vecSum, vecNoA);
- vecSum = _mm_srai_epi32(vecSum, SIG_SHIFT);
- vecX = OP_CVTEPI16_EPI32_M64(x + i);
- vecSum = _mm_add_epi32(vecSum, vecX);
- vecSum = _mm_packs_epi32(vecSum, vecSum);
- _mm_storel_epi64((__m128i *)(y + i), vecSum);
- }
- for (;i<N;i++)
- {
- opus_val32 sum = 0;
- for (j=0;j<ord;j++)
- sum = MAC16_16(sum, rnum[j], x[i+j-ord]);
- y[i] = SATURATE16(ADD32(EXTEND32(x[i]), PSHR32(sum, SIG_SHIFT)));
- }
-
- RESTORE_STACK;
-}
-
-#endif
diff --git a/media/libopus/silk/fixed/x86/burg_modified_FIX_sse.c b/media/libopus/silk/fixed/x86/burg_modified_FIX_sse.c
deleted file mode 100644
index 3c3583c5fc37c..0000000000000
--- a/media/libopus/silk/fixed/x86/burg_modified_FIX_sse.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-
-#include "SigProc_FIX.h"
-#include "define.h"
-#include "tuning_parameters.h"
-#include "pitch.h"
-#include "celt/x86/x86cpu.h"
-
-#define MAX_FRAME_SIZE 384 /* subfr_length * nb_subfr = ( 0.005 * 16000 + 16 ) * 4 = 384 */
-
-#define QA 25
-#define N_BITS_HEAD_ROOM 2
-#define MIN_RSHIFTS -16
-#define MAX_RSHIFTS (32 - QA)
-
-/* Compute reflection coefficients from input signal */
-void silk_burg_modified_sse4_1(
- opus_int32 *res_nrg, /* O Residual energy */
- opus_int *res_nrg_Q, /* O Residual energy Q value */
- opus_int32 A_Q16[], /* O Prediction coefficients (length order) */
- const opus_int16 x[], /* I Input signal, length: nb_subfr * ( D + subfr_length ) */
- const opus_int32 minInvGain_Q30, /* I Inverse of max prediction gain */
- const opus_int subfr_length, /* I Input signal subframe length (incl. D preceding samples) */
- const opus_int nb_subfr, /* I Number of subframes stacked in x */
- const opus_int D, /* I Order */
- int arch /* I Run-time architecture */
-)
-{
- opus_int k, n, s, lz, rshifts, rshifts_extra, reached_max_gain;
- opus_int32 C0, num, nrg, rc_Q31, invGain_Q30, Atmp_QA, Atmp1, tmp1, tmp2, x1, x2;
- const opus_int16 *x_ptr;
- opus_int32 C_first_row[ SILK_MAX_ORDER_LPC ];
- opus_int32 C_last_row[ SILK_MAX_ORDER_LPC ];
- opus_int32 Af_QA[ SILK_MAX_ORDER_LPC ];
- opus_int32 CAf[ SILK_MAX_ORDER_LPC + 1 ];
- opus_int32 CAb[ SILK_MAX_ORDER_LPC + 1 ];
- opus_int32 xcorr[ SILK_MAX_ORDER_LPC ];
-
- __m128i FIRST_3210, LAST_3210, ATMP_3210, TMP1_3210, TMP2_3210, T1_3210, T2_3210, PTR_3210, SUBFR_3210, X1_3210, X2_3210;
- __m128i CONST1 = _mm_set1_epi32(1);
-
- silk_assert( subfr_length * nb_subfr <= MAX_FRAME_SIZE );
-
- /* Compute autocorrelations, added over subframes */
- silk_sum_sqr_shift( &C0, &rshifts, x, nb_subfr * subfr_length );
- if( rshifts > MAX_RSHIFTS ) {
- C0 = silk_LSHIFT32( C0, rshifts - MAX_RSHIFTS );
- silk_assert( C0 > 0 );
- rshifts = MAX_RSHIFTS;
- } else {
- lz = silk_CLZ32( C0 ) - 1;
- rshifts_extra = N_BITS_HEAD_ROOM - lz;
- if( rshifts_extra > 0 ) {
- rshifts_extra = silk_min( rshifts_extra, MAX_RSHIFTS - rshifts );
- C0 = silk_RSHIFT32( C0, rshifts_extra );
- } else {
- rshifts_extra = silk_max( rshifts_extra, MIN_RSHIFTS - rshifts );
- C0 = silk_LSHIFT32( C0, -rshifts_extra );
- }
- rshifts += rshifts_extra;
- }
- CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */
- silk_memset( C_first_row, 0, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) );
- if( rshifts > 0 ) {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- for( n = 1; n < D + 1; n++ ) {
- C_first_row[ n - 1 ] += (opus_int32)silk_RSHIFT64(
- silk_inner_prod16_aligned_64( x_ptr, x_ptr + n, subfr_length - n, arch ), rshifts );
- }
- }
- } else {
- for( s = 0; s < nb_subfr; s++ ) {
- int i;
- opus_int32 d;
- x_ptr = x + s * subfr_length;
- celt_pitch_xcorr(x_ptr, x_ptr + 1, xcorr, subfr_length - D, D, arch );
- for( n = 1; n < D + 1; n++ ) {
- for ( i = n + subfr_length - D, d = 0; i < subfr_length; i++ )
- d = MAC16_16( d, x_ptr[ i ], x_ptr[ i - n ] );
- xcorr[ n - 1 ] += d;
- }
- for( n = 1; n < D + 1; n++ ) {
- C_first_row[ n - 1 ] += silk_LSHIFT32( xcorr[ n - 1 ], -rshifts );
- }
- }
- }
- silk_memcpy( C_last_row, C_first_row, SILK_MAX_ORDER_LPC * sizeof( opus_int32 ) );
-
- /* Initialize */
- CAb[ 0 ] = CAf[ 0 ] = C0 + silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ) + 1; /* Q(-rshifts) */
-
- invGain_Q30 = (opus_int32)1 << 30;
- reached_max_gain = 0;
- for( n = 0; n < D; n++ ) {
- /* Update first row of correlation matrix (without first element) */
- /* Update last row of correlation matrix (without last element, stored in reversed order) */
- /* Update C * Af */
- /* Update C * flipud(Af) (stored in reversed order) */
- if( rshifts > -2 ) {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], 16 - rshifts ); /* Q(16-rshifts) */
- x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 16 - rshifts ); /* Q(16-rshifts) */
- tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], QA - 16 ); /* Q(QA-16) */
- tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], QA - 16 ); /* Q(QA-16) */
- for( k = 0; k < n; k++ ) {
- C_first_row[ k ] = silk_SMLAWB( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */
- C_last_row[ k ] = silk_SMLAWB( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */
- Atmp_QA = Af_QA[ k ];
- tmp1 = silk_SMLAWB( tmp1, Atmp_QA, x_ptr[ n - k - 1 ] ); /* Q(QA-16) */
- tmp2 = silk_SMLAWB( tmp2, Atmp_QA, x_ptr[ subfr_length - n + k ] ); /* Q(QA-16) */
- }
- tmp1 = silk_LSHIFT32( -tmp1, 32 - QA - rshifts ); /* Q(16-rshifts) */
- tmp2 = silk_LSHIFT32( -tmp2, 32 - QA - rshifts ); /* Q(16-rshifts) */
- for( k = 0; k <= n; k++ ) {
- CAf[ k ] = silk_SMLAWB( CAf[ k ], tmp1, x_ptr[ n - k ] ); /* Q( -rshift ) */
- CAb[ k ] = silk_SMLAWB( CAb[ k ], tmp2, x_ptr[ subfr_length - n + k - 1 ] ); /* Q( -rshift ) */
- }
- }
- } else {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- x1 = -silk_LSHIFT32( (opus_int32)x_ptr[ n ], -rshifts ); /* Q( -rshifts ) */
- x2 = -silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], -rshifts ); /* Q( -rshifts ) */
- tmp1 = silk_LSHIFT32( (opus_int32)x_ptr[ n ], 17 ); /* Q17 */
- tmp2 = silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n - 1 ], 17 ); /* Q17 */
-
- X1_3210 = _mm_set1_epi32( x1 );
- X2_3210 = _mm_set1_epi32( x2 );
- TMP1_3210 = _mm_setzero_si128();
- TMP2_3210 = _mm_setzero_si128();
- for( k = 0; k < n - 3; k += 4 ) {
- PTR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 1 - 3 ] );
- SUBFR_3210 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k ] );
- FIRST_3210 = _mm_loadu_si128( (__m128i *)&C_first_row[ k ] );
- PTR_3210 = _mm_shuffle_epi32( PTR_3210, _MM_SHUFFLE( 0, 1, 2, 3 ) );
- LAST_3210 = _mm_loadu_si128( (__m128i *)&C_last_row[ k ] );
- ATMP_3210 = _mm_loadu_si128( (__m128i *)&Af_QA[ k ] );
-
- T1_3210 = _mm_mullo_epi32( PTR_3210, X1_3210 );
- T2_3210 = _mm_mullo_epi32( SUBFR_3210, X2_3210 );
-
- ATMP_3210 = _mm_srai_epi32( ATMP_3210, 7 );
- ATMP_3210 = _mm_add_epi32( ATMP_3210, CONST1 );
- ATMP_3210 = _mm_srai_epi32( ATMP_3210, 1 );
-
- FIRST_3210 = _mm_add_epi32( FIRST_3210, T1_3210 );
- LAST_3210 = _mm_add_epi32( LAST_3210, T2_3210 );
-
- PTR_3210 = _mm_mullo_epi32( ATMP_3210, PTR_3210 );
- SUBFR_3210 = _mm_mullo_epi32( ATMP_3210, SUBFR_3210 );
-
- _mm_storeu_si128( (__m128i *)&C_first_row[ k ], FIRST_3210 );
- _mm_storeu_si128( (__m128i *)&C_last_row[ k ], LAST_3210 );
-
- TMP1_3210 = _mm_add_epi32( TMP1_3210, PTR_3210 );
- TMP2_3210 = _mm_add_epi32( TMP2_3210, SUBFR_3210 );
- }
-
- TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_unpackhi_epi64(TMP1_3210, TMP1_3210 ) );
- TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_unpackhi_epi64(TMP2_3210, TMP2_3210 ) );
- TMP1_3210 = _mm_add_epi32( TMP1_3210, _mm_shufflelo_epi16(TMP1_3210, 0x0E ) );
- TMP2_3210 = _mm_add_epi32( TMP2_3210, _mm_shufflelo_epi16(TMP2_3210, 0x0E ) );
-
- tmp1 += _mm_cvtsi128_si32( TMP1_3210 );
- tmp2 += _mm_cvtsi128_si32( TMP2_3210 );
-
- for( ; k < n; k++ ) {
- C_first_row[ k ] = silk_MLA( C_first_row[ k ], x1, x_ptr[ n - k - 1 ] ); /* Q( -rshifts ) */
- C_last_row[ k ] = silk_MLA( C_last_row[ k ], x2, x_ptr[ subfr_length - n + k ] ); /* Q( -rshifts ) */
- Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 17 ); /* Q17 */
- tmp1 = silk_MLA( tmp1, x_ptr[ n - k - 1 ], Atmp1 ); /* Q17 */
- tmp2 = silk_MLA( tmp2, x_ptr[ subfr_length - n + k ], Atmp1 ); /* Q17 */
- }
-
- tmp1 = -tmp1; /* Q17 */
- tmp2 = -tmp2; /* Q17 */
-
- {
- __m128i xmm_tmp1, xmm_tmp2;
- __m128i xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1;
- __m128i xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1;
-
- xmm_tmp1 = _mm_set1_epi32( tmp1 );
- xmm_tmp2 = _mm_set1_epi32( tmp2 );
-
- for( k = 0; k <= n - 3; k += 4 ) {
- xmm_x_ptr_n_k_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ n - k - 3 ] );
- xmm_x_ptr_sub_x2x0 = OP_CVTEPI16_EPI32_M64( &x_ptr[ subfr_length - n + k - 1 ] );
-
- xmm_x_ptr_n_k_x2x0 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 1, 2, 3 ) );
-
- xmm_x_ptr_n_k_x2x0 = _mm_slli_epi32( xmm_x_ptr_n_k_x2x0, -rshifts - 1 );
- xmm_x_ptr_sub_x2x0 = _mm_slli_epi32( xmm_x_ptr_sub_x2x0, -rshifts - 1 );
-
- /* equal shift right 4 bytes, xmm_x_ptr_n_k_x3x1 = _mm_srli_si128(xmm_x_ptr_n_k_x2x0, 4)*/
- xmm_x_ptr_n_k_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_n_k_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
- xmm_x_ptr_sub_x3x1 = _mm_shuffle_epi32( xmm_x_ptr_sub_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_x_ptr_n_k_x2x0 = _mm_mul_epi32( xmm_x_ptr_n_k_x2x0, xmm_tmp1 );
- xmm_x_ptr_n_k_x3x1 = _mm_mul_epi32( xmm_x_ptr_n_k_x3x1, xmm_tmp1 );
- xmm_x_ptr_sub_x2x0 = _mm_mul_epi32( xmm_x_ptr_sub_x2x0, xmm_tmp2 );
- xmm_x_ptr_sub_x3x1 = _mm_mul_epi32( xmm_x_ptr_sub_x3x1, xmm_tmp2 );
-
- xmm_x_ptr_n_k_x2x0 = _mm_srli_epi64( xmm_x_ptr_n_k_x2x0, 16 );
- xmm_x_ptr_n_k_x3x1 = _mm_slli_epi64( xmm_x_ptr_n_k_x3x1, 16 );
- xmm_x_ptr_sub_x2x0 = _mm_srli_epi64( xmm_x_ptr_sub_x2x0, 16 );
- xmm_x_ptr_sub_x3x1 = _mm_slli_epi64( xmm_x_ptr_sub_x3x1, 16 );
-
- xmm_x_ptr_n_k_x2x0 = _mm_blend_epi16( xmm_x_ptr_n_k_x2x0, xmm_x_ptr_n_k_x3x1, 0xCC );
- xmm_x_ptr_sub_x2x0 = _mm_blend_epi16( xmm_x_ptr_sub_x2x0, xmm_x_ptr_sub_x3x1, 0xCC );
-
- X1_3210 = _mm_loadu_si128( (__m128i *)&CAf[ k ] );
- PTR_3210 = _mm_loadu_si128( (__m128i *)&CAb[ k ] );
-
- X1_3210 = _mm_add_epi32( X1_3210, xmm_x_ptr_n_k_x2x0 );
- PTR_3210 = _mm_add_epi32( PTR_3210, xmm_x_ptr_sub_x2x0 );
-
- _mm_storeu_si128( (__m128i *)&CAf[ k ], X1_3210 );
- _mm_storeu_si128( (__m128i *)&CAb[ k ], PTR_3210 );
- }
-
- for( ; k <= n; k++ ) {
- CAf[ k ] = silk_SMLAWW( CAf[ k ], tmp1,
- silk_LSHIFT32( (opus_int32)x_ptr[ n - k ], -rshifts - 1 ) ); /* Q( -rshift ) */
- CAb[ k ] = silk_SMLAWW( CAb[ k ], tmp2,
- silk_LSHIFT32( (opus_int32)x_ptr[ subfr_length - n + k - 1 ], -rshifts - 1 ) ); /* Q( -rshift ) */
- }
- }
- }
- }
-
- /* Calculate nominator and denominator for the next order reflection (parcor) coefficient */
- tmp1 = C_first_row[ n ]; /* Q( -rshifts ) */
- tmp2 = C_last_row[ n ]; /* Q( -rshifts ) */
- num = 0; /* Q( -rshifts ) */
- nrg = silk_ADD32( CAb[ 0 ], CAf[ 0 ] ); /* Q( 1-rshifts ) */
- for( k = 0; k < n; k++ ) {
- Atmp_QA = Af_QA[ k ];
- lz = silk_CLZ32( silk_abs( Atmp_QA ) ) - 1;
- lz = silk_min( 32 - QA, lz );
- Atmp1 = silk_LSHIFT32( Atmp_QA, lz ); /* Q( QA + lz ) */
-
- tmp1 = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( C_last_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */
- tmp2 = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( C_first_row[ n - k - 1 ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */
- num = silk_ADD_LSHIFT32( num, silk_SMMUL( CAb[ n - k ], Atmp1 ), 32 - QA - lz ); /* Q( -rshifts ) */
- nrg = silk_ADD_LSHIFT32( nrg, silk_SMMUL( silk_ADD32( CAb[ k + 1 ], CAf[ k + 1 ] ),
- Atmp1 ), 32 - QA - lz ); /* Q( 1-rshifts ) */
- }
- CAf[ n + 1 ] = tmp1; /* Q( -rshifts ) */
- CAb[ n + 1 ] = tmp2; /* Q( -rshifts ) */
- num = silk_ADD32( num, tmp2 ); /* Q( -rshifts ) */
- num = silk_LSHIFT32( -num, 1 ); /* Q( 1-rshifts ) */
-
- /* Calculate the next order reflection (parcor) coefficient */
- if( silk_abs( num ) < nrg ) {
- rc_Q31 = silk_DIV32_varQ( num, nrg, 31 );
- } else {
- rc_Q31 = ( num > 0 ) ? silk_int32_MAX : silk_int32_MIN;
- }
-
- /* Update inverse prediction gain */
- tmp1 = ( (opus_int32)1 << 30 ) - silk_SMMUL( rc_Q31, rc_Q31 );
- tmp1 = silk_LSHIFT( silk_SMMUL( invGain_Q30, tmp1 ), 2 );
- if( tmp1 <= minInvGain_Q30 ) {
- /* Max prediction gain exceeded; set reflection coefficient such that max prediction gain is exactly hit */
- tmp2 = ( (opus_int32)1 << 30 ) - silk_DIV32_varQ( minInvGain_Q30, invGain_Q30, 30 ); /* Q30 */
- rc_Q31 = silk_SQRT_APPROX( tmp2 ); /* Q15 */
- if( rc_Q31 > 0 ) {
- /* Newton-Raphson iteration */
- rc_Q31 = silk_RSHIFT32( rc_Q31 + silk_DIV32( tmp2, rc_Q31 ), 1 ); /* Q15 */
- rc_Q31 = silk_LSHIFT32( rc_Q31, 16 ); /* Q31 */
- if( num < 0 ) {
- /* Ensure adjusted reflection coefficients has the original sign */
- rc_Q31 = -rc_Q31;
- }
- }
- invGain_Q30 = minInvGain_Q30;
- reached_max_gain = 1;
- } else {
- invGain_Q30 = tmp1;
- }
-
- /* Update the AR coefficients */
- for( k = 0; k < (n + 1) >> 1; k++ ) {
- tmp1 = Af_QA[ k ]; /* QA */
- tmp2 = Af_QA[ n - k - 1 ]; /* QA */
- Af_QA[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* QA */
- Af_QA[ n - k - 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* QA */
- }
- Af_QA[ n ] = silk_RSHIFT32( rc_Q31, 31 - QA ); /* QA */
-
- if( reached_max_gain ) {
- /* Reached max prediction gain; set remaining coefficients to zero and exit loop */
- for( k = n + 1; k < D; k++ ) {
- Af_QA[ k ] = 0;
- }
- break;
- }
-
- /* Update C * Af and C * Ab */
- for( k = 0; k <= n + 1; k++ ) {
- tmp1 = CAf[ k ]; /* Q( -rshifts ) */
- tmp2 = CAb[ n - k + 1 ]; /* Q( -rshifts ) */
- CAf[ k ] = silk_ADD_LSHIFT32( tmp1, silk_SMMUL( tmp2, rc_Q31 ), 1 ); /* Q( -rshifts ) */
- CAb[ n - k + 1 ] = silk_ADD_LSHIFT32( tmp2, silk_SMMUL( tmp1, rc_Q31 ), 1 ); /* Q( -rshifts ) */
- }
- }
-
- if( reached_max_gain ) {
- for( k = 0; k < D; k++ ) {
- /* Scale coefficients */
- A_Q16[ k ] = -silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 );
- }
- /* Subtract energy of preceding samples from C0 */
- if( rshifts > 0 ) {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- C0 -= (opus_int32)silk_RSHIFT64( silk_inner_prod16_aligned_64( x_ptr, x_ptr, D, arch ), rshifts );
- }
- } else {
- for( s = 0; s < nb_subfr; s++ ) {
- x_ptr = x + s * subfr_length;
- C0 -= silk_LSHIFT32( silk_inner_prod_aligned( x_ptr, x_ptr, D, arch ), -rshifts );
- }
- }
- /* Approximate residual energy */
- *res_nrg = silk_LSHIFT( silk_SMMUL( invGain_Q30, C0 ), 2 );
- *res_nrg_Q = -rshifts;
- } else {
- /* Return residual energy */
- nrg = CAf[ 0 ]; /* Q( -rshifts ) */
- tmp1 = (opus_int32)1 << 16; /* Q16 */
- for( k = 0; k < D; k++ ) {
- Atmp1 = silk_RSHIFT_ROUND( Af_QA[ k ], QA - 16 ); /* Q16 */
- nrg = silk_SMLAWW( nrg, CAf[ k + 1 ], Atmp1 ); /* Q( -rshifts ) */
- tmp1 = silk_SMLAWW( tmp1, Atmp1, Atmp1 ); /* Q16 */
- A_Q16[ k ] = -Atmp1;
- }
- *res_nrg = silk_SMLAWW( nrg, silk_SMMUL( SILK_FIX_CONST( FIND_LPC_COND_FAC, 32 ), C0 ), -tmp1 );/* Q( -rshifts ) */
- *res_nrg_Q = -rshifts;
- }
-}
diff --git a/media/libopus/silk/fixed/x86/vector_ops_FIX_sse.c b/media/libopus/silk/fixed/x86/vector_ops_FIX_sse.c
deleted file mode 100644
index c1e90564d0ed7..0000000000000
--- a/media/libopus/silk/fixed/x86/vector_ops_FIX_sse.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-#include "main.h"
-
-#include "SigProc_FIX.h"
-#include "pitch.h"
-
-opus_int64 silk_inner_prod16_aligned_64_sse4_1(
- const opus_int16 *inVec1, /* I input vector 1 */
- const opus_int16 *inVec2, /* I input vector 2 */
- const opus_int len /* I vector lengths */
-)
-{
- opus_int i, dataSize8;
- opus_int64 sum;
-
- __m128i xmm_tempa;
- __m128i inVec1_76543210, acc1;
- __m128i inVec2_76543210, acc2;
-
- sum = 0;
- dataSize8 = len & ~7;
-
- acc1 = _mm_setzero_si128();
- acc2 = _mm_setzero_si128();
-
- for( i = 0; i < dataSize8; i += 8 ) {
- inVec1_76543210 = _mm_loadu_si128( (__m128i *)(&inVec1[i + 0] ) );
- inVec2_76543210 = _mm_loadu_si128( (__m128i *)(&inVec2[i + 0] ) );
-
- /* only when all 4 operands are -32768 (0x8000), this results in wrap around */
- inVec1_76543210 = _mm_madd_epi16( inVec1_76543210, inVec2_76543210 );
-
- xmm_tempa = _mm_cvtepi32_epi64( inVec1_76543210 );
- /* equal shift right 8 bytes */
- inVec1_76543210 = _mm_shuffle_epi32( inVec1_76543210, _MM_SHUFFLE( 0, 0, 3, 2 ) );
- inVec1_76543210 = _mm_cvtepi32_epi64( inVec1_76543210 );
-
- acc1 = _mm_add_epi64( acc1, xmm_tempa );
- acc2 = _mm_add_epi64( acc2, inVec1_76543210 );
- }
-
- acc1 = _mm_add_epi64( acc1, acc2 );
-
- /* equal shift right 8 bytes */
- acc2 = _mm_shuffle_epi32( acc1, _MM_SHUFFLE( 0, 0, 3, 2 ) );
- acc1 = _mm_add_epi64( acc1, acc2 );
-
- _mm_storel_epi64( (__m128i *)&sum, acc1 );
-
- for( ; i < len; i++ ) {
- sum = silk_SMLABB( sum, inVec1[ i ], inVec2[ i ] );
- }
-
- return sum;
-}
diff --git a/media/libopus/silk/x86/NSQ_del_dec_sse.c b/media/libopus/silk/x86/NSQ_del_dec_sse.c
deleted file mode 100644
index c5212bee8d3a1..0000000000000
--- a/media/libopus/silk/x86/NSQ_del_dec_sse.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-#include "main.h"
-#include "celt/x86/x86cpu.h"
-
-#include "stack_alloc.h"
-
-typedef struct {
- opus_int32 sLPC_Q14[ MAX_SUB_FRAME_LENGTH + NSQ_LPC_BUF_LENGTH ];
- opus_int32 RandState[ DECISION_DELAY ];
- opus_int32 Q_Q10[ DECISION_DELAY ];
- opus_int32 Xq_Q14[ DECISION_DELAY ];
- opus_int32 Pred_Q15[ DECISION_DELAY ];
- opus_int32 Shape_Q14[ DECISION_DELAY ];
- opus_int32 sAR2_Q14[ MAX_SHAPE_LPC_ORDER ];
- opus_int32 LF_AR_Q14;
- opus_int32 Seed;
- opus_int32 SeedInit;
- opus_int32 RD_Q10;
-} NSQ_del_dec_struct;
-
-typedef struct {
- opus_int32 Q_Q10;
- opus_int32 RD_Q10;
- opus_int32 xq_Q14;
- opus_int32 LF_AR_Q14;
- opus_int32 sLTP_shp_Q14;
- opus_int32 LPC_exc_Q14;
-} NSQ_sample_struct;
-
-typedef NSQ_sample_struct NSQ_sample_pair[ 2 ];
-
-static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- const opus_int32 x_Q3[], /* I Input in Q3 */
- opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
- const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
- opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
- opus_int subfr, /* I Subframe number */
- opus_int nStatesDelayedDecision, /* I Number of del dec states */
- const opus_int LTP_scale_Q14, /* I LTP state scaling */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
- const opus_int signal_type, /* I Signal type */
- const opus_int decisionDelay /* I Decision delay */
-);
-
-/******************************************/
-/* Noise shape quantizer for one subframe */
-/******************************************/
-static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1(
- silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- opus_int signalType, /* I Signal type */
- const opus_int32 x_Q10[], /* I */
- opus_int8 pulses[], /* O */
- opus_int16 xq[], /* O */
- opus_int32 sLTP_Q15[], /* I/O LTP filter state */
- opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */
- const opus_int16 a_Q12[], /* I Short term prediction coefs */
- const opus_int16 b_Q14[], /* I Long term prediction coefs */
- const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */
- opus_int lag, /* I Pitch lag */
- opus_int32 HarmShapeFIRPacked_Q14, /* I */
- opus_int Tilt_Q14, /* I Spectral tilt */
- opus_int32 LF_shp_Q14, /* I */
- opus_int32 Gain_Q16, /* I */
- opus_int Lambda_Q10, /* I */
- opus_int offset_Q10, /* I */
- opus_int length, /* I Input length */
- opus_int subfr, /* I Subframe number */
- opus_int shapingLPCOrder, /* I Shaping LPC filter order */
- opus_int predictLPCOrder, /* I Prediction filter order */
- opus_int warping_Q16, /* I */
- opus_int nStatesDelayedDecision, /* I Number of states in decision tree */
- opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */
- opus_int decisionDelay /* I */
-);
-
-void silk_NSQ_del_dec_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- SideInfoIndices *psIndices, /* I/O Quantization Indices */
- const opus_int32 x_Q3[], /* I Prefiltered input signal */
- opus_int8 pulses[], /* O Quantized pulse signal */
- const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */
- const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */
- const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */
- const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */
- const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
- const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
- const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */
- const opus_int LTP_scale_Q14 /* I LTP state scaling */
-)
-{
- opus_int i, k, lag, start_idx, LSF_interpolation_flag, Winner_ind, subfr;
- opus_int last_smple_idx, smpl_buf_idx, decisionDelay;
- const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
- opus_int16 *pxq;
- VARDECL( opus_int32, sLTP_Q15 );
- VARDECL( opus_int16, sLTP );
- opus_int32 HarmShapeFIRPacked_Q14;
- opus_int offset_Q10;
- opus_int32 RDmin_Q10, Gain_Q10;
- VARDECL( opus_int32, x_sc_Q10 );
- VARDECL( opus_int32, delayedGain_Q10 );
- VARDECL( NSQ_del_dec_struct, psDelDec );
- NSQ_del_dec_struct *psDD;
- SAVE_STACK;
-
- /* Set unvoiced lag to the previous one, overwrite later for voiced */
- lag = NSQ->lagPrev;
-
- silk_assert( NSQ->prev_gain_Q16 != 0 );
-
- /* Initialize delayed decision states */
- ALLOC( psDelDec, psEncC->nStatesDelayedDecision, NSQ_del_dec_struct );
- silk_memset( psDelDec, 0, psEncC->nStatesDelayedDecision * sizeof( NSQ_del_dec_struct ) );
- for( k = 0; k < psEncC->nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- psDD->Seed = ( k + psIndices->Seed ) & 3;
- psDD->SeedInit = psDD->Seed;
- psDD->RD_Q10 = 0;
- psDD->LF_AR_Q14 = NSQ->sLF_AR_shp_Q14;
- psDD->Shape_Q14[ 0 ] = NSQ->sLTP_shp_Q14[ psEncC->ltp_mem_length - 1 ];
- silk_memcpy( psDD->sLPC_Q14, NSQ->sLPC_Q14, NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
- silk_memcpy( psDD->sAR2_Q14, NSQ->sAR2_Q14, sizeof( NSQ->sAR2_Q14 ) );
- }
-
- offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
- smpl_buf_idx = 0; /* index of oldest samples */
-
- decisionDelay = silk_min_int( DECISION_DELAY, psEncC->subfr_length );
-
- /* For voiced frames limit the decision delay to lower than the pitch lag */
- if( psIndices->signalType == TYPE_VOICED ) {
- for( k = 0; k < psEncC->nb_subfr; k++ ) {
- decisionDelay = silk_min_int( decisionDelay, pitchL[ k ] - LTP_ORDER / 2 - 1 );
- }
- } else {
- if( lag > 0 ) {
- decisionDelay = silk_min_int( decisionDelay, lag - LTP_ORDER / 2 - 1 );
- }
- }
-
- if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
- LSF_interpolation_flag = 0;
- } else {
- LSF_interpolation_flag = 1;
- }
-
- ALLOC( sLTP_Q15,
- psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
- ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
- ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
- ALLOC( delayedGain_Q10, DECISION_DELAY, opus_int32 );
- /* Set up pointers to start of sub frame */
- pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
- NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
- NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
- subfr = 0;
- for( k = 0; k < psEncC->nb_subfr; k++ ) {
- A_Q12 = &PredCoef_Q12[ ( ( k >> 1 ) | ( 1 - LSF_interpolation_flag ) ) * MAX_LPC_ORDER ];
- B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
- AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ];
-
- /* Noise shape parameters */
- silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
- HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
- HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
-
- NSQ->rewhite_flag = 0;
- if( psIndices->signalType == TYPE_VOICED ) {
- /* Voiced */
- lag = pitchL[ k ];
-
- /* Re-whitening */
- if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
- if( k == 2 ) {
- /* RESET DELAYED DECISIONS */
- /* Find winner */
- RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
- Winner_ind = 0;
- for( i = 1; i < psEncC->nStatesDelayedDecision; i++ ) {
- if( psDelDec[ i ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psDelDec[ i ].RD_Q10;
- Winner_ind = i;
- }
- }
- for( i = 0; i < psEncC->nStatesDelayedDecision; i++ ) {
- if( i != Winner_ind ) {
- psDelDec[ i ].RD_Q10 += ( silk_int32_MAX >> 4 );
- silk_assert( psDelDec[ i ].RD_Q10 >= 0 );
- }
- }
-
- /* Copy final part of signals from winner state to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- last_smple_idx = smpl_buf_idx + decisionDelay;
- for( i = 0; i < decisionDelay; i++ ) {
- last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
- if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
- pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
- pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
- silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gains_Q16[ 1 ] ), 14 ) );
- NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
- }
-
- subfr = 0;
- }
-
- /* Rewhiten with new A coefs */
- start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
- silk_assert( start_idx > 0 );
-
- silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
- A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch );
-
- NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
- NSQ->rewhite_flag = 1;
- }
- }
-
- silk_nsq_del_dec_scale_states_sse4_1( psEncC, NSQ, psDelDec, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k,
- psEncC->nStatesDelayedDecision, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType, decisionDelay );
-
- silk_noise_shape_quantizer_del_dec_sse4_1( NSQ, psDelDec, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15,
- delayedGain_Q10, A_Q12, B_Q14, AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ],
- Gains_Q16[ k ], Lambda_Q10, offset_Q10, psEncC->subfr_length, subfr++, psEncC->shapingLPCOrder,
- psEncC->predictLPCOrder, psEncC->warping_Q16, psEncC->nStatesDelayedDecision, &smpl_buf_idx, decisionDelay );
-
- x_Q3 += psEncC->subfr_length;
- pulses += psEncC->subfr_length;
- pxq += psEncC->subfr_length;
- }
-
- /* Find winner */
- RDmin_Q10 = psDelDec[ 0 ].RD_Q10;
- Winner_ind = 0;
- for( k = 1; k < psEncC->nStatesDelayedDecision; k++ ) {
- if( psDelDec[ k ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psDelDec[ k ].RD_Q10;
- Winner_ind = k;
- }
- }
-
- /* Copy final part of signals from winner state to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- psIndices->Seed = psDD->SeedInit;
- last_smple_idx = smpl_buf_idx + decisionDelay;
- Gain_Q10 = silk_RSHIFT32( Gains_Q16[ psEncC->nb_subfr - 1 ], 6 );
- for( i = 0; i < decisionDelay; i++ ) {
- last_smple_idx = ( last_smple_idx - 1 ) % DECISION_DELAY;
- if( last_smple_idx < 0 ) last_smple_idx += DECISION_DELAY;
- pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
- pxq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
- silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], Gain_Q10 ), 8 ) );
- NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay + i ] = psDD->Shape_Q14[ last_smple_idx ];
- }
- silk_memcpy( NSQ->sLPC_Q14, &psDD->sLPC_Q14[ psEncC->subfr_length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
- silk_memcpy( NSQ->sAR2_Q14, psDD->sAR2_Q14, sizeof( psDD->sAR2_Q14 ) );
-
- /* Update states */
- NSQ->sLF_AR_shp_Q14 = psDD->LF_AR_Q14;
- NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ];
-
- /* Save quantized speech signal */
- silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
- silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
- RESTORE_STACK;
-}
-
-/******************************************/
-/* Noise shape quantizer for one subframe */
-/******************************************/
-static OPUS_INLINE void silk_noise_shape_quantizer_del_dec_sse4_1(
- silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- opus_int signalType, /* I Signal type */
- const opus_int32 x_Q10[], /* I */
- opus_int8 pulses[], /* O */
- opus_int16 xq[], /* O */
- opus_int32 sLTP_Q15[], /* I/O LTP filter state */
- opus_int32 delayedGain_Q10[], /* I/O Gain delay buffer */
- const opus_int16 a_Q12[], /* I Short term prediction coefs */
- const opus_int16 b_Q14[], /* I Long term prediction coefs */
- const opus_int16 AR_shp_Q13[], /* I Noise shaping coefs */
- opus_int lag, /* I Pitch lag */
- opus_int32 HarmShapeFIRPacked_Q14, /* I */
- opus_int Tilt_Q14, /* I Spectral tilt */
- opus_int32 LF_shp_Q14, /* I */
- opus_int32 Gain_Q16, /* I */
- opus_int Lambda_Q10, /* I */
- opus_int offset_Q10, /* I */
- opus_int length, /* I Input length */
- opus_int subfr, /* I Subframe number */
- opus_int shapingLPCOrder, /* I Shaping LPC filter order */
- opus_int predictLPCOrder, /* I Prediction filter order */
- opus_int warping_Q16, /* I */
- opus_int nStatesDelayedDecision, /* I Number of states in decision tree */
- opus_int *smpl_buf_idx, /* I/O Index to newest samples in buffers */
- opus_int decisionDelay /* I */
-)
-{
- opus_int i, j, k, Winner_ind, RDmin_ind, RDmax_ind, last_smple_idx;
- opus_int32 Winner_rand_state;
- opus_int32 LTP_pred_Q14, LPC_pred_Q14, n_AR_Q14, n_LTP_Q14;
- opus_int32 n_LF_Q14, r_Q10, rr_Q10, rd1_Q10, rd2_Q10, RDmin_Q10, RDmax_Q10;
- opus_int32 q1_Q0, q1_Q10, q2_Q10, exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
- opus_int32 tmp1, tmp2, sLF_AR_shp_Q14;
- opus_int32 *pred_lag_ptr, *shp_lag_ptr, *psLPC_Q14;
- VARDECL( NSQ_sample_pair, psSampleState );
- NSQ_del_dec_struct *psDD;
- NSQ_sample_struct *psSS;
-
- __m128i a_Q12_0123, a_Q12_4567, a_Q12_89AB, a_Q12_CDEF;
- __m128i b_Q12_0123, b_sr_Q12_0123;
- SAVE_STACK;
-
- silk_assert( nStatesDelayedDecision > 0 );
- ALLOC( psSampleState, nStatesDelayedDecision, NSQ_sample_pair );
-
- shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
- pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
- Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 );
-
- a_Q12_0123 = OP_CVTEPI16_EPI32_M64( a_Q12 );
- a_Q12_4567 = OP_CVTEPI16_EPI32_M64( a_Q12 + 4 );
-
- if( opus_likely( predictLPCOrder == 16 ) ) {
- a_Q12_89AB = OP_CVTEPI16_EPI32_M64( a_Q12 + 8 );
- a_Q12_CDEF = OP_CVTEPI16_EPI32_M64( a_Q12 + 12 );
- }
-
- if( signalType == TYPE_VOICED ){
- b_Q12_0123 = OP_CVTEPI16_EPI32_M64( b_Q14 );
- b_sr_Q12_0123 = _mm_shuffle_epi32( b_Q12_0123, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- }
- for( i = 0; i < length; i++ ) {
- /* Perform common calculations used in all states */
-
- /* Long-term prediction */
- if( signalType == TYPE_VOICED ) {
- /* Unrolled loop */
- /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
- LTP_pred_Q14 = 2;
- {
- __m128i tmpa, tmpb, pred_lag_ptr_tmp;
- pred_lag_ptr_tmp = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) );
- pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, 0x1B );
- tmpa = _mm_mul_epi32( pred_lag_ptr_tmp, b_Q12_0123 );
- tmpa = _mm_srli_si128( tmpa, 2 );
-
- pred_lag_ptr_tmp = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) );/* equal shift right 4 bytes */
- pred_lag_ptr_tmp = _mm_mul_epi32( pred_lag_ptr_tmp, b_sr_Q12_0123 );
- pred_lag_ptr_tmp = _mm_srli_si128( pred_lag_ptr_tmp, 2 );
- pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpa );
-
- tmpb = _mm_shuffle_epi32( pred_lag_ptr_tmp, _MM_SHUFFLE( 0, 0, 3, 2 ) );/* equal shift right 8 bytes */
- pred_lag_ptr_tmp = _mm_add_epi32( pred_lag_ptr_tmp, tmpb );
- LTP_pred_Q14 += _mm_cvtsi128_si32( pred_lag_ptr_tmp );
-
- LTP_pred_Q14 = silk_SMLAWB( LTP_pred_Q14, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
- LTP_pred_Q14 = silk_LSHIFT( LTP_pred_Q14, 1 ); /* Q13 -> Q14 */
- pred_lag_ptr++;
- }
- } else {
- LTP_pred_Q14 = 0;
- }
-
- /* Long-term shaping */
- if( lag > 0 ) {
- /* Symmetric, packed FIR coefficients */
- n_LTP_Q14 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
- n_LTP_Q14 = silk_SMLAWT( n_LTP_Q14, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
- n_LTP_Q14 = silk_SUB_LSHIFT32( LTP_pred_Q14, n_LTP_Q14, 2 ); /* Q12 -> Q14 */
- shp_lag_ptr++;
- } else {
- n_LTP_Q14 = 0;
- }
- {
- __m128i tmpa, tmpb, psLPC_Q14_tmp, a_Q12_tmp;
-
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- /* Delayed decision state */
- psDD = &psDelDec[ k ];
-
- /* Sample state */
- psSS = psSampleState[ k ];
-
- /* Generate dither */
- psDD->Seed = silk_RAND( psDD->Seed );
-
- /* Pointer used in short term prediction and shaping */
- psLPC_Q14 = &psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 + i ];
- /* Short-term prediction */
- silk_assert( predictLPCOrder == 10 || predictLPCOrder == 16 );
- /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
- LPC_pred_Q14 = silk_RSHIFT( predictLPCOrder, 1 );
-
- tmpb = _mm_setzero_si128();
-
- /* step 1 */
- psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -3 ] ) ); /* -3, -2 , -1, 0 */
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B ); /* 0, -1, -2, -3 */
- tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_0123 ); /* 0, -1, -2, -3 * 0123 -> 0*0, 2*-2 */
-
- tmpa = _mm_srli_epi64( tmpa, 16 );
- tmpb = _mm_add_epi32( tmpb, tmpa );
-
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- a_Q12_tmp = _mm_shuffle_epi32( a_Q12_0123, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp ); /* 1*-1, 3*-3 */
- psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 );
- tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp );
-
- /* step 2 */
- psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -7 ] ) );
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B );
- tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_4567 );
- tmpa = _mm_srli_epi64( tmpa, 16 );
- tmpb = _mm_add_epi32( tmpb, tmpa );
-
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- a_Q12_tmp = _mm_shuffle_epi32( a_Q12_4567, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp );
- psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 );
- tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp );
-
- if ( opus_likely( predictLPCOrder == 16 ) )
- {
- /* step 3 */
- psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -11 ] ) );
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B );
- tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_89AB );
- tmpa = _mm_srli_epi64( tmpa, 16 );
- tmpb = _mm_add_epi32( tmpb, tmpa );
-
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- a_Q12_tmp = _mm_shuffle_epi32( a_Q12_89AB, _MM_SHUFFLE(0, 3, 2, 1 ) );/* equal shift right 4 bytes */
- psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp );
- psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 );
- tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp );
-
- /* setp 4 */
- psLPC_Q14_tmp = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -15 ] ) );
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, 0x1B );
- tmpa = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_CDEF );
- tmpa = _mm_srli_epi64( tmpa, 16 );
- tmpb = _mm_add_epi32( tmpb, tmpa );
-
- psLPC_Q14_tmp = _mm_shuffle_epi32( psLPC_Q14_tmp, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- a_Q12_tmp = _mm_shuffle_epi32( a_Q12_CDEF, _MM_SHUFFLE(0, 3, 2, 1 ) ); /* equal shift right 4 bytes */
- psLPC_Q14_tmp = _mm_mul_epi32( psLPC_Q14_tmp, a_Q12_tmp );
- psLPC_Q14_tmp = _mm_srli_epi64( psLPC_Q14_tmp, 16 );
- tmpb = _mm_add_epi32( tmpb, psLPC_Q14_tmp );
-
- /* add at last */
- /* equal shift right 8 bytes*/
- tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) );
- tmpb = _mm_add_epi32( tmpb, tmpa );
- LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb );
- }
- else
- {
- /* add at last */
- tmpa = _mm_shuffle_epi32( tmpb, _MM_SHUFFLE( 0, 0, 3, 2 ) ); /* equal shift right 8 bytes*/
- tmpb = _mm_add_epi32( tmpb, tmpa );
- LPC_pred_Q14 += _mm_cvtsi128_si32( tmpb );
-
- LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -8 ], a_Q12[ 8 ] );
- LPC_pred_Q14 = silk_SMLAWB( LPC_pred_Q14, psLPC_Q14[ -9 ], a_Q12[ 9 ] );
- }
-
- LPC_pred_Q14 = silk_LSHIFT( LPC_pred_Q14, 4 ); /* Q10 -> Q14 */
-
- /* Noise shape feedback */
- silk_assert( ( shapingLPCOrder & 1 ) == 0 ); /* check that order is even */
- /* Output of lowpass section */
- tmp2 = silk_SMLAWB( psLPC_Q14[ 0 ], psDD->sAR2_Q14[ 0 ], warping_Q16 );
- /* Output of allpass section */
- tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ 0 ], psDD->sAR2_Q14[ 1 ] - tmp2, warping_Q16 );
- psDD->sAR2_Q14[ 0 ] = tmp2;
- n_AR_Q14 = silk_RSHIFT( shapingLPCOrder, 1 );
- n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ 0 ] );
- /* Loop over allpass sections */
- for( j = 2; j < shapingLPCOrder; j += 2 ) {
- /* Output of allpass section */
- tmp2 = silk_SMLAWB( psDD->sAR2_Q14[ j - 1 ], psDD->sAR2_Q14[ j + 0 ] - tmp1, warping_Q16 );
- psDD->sAR2_Q14[ j - 1 ] = tmp1;
- n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ j - 1 ] );
- /* Output of allpass section */
- tmp1 = silk_SMLAWB( psDD->sAR2_Q14[ j + 0 ], psDD->sAR2_Q14[ j + 1 ] - tmp2, warping_Q16 );
- psDD->sAR2_Q14[ j + 0 ] = tmp2;
- n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp2, AR_shp_Q13[ j ] );
- }
- psDD->sAR2_Q14[ shapingLPCOrder - 1 ] = tmp1;
- n_AR_Q14 = silk_SMLAWB( n_AR_Q14, tmp1, AR_shp_Q13[ shapingLPCOrder - 1 ] );
-
- n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 1 ); /* Q11 -> Q12 */
- n_AR_Q14 = silk_SMLAWB( n_AR_Q14, psDD->LF_AR_Q14, Tilt_Q14 ); /* Q12 */
- n_AR_Q14 = silk_LSHIFT( n_AR_Q14, 2 ); /* Q12 -> Q14 */
-
- n_LF_Q14 = silk_SMULWB( psDD->Shape_Q14[ *smpl_buf_idx ], LF_shp_Q14 ); /* Q12 */
- n_LF_Q14 = silk_SMLAWT( n_LF_Q14, psDD->LF_AR_Q14, LF_shp_Q14 ); /* Q12 */
- n_LF_Q14 = silk_LSHIFT( n_LF_Q14, 2 ); /* Q12 -> Q14 */
-
- /* Input minus prediction plus noise feedback */
- /* r = x[ i ] - LTP_pred - LPC_pred + n_AR + n_Tilt + n_LF + n_LTP */
- tmp1 = silk_ADD32( n_AR_Q14, n_LF_Q14 ); /* Q14 */
- tmp2 = silk_ADD32( n_LTP_Q14, LPC_pred_Q14 ); /* Q13 */
- tmp1 = silk_SUB32( tmp2, tmp1 ); /* Q13 */
- tmp1 = silk_RSHIFT_ROUND( tmp1, 4 ); /* Q10 */
-
- r_Q10 = silk_SUB32( x_Q10[ i ], tmp1 ); /* residual error Q10 */
-
- /* Flip sign depending on dither */
- if ( psDD->Seed < 0 ) {
- r_Q10 = -r_Q10;
- }
- r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
-
- /* Find two quantization level candidates and measure their rate-distortion */
- q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
- q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
- if( q1_Q0 > 0 ) {
- q1_Q10 = silk_SUB32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
- q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
- q2_Q10 = silk_ADD32( q1_Q10, 1024 );
- rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
- rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
- } else if( q1_Q0 == 0 ) {
- q1_Q10 = offset_Q10;
- q2_Q10 = silk_ADD32( q1_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
- rd1_Q10 = silk_SMULBB( q1_Q10, Lambda_Q10 );
- rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
- } else if( q1_Q0 == -1 ) {
- q2_Q10 = offset_Q10;
- q1_Q10 = silk_SUB32( q2_Q10, 1024 - QUANT_LEVEL_ADJUST_Q10 );
- rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
- rd2_Q10 = silk_SMULBB( q2_Q10, Lambda_Q10 );
- } else { /* q1_Q0 < -1 */
- q1_Q10 = silk_ADD32( silk_LSHIFT( q1_Q0, 10 ), QUANT_LEVEL_ADJUST_Q10 );
- q1_Q10 = silk_ADD32( q1_Q10, offset_Q10 );
- q2_Q10 = silk_ADD32( q1_Q10, 1024 );
- rd1_Q10 = silk_SMULBB( -q1_Q10, Lambda_Q10 );
- rd2_Q10 = silk_SMULBB( -q2_Q10, Lambda_Q10 );
- }
- rr_Q10 = silk_SUB32( r_Q10, q1_Q10 );
- rd1_Q10 = silk_RSHIFT( silk_SMLABB( rd1_Q10, rr_Q10, rr_Q10 ), 10 );
- rr_Q10 = silk_SUB32( r_Q10, q2_Q10 );
- rd2_Q10 = silk_RSHIFT( silk_SMLABB( rd2_Q10, rr_Q10, rr_Q10 ), 10 );
-
- if( rd1_Q10 < rd2_Q10 ) {
- psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
- psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
- psSS[ 0 ].Q_Q10 = q1_Q10;
- psSS[ 1 ].Q_Q10 = q2_Q10;
- } else {
- psSS[ 0 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd2_Q10 );
- psSS[ 1 ].RD_Q10 = silk_ADD32( psDD->RD_Q10, rd1_Q10 );
- psSS[ 0 ].Q_Q10 = q2_Q10;
- psSS[ 1 ].Q_Q10 = q1_Q10;
- }
-
- /* Update states for best quantization */
-
- /* Quantized excitation */
- exc_Q14 = silk_LSHIFT32( psSS[ 0 ].Q_Q10, 4 );
- if ( psDD->Seed < 0 ) {
- exc_Q14 = -exc_Q14;
- }
-
- /* Add predictions */
- LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
- xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
-
- /* Update states */
- sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 );
- psSS[ 0 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 );
- psSS[ 0 ].LF_AR_Q14 = sLF_AR_shp_Q14;
- psSS[ 0 ].LPC_exc_Q14 = LPC_exc_Q14;
- psSS[ 0 ].xq_Q14 = xq_Q14;
-
- /* Update states for second best quantization */
-
- /* Quantized excitation */
- exc_Q14 = silk_LSHIFT32( psSS[ 1 ].Q_Q10, 4 );
- if ( psDD->Seed < 0 ) {
- exc_Q14 = -exc_Q14;
- }
-
-
- /* Add predictions */
- LPC_exc_Q14 = silk_ADD32( exc_Q14, LTP_pred_Q14 );
- xq_Q14 = silk_ADD32( LPC_exc_Q14, LPC_pred_Q14 );
-
- /* Update states */
- sLF_AR_shp_Q14 = silk_SUB32( xq_Q14, n_AR_Q14 );
- psSS[ 1 ].sLTP_shp_Q14 = silk_SUB32( sLF_AR_shp_Q14, n_LF_Q14 );
- psSS[ 1 ].LF_AR_Q14 = sLF_AR_shp_Q14;
- psSS[ 1 ].LPC_exc_Q14 = LPC_exc_Q14;
- psSS[ 1 ].xq_Q14 = xq_Q14;
- }
- }
- *smpl_buf_idx = ( *smpl_buf_idx - 1 ) % DECISION_DELAY;
- if( *smpl_buf_idx < 0 ) *smpl_buf_idx += DECISION_DELAY;
- last_smple_idx = ( *smpl_buf_idx + decisionDelay ) % DECISION_DELAY;
-
- /* Find winner */
- RDmin_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
- Winner_ind = 0;
- for( k = 1; k < nStatesDelayedDecision; k++ ) {
- if( psSampleState[ k ][ 0 ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
- Winner_ind = k;
- }
- }
-
- /* Increase RD values of expired states */
- Winner_rand_state = psDelDec[ Winner_ind ].RandState[ last_smple_idx ];
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- if( psDelDec[ k ].RandState[ last_smple_idx ] != Winner_rand_state ) {
- psSampleState[ k ][ 0 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 0 ].RD_Q10, silk_int32_MAX >> 4 );
- psSampleState[ k ][ 1 ].RD_Q10 = silk_ADD32( psSampleState[ k ][ 1 ].RD_Q10, silk_int32_MAX >> 4 );
- silk_assert( psSampleState[ k ][ 0 ].RD_Q10 >= 0 );
- }
- }
-
- /* Find worst in first set and best in second set */
- RDmax_Q10 = psSampleState[ 0 ][ 0 ].RD_Q10;
- RDmin_Q10 = psSampleState[ 0 ][ 1 ].RD_Q10;
- RDmax_ind = 0;
- RDmin_ind = 0;
- for( k = 1; k < nStatesDelayedDecision; k++ ) {
- /* find worst in first set */
- if( psSampleState[ k ][ 0 ].RD_Q10 > RDmax_Q10 ) {
- RDmax_Q10 = psSampleState[ k ][ 0 ].RD_Q10;
- RDmax_ind = k;
- }
- /* find best in second set */
- if( psSampleState[ k ][ 1 ].RD_Q10 < RDmin_Q10 ) {
- RDmin_Q10 = psSampleState[ k ][ 1 ].RD_Q10;
- RDmin_ind = k;
- }
- }
-
- /* Replace a state if best from second set outperforms worst in first set */
- if( RDmin_Q10 < RDmax_Q10 ) {
- silk_memcpy( ( (opus_int32 *)&psDelDec[ RDmax_ind ] ) + i,
- ( (opus_int32 *)&psDelDec[ RDmin_ind ] ) + i, sizeof( NSQ_del_dec_struct ) - i * sizeof( opus_int32) );
- silk_memcpy( &psSampleState[ RDmax_ind ][ 0 ], &psSampleState[ RDmin_ind ][ 1 ], sizeof( NSQ_sample_struct ) );
- }
-
- /* Write samples from winner to output and long-term filter states */
- psDD = &psDelDec[ Winner_ind ];
- if( subfr > 0 || i >= decisionDelay ) {
- pulses[ i - decisionDelay ] = (opus_int8)silk_RSHIFT_ROUND( psDD->Q_Q10[ last_smple_idx ], 10 );
- xq[ i - decisionDelay ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND(
- silk_SMULWW( psDD->Xq_Q14[ last_smple_idx ], delayedGain_Q10[ last_smple_idx ] ), 8 ) );
- NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - decisionDelay ] = psDD->Shape_Q14[ last_smple_idx ];
- sLTP_Q15[ NSQ->sLTP_buf_idx - decisionDelay ] = psDD->Pred_Q15[ last_smple_idx ];
- }
- NSQ->sLTP_shp_buf_idx++;
- NSQ->sLTP_buf_idx++;
-
- /* Update states */
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- psSS = &psSampleState[ k ][ 0 ];
- psDD->LF_AR_Q14 = psSS->LF_AR_Q14;
- psDD->sLPC_Q14[ NSQ_LPC_BUF_LENGTH + i ] = psSS->xq_Q14;
- psDD->Xq_Q14[ *smpl_buf_idx ] = psSS->xq_Q14;
- psDD->Q_Q10[ *smpl_buf_idx ] = psSS->Q_Q10;
- psDD->Pred_Q15[ *smpl_buf_idx ] = silk_LSHIFT32( psSS->LPC_exc_Q14, 1 );
- psDD->Shape_Q14[ *smpl_buf_idx ] = psSS->sLTP_shp_Q14;
- psDD->Seed = silk_ADD32_ovflw( psDD->Seed, silk_RSHIFT_ROUND( psSS->Q_Q10, 10 ) );
- psDD->RandState[ *smpl_buf_idx ] = psDD->Seed;
- psDD->RD_Q10 = psSS->RD_Q10;
- }
- delayedGain_Q10[ *smpl_buf_idx ] = Gain_Q10;
- }
- /* Update LPC states */
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
- silk_memcpy( psDD->sLPC_Q14, &psDD->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
- }
- RESTORE_STACK;
-}
-
-static OPUS_INLINE void silk_nsq_del_dec_scale_states_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- NSQ_del_dec_struct psDelDec[], /* I/O Delayed decision states */
- const opus_int32 x_Q3[], /* I Input in Q3 */
- opus_int32 x_sc_Q10[], /* O Input scaled with 1/Gain in Q10 */
- const opus_int16 sLTP[], /* I Re-whitened LTP state in Q0 */
- opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
- opus_int subfr, /* I Subframe number */
- opus_int nStatesDelayedDecision, /* I Number of del dec states */
- const opus_int LTP_scale_Q14, /* I LTP state scaling */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
- const opus_int signal_type, /* I Signal type */
- const opus_int decisionDelay /* I Decision delay */
-)
-{
- opus_int i, k, lag;
- opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23;
- NSQ_del_dec_struct *psDD;
- __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1;
-
- lag = pitchL[ subfr ];
- inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
-
- silk_assert( inv_gain_Q31 != 0 );
-
- /* Calculate gain adjustment factor */
- if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
- gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
- } else {
- gain_adj_Q16 = (opus_int32)1 << 16;
- }
-
- /* Scale input */
- inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 );
-
- /* prepare inv_gain_Q23 in packed 4 32-bits */
- xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23);
-
- for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) {
- xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) );
- /* equal shift right 4 bytes*/
- xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 );
- xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 );
-
- xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 );
- xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 );
-
- xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC );
-
- _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ])), xmm_x_Q3_x2x0 );
- }
-
- for( ; i < psEncC->subfr_length; i++ ) {
- x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 );
- }
-
- /* Save inverse gain */
- NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
-
- /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
- if( NSQ->rewhite_flag ) {
- if( subfr == 0 ) {
- /* Do LTP downscaling */
- inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
- }
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- silk_assert( i < MAX_FRAME_LENGTH );
- sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
- }
- }
-
- /* Adjust for changing gain */
- if( gain_adj_Q16 != (opus_int32)1 << 16 ) {
- /* Scale long-term shaping state */
- {
- __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1;
-
- /* prepare gain_adj_Q16 in packed 4 32-bits */
- xmm_gain_adj_Q16 = _mm_set1_epi32( gain_adj_Q16 );
-
- for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 )
- {
- xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) );
- /* equal shift right 4 bytes*/
- xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 );
- xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 );
- xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC );
-
- _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 );
- }
-
- for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) {
- NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
- }
-
- /* Scale long-term prediction state */
- if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx - decisionDelay; i++ ) {
- sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
- }
- }
-
- for( k = 0; k < nStatesDelayedDecision; k++ ) {
- psDD = &psDelDec[ k ];
-
- /* Scale scalar states */
- psDD->LF_AR_Q14 = silk_SMULWW( gain_adj_Q16, psDD->LF_AR_Q14 );
-
- /* Scale short-term prediction and shaping states */
- for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
- psDD->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sLPC_Q14[ i ] );
- }
- for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
- psDD->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->sAR2_Q14[ i ] );
- }
- for( i = 0; i < DECISION_DELAY; i++ ) {
- psDD->Pred_Q15[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Pred_Q15[ i ] );
- psDD->Shape_Q14[ i ] = silk_SMULWW( gain_adj_Q16, psDD->Shape_Q14[ i ] );
- }
- }
- }
- }
-}
diff --git a/media/libopus/silk/x86/NSQ_sse.c b/media/libopus/silk/x86/NSQ_sse.c
deleted file mode 100644
index 6a9e6e96cfab8..0000000000000
--- a/media/libopus/silk/x86/NSQ_sse.c
+++ /dev/null
@@ -1,719 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-#include "main.h"
-#include "celt/x86/x86cpu.h"
-#include "stack_alloc.h"
-
-static OPUS_INLINE void silk_nsq_scale_states_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- const opus_int32 x_Q3[], /* I input in Q3 */
- opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
- const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */
- opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
- opus_int subfr, /* I subframe number */
- const opus_int LTP_scale_Q14, /* I */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
- const opus_int signal_type /* I Signal type */
-);
-
-static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1(
- silk_nsq_state *NSQ, /* I/O NSQ state */
- opus_int signalType, /* I Signal type */
- const opus_int32 x_sc_Q10[], /* I */
- opus_int8 pulses[], /* O */
- opus_int16 xq[], /* O */
- opus_int32 sLTP_Q15[], /* I/O LTP state */
- const opus_int16 a_Q12[], /* I Short term prediction coefs */
- const opus_int16 b_Q14[], /* I Long term prediction coefs */
- const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
- opus_int lag, /* I Pitch lag */
- opus_int32 HarmShapeFIRPacked_Q14, /* I */
- opus_int Tilt_Q14, /* I Spectral tilt */
- opus_int32 LF_shp_Q14, /* I */
- opus_int32 Gain_Q16, /* I */
- opus_int offset_Q10, /* I */
- opus_int length, /* I Input length */
- opus_int32 table[][4] /* I */
-);
-
-void silk_NSQ_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- SideInfoIndices *psIndices, /* I/O Quantization Indices */
- const opus_int32 x_Q3[], /* I Prefiltered input signal */
- opus_int8 pulses[], /* O Quantized pulse signal */
- const opus_int16 PredCoef_Q12[ 2 * MAX_LPC_ORDER ], /* I Short term prediction coefs */
- const opus_int16 LTPCoef_Q14[ LTP_ORDER * MAX_NB_SUBFR ], /* I Long term prediction coefs */
- const opus_int16 AR2_Q13[ MAX_NB_SUBFR * MAX_SHAPE_LPC_ORDER ], /* I Noise shaping coefs */
- const opus_int HarmShapeGain_Q14[ MAX_NB_SUBFR ], /* I Long term shaping coefs */
- const opus_int Tilt_Q14[ MAX_NB_SUBFR ], /* I Spectral tilt */
- const opus_int32 LF_shp_Q14[ MAX_NB_SUBFR ], /* I Low frequency shaping coefs */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I Quantization step sizes */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lags */
- const opus_int Lambda_Q10, /* I Rate/distortion tradeoff */
- const opus_int LTP_scale_Q14 /* I LTP state scaling */
-)
-{
- opus_int k, lag, start_idx, LSF_interpolation_flag;
- const opus_int16 *A_Q12, *B_Q14, *AR_shp_Q13;
- opus_int16 *pxq;
- VARDECL( opus_int32, sLTP_Q15 );
- VARDECL( opus_int16, sLTP );
- opus_int32 HarmShapeFIRPacked_Q14;
- opus_int offset_Q10;
- VARDECL( opus_int32, x_sc_Q10 );
-
- opus_int32 table[ 64 ][ 4 ];
- opus_int32 tmp1;
- opus_int32 q1_Q10, q2_Q10, rd1_Q20, rd2_Q20;
-
- SAVE_STACK;
-
- NSQ->rand_seed = psIndices->Seed;
-
- /* Set unvoiced lag to the previous one, overwrite later for voiced */
- lag = NSQ->lagPrev;
-
- silk_assert( NSQ->prev_gain_Q16 != 0 );
-
- offset_Q10 = silk_Quantization_Offsets_Q10[ psIndices->signalType >> 1 ][ psIndices->quantOffsetType ];
-
- /* 0 */
- q1_Q10 = offset_Q10;
- q2_Q10 = offset_Q10 + ( 1024 - QUANT_LEVEL_ADJUST_Q10 );
- rd1_Q20 = q1_Q10 * Lambda_Q10;
- rd2_Q20 = q2_Q10 * Lambda_Q10;
-
- table[ 32 ][ 0 ] = q1_Q10;
- table[ 32 ][ 1 ] = q2_Q10;
- table[ 32 ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
- table[ 32 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
-
- /* -1 */
- q1_Q10 = offset_Q10 - ( 1024 - QUANT_LEVEL_ADJUST_Q10 );
- q2_Q10 = offset_Q10;
- rd1_Q20 = - q1_Q10 * Lambda_Q10;
- rd2_Q20 = q2_Q10 * Lambda_Q10;
-
- table[ 31 ][ 0 ] = q1_Q10;
- table[ 31 ][ 1 ] = q2_Q10;
- table[ 31 ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
- table[ 31 ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
-
- /* > 0 */
- for (k = 1; k <= 31; k++)
- {
- tmp1 = offset_Q10 + silk_LSHIFT( k, 10 );
-
- q1_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10;
- q2_Q10 = tmp1 - QUANT_LEVEL_ADJUST_Q10 + 1024;
- rd1_Q20 = q1_Q10 * Lambda_Q10;
- rd2_Q20 = q2_Q10 * Lambda_Q10;
-
- table[ 32 + k ][ 0 ] = q1_Q10;
- table[ 32 + k ][ 1 ] = q2_Q10;
- table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
- table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
- }
-
- /* < -1 */
- for (k = -32; k <= -2; k++)
- {
- tmp1 = offset_Q10 + silk_LSHIFT( k, 10 );
-
- q1_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10;
- q2_Q10 = tmp1 + QUANT_LEVEL_ADJUST_Q10 + 1024;
- rd1_Q20 = - q1_Q10 * Lambda_Q10;
- rd2_Q20 = - q2_Q10 * Lambda_Q10;
-
- table[ 32 + k ][ 0 ] = q1_Q10;
- table[ 32 + k ][ 1 ] = q2_Q10;
- table[ 32 + k ][ 2 ] = 2 * (q1_Q10 - q2_Q10);
- table[ 32 + k ][ 3 ] = (rd1_Q20 - rd2_Q20) + (q1_Q10 * q1_Q10 - q2_Q10 * q2_Q10);
- }
-
- if( psIndices->NLSFInterpCoef_Q2 == 4 ) {
- LSF_interpolation_flag = 0;
- } else {
- LSF_interpolation_flag = 1;
- }
-
- ALLOC( sLTP_Q15,
- psEncC->ltp_mem_length + psEncC->frame_length, opus_int32 );
- ALLOC( sLTP, psEncC->ltp_mem_length + psEncC->frame_length, opus_int16 );
- ALLOC( x_sc_Q10, psEncC->subfr_length, opus_int32 );
- /* Set up pointers to start of sub frame */
- NSQ->sLTP_shp_buf_idx = psEncC->ltp_mem_length;
- NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
- pxq = &NSQ->xq[ psEncC->ltp_mem_length ];
- for( k = 0; k < psEncC->nb_subfr; k++ ) {
- A_Q12 = &PredCoef_Q12[ (( k >> 1 ) | ( 1 - LSF_interpolation_flag )) * MAX_LPC_ORDER ];
- B_Q14 = <PCoef_Q14[ k * LTP_ORDER ];
- AR_shp_Q13 = &AR2_Q13[ k * MAX_SHAPE_LPC_ORDER ];
-
- /* Noise shape parameters */
- silk_assert( HarmShapeGain_Q14[ k ] >= 0 );
- HarmShapeFIRPacked_Q14 = silk_RSHIFT( HarmShapeGain_Q14[ k ], 2 );
- HarmShapeFIRPacked_Q14 |= silk_LSHIFT( (opus_int32)silk_RSHIFT( HarmShapeGain_Q14[ k ], 1 ), 16 );
-
- NSQ->rewhite_flag = 0;
- if( psIndices->signalType == TYPE_VOICED ) {
- /* Voiced */
- lag = pitchL[ k ];
-
- /* Re-whitening */
- if( ( k & ( 3 - silk_LSHIFT( LSF_interpolation_flag, 1 ) ) ) == 0 ) {
- /* Rewhiten with new A coefs */
- start_idx = psEncC->ltp_mem_length - lag - psEncC->predictLPCOrder - LTP_ORDER / 2;
- silk_assert( start_idx > 0 );
-
- silk_LPC_analysis_filter( &sLTP[ start_idx ], &NSQ->xq[ start_idx + k * psEncC->subfr_length ],
- A_Q12, psEncC->ltp_mem_length - start_idx, psEncC->predictLPCOrder, psEncC->arch );
-
- NSQ->rewhite_flag = 1;
- NSQ->sLTP_buf_idx = psEncC->ltp_mem_length;
- }
- }
-
- silk_nsq_scale_states_sse4_1( psEncC, NSQ, x_Q3, x_sc_Q10, sLTP, sLTP_Q15, k, LTP_scale_Q14, Gains_Q16, pitchL, psIndices->signalType );
-
- if ( opus_likely( ( 10 == psEncC->shapingLPCOrder ) && ( 16 == psEncC->predictLPCOrder) ) )
- {
- silk_noise_shape_quantizer_10_16_sse4_1( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14,
- AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ],
- offset_Q10, psEncC->subfr_length, &(table[32]) );
- }
- else
- {
- silk_noise_shape_quantizer( NSQ, psIndices->signalType, x_sc_Q10, pulses, pxq, sLTP_Q15, A_Q12, B_Q14,
- AR_shp_Q13, lag, HarmShapeFIRPacked_Q14, Tilt_Q14[ k ], LF_shp_Q14[ k ], Gains_Q16[ k ], Lambda_Q10,
- offset_Q10, psEncC->subfr_length, psEncC->shapingLPCOrder, psEncC->predictLPCOrder, psEncC->arch );
- }
-
- x_Q3 += psEncC->subfr_length;
- pulses += psEncC->subfr_length;
- pxq += psEncC->subfr_length;
- }
-
- /* Update lagPrev for next frame */
- NSQ->lagPrev = pitchL[ psEncC->nb_subfr - 1 ];
-
- /* Save quantized speech and noise shaping signals */
- silk_memmove( NSQ->xq, &NSQ->xq[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int16 ) );
- silk_memmove( NSQ->sLTP_shp_Q14, &NSQ->sLTP_shp_Q14[ psEncC->frame_length ], psEncC->ltp_mem_length * sizeof( opus_int32 ) );
- RESTORE_STACK;
-}
-
-/***********************************/
-/* silk_noise_shape_quantizer_10_16 */
-/***********************************/
-static OPUS_INLINE void silk_noise_shape_quantizer_10_16_sse4_1(
- silk_nsq_state *NSQ, /* I/O NSQ state */
- opus_int signalType, /* I Signal type */
- const opus_int32 x_sc_Q10[], /* I */
- opus_int8 pulses[], /* O */
- opus_int16 xq[], /* O */
- opus_int32 sLTP_Q15[], /* I/O LTP state */
- const opus_int16 a_Q12[], /* I Short term prediction coefs */
- const opus_int16 b_Q14[], /* I Long term prediction coefs */
- const opus_int16 AR_shp_Q13[], /* I Noise shaping AR coefs */
- opus_int lag, /* I Pitch lag */
- opus_int32 HarmShapeFIRPacked_Q14, /* I */
- opus_int Tilt_Q14, /* I Spectral tilt */
- opus_int32 LF_shp_Q14, /* I */
- opus_int32 Gain_Q16, /* I */
- opus_int offset_Q10, /* I */
- opus_int length, /* I Input length */
- opus_int32 table[][4] /* I */
-)
-{
- opus_int i;
- opus_int32 LTP_pred_Q13, LPC_pred_Q10, n_AR_Q12, n_LTP_Q13;
- opus_int32 n_LF_Q12, r_Q10, q1_Q0, q1_Q10, q2_Q10;
- opus_int32 exc_Q14, LPC_exc_Q14, xq_Q14, Gain_Q10;
- opus_int32 tmp1, tmp2, sLF_AR_shp_Q14;
- opus_int32 *psLPC_Q14, *shp_lag_ptr, *pred_lag_ptr;
-
- __m128i xmm_tempa, xmm_tempb;
-
- __m128i xmm_one;
-
- __m128i psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF;
- __m128i psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF;
- __m128i a_Q12_01234567, a_Q12_89ABCDEF;
-
- __m128i sAR2_Q14_hi_76543210, sAR2_Q14_lo_76543210;
- __m128i AR_shp_Q13_76543210;
-
- shp_lag_ptr = &NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - lag + HARM_SHAPE_FIR_TAPS / 2 ];
- pred_lag_ptr = &sLTP_Q15[ NSQ->sLTP_buf_idx - lag + LTP_ORDER / 2 ];
- Gain_Q10 = silk_RSHIFT( Gain_Q16, 6 );
-
- /* Set up short term AR state */
- psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH - 1 ];
-
- sLF_AR_shp_Q14 = NSQ->sLF_AR_shp_Q14;
- xq_Q14 = psLPC_Q14[ 0 ];
- LTP_pred_Q13 = 0;
-
- /* load a_Q12 */
- xmm_one = _mm_set_epi8( 1, 0, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14 );
-
- /* load a_Q12[0] - a_Q12[7] */
- a_Q12_01234567 = _mm_loadu_si128( (__m128i *)(&a_Q12[ 0 ] ) );
- /* load a_Q12[ 8 ] - a_Q12[ 15 ] */
- a_Q12_89ABCDEF = _mm_loadu_si128( (__m128i *)(&a_Q12[ 8 ] ) );
-
- a_Q12_01234567 = _mm_shuffle_epi8( a_Q12_01234567, xmm_one );
- a_Q12_89ABCDEF = _mm_shuffle_epi8( a_Q12_89ABCDEF, xmm_one );
-
- /* load AR_shp_Q13 */
- AR_shp_Q13_76543210 = _mm_loadu_si128( (__m128i *)(&AR_shp_Q13[0] ) );
-
- /* load psLPC_Q14 */
- xmm_one = _mm_set_epi8(15, 14, 11, 10, 7, 6, 3, 2, 13, 12, 9, 8, 5, 4, 1, 0 );
-
- xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-16]) );
- xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[-12]) );
-
- xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
- xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
-
- psLPC_Q14_hi_89ABCDEF = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
- psLPC_Q14_lo_89ABCDEF = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
-
- xmm_tempa = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -8 ]) );
- xmm_tempb = _mm_loadu_si128( (__m128i *)(&psLPC_Q14[ -4 ]) );
-
- xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
- xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
-
- psLPC_Q14_hi_01234567 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
- psLPC_Q14_lo_01234567 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
-
- /* load sAR2_Q14 */
- xmm_tempa = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 0 ]) ) );
- xmm_tempb = _mm_loadu_si128( (__m128i *)(&(NSQ->sAR2_Q14[ 4 ]) ) );
-
- xmm_tempa = _mm_shuffle_epi8( xmm_tempa, xmm_one );
- xmm_tempb = _mm_shuffle_epi8( xmm_tempb, xmm_one );
-
- sAR2_Q14_hi_76543210 = _mm_unpackhi_epi64( xmm_tempa, xmm_tempb );
- sAR2_Q14_lo_76543210 = _mm_unpacklo_epi64( xmm_tempa, xmm_tempb );
-
- /* prepare 1 in 8 * 16bit */
- xmm_one = _mm_set1_epi16(1);
-
- for( i = 0; i < length; i++ )
- {
- /* Short-term prediction */
- __m128i xmm_hi_07, xmm_hi_8F, xmm_lo_07, xmm_lo_8F;
-
- /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
- LPC_pred_Q10 = 8; /* silk_RSHIFT( predictLPCOrder, 1 ); */
-
- /* shift psLPC_Q14 */
- psLPC_Q14_hi_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_hi_01234567, psLPC_Q14_hi_89ABCDEF, 2 );
- psLPC_Q14_lo_89ABCDEF = _mm_alignr_epi8( psLPC_Q14_lo_01234567, psLPC_Q14_lo_89ABCDEF, 2 );
-
- psLPC_Q14_hi_01234567 = _mm_srli_si128( psLPC_Q14_hi_01234567, 2 );
- psLPC_Q14_lo_01234567 = _mm_srli_si128( psLPC_Q14_lo_01234567, 2 );
-
- psLPC_Q14_hi_01234567 = _mm_insert_epi16( psLPC_Q14_hi_01234567, (xq_Q14 >> 16), 7 );
- psLPC_Q14_lo_01234567 = _mm_insert_epi16( psLPC_Q14_lo_01234567, (xq_Q14), 7 );
-
- /* high part, use pmaddwd, results in 4 32-bit */
- xmm_hi_07 = _mm_madd_epi16( psLPC_Q14_hi_01234567, a_Q12_01234567 );
- xmm_hi_8F = _mm_madd_epi16( psLPC_Q14_hi_89ABCDEF, a_Q12_89ABCDEF );
-
- /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed, _mm_srai_epi16(psLPC_Q14_lo_01234567, 15) */
- xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_01234567 );
- xmm_tempb = _mm_cmpgt_epi16( _mm_setzero_si128(), psLPC_Q14_lo_89ABCDEF );
-
- xmm_tempa = _mm_and_si128( xmm_tempa, a_Q12_01234567 );
- xmm_tempb = _mm_and_si128( xmm_tempb, a_Q12_89ABCDEF );
-
- xmm_lo_07 = _mm_mulhi_epi16( psLPC_Q14_lo_01234567, a_Q12_01234567 );
- xmm_lo_8F = _mm_mulhi_epi16( psLPC_Q14_lo_89ABCDEF, a_Q12_89ABCDEF );
-
- xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa );
- xmm_lo_8F = _mm_add_epi16( xmm_lo_8F, xmm_tempb );
-
- xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one );
- xmm_lo_8F = _mm_madd_epi16( xmm_lo_8F, xmm_one );
-
- /* accumulate */
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_hi_8F );
- xmm_lo_07 = _mm_add_epi32( xmm_lo_07, xmm_lo_8F );
-
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 );
-
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) );
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) );
-
- LPC_pred_Q10 += _mm_cvtsi128_si32( xmm_hi_07 );
-
- /* Long-term prediction */
- if ( opus_likely( signalType == TYPE_VOICED ) ) {
- /* Unrolled loop */
- /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */
- LTP_pred_Q13 = 2;
- {
- __m128i b_Q14_3210, b_Q14_0123, pred_lag_ptr_0123;
-
- b_Q14_3210 = OP_CVTEPI16_EPI32_M64( b_Q14 );
- b_Q14_0123 = _mm_shuffle_epi32( b_Q14_3210, 0x1B );
-
- /* loaded: [0] [-1] [-2] [-3] */
- pred_lag_ptr_0123 = _mm_loadu_si128( (__m128i *)(&pred_lag_ptr[ -3 ] ) );
- /* shuffle to [-3] [-2] [-1] [0] and to new xmm */
- xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, 0x1B );
- /*64-bit multiply, a[2] * b[-2], a[0] * b[0] */
- xmm_tempa = _mm_mul_epi32( xmm_tempa, b_Q14_3210 );
- /* right shift 2 bytes (16 bits), zero extended */
- xmm_tempa = _mm_srli_si128( xmm_tempa, 2 );
-
- /* a[1] * b[-1], a[3] * b[-3] */
- pred_lag_ptr_0123 = _mm_mul_epi32( pred_lag_ptr_0123, b_Q14_0123 );
- pred_lag_ptr_0123 = _mm_srli_si128( pred_lag_ptr_0123, 2 );
-
- pred_lag_ptr_0123 = _mm_add_epi32( pred_lag_ptr_0123, xmm_tempa );
- /* equal shift right 8 bytes*/
- xmm_tempa = _mm_shuffle_epi32( pred_lag_ptr_0123, _MM_SHUFFLE( 0, 0, 3, 2 ) );
- xmm_tempa = _mm_add_epi32( xmm_tempa, pred_lag_ptr_0123 );
-
- LTP_pred_Q13 += _mm_cvtsi128_si32( xmm_tempa );
-
- LTP_pred_Q13 = silk_SMLAWB( LTP_pred_Q13, pred_lag_ptr[ -4 ], b_Q14[ 4 ] );
- pred_lag_ptr++;
- }
- }
-
- /* Noise shape feedback */
- NSQ->sAR2_Q14[ 9 ] = NSQ->sAR2_Q14[ 8 ];
- NSQ->sAR2_Q14[ 8 ] = _mm_cvtsi128_si32( _mm_srli_si128(_mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 ), 12 ) );
-
- sAR2_Q14_hi_76543210 = _mm_slli_si128( sAR2_Q14_hi_76543210, 2 );
- sAR2_Q14_lo_76543210 = _mm_slli_si128( sAR2_Q14_lo_76543210, 2 );
-
- sAR2_Q14_hi_76543210 = _mm_insert_epi16( sAR2_Q14_hi_76543210, (xq_Q14 >> 16), 0 );
- sAR2_Q14_lo_76543210 = _mm_insert_epi16( sAR2_Q14_lo_76543210, (xq_Q14), 0 );
-
- /* high part, use pmaddwd, results in 4 32-bit */
- xmm_hi_07 = _mm_madd_epi16( sAR2_Q14_hi_76543210, AR_shp_Q13_76543210 );
-
- /* low part, use pmulhw, results in 8 16-bit, note we need simulate unsigned * signed,_mm_srai_epi16(sAR2_Q14_lo_76543210, 15) */
- xmm_tempa = _mm_cmpgt_epi16( _mm_setzero_si128(), sAR2_Q14_lo_76543210 );
- xmm_tempa = _mm_and_si128( xmm_tempa, AR_shp_Q13_76543210 );
-
- xmm_lo_07 = _mm_mulhi_epi16( sAR2_Q14_lo_76543210, AR_shp_Q13_76543210 );
- xmm_lo_07 = _mm_add_epi16( xmm_lo_07, xmm_tempa );
-
- xmm_lo_07 = _mm_madd_epi16( xmm_lo_07, xmm_one );
-
- /* accumulate */
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, xmm_lo_07 );
-
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_unpackhi_epi64(xmm_hi_07, xmm_hi_07 ) );
- xmm_hi_07 = _mm_add_epi32( xmm_hi_07, _mm_shufflelo_epi16(xmm_hi_07, 0x0E ) );
-
- n_AR_Q12 = 5 + _mm_cvtsi128_si32( xmm_hi_07 );
-
- n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 8 ], AR_shp_Q13[ 8 ] );
- n_AR_Q12 = silk_SMLAWB( n_AR_Q12, NSQ->sAR2_Q14[ 9 ], AR_shp_Q13[ 9 ] );
-
- n_AR_Q12 = silk_LSHIFT32( n_AR_Q12, 1 ); /* Q11 -> Q12 */
- n_AR_Q12 = silk_SMLAWB( n_AR_Q12, sLF_AR_shp_Q14, Tilt_Q14 );
-
- n_LF_Q12 = silk_SMULWB( NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx - 1 ], LF_shp_Q14 );
- n_LF_Q12 = silk_SMLAWT( n_LF_Q12, sLF_AR_shp_Q14, LF_shp_Q14 );
-
- silk_assert( lag > 0 || signalType != TYPE_VOICED );
-
- /* Combine prediction and noise shaping signals */
- tmp1 = silk_SUB32( silk_LSHIFT32( LPC_pred_Q10, 2 ), n_AR_Q12 ); /* Q12 */
- tmp1 = silk_SUB32( tmp1, n_LF_Q12 ); /* Q12 */
- if( lag > 0 ) {
- /* Symmetric, packed FIR coefficients */
- n_LTP_Q13 = silk_SMULWB( silk_ADD32( shp_lag_ptr[ 0 ], shp_lag_ptr[ -2 ] ), HarmShapeFIRPacked_Q14 );
- n_LTP_Q13 = silk_SMLAWT( n_LTP_Q13, shp_lag_ptr[ -1 ], HarmShapeFIRPacked_Q14 );
- n_LTP_Q13 = silk_LSHIFT( n_LTP_Q13, 1 );
- shp_lag_ptr++;
-
- tmp2 = silk_SUB32( LTP_pred_Q13, n_LTP_Q13 ); /* Q13 */
- tmp1 = silk_ADD_LSHIFT32( tmp2, tmp1, 1 ); /* Q13 */
- tmp1 = silk_RSHIFT_ROUND( tmp1, 3 ); /* Q10 */
- } else {
- tmp1 = silk_RSHIFT_ROUND( tmp1, 2 ); /* Q10 */
- }
-
- r_Q10 = silk_SUB32( x_sc_Q10[ i ], tmp1 ); /* residual error Q10 */
-
- /* Generate dither */
- NSQ->rand_seed = silk_RAND( NSQ->rand_seed );
-
- /* Flip sign depending on dither */
- tmp2 = -r_Q10;
- if ( NSQ->rand_seed < 0 ) r_Q10 = tmp2;
-
- r_Q10 = silk_LIMIT_32( r_Q10, -(31 << 10), 30 << 10 );
-
- /* Find two quantization level candidates and measure their rate-distortion */
- q1_Q10 = silk_SUB32( r_Q10, offset_Q10 );
- q1_Q0 = silk_RSHIFT( q1_Q10, 10 );
-
- q1_Q10 = table[q1_Q0][0];
- q2_Q10 = table[q1_Q0][1];
-
- if (r_Q10 * table[q1_Q0][2] - table[q1_Q0][3] < 0)
- {
- q1_Q10 = q2_Q10;
- }
-
- pulses[ i ] = (opus_int8)silk_RSHIFT_ROUND( q1_Q10, 10 );
-
- /* Excitation */
- exc_Q14 = silk_LSHIFT( q1_Q10, 4 );
-
- tmp2 = -exc_Q14;
- if ( NSQ->rand_seed < 0 ) exc_Q14 = tmp2;
-
- /* Add predictions */
- LPC_exc_Q14 = silk_ADD_LSHIFT32( exc_Q14, LTP_pred_Q13, 1 );
- xq_Q14 = silk_ADD_LSHIFT32( LPC_exc_Q14, LPC_pred_Q10, 4 );
-
- /* Update states */
- psLPC_Q14++;
- *psLPC_Q14 = xq_Q14;
- sLF_AR_shp_Q14 = silk_SUB_LSHIFT32( xq_Q14, n_AR_Q12, 2 );
-
- NSQ->sLTP_shp_Q14[ NSQ->sLTP_shp_buf_idx ] = silk_SUB_LSHIFT32( sLF_AR_shp_Q14, n_LF_Q12, 2 );
- sLTP_Q15[ NSQ->sLTP_buf_idx ] = silk_LSHIFT( LPC_exc_Q14, 1 );
- NSQ->sLTP_shp_buf_idx++;
- NSQ->sLTP_buf_idx++;
-
- /* Make dither dependent on quantized signal */
- NSQ->rand_seed = silk_ADD32_ovflw( NSQ->rand_seed, pulses[ i ] );
- }
-
- NSQ->sLF_AR_shp_Q14 = sLF_AR_shp_Q14;
-
- /* Scale XQ back to normal level before saving */
- psLPC_Q14 = &NSQ->sLPC_Q14[ NSQ_LPC_BUF_LENGTH ];
-
- /* write back sAR2_Q14 */
- xmm_tempa = _mm_unpackhi_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 );
- xmm_tempb = _mm_unpacklo_epi16( sAR2_Q14_lo_76543210, sAR2_Q14_hi_76543210 );
- _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 4 ]), xmm_tempa );
- _mm_storeu_si128( (__m128i *)(&NSQ->sAR2_Q14[ 0 ]), xmm_tempb );
-
- /* xq[ i ] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) ); */
- {
- __m128i xmm_Gain_Q10;
- __m128i xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, xmm_xq_Q14_7654, xmm_xq_Q14_x7x5;
-
- /* prepare (1 << 7) in packed 4 32-bits */
- xmm_tempa = _mm_set1_epi32( (1 << 7) );
-
- /* prepare Gain_Q10 in packed 4 32-bits */
- xmm_Gain_Q10 = _mm_set1_epi32( Gain_Q10 );
-
- /* process xq */
- for (i = 0; i < length - 7; i += 8)
- {
- xmm_xq_Q14_3210 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 0 ] ) ) );
- xmm_xq_Q14_7654 = _mm_loadu_si128( (__m128i *)(&(psLPC_Q14[ i + 4 ] ) ) );
-
- /* equal shift right 4 bytes*/
- xmm_xq_Q14_x3x1 = _mm_shuffle_epi32( xmm_xq_Q14_3210, _MM_SHUFFLE( 0, 3, 2, 1 ) );
- /* equal shift right 4 bytes*/
- xmm_xq_Q14_x7x5 = _mm_shuffle_epi32( xmm_xq_Q14_7654, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_xq_Q14_3210 = _mm_mul_epi32( xmm_xq_Q14_3210, xmm_Gain_Q10 );
- xmm_xq_Q14_x3x1 = _mm_mul_epi32( xmm_xq_Q14_x3x1, xmm_Gain_Q10 );
- xmm_xq_Q14_7654 = _mm_mul_epi32( xmm_xq_Q14_7654, xmm_Gain_Q10 );
- xmm_xq_Q14_x7x5 = _mm_mul_epi32( xmm_xq_Q14_x7x5, xmm_Gain_Q10 );
-
- xmm_xq_Q14_3210 = _mm_srli_epi64( xmm_xq_Q14_3210, 16 );
- xmm_xq_Q14_x3x1 = _mm_slli_epi64( xmm_xq_Q14_x3x1, 16 );
- xmm_xq_Q14_7654 = _mm_srli_epi64( xmm_xq_Q14_7654, 16 );
- xmm_xq_Q14_x7x5 = _mm_slli_epi64( xmm_xq_Q14_x7x5, 16 );
-
- xmm_xq_Q14_3210 = _mm_blend_epi16( xmm_xq_Q14_3210, xmm_xq_Q14_x3x1, 0xCC );
- xmm_xq_Q14_7654 = _mm_blend_epi16( xmm_xq_Q14_7654, xmm_xq_Q14_x7x5, 0xCC );
-
- /* silk_RSHIFT_ROUND(xq, 8) */
- xmm_xq_Q14_3210 = _mm_add_epi32( xmm_xq_Q14_3210, xmm_tempa );
- xmm_xq_Q14_7654 = _mm_add_epi32( xmm_xq_Q14_7654, xmm_tempa );
-
- xmm_xq_Q14_3210 = _mm_srai_epi32( xmm_xq_Q14_3210, 8 );
- xmm_xq_Q14_7654 = _mm_srai_epi32( xmm_xq_Q14_7654, 8 );
-
- /* silk_SAT16 */
- xmm_xq_Q14_3210 = _mm_packs_epi32( xmm_xq_Q14_3210, xmm_xq_Q14_7654 );
-
- /* save to xq */
- _mm_storeu_si128( (__m128i *)(&xq[ i ] ), xmm_xq_Q14_3210 );
- }
- }
- for ( ; i < length; i++)
- {
- xq[i] = (opus_int16)silk_SAT16( silk_RSHIFT_ROUND( silk_SMULWW( psLPC_Q14[ i ], Gain_Q10 ), 8 ) );
- }
-
- /* Update LPC synth buffer */
- silk_memcpy( NSQ->sLPC_Q14, &NSQ->sLPC_Q14[ length ], NSQ_LPC_BUF_LENGTH * sizeof( opus_int32 ) );
-}
-
-static OPUS_INLINE void silk_nsq_scale_states_sse4_1(
- const silk_encoder_state *psEncC, /* I Encoder State */
- silk_nsq_state *NSQ, /* I/O NSQ state */
- const opus_int32 x_Q3[], /* I input in Q3 */
- opus_int32 x_sc_Q10[], /* O input scaled with 1/Gain */
- const opus_int16 sLTP[], /* I re-whitened LTP state in Q0 */
- opus_int32 sLTP_Q15[], /* O LTP state matching scaled input */
- opus_int subfr, /* I subframe number */
- const opus_int LTP_scale_Q14, /* I */
- const opus_int32 Gains_Q16[ MAX_NB_SUBFR ], /* I */
- const opus_int pitchL[ MAX_NB_SUBFR ], /* I Pitch lag */
- const opus_int signal_type /* I Signal type */
-)
-{
- opus_int i, lag;
- opus_int32 gain_adj_Q16, inv_gain_Q31, inv_gain_Q23;
- __m128i xmm_inv_gain_Q23, xmm_x_Q3_x2x0, xmm_x_Q3_x3x1;
-
- lag = pitchL[ subfr ];
- inv_gain_Q31 = silk_INVERSE32_varQ( silk_max( Gains_Q16[ subfr ], 1 ), 47 );
- silk_assert( inv_gain_Q31 != 0 );
-
- /* Calculate gain adjustment factor */
- if( Gains_Q16[ subfr ] != NSQ->prev_gain_Q16 ) {
- gain_adj_Q16 = silk_DIV32_varQ( NSQ->prev_gain_Q16, Gains_Q16[ subfr ], 16 );
- } else {
- gain_adj_Q16 = (opus_int32)1 << 16;
- }
-
- /* Scale input */
- inv_gain_Q23 = silk_RSHIFT_ROUND( inv_gain_Q31, 8 );
-
- /* prepare inv_gain_Q23 in packed 4 32-bits */
- xmm_inv_gain_Q23 = _mm_set1_epi32(inv_gain_Q23);
-
- for( i = 0; i < psEncC->subfr_length - 3; i += 4 ) {
- xmm_x_Q3_x2x0 = _mm_loadu_si128( (__m128i *)(&(x_Q3[ i ] ) ) );
-
- /* equal shift right 4 bytes*/
- xmm_x_Q3_x3x1 = _mm_shuffle_epi32( xmm_x_Q3_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_x_Q3_x2x0 = _mm_mul_epi32( xmm_x_Q3_x2x0, xmm_inv_gain_Q23 );
- xmm_x_Q3_x3x1 = _mm_mul_epi32( xmm_x_Q3_x3x1, xmm_inv_gain_Q23 );
-
- xmm_x_Q3_x2x0 = _mm_srli_epi64( xmm_x_Q3_x2x0, 16 );
- xmm_x_Q3_x3x1 = _mm_slli_epi64( xmm_x_Q3_x3x1, 16 );
-
- xmm_x_Q3_x2x0 = _mm_blend_epi16( xmm_x_Q3_x2x0, xmm_x_Q3_x3x1, 0xCC );
-
- _mm_storeu_si128( (__m128i *)(&(x_sc_Q10[ i ] ) ), xmm_x_Q3_x2x0 );
- }
-
- for( ; i < psEncC->subfr_length; i++ ) {
- x_sc_Q10[ i ] = silk_SMULWW( x_Q3[ i ], inv_gain_Q23 );
- }
-
- /* Save inverse gain */
- NSQ->prev_gain_Q16 = Gains_Q16[ subfr ];
-
- /* After rewhitening the LTP state is un-scaled, so scale with inv_gain_Q16 */
- if( NSQ->rewhite_flag ) {
- if( subfr == 0 ) {
- /* Do LTP downscaling */
- inv_gain_Q31 = silk_LSHIFT( silk_SMULWB( inv_gain_Q31, LTP_scale_Q14 ), 2 );
- }
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- silk_assert( i < MAX_FRAME_LENGTH );
- sLTP_Q15[ i ] = silk_SMULWB( inv_gain_Q31, sLTP[ i ] );
- }
- }
-
- /* Adjust for changing gain */
- if( gain_adj_Q16 != (opus_int32)1 << 16 ) {
- /* Scale long-term shaping state */
- __m128i xmm_gain_adj_Q16, xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1;
-
- /* prepare gain_adj_Q16 in packed 4 32-bits */
- xmm_gain_adj_Q16 = _mm_set1_epi32(gain_adj_Q16);
-
- for( i = NSQ->sLTP_shp_buf_idx - psEncC->ltp_mem_length; i < NSQ->sLTP_shp_buf_idx - 3; i += 4 )
- {
- xmm_sLTP_shp_Q14_x2x0 = _mm_loadu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ) );
- /* equal shift right 4 bytes*/
- xmm_sLTP_shp_Q14_x3x1 = _mm_shuffle_epi32( xmm_sLTP_shp_Q14_x2x0, _MM_SHUFFLE( 0, 3, 2, 1 ) );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x2x0, xmm_gain_adj_Q16 );
- xmm_sLTP_shp_Q14_x3x1 = _mm_mul_epi32( xmm_sLTP_shp_Q14_x3x1, xmm_gain_adj_Q16 );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_srli_epi64( xmm_sLTP_shp_Q14_x2x0, 16 );
- xmm_sLTP_shp_Q14_x3x1 = _mm_slli_epi64( xmm_sLTP_shp_Q14_x3x1, 16 );
-
- xmm_sLTP_shp_Q14_x2x0 = _mm_blend_epi16( xmm_sLTP_shp_Q14_x2x0, xmm_sLTP_shp_Q14_x3x1, 0xCC );
-
- _mm_storeu_si128( (__m128i *)(&(NSQ->sLTP_shp_Q14[ i ] ) ), xmm_sLTP_shp_Q14_x2x0 );
- }
-
- for( ; i < NSQ->sLTP_shp_buf_idx; i++ ) {
- NSQ->sLTP_shp_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLTP_shp_Q14[ i ] );
- }
-
- /* Scale long-term prediction state */
- if( signal_type == TYPE_VOICED && NSQ->rewhite_flag == 0 ) {
- for( i = NSQ->sLTP_buf_idx - lag - LTP_ORDER / 2; i < NSQ->sLTP_buf_idx; i++ ) {
- sLTP_Q15[ i ] = silk_SMULWW( gain_adj_Q16, sLTP_Q15[ i ] );
- }
- }
-
- NSQ->sLF_AR_shp_Q14 = silk_SMULWW( gain_adj_Q16, NSQ->sLF_AR_shp_Q14 );
-
- /* Scale short-term prediction and shaping states */
- for( i = 0; i < NSQ_LPC_BUF_LENGTH; i++ ) {
- NSQ->sLPC_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sLPC_Q14[ i ] );
- }
- for( i = 0; i < MAX_SHAPE_LPC_ORDER; i++ ) {
- NSQ->sAR2_Q14[ i ] = silk_SMULWW( gain_adj_Q16, NSQ->sAR2_Q14[ i ] );
- }
- }
-}
diff --git a/media/libopus/silk/x86/VAD_sse.c b/media/libopus/silk/x86/VAD_sse.c
deleted file mode 100644
index 4e90f4410d81f..0000000000000
--- a/media/libopus/silk/x86/VAD_sse.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-
-#include "main.h"
-#include "stack_alloc.h"
-
-/* Weighting factors for tilt measure */
-static const opus_int32 tiltWeights[ VAD_N_BANDS ] = { 30000, 6000, -12000, -12000 };
-
-/***************************************/
-/* Get the speech activity level in Q8 */
-/***************************************/
-opus_int silk_VAD_GetSA_Q8_sse4_1( /* O Return value, 0 if success */
- silk_encoder_state *psEncC, /* I/O Encoder state */
- const opus_int16 pIn[] /* I PCM input */
-)
-{
- opus_int SA_Q15, pSNR_dB_Q7, input_tilt;
- opus_int decimated_framelength1, decimated_framelength2;
- opus_int decimated_framelength;
- opus_int dec_subframe_length, dec_subframe_offset, SNR_Q7, i, b, s;
- opus_int32 sumSquared, smooth_coef_Q16;
- opus_int16 HPstateTmp;
- VARDECL( opus_int16, X );
- opus_int32 Xnrg[ VAD_N_BANDS ];
- opus_int32 NrgToNoiseRatio_Q8[ VAD_N_BANDS ];
- opus_int32 speech_nrg, x_tmp;
- opus_int X_offset[ VAD_N_BANDS ];
- opus_int ret = 0;
- silk_VAD_state *psSilk_VAD = &psEncC->sVAD;
-
- SAVE_STACK;
-
- /* Safety checks */
- silk_assert( VAD_N_BANDS == 4 );
- silk_assert( MAX_FRAME_LENGTH >= psEncC->frame_length );
- silk_assert( psEncC->frame_length <= 512 );
- silk_assert( psEncC->frame_length == 8 * silk_RSHIFT( psEncC->frame_length, 3 ) );
-
- /***********************/
- /* Filter and Decimate */
- /***********************/
- decimated_framelength1 = silk_RSHIFT( psEncC->frame_length, 1 );
- decimated_framelength2 = silk_RSHIFT( psEncC->frame_length, 2 );
- decimated_framelength = silk_RSHIFT( psEncC->frame_length, 3 );
- /* Decimate into 4 bands:
- 0 L 3L L 3L 5L
- - -- - -- --
- 8 8 2 4 4
-
- [0-1 kHz| temp. |1-2 kHz| 2-4 kHz | 4-8 kHz |
-
- They're arranged to allow the minimal ( frame_length / 4 ) extra
- scratch space during the downsampling process */
- X_offset[ 0 ] = 0;
- X_offset[ 1 ] = decimated_framelength + decimated_framelength2;
- X_offset[ 2 ] = X_offset[ 1 ] + decimated_framelength;
- X_offset[ 3 ] = X_offset[ 2 ] + decimated_framelength2;
- ALLOC( X, X_offset[ 3 ] + decimated_framelength1, opus_int16 );
-
- /* 0-8 kHz to 0-4 kHz and 4-8 kHz */
- silk_ana_filt_bank_1( pIn, &psSilk_VAD->AnaState[ 0 ],
- X, &X[ X_offset[ 3 ] ], psEncC->frame_length );
-
- /* 0-4 kHz to 0-2 kHz and 2-4 kHz */
- silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState1[ 0 ],
- X, &X[ X_offset[ 2 ] ], decimated_framelength1 );
-
- /* 0-2 kHz to 0-1 kHz and 1-2 kHz */
- silk_ana_filt_bank_1( X, &psSilk_VAD->AnaState2[ 0 ],
- X, &X[ X_offset[ 1 ] ], decimated_framelength2 );
-
- /*********************************************/
- /* HP filter on lowest band (differentiator) */
- /*********************************************/
- X[ decimated_framelength - 1 ] = silk_RSHIFT( X[ decimated_framelength - 1 ], 1 );
- HPstateTmp = X[ decimated_framelength - 1 ];
- for( i = decimated_framelength - 1; i > 0; i-- ) {
- X[ i - 1 ] = silk_RSHIFT( X[ i - 1 ], 1 );
- X[ i ] -= X[ i - 1 ];
- }
- X[ 0 ] -= psSilk_VAD->HPstate;
- psSilk_VAD->HPstate = HPstateTmp;
-
- /*************************************/
- /* Calculate the energy in each band */
- /*************************************/
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* Find the decimated framelength in the non-uniformly divided bands */
- decimated_framelength = silk_RSHIFT( psEncC->frame_length, silk_min_int( VAD_N_BANDS - b, VAD_N_BANDS - 1 ) );
-
- /* Split length into subframe lengths */
- dec_subframe_length = silk_RSHIFT( decimated_framelength, VAD_INTERNAL_SUBFRAMES_LOG2 );
- dec_subframe_offset = 0;
-
- /* Compute energy per sub-frame */
- /* initialize with summed energy of last subframe */
- Xnrg[ b ] = psSilk_VAD->XnrgSubfr[ b ];
- for( s = 0; s < VAD_INTERNAL_SUBFRAMES; s++ ) {
- __m128i xmm_X, xmm_acc;
- sumSquared = 0;
-
- xmm_acc = _mm_setzero_si128();
-
- for( i = 0; i < dec_subframe_length - 7; i += 8 )
- {
- xmm_X = _mm_loadu_si128( (__m128i *)&(X[ X_offset[ b ] + i + dec_subframe_offset ] ) );
- xmm_X = _mm_srai_epi16( xmm_X, 3 );
- xmm_X = _mm_madd_epi16( xmm_X, xmm_X );
- xmm_acc = _mm_add_epi32( xmm_acc, xmm_X );
- }
-
- xmm_acc = _mm_add_epi32( xmm_acc, _mm_unpackhi_epi64( xmm_acc, xmm_acc ) );
- xmm_acc = _mm_add_epi32( xmm_acc, _mm_shufflelo_epi16( xmm_acc, 0x0E ) );
-
- sumSquared += _mm_cvtsi128_si32( xmm_acc );
-
- for( ; i < dec_subframe_length; i++ ) {
- /* The energy will be less than dec_subframe_length * ( silk_int16_MIN / 8 ) ^ 2. */
- /* Therefore we can accumulate with no risk of overflow (unless dec_subframe_length > 128) */
- x_tmp = silk_RSHIFT(
- X[ X_offset[ b ] + i + dec_subframe_offset ], 3 );
- sumSquared = silk_SMLABB( sumSquared, x_tmp, x_tmp );
-
- /* Safety check */
- silk_assert( sumSquared >= 0 );
- }
-
- /* Add/saturate summed energy of current subframe */
- if( s < VAD_INTERNAL_SUBFRAMES - 1 ) {
- Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], sumSquared );
- } else {
- /* Look-ahead subframe */
- Xnrg[ b ] = silk_ADD_POS_SAT32( Xnrg[ b ], silk_RSHIFT( sumSquared, 1 ) );
- }
-
- dec_subframe_offset += dec_subframe_length;
- }
- psSilk_VAD->XnrgSubfr[ b ] = sumSquared;
- }
-
- /********************/
- /* Noise estimation */
- /********************/
- silk_VAD_GetNoiseLevels( &Xnrg[ 0 ], psSilk_VAD );
-
- /***********************************************/
- /* Signal-plus-noise to noise ratio estimation */
- /***********************************************/
- sumSquared = 0;
- input_tilt = 0;
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- speech_nrg = Xnrg[ b ] - psSilk_VAD->NL[ b ];
- if( speech_nrg > 0 ) {
- /* Divide, with sufficient resolution */
- if( ( Xnrg[ b ] & 0xFF800000 ) == 0 ) {
- NrgToNoiseRatio_Q8[ b ] = silk_DIV32( silk_LSHIFT( Xnrg[ b ], 8 ), psSilk_VAD->NL[ b ] + 1 );
- } else {
- NrgToNoiseRatio_Q8[ b ] = silk_DIV32( Xnrg[ b ], silk_RSHIFT( psSilk_VAD->NL[ b ], 8 ) + 1 );
- }
-
- /* Convert to log domain */
- SNR_Q7 = silk_lin2log( NrgToNoiseRatio_Q8[ b ] ) - 8 * 128;
-
- /* Sum-of-squares */
- sumSquared = silk_SMLABB( sumSquared, SNR_Q7, SNR_Q7 ); /* Q14 */
-
- /* Tilt measure */
- if( speech_nrg < ( (opus_int32)1 << 20 ) ) {
- /* Scale down SNR value for small subband speech energies */
- SNR_Q7 = silk_SMULWB( silk_LSHIFT( silk_SQRT_APPROX( speech_nrg ), 6 ), SNR_Q7 );
- }
- input_tilt = silk_SMLAWB( input_tilt, tiltWeights[ b ], SNR_Q7 );
- } else {
- NrgToNoiseRatio_Q8[ b ] = 256;
- }
- }
-
- /* Mean-of-squares */
- sumSquared = silk_DIV32_16( sumSquared, VAD_N_BANDS ); /* Q14 */
-
- /* Root-mean-square approximation, scale to dBs, and write to output pointer */
- pSNR_dB_Q7 = (opus_int16)( 3 * silk_SQRT_APPROX( sumSquared ) ); /* Q7 */
-
- /*********************************/
- /* Speech Probability Estimation */
- /*********************************/
- SA_Q15 = silk_sigm_Q15( silk_SMULWB( VAD_SNR_FACTOR_Q16, pSNR_dB_Q7 ) - VAD_NEGATIVE_OFFSET_Q5 );
-
- /**************************/
- /* Frequency Tilt Measure */
- /**************************/
- psEncC->input_tilt_Q15 = silk_LSHIFT( silk_sigm_Q15( input_tilt ) - 16384, 1 );
-
- /**************************************************/
- /* Scale the sigmoid output based on power levels */
- /**************************************************/
- speech_nrg = 0;
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* Accumulate signal-without-noise energies, higher frequency bands have more weight */
- speech_nrg += ( b + 1 ) * silk_RSHIFT( Xnrg[ b ] - psSilk_VAD->NL[ b ], 4 );
- }
-
- /* Power scaling */
- if( speech_nrg <= 0 ) {
- SA_Q15 = silk_RSHIFT( SA_Q15, 1 );
- } else if( speech_nrg < 32768 ) {
- if( psEncC->frame_length == 10 * psEncC->fs_kHz ) {
- speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 16 );
- } else {
- speech_nrg = silk_LSHIFT_SAT32( speech_nrg, 15 );
- }
-
- /* square-root */
- speech_nrg = silk_SQRT_APPROX( speech_nrg );
- SA_Q15 = silk_SMULWB( 32768 + speech_nrg, SA_Q15 );
- }
-
- /* Copy the resulting speech activity in Q8 */
- psEncC->speech_activity_Q8 = silk_min_int( silk_RSHIFT( SA_Q15, 7 ), silk_uint8_MAX );
-
- /***********************************/
- /* Energy Level and SNR estimation */
- /***********************************/
- /* Smoothing coefficient */
- smooth_coef_Q16 = silk_SMULWB( VAD_SNR_SMOOTH_COEF_Q18, silk_SMULWB( (opus_int32)SA_Q15, SA_Q15 ) );
-
- if( psEncC->frame_length == 10 * psEncC->fs_kHz ) {
- smooth_coef_Q16 >>= 1;
- }
-
- for( b = 0; b < VAD_N_BANDS; b++ ) {
- /* compute smoothed energy-to-noise ratio per band */
- psSilk_VAD->NrgRatioSmth_Q8[ b ] = silk_SMLAWB( psSilk_VAD->NrgRatioSmth_Q8[ b ],
- NrgToNoiseRatio_Q8[ b ] - psSilk_VAD->NrgRatioSmth_Q8[ b ], smooth_coef_Q16 );
-
- /* signal to noise ratio in dB per band */
- SNR_Q7 = 3 * ( silk_lin2log( psSilk_VAD->NrgRatioSmth_Q8[b] ) - 8 * 128 );
- /* quality = sigmoid( 0.25 * ( SNR_dB - 16 ) ); */
- psEncC->input_quality_bands_Q15[ b ] = silk_sigm_Q15( silk_RSHIFT( SNR_Q7 - 16 * 128, 4 ) );
- }
-
- RESTORE_STACK;
- return( ret );
-}
diff --git a/media/libopus/silk/x86/VQ_WMat_EC_sse.c b/media/libopus/silk/x86/VQ_WMat_EC_sse.c
deleted file mode 100644
index 74d6c6d0ec6e4..0000000000000
--- a/media/libopus/silk/x86/VQ_WMat_EC_sse.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/* Copyright (c) 2014, Cisco Systems, INC
- Written by XiangMingZhu WeiZhou MinPeng YanWang
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <xmmintrin.h>
-#include <emmintrin.h>
-#include <smmintrin.h>
-#include "main.h"
-#include "celt/x86/x86cpu.h"
-
-/* Entropy constrained matrix-weighted VQ, hard-coded to 5-element vectors, for a single input data vector */
-void silk_VQ_WMat_EC_sse4_1(
- opus_int8 *ind, /* O index of best codebook vector */
- opus_int32 *rate_dist_Q14, /* O best weighted quant error + mu * rate */
- opus_int *gain_Q7, /* O sum of absolute LTP coefficients */
- const opus_int16 *in_Q14, /* I input vector to be quantized */
- const opus_int32 *W_Q18, /* I weighting matrix */
- const opus_int8 *cb_Q7, /* I codebook */
- const opus_uint8 *cb_gain_Q7, /* I codebook effective gain */
- const opus_uint8 *cl_Q5, /* I code length for each codebook vector */
- const opus_int mu_Q9, /* I tradeoff betw. weighted error and rate */
- const opus_int32 max_gain_Q7, /* I maximum sum of absolute LTP coefficients */
- opus_int L /* I number of vectors in codebook */
-)
-{
- opus_int k, gain_tmp_Q7;
- const opus_int8 *cb_row_Q7;
- opus_int16 diff_Q14[ 5 ];
- opus_int32 sum1_Q14, sum2_Q16;
-
- __m128i C_tmp1, C_tmp2, C_tmp3, C_tmp4, C_tmp5;
- /* Loop over codebook */
- *rate_dist_Q14 = silk_int32_MAX;
- cb_row_Q7 = cb_Q7;
- for( k = 0; k < L; k++ ) {
- gain_tmp_Q7 = cb_gain_Q7[k];
-
- diff_Q14[ 0 ] = in_Q14[ 0 ] - silk_LSHIFT( cb_row_Q7[ 0 ], 7 );
-
- C_tmp1 = OP_CVTEPI16_EPI32_M64( &in_Q14[ 1 ] );
- C_tmp2 = OP_CVTEPI8_EPI32_M32( &cb_row_Q7[ 1 ] );
- C_tmp2 = _mm_slli_epi32( C_tmp2, 7 );
- C_tmp1 = _mm_sub_epi32( C_tmp1, C_tmp2 );
-
- diff_Q14[ 1 ] = _mm_extract_epi16( C_tmp1, 0 );
- diff_Q14[ 2 ] = _mm_extract_epi16( C_tmp1, 2 );
- diff_Q14[ 3 ] = _mm_extract_epi16( C_tmp1, 4 );
- diff_Q14[ 4 ] = _mm_extract_epi16( C_tmp1, 6 );
-
- /* Weighted rate */
- sum1_Q14 = silk_SMULBB( mu_Q9, cl_Q5[ k ] );
-
- /* Penalty for too large gain */
- sum1_Q14 = silk_ADD_LSHIFT32( sum1_Q14, silk_max( silk_SUB32( gain_tmp_Q7, max_gain_Q7 ), 0 ), 10 );
-
- silk_assert( sum1_Q14 >= 0 );
-
- /* first row of W_Q18 */
- C_tmp3 = _mm_loadu_si128( (__m128i *)(&W_Q18[ 1 ] ) );
- C_tmp4 = _mm_mul_epi32( C_tmp3, C_tmp1 );
- C_tmp4 = _mm_srli_si128( C_tmp4, 2 );
-
- C_tmp1 = _mm_shuffle_epi32( C_tmp1, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */
- C_tmp3 = _mm_shuffle_epi32( C_tmp3, _MM_SHUFFLE( 0, 3, 2, 1 ) ); /* shift right 4 bytes */
-
- C_tmp5 = _mm_mul_epi32( C_tmp3, C_tmp1 );
- C_tmp5 = _mm_srli_si128( C_tmp5, 2 );
-
- C_tmp5 = _mm_add_epi32( C_tmp4, C_tmp5 );
- C_tmp5 = _mm_slli_epi32( C_tmp5, 1 );
-
- C_tmp5 = _mm_add_epi32( C_tmp5, _mm_shuffle_epi32( C_tmp5, _MM_SHUFFLE( 0, 0, 0, 2 ) ) );
- sum2_Q16 = _mm_cvtsi128_si32( C_tmp5 );
-
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 0 ], diff_Q14[ 0 ] );
- sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 0 ] );
-
- /* second row of W_Q18 */
- sum2_Q16 = silk_SMULWB( W_Q18[ 7 ], diff_Q14[ 2 ] );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 8 ], diff_Q14[ 3 ] );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 9 ], diff_Q14[ 4 ] );
- sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 6 ], diff_Q14[ 1 ] );
- sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 1 ] );
-
- /* third row of W_Q18 */
- sum2_Q16 = silk_SMULWB( W_Q18[ 13 ], diff_Q14[ 3 ] );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 14 ], diff_Q14[ 4 ] );
- sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 12 ], diff_Q14[ 2 ] );
- sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 2 ] );
-
- /* fourth row of W_Q18 */
- sum2_Q16 = silk_SMULWB( W_Q18[ 19 ], diff_Q14[ 4 ] );
- sum2_Q16 = silk_LSHIFT( sum2_Q16, 1 );
- sum2_Q16 = silk_SMLAWB( sum2_Q16, W_Q18[ 18 ], diff_Q14[ 3 ] );
- sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 3 ] );
-
- /* last row of W_Q18 */
- sum2_Q16 = silk_SMULWB( W_Q18[ 24 ], diff_Q14[ 4 ] );
- sum1_Q14 = silk_SMLAWB( sum1_Q14, sum2_Q16, diff_Q14[ 4 ] );
-
- silk_assert( sum1_Q14 >= 0 );
-
- /* find best */
- if( sum1_Q14 < *rate_dist_Q14 ) {
- *rate_dist_Q14 = sum1_Q14;
- *ind = (opus_int8)k;
- *gain_Q7 = gain_tmp_Q7;
- }
-
- /* Go to next cbk vector */
- cb_row_Q7 += LTP_ORDER;
- }
-}
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the tbb-commits
mailing list