cannam@154
|
1 /* Copyright (c) 2014, Cisco Systems, INC
|
cannam@154
|
2 Written by XiangMingZhu WeiZhou MinPeng YanWang
|
cannam@154
|
3
|
cannam@154
|
4 Redistribution and use in source and binary forms, with or without
|
cannam@154
|
5 modification, are permitted provided that the following conditions
|
cannam@154
|
6 are met:
|
cannam@154
|
7
|
cannam@154
|
8 - Redistributions of source code must retain the above copyright
|
cannam@154
|
9 notice, this list of conditions and the following disclaimer.
|
cannam@154
|
10
|
cannam@154
|
11 - Redistributions in binary form must reproduce the above copyright
|
cannam@154
|
12 notice, this list of conditions and the following disclaimer in the
|
cannam@154
|
13 documentation and/or other materials provided with the distribution.
|
cannam@154
|
14
|
cannam@154
|
15 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
cannam@154
|
16 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
cannam@154
|
17 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
cannam@154
|
18 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
cannam@154
|
19 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
cannam@154
|
20 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
cannam@154
|
21 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
cannam@154
|
22 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
cannam@154
|
23 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
cannam@154
|
24 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
cannam@154
|
25 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
cannam@154
|
26 */
|
cannam@154
|
27
|
cannam@154
|
28 #if defined(HAVE_CONFIG_H)
|
cannam@154
|
29 #include "config.h"
|
cannam@154
|
30 #endif
|
cannam@154
|
31
|
cannam@154
|
32 #include "x86/x86cpu.h"
|
cannam@154
|
33 #include "celt_lpc.h"
|
cannam@154
|
34 #include "pitch.h"
|
cannam@154
|
35 #include "pitch_sse.h"
|
cannam@154
|
36 #include "vq.h"
|
cannam@154
|
37
|
cannam@154
|
38 #if defined(OPUS_HAVE_RTCD)
|
cannam@154
|
39
|
cannam@154
|
40 # if defined(FIXED_POINT)
|
cannam@154
|
41
|
cannam@154
|
42 #if defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)
|
cannam@154
|
43
|
cannam@154
|
44 void (*const CELT_FIR_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
45 const opus_val16 *x,
|
cannam@154
|
46 const opus_val16 *num,
|
cannam@154
|
47 opus_val16 *y,
|
cannam@154
|
48 int N,
|
cannam@154
|
49 int ord,
|
cannam@154
|
50 int arch
|
cannam@154
|
51 ) = {
|
cannam@154
|
52 celt_fir_c, /* non-sse */
|
cannam@154
|
53 celt_fir_c,
|
cannam@154
|
54 celt_fir_c,
|
cannam@154
|
55 MAY_HAVE_SSE4_1(celt_fir), /* sse4.1 */
|
cannam@154
|
56 MAY_HAVE_SSE4_1(celt_fir) /* avx */
|
cannam@154
|
57 };
|
cannam@154
|
58
|
cannam@154
|
59 void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
60 const opus_val16 *x,
|
cannam@154
|
61 const opus_val16 *y,
|
cannam@154
|
62 opus_val32 sum[4],
|
cannam@154
|
63 int len
|
cannam@154
|
64 ) = {
|
cannam@154
|
65 xcorr_kernel_c, /* non-sse */
|
cannam@154
|
66 xcorr_kernel_c,
|
cannam@154
|
67 xcorr_kernel_c,
|
cannam@154
|
68 MAY_HAVE_SSE4_1(xcorr_kernel), /* sse4.1 */
|
cannam@154
|
69 MAY_HAVE_SSE4_1(xcorr_kernel) /* avx */
|
cannam@154
|
70 };
|
cannam@154
|
71
|
cannam@154
|
72 #endif
|
cannam@154
|
73
|
cannam@154
|
74 #if (defined(OPUS_X86_MAY_HAVE_SSE4_1) && !defined(OPUS_X86_PRESUME_SSE4_1)) || \
|
cannam@154
|
75 (!defined(OPUS_X86_MAY_HAVE_SSE_4_1) && defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2))
|
cannam@154
|
76
|
cannam@154
|
77 opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
78 const opus_val16 *x,
|
cannam@154
|
79 const opus_val16 *y,
|
cannam@154
|
80 int N
|
cannam@154
|
81 ) = {
|
cannam@154
|
82 celt_inner_prod_c, /* non-sse */
|
cannam@154
|
83 celt_inner_prod_c,
|
cannam@154
|
84 MAY_HAVE_SSE2(celt_inner_prod),
|
cannam@154
|
85 MAY_HAVE_SSE4_1(celt_inner_prod), /* sse4.1 */
|
cannam@154
|
86 MAY_HAVE_SSE4_1(celt_inner_prod) /* avx */
|
cannam@154
|
87 };
|
cannam@154
|
88
|
cannam@154
|
89 #endif
|
cannam@154
|
90
|
cannam@154
|
91 # else
|
cannam@154
|
92
|
cannam@154
|
93 #if defined(OPUS_X86_MAY_HAVE_SSE) && !defined(OPUS_X86_PRESUME_SSE)
|
cannam@154
|
94
|
cannam@154
|
95 void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
96 const opus_val16 *x,
|
cannam@154
|
97 const opus_val16 *y,
|
cannam@154
|
98 opus_val32 sum[4],
|
cannam@154
|
99 int len
|
cannam@154
|
100 ) = {
|
cannam@154
|
101 xcorr_kernel_c, /* non-sse */
|
cannam@154
|
102 MAY_HAVE_SSE(xcorr_kernel),
|
cannam@154
|
103 MAY_HAVE_SSE(xcorr_kernel),
|
cannam@154
|
104 MAY_HAVE_SSE(xcorr_kernel),
|
cannam@154
|
105 MAY_HAVE_SSE(xcorr_kernel)
|
cannam@154
|
106 };
|
cannam@154
|
107
|
cannam@154
|
108 opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
109 const opus_val16 *x,
|
cannam@154
|
110 const opus_val16 *y,
|
cannam@154
|
111 int N
|
cannam@154
|
112 ) = {
|
cannam@154
|
113 celt_inner_prod_c, /* non-sse */
|
cannam@154
|
114 MAY_HAVE_SSE(celt_inner_prod),
|
cannam@154
|
115 MAY_HAVE_SSE(celt_inner_prod),
|
cannam@154
|
116 MAY_HAVE_SSE(celt_inner_prod),
|
cannam@154
|
117 MAY_HAVE_SSE(celt_inner_prod)
|
cannam@154
|
118 };
|
cannam@154
|
119
|
cannam@154
|
120 void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
121 const opus_val16 *x,
|
cannam@154
|
122 const opus_val16 *y01,
|
cannam@154
|
123 const opus_val16 *y02,
|
cannam@154
|
124 int N,
|
cannam@154
|
125 opus_val32 *xy1,
|
cannam@154
|
126 opus_val32 *xy2
|
cannam@154
|
127 ) = {
|
cannam@154
|
128 dual_inner_prod_c, /* non-sse */
|
cannam@154
|
129 MAY_HAVE_SSE(dual_inner_prod),
|
cannam@154
|
130 MAY_HAVE_SSE(dual_inner_prod),
|
cannam@154
|
131 MAY_HAVE_SSE(dual_inner_prod),
|
cannam@154
|
132 MAY_HAVE_SSE(dual_inner_prod)
|
cannam@154
|
133 };
|
cannam@154
|
134
|
cannam@154
|
135 void (*const COMB_FILTER_CONST_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
136 opus_val32 *y,
|
cannam@154
|
137 opus_val32 *x,
|
cannam@154
|
138 int T,
|
cannam@154
|
139 int N,
|
cannam@154
|
140 opus_val16 g10,
|
cannam@154
|
141 opus_val16 g11,
|
cannam@154
|
142 opus_val16 g12
|
cannam@154
|
143 ) = {
|
cannam@154
|
144 comb_filter_const_c, /* non-sse */
|
cannam@154
|
145 MAY_HAVE_SSE(comb_filter_const),
|
cannam@154
|
146 MAY_HAVE_SSE(comb_filter_const),
|
cannam@154
|
147 MAY_HAVE_SSE(comb_filter_const),
|
cannam@154
|
148 MAY_HAVE_SSE(comb_filter_const)
|
cannam@154
|
149 };
|
cannam@154
|
150
|
cannam@154
|
151
|
cannam@154
|
152 #endif
|
cannam@154
|
153
|
cannam@154
|
154 #if defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(OPUS_X86_PRESUME_SSE2)
|
cannam@154
|
155 opus_val16 (*const OP_PVQ_SEARCH_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
156 celt_norm *_X, int *iy, int K, int N, int arch
|
cannam@154
|
157 ) = {
|
cannam@154
|
158 op_pvq_search_c, /* non-sse */
|
cannam@154
|
159 op_pvq_search_c,
|
cannam@154
|
160 MAY_HAVE_SSE2(op_pvq_search),
|
cannam@154
|
161 MAY_HAVE_SSE2(op_pvq_search),
|
cannam@154
|
162 MAY_HAVE_SSE2(op_pvq_search)
|
cannam@154
|
163 };
|
cannam@154
|
164 #endif
|
cannam@154
|
165
|
cannam@154
|
166 #endif
|
cannam@154
|
167 #endif
|