1 /*****************************************************************************
2 * ac3_downmix_3dn.c: ac3 downmix functions
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_downmix_3dn.c,v 1.1 2001/05/14 15:58:04 reno Exp $
7 * Authors: Renaud Dartus <reno@videolan.org>
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.
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.
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 *****************************************************************************/
32 #include "stream_control.h"
33 #include "input_ext-dec.h"
34 #include "ac3_decoder.h"
37 void downmix_3f_2r_to_2ch_3dn (float * samples, dm_par_t * dm_par)
39 __asm__ __volatile__ (
41 "movl $128, %%ecx\n" /* loop counter */
43 "movd (%%ebx), %%mm5\n" /* unit */
44 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
46 "movd 4(%%ebx), %%mm6\n" /* clev */
47 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
49 "movd 8(%%ebx), %%mm7\n" /* slev */
50 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
53 "movq (%%eax), %%mm0\n" /* left */
54 "movq 2048(%%eax), %%mm1\n" /* right */
55 "movq 1024(%%eax), %%mm2\n" /* center */
56 "movq 3072(%%eax), %%mm3\n" /* leftsur */
57 "movq 4096(%%eax), %%mm4\n" /* rightsur */
58 "pfmul %%mm5, %%mm0\n"
59 "pfmul %%mm5, %%mm1\n"
60 "pfmul %%mm6, %%mm2\n"
61 "pfadd %%mm2, %%mm0\n"
62 "pfadd %%mm2, %%mm1\n"
63 "pfmul %%mm7, %%mm3\n"
64 "pfmul %%mm7, %%mm4\n"
65 "pfadd %%mm3, %%mm0\n"
66 "pfadd %%mm4, %%mm1\n"
68 "movq %%mm0, (%%eax)\n"
69 "movq %%mm1, 1024(%%eax)\n"
78 : "a" (samples), "b" (dm_par));
81 void downmix_2f_2r_to_2ch_3dn (float *samples, dm_par_t * dm_par)
83 __asm__ __volatile__ (
85 "movl $128, %%ecx\n" /* loop counter */
87 "movd (%%ebx), %%mm5\n" /* unit */
88 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
90 "movd 8(%%ebx), %%mm7\n" /* slev */
91 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
94 "movq (%%eax), %%mm0\n" /* left */
95 "movq 1024(%%eax), %%mm1\n" /* right */
96 "movq 2048(%%eax), %%mm3\n" /* leftsur */
97 "movq 3072(%%eax), %%mm4\n" /* rightsur */
98 "pfmul %%mm5, %%mm0\n"
99 "pfmul %%mm5, %%mm1\n"
100 "pfmul %%mm7, %%mm3\n"
101 "pfmul %%mm7, %%mm4\n"
102 "pfadd %%mm3, %%mm0\n"
103 "pfadd %%mm4, %%mm1\n"
105 "movq %%mm0, (%%eax)\n"
106 "movq %%mm1, 1024(%%eax)\n"
115 : "a" (samples), "b" (dm_par));
117 void downmix_3f_1r_to_2ch_3dn (float *samples, dm_par_t * dm_par)
119 __asm__ __volatile__ (
122 "movl $128, %%ecx\n" /* loop counter */
124 "movd (%%ebx), %%mm5\n" /* unit */
125 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
127 "movd 4(%%ebx), %%mm6\n" /* clev */
128 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
130 "movd 8(%%ebx), %%mm7\n" /* slev */
131 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
134 "movq (%%eax), %%mm0\n" /* left */
135 "movq 2048(%%eax), %%mm1\n" /* right */
136 "movq 1024(%%eax), %%mm2\n" /* center */
137 "movq 3072(%%eax), %%mm3\n" /* sur */
138 "pfmul %%mm5, %%mm0\n"
139 "pfmul %%mm5, %%mm1\n"
140 "pfmul %%mm6, %%mm2\n"
141 "pfadd %%mm2, %%mm0\n"
142 "pfmul %%mm7, %%mm3\n"
143 "pfadd %%mm2, %%mm1\n"
144 "pfsub %%mm3, %%mm0\n"
145 "pfadd %%mm3, %%mm1\n"
147 "movq %%mm0, (%%eax)\n"
148 "movq %%mm1, 1024(%%eax)\n"
157 : "a" (samples), "b" (dm_par));
159 void downmix_2f_1r_to_2ch_3dn (float *samples, dm_par_t * dm_par)
161 __asm__ __volatile__ (
163 "movl $128, %%ecx\n" /* loop counter */
165 "movd (%%ebx), %%mm5\n" /* unit */
166 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
168 "movd 8(%%ebx), %%mm7\n" /* slev */
169 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
172 "movq (%%eax), %%mm0\n" /* left */
173 "movq 1024(%%eax), %%mm1\n" /* right */
174 "movq 2048(%%eax), %%mm3\n" /* sur */
175 "pfmul %%mm5, %%mm0\n"
176 "pfmul %%mm5, %%mm1\n"
177 "pfmul %%mm7, %%mm3\n"
178 "pfsub %%mm3, %%mm0\n"
179 "pfadd %%mm3, %%mm1\n"
181 "movq %%mm0, (%%eax)\n"
182 "movq %%mm1, 1024(%%eax)\n"
191 : "a" (samples), "b" (dm_par));
194 void downmix_3f_0r_to_2ch_3dn (float *samples, dm_par_t * dm_par)
196 __asm__ __volatile__ (
198 "movl $128, %%ecx\n" /* loop counter */
200 "movd (%%ebx), %%mm5\n" /* unit */
201 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
203 "movd 4(%%ebx), %%mm6\n" /* clev */
204 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
207 "movq (%%eax), %%mm0\n" /*left */
208 "movq 2048(%%eax), %%mm1\n" /* right */
209 "movq 1024(%%eax), %%mm2\n" /* center */
210 "pfmul %%mm5, %%mm0\n"
211 "pfmul %%mm5, %%mm1\n"
212 "pfmul %%mm6, %%mm2\n"
213 "pfadd %%mm2, %%mm0\n"
214 "pfadd %%mm2, %%mm1\n"
216 "movq %%mm0, (%%eax)\n"
217 "movq %%mm1, 1024(%%eax)\n"
226 : "a" (samples), "b" (dm_par));
229 void stream_sample_1ch_to_s16_3dn (s16 *s16_samples, float *left)
231 __asm__ __volatile__ (
235 "movl $sqrt2, %%edx\n"
236 "movd (%%edx), %%mm7\n"
237 "punpckldq %%mm7, %%mm7\n" /* sqrt2 | sqrt2 */
241 "movq (%%ebx), %%mm0\n" /* c1 | c0 */
242 "pfmul %%mm7, %%mm0\n"
244 "pf2id %%mm0, %%mm0\n" /* c1 c0 --> mm0, int_32 */
246 "packssdw %%mm0, %%mm0\n" /* c1 c1 c0 c0 --> mm0, int_16 */
248 "movq %%mm0, (%%eax)\n"
258 : "=a" (s16_samples), "=b" (left)
259 : "a" (s16_samples), "b" (left));
262 void stream_sample_2ch_to_s16_3dn (s16 *s16_samples, float *left, float *right)
265 __asm__ __volatile__ (
270 "movq (%%ebx), %%mm0\n" /* l1 | l0 */
271 "movq (%%edx), %%mm1\n" /* r1 | r0 */
272 "movq %%mm0, %%mm2\n" /* l1 | l0 */
273 "punpckldq %%mm1, %%mm0\n" /* r0 | l0 */
274 "punpckhdq %%mm1, %%mm2\n" /* r1 | l1 */
276 "pf2id %%mm0, %%mm0\n" /* r0 l0 --> mm0, int_32 */
277 "pf2id %%mm2, %%mm2\n" /* r0 l0 --> mm0, int_32 */
279 "packssdw %%mm2, %%mm0\n" /* r1 l1 r0 l0 --> mm0, int_16 */
281 "movq %%mm0, (%%eax)\n"
282 "movq %%mm2, 8(%%eax)\n"
292 : "=a" (s16_samples), "=b" (left), "=d" (right)
293 : "a" (s16_samples), "b" (left), "d" (right));