Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1605)

Side by Side Diff: src/libFLAC/lpc_intrin_sse.c

Issue 1961133002: Update FLAC to 1.3.1 (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/flac.git@master
Patch Set: build config tweaks for Windows Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/libFLAC/lpc_intrin_avx2.c ('k') | src/libFLAC/lpc_intrin_sse2.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /* libFLAC - Free Lossless Audio Codec library
2 * Copyright (C) 2000-2009 Josh Coalson
3 * Copyright (C) 2011-2014 Xiph.Org Foundation
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * - Neither the name of the Xiph.org Foundation nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 */
32
33 #ifdef HAVE_CONFIG_H
34 # include <config.h>
35 #endif
36
37 #ifndef FLAC__INTEGER_ONLY_LIBRARY
38 #ifndef FLAC__NO_ASM
39 #if (defined FLAC__CPU_IA32 || defined FLAC__CPU_X86_64) && defined FLAC__HAS_X8 6INTRIN
40 #include "private/lpc.h"
41 #ifdef FLAC__SSE_SUPPORTED
42
43 #include "FLAC/assert.h"
44 #include "FLAC/format.h"
45
46 #include <xmmintrin.h> /* SSE */
47
48 #if 1
49 /* Faster on current Intel (starting from Core i aka Nehalem) and all AMD CPUs * /
50
51 FLAC__SSE_TARGET("sse")
52 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
53 {
54 int i;
55 int limit = data_len - 4;
56 __m128 sum0;
57
58 (void) lag;
59 FLAC__ASSERT(lag <= 4);
60 FLAC__ASSERT(lag <= data_len);
61
62 sum0 = _mm_setzero_ps();
63
64 for(i = 0; i <= limit; i++) {
65 __m128 d, d0;
66 d0 = _mm_loadu_ps(data+i);
67 d = d0; d = _mm_shuffle_ps(d, d, 0);
68 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
69 }
70
71 {
72 __m128 d0 = _mm_setzero_ps();
73 limit++; if(limit < 0) limit = 0;
74
75 for(i = data_len-1; i >= limit; i--) {
76 __m128 d;
77 d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
78 d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
79 d0 = _mm_move_ss(d0, d);
80 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
81 }
82 }
83
84 _mm_storeu_ps(autoc, sum0);
85 }
86
87 FLAC__SSE_TARGET("sse")
88 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
89 {
90 int i;
91 int limit = data_len - 8;
92 __m128 sum0, sum1;
93
94 (void) lag;
95 FLAC__ASSERT(lag <= 8);
96 FLAC__ASSERT(lag <= data_len);
97
98 sum0 = _mm_setzero_ps();
99 sum1 = _mm_setzero_ps();
100
101 for(i = 0; i <= limit; i++) {
102 __m128 d, d0, d1;
103 d0 = _mm_loadu_ps(data+i);
104 d1 = _mm_loadu_ps(data+i+4);
105 d = d0; d = _mm_shuffle_ps(d, d, 0);
106 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
107 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
108 }
109
110 {
111 __m128 d0 = _mm_setzero_ps();
112 __m128 d1 = _mm_setzero_ps();
113 limit++; if(limit < 0) limit = 0;
114
115 for(i = data_len-1; i >= limit; i--) {
116 __m128 d;
117 d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
118 d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
119 d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
120 d1 = _mm_move_ss(d1, d0);
121 d0 = _mm_move_ss(d0, d);
122 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
123 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
124 }
125 }
126
127 _mm_storeu_ps(autoc, sum0);
128 _mm_storeu_ps(autoc+4, sum1);
129 }
130
131 FLAC__SSE_TARGET("sse")
132 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[] , unsigned data_len, unsigned lag, FLAC__real autoc[])
133 {
134 int i;
135 int limit = data_len - 12;
136 __m128 sum0, sum1, sum2;
137
138 (void) lag;
139 FLAC__ASSERT(lag <= 12);
140 FLAC__ASSERT(lag <= data_len);
141
142 sum0 = _mm_setzero_ps();
143 sum1 = _mm_setzero_ps();
144 sum2 = _mm_setzero_ps();
145
146 for(i = 0; i <= limit; i++) {
147 __m128 d, d0, d1, d2;
148 d0 = _mm_loadu_ps(data+i);
149 d1 = _mm_loadu_ps(data+i+4);
150 d2 = _mm_loadu_ps(data+i+8);
151 d = d0; d = _mm_shuffle_ps(d, d, 0);
152 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
153 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
154 sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d));
155 }
156
157 {
158 __m128 d0 = _mm_setzero_ps();
159 __m128 d1 = _mm_setzero_ps();
160 __m128 d2 = _mm_setzero_ps();
161 limit++; if(limit < 0) limit = 0;
162
163 for(i = data_len-1; i >= limit; i--) {
164 __m128 d;
165 d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
166 d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3));
167 d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
168 d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
169 d2 = _mm_move_ss(d2, d1);
170 d1 = _mm_move_ss(d1, d0);
171 d0 = _mm_move_ss(d0, d);
172 sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2));
173 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
174 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
175 }
176 }
177
178 _mm_storeu_ps(autoc, sum0);
179 _mm_storeu_ps(autoc+4, sum1);
180 _mm_storeu_ps(autoc+8, sum2);
181 }
182
183 FLAC__SSE_TARGET("sse")
184 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[] , unsigned data_len, unsigned lag, FLAC__real autoc[])
185 {
186 int i;
187 int limit = data_len - 16;
188 __m128 sum0, sum1, sum2, sum3;
189
190 (void) lag;
191 FLAC__ASSERT(lag <= 16);
192 FLAC__ASSERT(lag <= data_len);
193
194 sum0 = _mm_setzero_ps();
195 sum1 = _mm_setzero_ps();
196 sum2 = _mm_setzero_ps();
197 sum3 = _mm_setzero_ps();
198
199 for(i = 0; i <= limit; i++) {
200 __m128 d, d0, d1, d2, d3;
201 d0 = _mm_loadu_ps(data+i);
202 d1 = _mm_loadu_ps(data+i+4);
203 d2 = _mm_loadu_ps(data+i+8);
204 d3 = _mm_loadu_ps(data+i+12);
205 d = d0; d = _mm_shuffle_ps(d, d, 0);
206 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d0, d));
207 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d1, d));
208 sum2 = _mm_add_ps(sum2, _mm_mul_ps(d2, d));
209 sum3 = _mm_add_ps(sum3, _mm_mul_ps(d3, d));
210 }
211
212 {
213 __m128 d0 = _mm_setzero_ps();
214 __m128 d1 = _mm_setzero_ps();
215 __m128 d2 = _mm_setzero_ps();
216 __m128 d3 = _mm_setzero_ps();
217 limit++; if(limit < 0) limit = 0;
218
219 for(i = data_len-1; i >= limit; i--) {
220 __m128 d;
221 d = _mm_load_ss(data+i); d = _mm_shuffle_ps(d, d, 0);
222 d3 = _mm_shuffle_ps(d3, d3, _MM_SHUFFLE(2,1,0,3));
223 d2 = _mm_shuffle_ps(d2, d2, _MM_SHUFFLE(2,1,0,3));
224 d1 = _mm_shuffle_ps(d1, d1, _MM_SHUFFLE(2,1,0,3));
225 d0 = _mm_shuffle_ps(d0, d0, _MM_SHUFFLE(2,1,0,3));
226 d3 = _mm_move_ss(d3, d2);
227 d2 = _mm_move_ss(d2, d1);
228 d1 = _mm_move_ss(d1, d0);
229 d0 = _mm_move_ss(d0, d);
230 sum3 = _mm_add_ps(sum3, _mm_mul_ps(d, d3));
231 sum2 = _mm_add_ps(sum2, _mm_mul_ps(d, d2));
232 sum1 = _mm_add_ps(sum1, _mm_mul_ps(d, d1));
233 sum0 = _mm_add_ps(sum0, _mm_mul_ps(d, d0));
234 }
235 }
236
237 _mm_storeu_ps(autoc, sum0);
238 _mm_storeu_ps(autoc+4, sum1);
239 _mm_storeu_ps(autoc+8, sum2);
240 _mm_storeu_ps(autoc+12,sum3);
241 }
242
243 #else
244 /* Faster on older Intel CPUs (up to Core 2) */
245
246 FLAC__SSE_TARGET("sse")
247 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_4(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
248 {
249 __m128 xmm0, xmm2, xmm5;
250
251 (void) lag;
252 FLAC__ASSERT(lag > 0);
253 FLAC__ASSERT(lag <= 4);
254 FLAC__ASSERT(lag <= data_len);
255 FLAC__ASSERT(data_len > 0);
256
257 xmm5 = _mm_setzero_ps();
258
259 xmm0 = _mm_load_ss(data++);
260 xmm2 = xmm0;
261 xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
262
263 xmm0 = _mm_mul_ps(xmm0, xmm2);
264 xmm5 = _mm_add_ps(xmm5, xmm0);
265
266 data_len--;
267
268 while(data_len)
269 {
270 xmm0 = _mm_load1_ps(data++);
271
272 xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
273 xmm2 = _mm_move_ss(xmm2, xmm0);
274 xmm0 = _mm_mul_ps(xmm0, xmm2);
275 xmm5 = _mm_add_ps(xmm5, xmm0);
276
277 data_len--;
278 }
279
280 _mm_storeu_ps(autoc, xmm5);
281 }
282
283 FLAC__SSE_TARGET("sse")
284 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_8(const FLAC__real data[], unsigned data_len, unsigned lag, FLAC__real autoc[])
285 {
286 __m128 xmm0, xmm1, xmm2, xmm3, xmm5, xmm6;
287
288 (void) lag;
289 FLAC__ASSERT(lag > 0);
290 FLAC__ASSERT(lag <= 8);
291 FLAC__ASSERT(lag <= data_len);
292 FLAC__ASSERT(data_len > 0);
293
294 xmm5 = _mm_setzero_ps();
295 xmm6 = _mm_setzero_ps();
296
297 xmm0 = _mm_load_ss(data++);
298 xmm2 = xmm0;
299 xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
300 xmm3 = _mm_setzero_ps();
301
302 xmm0 = _mm_mul_ps(xmm0, xmm2);
303 xmm5 = _mm_add_ps(xmm5, xmm0);
304
305 data_len--;
306
307 while(data_len)
308 {
309 xmm0 = _mm_load1_ps(data++);
310
311 xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
312 xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
313 xmm3 = _mm_move_ss(xmm3, xmm2);
314 xmm2 = _mm_move_ss(xmm2, xmm0);
315
316 xmm1 = xmm0;
317 xmm1 = _mm_mul_ps(xmm1, xmm3);
318 xmm0 = _mm_mul_ps(xmm0, xmm2);
319 xmm6 = _mm_add_ps(xmm6, xmm1);
320 xmm5 = _mm_add_ps(xmm5, xmm0);
321
322 data_len--;
323 }
324
325 _mm_storeu_ps(autoc, xmm5);
326 _mm_storeu_ps(autoc+4, xmm6);
327 }
328
329 FLAC__SSE_TARGET("sse")
330 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_12(const FLAC__real data[] , unsigned data_len, unsigned lag, FLAC__real autoc[])
331 {
332 __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7;
333
334 (void) lag;
335 FLAC__ASSERT(lag > 0);
336 FLAC__ASSERT(lag <= 12);
337 FLAC__ASSERT(lag <= data_len);
338 FLAC__ASSERT(data_len > 0);
339
340 xmm5 = _mm_setzero_ps();
341 xmm6 = _mm_setzero_ps();
342 xmm7 = _mm_setzero_ps();
343
344 xmm0 = _mm_load_ss(data++);
345 xmm2 = xmm0;
346 xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
347 xmm3 = _mm_setzero_ps();
348 xmm4 = _mm_setzero_ps();
349
350 xmm0 = _mm_mul_ps(xmm0, xmm2);
351 xmm5 = _mm_add_ps(xmm5, xmm0);
352
353 data_len--;
354
355 while(data_len)
356 {
357 xmm0 = _mm_load1_ps(data++);
358
359 xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
360 xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
361 xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3));
362 xmm4 = _mm_move_ss(xmm4, xmm3);
363 xmm3 = _mm_move_ss(xmm3, xmm2);
364 xmm2 = _mm_move_ss(xmm2, xmm0);
365
366 xmm1 = xmm0;
367 xmm1 = _mm_mul_ps(xmm1, xmm2);
368 xmm5 = _mm_add_ps(xmm5, xmm1);
369 xmm1 = xmm0;
370 xmm1 = _mm_mul_ps(xmm1, xmm3);
371 xmm6 = _mm_add_ps(xmm6, xmm1);
372 xmm0 = _mm_mul_ps(xmm0, xmm4);
373 xmm7 = _mm_add_ps(xmm7, xmm0);
374
375 data_len--;
376 }
377
378 _mm_storeu_ps(autoc, xmm5);
379 _mm_storeu_ps(autoc+4, xmm6);
380 _mm_storeu_ps(autoc+8, xmm7);
381 }
382
383 FLAC__SSE_TARGET("sse")
384 void FLAC__lpc_compute_autocorrelation_intrin_sse_lag_16(const FLAC__real data[] , unsigned data_len, unsigned lag, FLAC__real autoc[])
385 {
386 __m128 xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9;
387
388 (void) lag;
389 FLAC__ASSERT(lag > 0);
390 FLAC__ASSERT(lag <= 16);
391 FLAC__ASSERT(lag <= data_len);
392 FLAC__ASSERT(data_len > 0);
393
394 xmm6 = _mm_setzero_ps();
395 xmm7 = _mm_setzero_ps();
396 xmm8 = _mm_setzero_ps();
397 xmm9 = _mm_setzero_ps();
398
399 xmm0 = _mm_load_ss(data++);
400 xmm2 = xmm0;
401 xmm0 = _mm_shuffle_ps(xmm0, xmm0, 0);
402 xmm3 = _mm_setzero_ps();
403 xmm4 = _mm_setzero_ps();
404 xmm5 = _mm_setzero_ps();
405
406 xmm0 = _mm_mul_ps(xmm0, xmm2);
407 xmm6 = _mm_add_ps(xmm6, xmm0);
408
409 data_len--;
410
411 while(data_len)
412 {
413 xmm0 = _mm_load1_ps(data++);
414
415 /* shift xmm5:xmm4:xmm3:xmm2 left by one float */
416 xmm5 = _mm_shuffle_ps(xmm5, xmm5, _MM_SHUFFLE(2,1,0,3));
417 xmm4 = _mm_shuffle_ps(xmm4, xmm4, _MM_SHUFFLE(2,1,0,3));
418 xmm3 = _mm_shuffle_ps(xmm3, xmm3, _MM_SHUFFLE(2,1,0,3));
419 xmm2 = _mm_shuffle_ps(xmm2, xmm2, _MM_SHUFFLE(2,1,0,3));
420 xmm5 = _mm_move_ss(xmm5, xmm4);
421 xmm4 = _mm_move_ss(xmm4, xmm3);
422 xmm3 = _mm_move_ss(xmm3, xmm2);
423 xmm2 = _mm_move_ss(xmm2, xmm0);
424
425 /* xmm9|xmm8|xmm7|xmm6 += xmm0|xmm0|xmm0|xmm0 * xmm5|xmm4|xmm3|x mm2 */
426 xmm1 = xmm0;
427 xmm1 = _mm_mul_ps(xmm1, xmm5);
428 xmm9 = _mm_add_ps(xmm9, xmm1);
429 xmm1 = xmm0;
430 xmm1 = _mm_mul_ps(xmm1, xmm4);
431 xmm8 = _mm_add_ps(xmm8, xmm1);
432 xmm1 = xmm0;
433 xmm1 = _mm_mul_ps(xmm1, xmm3);
434 xmm7 = _mm_add_ps(xmm7, xmm1);
435 xmm0 = _mm_mul_ps(xmm0, xmm2);
436 xmm6 = _mm_add_ps(xmm6, xmm0);
437
438 data_len--;
439 }
440
441 _mm_storeu_ps(autoc, xmm6);
442 _mm_storeu_ps(autoc+4, xmm7);
443 _mm_storeu_ps(autoc+8, xmm8);
444 _mm_storeu_ps(autoc+12,xmm9);
445 }
446 #endif
447
448 #endif /* FLAC__SSE_SUPPORTED */
449 #endif /* (FLAC__CPU_IA32 || FLAC__CPU_X86_64) && FLAC__HAS_X86INTRIN */
450 #endif /* FLAC__NO_ASM */
451 #endif /* FLAC__INTEGER_ONLY_LIBRARY */
OLDNEW
« no previous file with comments | « src/libFLAC/lpc_intrin_avx2.c ('k') | src/libFLAC/lpc_intrin_sse2.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698