cannam@154
|
1 /* Copyright (c) 2013 Jean-Marc Valin and John Ridges
|
cannam@154
|
2 Copyright (c) 2014, Cisco Systems, INC MingXiang WeiZhou MinPeng YanWang*/
|
cannam@154
|
3 /**
|
cannam@154
|
4 @file pitch_sse.h
|
cannam@154
|
5 @brief Pitch analysis
|
cannam@154
|
6 */
|
cannam@154
|
7
|
cannam@154
|
8 /*
|
cannam@154
|
9 Redistribution and use in source and binary forms, with or without
|
cannam@154
|
10 modification, are permitted provided that the following conditions
|
cannam@154
|
11 are met:
|
cannam@154
|
12
|
cannam@154
|
13 - Redistributions of source code must retain the above copyright
|
cannam@154
|
14 notice, this list of conditions and the following disclaimer.
|
cannam@154
|
15
|
cannam@154
|
16 - Redistributions in binary form must reproduce the above copyright
|
cannam@154
|
17 notice, this list of conditions and the following disclaimer in the
|
cannam@154
|
18 documentation and/or other materials provided with the distribution.
|
cannam@154
|
19
|
cannam@154
|
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
cannam@154
|
21 ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
cannam@154
|
22 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
cannam@154
|
23 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
cannam@154
|
24 OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
cannam@154
|
25 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
cannam@154
|
26 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
cannam@154
|
27 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
cannam@154
|
28 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
cannam@154
|
29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
cannam@154
|
30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
cannam@154
|
31 */
|
cannam@154
|
32
|
cannam@154
|
33 #ifndef PITCH_SSE_H
|
cannam@154
|
34 #define PITCH_SSE_H
|
cannam@154
|
35
|
cannam@154
|
36 #if defined(HAVE_CONFIG_H)
|
cannam@154
|
37 #include "config.h"
|
cannam@154
|
38 #endif
|
cannam@154
|
39
|
cannam@154
|
40 #if defined(OPUS_X86_MAY_HAVE_SSE4_1) && defined(FIXED_POINT)
|
cannam@154
|
41 void xcorr_kernel_sse4_1(
|
cannam@154
|
42 const opus_int16 *x,
|
cannam@154
|
43 const opus_int16 *y,
|
cannam@154
|
44 opus_val32 sum[4],
|
cannam@154
|
45 int len);
|
cannam@154
|
46 #endif
|
cannam@154
|
47
|
cannam@154
|
48 #if defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT)
|
cannam@154
|
49 void xcorr_kernel_sse(
|
cannam@154
|
50 const opus_val16 *x,
|
cannam@154
|
51 const opus_val16 *y,
|
cannam@154
|
52 opus_val32 sum[4],
|
cannam@154
|
53 int len);
|
cannam@154
|
54 #endif
|
cannam@154
|
55
|
cannam@154
|
56 #if defined(OPUS_X86_PRESUME_SSE4_1) && defined(FIXED_POINT)
|
cannam@154
|
57 #define OVERRIDE_XCORR_KERNEL
|
cannam@154
|
58 #define xcorr_kernel(x, y, sum, len, arch) \
|
cannam@154
|
59 ((void)arch, xcorr_kernel_sse4_1(x, y, sum, len))
|
cannam@154
|
60
|
cannam@154
|
61 #elif defined(OPUS_X86_PRESUME_SSE) && !defined(FIXED_POINT)
|
cannam@154
|
62 #define OVERRIDE_XCORR_KERNEL
|
cannam@154
|
63 #define xcorr_kernel(x, y, sum, len, arch) \
|
cannam@154
|
64 ((void)arch, xcorr_kernel_sse(x, y, sum, len))
|
cannam@154
|
65
|
cannam@154
|
66 #elif (defined(OPUS_X86_MAY_HAVE_SSE4_1) && defined(FIXED_POINT)) || (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT))
|
cannam@154
|
67
|
cannam@154
|
68 extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
69 const opus_val16 *x,
|
cannam@154
|
70 const opus_val16 *y,
|
cannam@154
|
71 opus_val32 sum[4],
|
cannam@154
|
72 int len);
|
cannam@154
|
73
|
cannam@154
|
74 #define OVERRIDE_XCORR_KERNEL
|
cannam@154
|
75 #define xcorr_kernel(x, y, sum, len, arch) \
|
cannam@154
|
76 ((*XCORR_KERNEL_IMPL[(arch) & OPUS_ARCHMASK])(x, y, sum, len))
|
cannam@154
|
77
|
cannam@154
|
78 #endif
|
cannam@154
|
79
|
cannam@154
|
80 #if defined(OPUS_X86_MAY_HAVE_SSE4_1) && defined(FIXED_POINT)
|
cannam@154
|
81 opus_val32 celt_inner_prod_sse4_1(
|
cannam@154
|
82 const opus_int16 *x,
|
cannam@154
|
83 const opus_int16 *y,
|
cannam@154
|
84 int N);
|
cannam@154
|
85 #endif
|
cannam@154
|
86
|
cannam@154
|
87 #if defined(OPUS_X86_MAY_HAVE_SSE2) && defined(FIXED_POINT)
|
cannam@154
|
88 opus_val32 celt_inner_prod_sse2(
|
cannam@154
|
89 const opus_int16 *x,
|
cannam@154
|
90 const opus_int16 *y,
|
cannam@154
|
91 int N);
|
cannam@154
|
92 #endif
|
cannam@154
|
93
|
cannam@154
|
94 #if defined(OPUS_X86_MAY_HAVE_SSE2) && !defined(FIXED_POINT)
|
cannam@154
|
95 opus_val32 celt_inner_prod_sse(
|
cannam@154
|
96 const opus_val16 *x,
|
cannam@154
|
97 const opus_val16 *y,
|
cannam@154
|
98 int N);
|
cannam@154
|
99 #endif
|
cannam@154
|
100
|
cannam@154
|
101
|
cannam@154
|
102 #if defined(OPUS_X86_PRESUME_SSE4_1) && defined(FIXED_POINT)
|
cannam@154
|
103 #define OVERRIDE_CELT_INNER_PROD
|
cannam@154
|
104 #define celt_inner_prod(x, y, N, arch) \
|
cannam@154
|
105 ((void)arch, celt_inner_prod_sse4_1(x, y, N))
|
cannam@154
|
106
|
cannam@154
|
107 #elif defined(OPUS_X86_PRESUME_SSE2) && defined(FIXED_POINT) && !defined(OPUS_X86_MAY_HAVE_SSE4_1)
|
cannam@154
|
108 #define OVERRIDE_CELT_INNER_PROD
|
cannam@154
|
109 #define celt_inner_prod(x, y, N, arch) \
|
cannam@154
|
110 ((void)arch, celt_inner_prod_sse2(x, y, N))
|
cannam@154
|
111
|
cannam@154
|
112 #elif defined(OPUS_X86_PRESUME_SSE) && !defined(FIXED_POINT)
|
cannam@154
|
113 #define OVERRIDE_CELT_INNER_PROD
|
cannam@154
|
114 #define celt_inner_prod(x, y, N, arch) \
|
cannam@154
|
115 ((void)arch, celt_inner_prod_sse(x, y, N))
|
cannam@154
|
116
|
cannam@154
|
117
|
cannam@154
|
118 #elif ((defined(OPUS_X86_MAY_HAVE_SSE4_1) || defined(OPUS_X86_MAY_HAVE_SSE2)) && defined(FIXED_POINT)) || \
|
cannam@154
|
119 (defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT))
|
cannam@154
|
120
|
cannam@154
|
121 extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
122 const opus_val16 *x,
|
cannam@154
|
123 const opus_val16 *y,
|
cannam@154
|
124 int N);
|
cannam@154
|
125
|
cannam@154
|
126 #define OVERRIDE_CELT_INNER_PROD
|
cannam@154
|
127 #define celt_inner_prod(x, y, N, arch) \
|
cannam@154
|
128 ((*CELT_INNER_PROD_IMPL[(arch) & OPUS_ARCHMASK])(x, y, N))
|
cannam@154
|
129
|
cannam@154
|
130 #endif
|
cannam@154
|
131
|
cannam@154
|
132 #if defined(OPUS_X86_MAY_HAVE_SSE) && !defined(FIXED_POINT)
|
cannam@154
|
133
|
cannam@154
|
134 #define OVERRIDE_DUAL_INNER_PROD
|
cannam@154
|
135 #define OVERRIDE_COMB_FILTER_CONST
|
cannam@154
|
136
|
cannam@154
|
137 #undef dual_inner_prod
|
cannam@154
|
138 #undef comb_filter_const
|
cannam@154
|
139
|
cannam@154
|
140 void dual_inner_prod_sse(const opus_val16 *x,
|
cannam@154
|
141 const opus_val16 *y01,
|
cannam@154
|
142 const opus_val16 *y02,
|
cannam@154
|
143 int N,
|
cannam@154
|
144 opus_val32 *xy1,
|
cannam@154
|
145 opus_val32 *xy2);
|
cannam@154
|
146
|
cannam@154
|
147 void comb_filter_const_sse(opus_val32 *y,
|
cannam@154
|
148 opus_val32 *x,
|
cannam@154
|
149 int T,
|
cannam@154
|
150 int N,
|
cannam@154
|
151 opus_val16 g10,
|
cannam@154
|
152 opus_val16 g11,
|
cannam@154
|
153 opus_val16 g12);
|
cannam@154
|
154
|
cannam@154
|
155
|
cannam@154
|
156 #if defined(OPUS_X86_PRESUME_SSE)
|
cannam@154
|
157 # define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) \
|
cannam@154
|
158 ((void)(arch),dual_inner_prod_sse(x, y01, y02, N, xy1, xy2))
|
cannam@154
|
159
|
cannam@154
|
160 # define comb_filter_const(y, x, T, N, g10, g11, g12, arch) \
|
cannam@154
|
161 ((void)(arch),comb_filter_const_sse(y, x, T, N, g10, g11, g12))
|
cannam@154
|
162 #else
|
cannam@154
|
163
|
cannam@154
|
164 extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
165 const opus_val16 *x,
|
cannam@154
|
166 const opus_val16 *y01,
|
cannam@154
|
167 const opus_val16 *y02,
|
cannam@154
|
168 int N,
|
cannam@154
|
169 opus_val32 *xy1,
|
cannam@154
|
170 opus_val32 *xy2);
|
cannam@154
|
171
|
cannam@154
|
172 #define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) \
|
cannam@154
|
173 ((*DUAL_INNER_PROD_IMPL[(arch) & OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2))
|
cannam@154
|
174
|
cannam@154
|
175 extern void (*const COMB_FILTER_CONST_IMPL[OPUS_ARCHMASK + 1])(
|
cannam@154
|
176 opus_val32 *y,
|
cannam@154
|
177 opus_val32 *x,
|
cannam@154
|
178 int T,
|
cannam@154
|
179 int N,
|
cannam@154
|
180 opus_val16 g10,
|
cannam@154
|
181 opus_val16 g11,
|
cannam@154
|
182 opus_val16 g12);
|
cannam@154
|
183
|
cannam@154
|
184 #define comb_filter_const(y, x, T, N, g10, g11, g12, arch) \
|
cannam@154
|
185 ((*COMB_FILTER_CONST_IMPL[(arch) & OPUS_ARCHMASK])(y, x, T, N, g10, g11, g12))
|
cannam@154
|
186
|
cannam@154
|
187 #define NON_STATIC_COMB_FILTER_CONST_C
|
cannam@154
|
188
|
cannam@154
|
189 #endif
|
cannam@154
|
190 #endif
|
cannam@154
|
191
|
cannam@154
|
192 #endif
|