]> git.sesse.net Git - vlc/blob - plugins/downmix/ac3_downmix_3dn.c
* Removed unused code (intf_channels.c, keystrokes.h).
[vlc] / plugins / downmix / ac3_downmix_3dn.c
1 /*****************************************************************************
2  * ac3_downmix_3dn.c: accelerated 3D Now! ac3 downmix functions
3  *****************************************************************************
4  * Copyright (C) 1999, 2000, 2001 VideoLAN
5  * $Id: ac3_downmix_3dn.c,v 1.8 2001/12/10 04:53:10 sam Exp $
6  *
7  * Authors: Renaud Dartus <reno@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #define MODULE_NAME downmix3dn
25 #include "modules_inner.h"
26
27 /*****************************************************************************
28  * Preamble
29  *****************************************************************************/
30 #include "defs.h"
31
32 #include "common.h"
33
34 #include "ac3_downmix.h"
35
36 const float sqrt2_3dn __asm__ ("sqrt2_3dn") = 0.7071068;
37
38 void _M( downmix_3f_2r_to_2ch ) (float * samples, dm_par_t * dm_par)
39 {
40     __asm__ __volatile__ (
41     ".align 16\n"
42     "pushl %%ebx\n"
43     "movl  $128,  %%ebx\n"            /* loop counter */
44
45     "movd    (%%ecx), %%mm5\n"        /* unit */
46     "punpckldq %%mm5, %%mm5\n"        /* unit | unit */
47
48     "movd    4(%%ecx), %%mm6\n"        /* clev */
49     "punpckldq %%mm6, %%mm6\n"        /* clev | clev */
50
51     "movd    8(%%ecx), %%mm7\n"        /* slev */
52     "punpckldq %%mm7, %%mm7\n"        /* slev | slev */
53
54     ".align 16\n"
55 ".loop:\n"
56     "movq    (%%eax),     %%mm0\n"   /* left */
57     "movq    2048(%%eax), %%mm1\n"   /* right */
58     "movq   1024(%%eax), %%mm2\n"    /* center */
59     "movq    3072(%%eax), %%mm3\n"    /* leftsur */
60     "movq    4096(%%eax), %%mm4\n"    /* rightsur */
61     "pfmul    %%mm5, %%mm0\n"
62     "pfmul    %%mm5, %%mm1\n"
63     "pfmul    %%mm6, %%mm2\n"
64     "pfadd    %%mm2, %%mm0\n"
65     "pfadd     %%mm2, %%mm1\n"
66     "pfmul  %%mm7, %%mm3\n"
67     "pfmul    %%mm7, %%mm4\n"
68     "pfadd    %%mm3, %%mm0\n"
69     "pfadd    %%mm4, %%mm1\n"
70
71     "movq    %%mm0, (%%eax)\n"
72     "movq    %%mm1, 1024(%%eax)\n"
73
74     "addl    $8, %%eax\n"
75     "decl     %%ebx\n"
76     "jnz    .loop\n"
77     
78     "popl   %%ebx\n"
79     "femms\n"
80     : "=a" (samples)
81     : "a" (samples), "c" (dm_par));
82 }
83
84 void _M( downmix_2f_2r_to_2ch ) (float *samples, dm_par_t * dm_par)
85 {
86     __asm__ __volatile__ (
87     ".align 16\n"
88     "pushl %%ebx\n"
89     "movl  $128, %%ebx\n"       /* loop counter */
90
91     "movd  (%%ecx), %%mm5\n"    /* unit */
92     "punpckldq %%mm5, %%mm5\n"  /* unit | unit */
93
94     "movd    8(%%ecx), %%mm7\n"    /* slev */
95     "punpckldq %%mm7, %%mm7\n"    /* slev | slev */
96
97     ".align 16\n"
98 ".loop3:\n"
99     "movq   (%%eax), %%mm0\n"       /* left */
100     "movq   1024(%%eax), %%mm1\n"   /* right */
101     "movq   2048(%%eax), %%mm3\n"    /* leftsur */
102     "movq   3072(%%eax), %%mm4\n"    /* rightsur */
103     "pfmul    %%mm5, %%mm0\n"
104     "pfmul    %%mm5, %%mm1\n"
105     "pfmul    %%mm7, %%mm3\n"
106     "pfmul    %%mm7, %%mm4\n"
107     "pfadd    %%mm3, %%mm0\n"
108     "pfadd    %%mm4, %%mm1\n"
109
110     "movq    %%mm0, (%%eax)\n"
111     "movq    %%mm1, 1024(%%eax)\n"
112
113     "addl    $8, %%eax\n"
114     "decl     %%ebx\n"
115     "jnz    .loop3\n"
116
117     "popl    %%ebx\n"
118     "femms\n"
119     : "=a" (samples)
120     : "a" (samples), "c" (dm_par));
121 }
122
123 void _M( downmix_3f_1r_to_2ch ) (float *samples, dm_par_t * dm_par)
124 {
125     __asm__ __volatile__ (
126     ".align 16\n"
127     "pushl    %%ebx\n"
128     "movl    $128, %%ebx\n"            /* loop counter */
129
130     "movd    (%%ecx), %%mm5\n"        /* unit */
131     "punpckldq %%mm5, %%mm5\n"        /* unit | unit */
132
133     "movd    4(%%ecx), %%mm6\n"        /* clev */
134     "punpckldq %%mm6, %%mm6\n"        /* clev | clev */
135
136     "movd    8(%%ecx), %%mm7\n"        /* slev */
137     "punpckldq %%mm7, %%mm7\n"      /* slev | slev */
138
139     ".align 16\n"
140 ".loop4:\n"
141     "movq    (%%eax), %%mm0\n"       /* left */
142     "movq    2048(%%eax), %%mm1\n"   /* right */
143     "movq    1024(%%eax), %%mm2\n"    /* center */
144     "movq    3072(%%eax), %%mm3\n"    /* sur */
145     "pfmul    %%mm5, %%mm0\n"
146     "pfmul    %%mm5, %%mm1\n"
147     "pfmul    %%mm6, %%mm2\n"
148     "pfadd    %%mm2, %%mm0\n"
149     "pfmul    %%mm7, %%mm3\n"
150     "pfadd     %%mm2, %%mm1\n"
151     "pfsub    %%mm3, %%mm0\n"
152     "pfadd    %%mm3, %%mm1\n"
153
154     "movq    %%mm0, (%%eax)\n"
155     "movq    %%mm1, 1024(%%eax)\n"
156
157     "addl    $8, %%eax\n"
158     "decl     %%ebx\n"
159     "jnz    .loop4\n"
160
161     "popl    %%ebx\n"
162     "femms\n"
163     : "=a" (samples)
164     : "a" (samples), "c" (dm_par));
165 }
166
167 void _M( downmix_2f_1r_to_2ch ) (float *samples, dm_par_t * dm_par)
168 {
169     __asm__ __volatile__ (
170     ".align 16\n"
171     "pushl    %%ebx\n"
172     "movl    $128, %%ebx\n"            /* loop counter */
173
174     "movd    (%%ecx), %%mm5\n"        /* unit */
175     "punpckldq %%mm5, %%mm5\n"        /* unit | unit */
176
177     "movd    8(%%ecx), %%mm7\n"        /* slev */
178     "punpckldq %%mm7, %%mm7\n"      /* slev | slev */
179
180     ".align 16\n"
181 ".loop5:\n"
182     "movq    (%%eax), %%mm0\n"       /* left */
183     "movq    1024(%%eax), %%mm1\n"   /* right */
184     "movq    2048(%%eax), %%mm3\n"    /* sur */
185     "pfmul    %%mm5, %%mm0\n"
186     "pfmul    %%mm5, %%mm1\n"
187     "pfmul    %%mm7, %%mm3\n"
188     "pfsub    %%mm3, %%mm0\n"
189     "pfadd    %%mm3, %%mm1\n"
190
191     "movq    %%mm0, (%%eax)\n"
192     "movq    %%mm1, 1024(%%eax)\n"
193
194     "addl    $8, %%eax\n"
195     "decl     %%ebx\n"
196     "jnz    .loop5\n"
197
198     "popl    %%ebx\n"
199     "femms\n"
200     : "=a" (samples)
201     : "a" (samples), "c" (dm_par));
202 }
203
204 void _M( downmix_3f_0r_to_2ch ) (float *samples, dm_par_t * dm_par)
205 {
206     __asm__ __volatile__ (
207     ".align 16\n"
208     "pushl    %%ebx\n"
209     "movl    $128, %%ebx\n"            /* loop counter */
210
211     "movd    (%%ecx), %%mm5\n"        /* unit */
212     "punpckldq %%mm5, %%mm5\n"        /* unit | unit */
213
214     "movd    4(%%ecx), %%mm6\n"        /* clev */
215     "punpckldq %%mm6, %%mm6\n"      /* clev | clev */
216
217     ".align 16\n"
218 ".loop6:\n"
219     "movq    (%%eax), %%mm0\n"       /*left */
220     "movq    2048(%%eax), %%mm1\n"   /* right */
221     "movq   1024(%%eax), %%mm2\n"   /* center */
222     "pfmul    %%mm5, %%mm0\n"
223     "pfmul    %%mm5, %%mm1\n"
224     "pfmul    %%mm6, %%mm2\n"
225     "pfadd    %%mm2, %%mm0\n"
226     "pfadd     %%mm2, %%mm1\n"
227
228     "movq    %%mm0, (%%eax)\n"
229     "movq    %%mm1, 1024(%%eax)\n"
230
231     "addl    $8, %%eax\n"
232     "decl     %%ebx\n"
233     "jnz    .loop6\n"
234
235     "popl    %%ebx\n"
236     "femms\n"
237     : "=a" (samples)
238     : "a" (samples), "c" (dm_par));
239 }
240
241 void _M( stream_sample_1ch_to_s16 ) (s16 *s16_samples, float *left)
242 {
243     __asm__ __volatile__ (
244     ".align 16\n"
245     "pushl %%ebx\n"
246     "pushl %%edx\n"
247
248     "movl   $sqrt2_3dn, %%edx\n"
249     "movd  (%%edx), %%mm7\n"
250     "punpckldq %%mm7, %%mm7\n"   /* sqrt2 | sqrt2 */
251     "movl $128, %%ebx\n"
252
253     ".align 16\n"
254 ".loop2:\n"
255     "movq (%%ecx), %%mm0\n"        /* c1 | c0 */
256     "pfmul   %%mm7, %%mm0\n"
257
258     "pf2id %%mm0, %%mm0\n"        /* c1 c0 --> mm0, int_32 */
259
260     "packssdw %%mm0, %%mm0\n"        /* c1 c1 c0 c0 --> mm0, int_16 */
261
262     "movq %%mm0, (%%eax)\n"
263     "addl $8, %%eax\n"
264     "addl $8, %%ecx\n"
265
266     "decl %%ebx\n"
267     "jnz .loop2\n"
268
269     "popl %%edx\n"
270     "popl %%ebx\n"
271     "femms\n"
272     : "=a" (s16_samples), "=c" (left)
273     : "a" (s16_samples), "c" (left));
274 }
275
276 void _M( stream_sample_2ch_to_s16 ) (s16 *s16_samples, float *left, float *right)
277 {
278
279     __asm__ __volatile__ (
280     ".align 16\n"
281     "pushl %%ebx\n"
282     "movl $128, %%ebx\n"
283
284     ".align 16\n"
285 ".loop1:\n"
286     "movq  (%%ecx), %%mm0\n"    /* l1 | l0 */
287     "movq  (%%edx), %%mm1\n"    /* r1 | r0 */
288     "movq   %%mm0,  %%mm2\n"    /* l1 | l0 */
289     "punpckldq %%mm1, %%mm0\n"    /* r0 | l0 */
290     "punpckhdq %%mm1, %%mm2\n"    /* r1 | l1 */
291
292     "pf2id    %%mm0, %%mm0\n"    /* r0 l0 --> mm0, int_32 */
293     "pf2id    %%mm2, %%mm2\n"    /* r0 l0 --> mm0, int_32 */
294     
295     "packssdw %%mm2, %%mm0\n"    /* r1 l1 r0 l0 --> mm0, int_16 */
296
297     "movq %%mm0, (%%eax)\n"
298     "movq %%mm2, 8(%%eax)\n"
299     "addl $8, %%eax\n"
300     "addl $8, %%ecx\n"
301     "addl $8, %%edx\n"
302
303     "decl %%ebx\n"
304     "jnz .loop1\n"
305
306     "popl %%ebx\n"
307     "femms\n"
308     : "=a" (s16_samples), "=c" (left), "=d" (right)
309     : "a" (s16_samples), "c" (left), "d" (right));
310     
311 }
312