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.1 2001/05/15 16:19:42 sam 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 *****************************************************************************/
24 #define MODULE_NAME downmix3dn
25 #include "modules_inner.h"
27 /*****************************************************************************
29 *****************************************************************************/
38 #include "ac3_downmix.h"
42 __asm__ (".float 0f0.7071068");
45 void _M( downmix_3f_2r_to_2ch ) (float * samples, dm_par_t * dm_par)
47 __asm__ __volatile__ (
49 "movl $128, %%ecx\n" /* loop counter */
51 "movd (%%ebx), %%mm5\n" /* unit */
52 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
54 "movd 4(%%ebx), %%mm6\n" /* clev */
55 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
57 "movd 8(%%ebx), %%mm7\n" /* slev */
58 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
61 "movq (%%eax), %%mm0\n" /* left */
62 "movq 2048(%%eax), %%mm1\n" /* right */
63 "movq 1024(%%eax), %%mm2\n" /* center */
64 "movq 3072(%%eax), %%mm3\n" /* leftsur */
65 "movq 4096(%%eax), %%mm4\n" /* rightsur */
66 "pfmul %%mm5, %%mm0\n"
67 "pfmul %%mm5, %%mm1\n"
68 "pfmul %%mm6, %%mm2\n"
69 "pfadd %%mm2, %%mm0\n"
70 "pfadd %%mm2, %%mm1\n"
71 "pfmul %%mm7, %%mm3\n"
72 "pfmul %%mm7, %%mm4\n"
73 "pfadd %%mm3, %%mm0\n"
74 "pfadd %%mm4, %%mm1\n"
76 "movq %%mm0, (%%eax)\n"
77 "movq %%mm1, 1024(%%eax)\n"
86 : "a" (samples), "b" (dm_par));
89 void _M( downmix_2f_2r_to_2ch ) (float *samples, dm_par_t * dm_par)
91 __asm__ __volatile__ (
93 "movl $128, %%ecx\n" /* loop counter */
95 "movd (%%ebx), %%mm5\n" /* unit */
96 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
98 "movd 8(%%ebx), %%mm7\n" /* slev */
99 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
102 "movq (%%eax), %%mm0\n" /* left */
103 "movq 1024(%%eax), %%mm1\n" /* right */
104 "movq 2048(%%eax), %%mm3\n" /* leftsur */
105 "movq 3072(%%eax), %%mm4\n" /* rightsur */
106 "pfmul %%mm5, %%mm0\n"
107 "pfmul %%mm5, %%mm1\n"
108 "pfmul %%mm7, %%mm3\n"
109 "pfmul %%mm7, %%mm4\n"
110 "pfadd %%mm3, %%mm0\n"
111 "pfadd %%mm4, %%mm1\n"
113 "movq %%mm0, (%%eax)\n"
114 "movq %%mm1, 1024(%%eax)\n"
123 : "a" (samples), "b" (dm_par));
126 void _M( downmix_3f_1r_to_2ch ) (float *samples, dm_par_t * dm_par)
128 __asm__ __volatile__ (
131 "movl $128, %%ecx\n" /* loop counter */
133 "movd (%%ebx), %%mm5\n" /* unit */
134 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
136 "movd 4(%%ebx), %%mm6\n" /* clev */
137 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
139 "movd 8(%%ebx), %%mm7\n" /* slev */
140 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
143 "movq (%%eax), %%mm0\n" /* left */
144 "movq 2048(%%eax), %%mm1\n" /* right */
145 "movq 1024(%%eax), %%mm2\n" /* center */
146 "movq 3072(%%eax), %%mm3\n" /* sur */
147 "pfmul %%mm5, %%mm0\n"
148 "pfmul %%mm5, %%mm1\n"
149 "pfmul %%mm6, %%mm2\n"
150 "pfadd %%mm2, %%mm0\n"
151 "pfmul %%mm7, %%mm3\n"
152 "pfadd %%mm2, %%mm1\n"
153 "pfsub %%mm3, %%mm0\n"
154 "pfadd %%mm3, %%mm1\n"
156 "movq %%mm0, (%%eax)\n"
157 "movq %%mm1, 1024(%%eax)\n"
166 : "a" (samples), "b" (dm_par));
169 void _M( downmix_2f_1r_to_2ch ) (float *samples, dm_par_t * dm_par)
171 __asm__ __volatile__ (
173 "movl $128, %%ecx\n" /* loop counter */
175 "movd (%%ebx), %%mm5\n" /* unit */
176 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
178 "movd 8(%%ebx), %%mm7\n" /* slev */
179 "punpckldq %%mm7, %%mm7\n" /* slev | slev */
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"
191 "movq %%mm0, (%%eax)\n"
192 "movq %%mm1, 1024(%%eax)\n"
201 : "a" (samples), "b" (dm_par));
204 void _M( downmix_3f_0r_to_2ch ) (float *samples, dm_par_t * dm_par)
206 __asm__ __volatile__ (
208 "movl $128, %%ecx\n" /* loop counter */
210 "movd (%%ebx), %%mm5\n" /* unit */
211 "punpckldq %%mm5, %%mm5\n" /* unit | unit */
213 "movd 4(%%ebx), %%mm6\n" /* clev */
214 "punpckldq %%mm6, %%mm6\n" /* clev | clev */
217 "movq (%%eax), %%mm0\n" /*left */
218 "movq 2048(%%eax), %%mm1\n" /* right */
219 "movq 1024(%%eax), %%mm2\n" /* center */
220 "pfmul %%mm5, %%mm0\n"
221 "pfmul %%mm5, %%mm1\n"
222 "pfmul %%mm6, %%mm2\n"
223 "pfadd %%mm2, %%mm0\n"
224 "pfadd %%mm2, %%mm1\n"
226 "movq %%mm0, (%%eax)\n"
227 "movq %%mm1, 1024(%%eax)\n"
236 : "a" (samples), "b" (dm_par));
239 void _M( stream_sample_1ch_to_s16 ) (s16 *s16_samples, float *left)
241 __asm__ __volatile__ (
245 "movl $sqrt2_3dn, %%edx\n"
246 "movd (%%edx), %%mm7\n"
247 "punpckldq %%mm7, %%mm7\n" /* sqrt2 | sqrt2 */
251 "movq (%%ebx), %%mm0\n" /* c1 | c0 */
252 "pfmul %%mm7, %%mm0\n"
254 "pf2id %%mm0, %%mm0\n" /* c1 c0 --> mm0, int_32 */
256 "packssdw %%mm0, %%mm0\n" /* c1 c1 c0 c0 --> mm0, int_16 */
258 "movq %%mm0, (%%eax)\n"
268 : "=a" (s16_samples), "=b" (left)
269 : "a" (s16_samples), "b" (left));
272 void _M( stream_sample_2ch_to_s16 ) (s16 *s16_samples, float *left, float *right)
275 __asm__ __volatile__ (
280 "movq (%%ebx), %%mm0\n" /* l1 | l0 */
281 "movq (%%edx), %%mm1\n" /* r1 | r0 */
282 "movq %%mm0, %%mm2\n" /* l1 | l0 */
283 "punpckldq %%mm1, %%mm0\n" /* r0 | l0 */
284 "punpckhdq %%mm1, %%mm2\n" /* r1 | l1 */
286 "pf2id %%mm0, %%mm0\n" /* r0 l0 --> mm0, int_32 */
287 "pf2id %%mm2, %%mm2\n" /* r0 l0 --> mm0, int_32 */
289 "packssdw %%mm2, %%mm0\n" /* r1 l1 r0 l0 --> mm0, int_16 */
291 "movq %%mm0, (%%eax)\n"
292 "movq %%mm2, 8(%%eax)\n"
302 : "=a" (s16_samples), "=b" (left), "=d" (right)
303 : "a" (s16_samples), "b" (left), "d" (right));