annotate x86/lpc_mmx.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 98bf00fa95cd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10424
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
1 /*
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
2 * MMX optimized LPC DSP utils
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
3 * Copyright (c) 2007 Loren Merritt
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
4 *
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
5 * This file is part of FFmpeg.
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
6 *
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
11 *
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
15 * Lesser General Public License for more details.
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
16 *
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
20 */
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
21
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
22 #include "libavutil/x86_cpu.h"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
23 #include "dsputil_mmx.h"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
24
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
25 static void apply_welch_window_sse2(const int32_t *data, int len, double *w_data)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
26 {
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
27 double c = 2.0 / (len-1.0);
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
28 int n2 = len>>1;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
29 x86_reg i = -n2*sizeof(int32_t);
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
30 x86_reg j = n2*sizeof(int32_t);
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
31 __asm__ volatile(
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
32 "movsd %0, %%xmm7 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
33 "movapd "MANGLE(ff_pd_1)", %%xmm6 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
34 "movapd "MANGLE(ff_pd_2)", %%xmm5 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
35 "movlhps %%xmm7, %%xmm7 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
36 "subpd %%xmm5, %%xmm7 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
37 "addsd %%xmm6, %%xmm7 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
38 ::"m"(c)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
39 );
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
40 #define WELCH(MOVPD, offset)\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
41 __asm__ volatile(\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
42 "1: \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
43 "movapd %%xmm7, %%xmm1 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
44 "mulpd %%xmm1, %%xmm1 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
45 "movapd %%xmm6, %%xmm0 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
46 "subpd %%xmm1, %%xmm0 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
47 "pshufd $0x4e, %%xmm0, %%xmm1 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
48 "cvtpi2pd (%3,%0), %%xmm2 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
49 "cvtpi2pd "#offset"*4(%3,%1), %%xmm3 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
50 "mulpd %%xmm0, %%xmm2 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
51 "mulpd %%xmm1, %%xmm3 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
52 "movapd %%xmm2, (%2,%0,2) \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
53 MOVPD" %%xmm3, "#offset"*8(%2,%1,2) \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
54 "subpd %%xmm5, %%xmm7 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
55 "sub $8, %1 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
56 "add $8, %0 \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
57 "jl 1b \n\t"\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
58 :"+&r"(i), "+&r"(j)\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
59 :"r"(w_data+n2), "r"(data+n2)\
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
60 );
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
61 if(len&1)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
62 WELCH("movupd", -1)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
63 else
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
64 WELCH("movapd", -2)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
65 #undef WELCH
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
66 }
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
67
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
68 void ff_lpc_compute_autocorr_sse2(const int32_t *data, int len, int lag,
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
69 double *autoc)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
70 {
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
71 double tmp[len + lag + 2];
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
72 double *data1 = tmp + lag;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
73 int j;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
74
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
75 if((x86_reg)data1 & 15)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
76 data1++;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
77
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
78 apply_welch_window_sse2(data, len, data1);
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
79
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
80 for(j=0; j<lag; j++)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
81 data1[j-lag]= 0.0;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
82 data1[len] = 0.0;
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
83
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
84 for(j=0; j<lag; j+=2){
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
85 x86_reg i = -len*sizeof(double);
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
86 if(j == lag-2) {
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
87 __asm__ volatile(
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
88 "movsd "MANGLE(ff_pd_1)", %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
89 "movsd "MANGLE(ff_pd_1)", %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
90 "movsd "MANGLE(ff_pd_1)", %%xmm2 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
91 "1: \n\t"
10763
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
92 "movapd (%2,%0), %%xmm3 \n\t"
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
93 "movupd -8(%3,%0), %%xmm4 \n\t"
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
94 "movapd (%3,%0), %%xmm5 \n\t"
10424
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
95 "mulpd %%xmm3, %%xmm4 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
96 "mulpd %%xmm3, %%xmm5 \n\t"
10763
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
97 "mulpd -16(%3,%0), %%xmm3 \n\t"
10424
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
98 "addpd %%xmm4, %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
99 "addpd %%xmm5, %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
100 "addpd %%xmm3, %%xmm2 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
101 "add $16, %0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
102 "jl 1b \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
103 "movhlps %%xmm0, %%xmm3 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
104 "movhlps %%xmm1, %%xmm4 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
105 "movhlps %%xmm2, %%xmm5 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
106 "addsd %%xmm3, %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
107 "addsd %%xmm4, %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
108 "addsd %%xmm5, %%xmm2 \n\t"
10763
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
109 "movsd %%xmm0, (%1) \n\t"
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
110 "movsd %%xmm1, 8(%1) \n\t"
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
111 "movsd %%xmm2, 16(%1) \n\t"
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
112 :"+&r"(i)
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
113 :"r"(autoc+j), "r"(data1+len), "r"(data1+len-j)
98bf00fa95cd Reduce number of ASM constraints for ff_lpc_compute_autocorr_sse2 since it
reimar
parents: 10424
diff changeset
114 :"memory"
10424
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
115 );
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
116 } else {
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
117 __asm__ volatile(
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
118 "movsd "MANGLE(ff_pd_1)", %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
119 "movsd "MANGLE(ff_pd_1)", %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
120 "1: \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
121 "movapd (%3,%0), %%xmm3 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
122 "movupd -8(%4,%0), %%xmm4 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
123 "mulpd %%xmm3, %%xmm4 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
124 "mulpd (%4,%0), %%xmm3 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
125 "addpd %%xmm4, %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
126 "addpd %%xmm3, %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
127 "add $16, %0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
128 "jl 1b \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
129 "movhlps %%xmm0, %%xmm3 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
130 "movhlps %%xmm1, %%xmm4 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
131 "addsd %%xmm3, %%xmm0 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
132 "addsd %%xmm4, %%xmm1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
133 "movsd %%xmm0, %1 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
134 "movsd %%xmm1, %2 \n\t"
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
135 :"+&r"(i), "=m"(autoc[j]), "=m"(autoc[j+1])
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
136 :"r"(data1+len), "r"(data1+len-j)
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
137 );
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
138 }
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
139 }
94595d0e617c Move autocorrelation function from flacenc.c to lpc.c. Also rename the
jbr
parents:
diff changeset
140 }