1 /* OpenCP Module Player
2 * copyright (c) '94-'10 Niklas Beisert <nbeisert@physik.tu-muenchen.de>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #include <stddef.h>
20
21 #define FLAG_DISABLED (~MIXF_PLAYING)
22
23 dwmixfa_state_t dwmixfa_state;
24
25 static const float __attribute__ ((used)) clampmax=32767.0;
26 static const float __attribute__ ((used)) clampmin=-32767.0;
27 static const float __attribute__ ((used)) cremoveconst=0.992;
28 #if 1
29 #define minampl 0x38d1b717 /* float 0.0001, represented as in integer */
30 #else
31 static const float __attribute__ ((used)) minampl=0.0001;
32 #endif
33
34 #ifdef __PIC__
35 # if __GNUC_PREREQ (4, 7)
36 # define GET_PC_THUNK_STR(reg) "__x86.get_pc_thunk." #reg
37 # else
38 # define GET_PC_THUNK_STR(reg) "__i686.get_pc_thunk." #reg
39 # endif
40 #endif
41
42
start_dwmixfa(void)43 void start_dwmixfa(void)
44 {
45 __asm__ __volatile__ (
46 ".equ tempbuf_ofs, %c0\n"
47 ".equ outbuf_ofs, %c1\n"
48 ".equ nsamples_ofs, %c2\n"
49 ".equ nvoices_ofs, %c3\n"
50 ".equ freqw_ofs, %c4\n"
51 ".equ freqf_ofs, %c5\n"
52 ".equ smpposw_ofs, %c6\n"
53 ".equ smpposf_ofs, %c7\n"
54 ".equ loopend_ofs, %c8\n"
55 ".equ looplen_ofs, %c9\n"
56 :
57 : "n" (offsetof(dwmixfa_state_t, tempbuf)),
58 "n" (offsetof(dwmixfa_state_t, outbuf)),
59 "n" (offsetof(dwmixfa_state_t, nsamples)),
60 "n" (offsetof(dwmixfa_state_t, nvoices)),
61 "n" (offsetof(dwmixfa_state_t, freqw[0])),
62 "n" (offsetof(dwmixfa_state_t, freqf[0])),
63 "n" (offsetof(dwmixfa_state_t, smpposw[0])),
64 "n" (offsetof(dwmixfa_state_t, smpposf[0])),
65 "n" (offsetof(dwmixfa_state_t, loopend[0])),
66 "n" (offsetof(dwmixfa_state_t, looplen[0]))
67 );
68 __asm__ __volatile__ (
69 ".equ volleft_ofs, %c0\n"
70 ".equ volright_ofs, %c1\n"
71 ".equ rampleft_ofs, %c2\n"
72 ".equ rampright_ofs, %c3\n"
73 ".equ voiceflags_ofs, %c4\n"
74 ".equ ffreq_ofs, %c5\n"
75 ".equ freso_ofs, %c6\n"
76 ".equ fadeleft_ofs, %c7\n"
77 ".equ faderight_ofs, %c8\n"
78 ".equ fl1_ofs, %c9\n"
79 :
80 : "n" (offsetof(dwmixfa_state_t, volleft[0])),
81 "n" (offsetof(dwmixfa_state_t, volright[0])),
82 "n" (offsetof(dwmixfa_state_t, rampleft[0])),
83 "n" (offsetof(dwmixfa_state_t, rampright[0])),
84 "n" (offsetof(dwmixfa_state_t, voiceflags[0])),
85 "n" (offsetof(dwmixfa_state_t, ffreq[0])),
86 "n" (offsetof(dwmixfa_state_t, freso[0])),
87 "n" (offsetof(dwmixfa_state_t, fadeleft)),
88 "n" (offsetof(dwmixfa_state_t, faderight)),
89 "n" (offsetof(dwmixfa_state_t, fl1[0]))
90 );
91 __asm__ __volatile__ (
92 ".equ fb1_ofs, %c0\n"
93 ".equ isstereo_ofs, %c1\n"
94 ".equ outfmt_ofs, %c2\n"
95 ".equ voll_ofs, %c3\n"
96 ".equ volr_ofs, %c4\n"
97 ".equ ct0_ofs, %c5\n"
98 ".equ ct1_ofs, %c6\n"
99 ".equ ct2_ofs, %c7\n"
100 ".equ ct3_ofs, %c8\n"
101 ".equ postprocs_ofs, %c9\n"
102 :
103 : "n" (offsetof(dwmixfa_state_t, fb1[0])),
104 "n" (offsetof(dwmixfa_state_t, isstereo)),
105 "n" (offsetof(dwmixfa_state_t, outfmt)),
106 "n" (offsetof(dwmixfa_state_t, voll)),
107 "n" (offsetof(dwmixfa_state_t, volr)),
108 "n" (offsetof(dwmixfa_state_t, ct0[0])),
109 "n" (offsetof(dwmixfa_state_t, ct1[0])),
110 "n" (offsetof(dwmixfa_state_t, ct2[0])),
111 "n" (offsetof(dwmixfa_state_t, ct3[0])),
112 "n" (offsetof(dwmixfa_state_t, postprocs))
113 );
114 __asm__ __volatile__ (
115 ".equ samprate_ofs, %c0\n"
116 ".equ volrl_ofs, %c1\n"
117 ".equ volrr_ofs, %c2\n"
118 ".equ clipval_ofs, %c3\n"
119 ".equ mixlooplen_ofs, %c4\n"
120 ".equ looptype_ofs, %c5\n"
121 ".equ magic1_ofs, %c6\n"
122 ".equ ffrq_ofs, %c7\n"
123 ".equ frez_ofs, %c8\n"
124 :
125 : "n" (offsetof(dwmixfa_state_t, samprate)),
126 "n" (offsetof(dwmixfa_state_t, volrl)),
127 "n" (offsetof(dwmixfa_state_t, volrr)),
128 "n" (offsetof(dwmixfa_state_t, clipval)),
129 "n" (offsetof(dwmixfa_state_t, mixlooplen)),
130 "n" (offsetof(dwmixfa_state_t, looptype)),
131 "n" (offsetof(dwmixfa_state_t, magic1)),
132 "n" (offsetof(dwmixfa_state_t, ffrq)),
133 "n" (offsetof(dwmixfa_state_t, frez))
134 );
135 __asm__ __volatile__ (
136 ".equ __fl1_ofs, %c0\n"
137 ".equ __fb1_ofs, %c1\n"
138 :
139 : "n" (offsetof(dwmixfa_state_t, __fl1)),
140 "n" (offsetof(dwmixfa_state_t, __fb1))
141 );
142 #if 0
143 volrl=volrl;
144 volrr=volrr;
145 eins=eins;
146 minuseins=minuseins;
147 clampmin=clampmin;
148 clampmax=clampmax;
149 cremoveconst=cremoveconst;
150 minampl=minampl;
151 magic1=magic1;
152 clipval=clipval;
153 mixlooplen=mixlooplen;
154 looptype=looptype;
155 ffrq=ffrq;
156 frez=frez;
157 __fl1=__fl1;
158 __fb1=__fb1;
159 #endif
160 }
161
162 #include <string.h>
prepare_mixer(void)163 void prepare_mixer (void)
164 {
165 #if 0
166 dwmixfa_state.fadeleft = 0;
167 dwmixfa_state.faderight = 0;
168 dwmixfa.volrl = 0;
169 dwmixfa.volrr = 0;
170 memset(dwmixfa_state.volleft, 0, sizeof (dwmixfa_state.volleft));
171 memset(dwmixfa_state.volright, 0, sizeof (dwmixfa_state.volright));
172 #endif
173 __asm__ __volatile__
174 (
175 #ifdef __PIC__
176 /* save EBX, and setup EBX PIC, probably overkill, since we are in the same .so file as the caller.... */
177 /* store pointer to dwmixfa_state into EBX. Non PIC code already has this in place from stub */
178 "pushl %%ebx\n"
179
180 "call " GET_PC_THUNK_STR(bx) "\n"
181 "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n"
182 "movl dwmixfa_state@GOT(%%ebx), %%ebx\n"
183 #endif
184
185 /* clear EAX */
186 "xorl %%eax, %%eax\n"
187
188 /* Clear private volrl and volrr */
189 "movl %%eax, volrl_ofs(%%ebx)\n" /* volrl is not in global struct */
190 "movl %%eax, volrr_ofs(%%ebx)\n" /* volrr is not in glocal struct */
191
192 /* clear dwmixfa_state.fadeleft and dwmixfa_state.faderight */
193 "movl %%eax, fadeleft_ofs(%%ebx)\n" /* fadeleft */
194 "movl %%eax, faderight_ofs(%%ebx)\n" /* faderight */
195
196 /* clear ECX, and count up to MAXVOICES */
197 "xorl %%ecx, %%ecx\n"
198 "prepare_mixer_fillloop:\n"
199 /* clear dwmixfa_state.volleft[] and dwmixfa_state.volright[] */
200 "movl %%eax, volleft_ofs(%%ebx,%%ecx,4)\n" /* volleft */
201 "movl %%eax, volright_ofs(%%ebx,%%ecx,4)\n" /* volright */
202 "incl %%ecx\n"
203 "cmpl %0, %%ecx\n" /* MAXVOICES */
204 "jne prepare_mixer_fillloop\n"
205 #ifdef __PIC__
206 /* restore EBX */
207 "pop %%ebx\n"
208 #endif
209
210 :
211 : "n" (MAXVOICES)
212 #ifndef __PIC__
213 ,"b" (&dwmixfa_state)
214 #endif
215 : "eax", "ecx"
216 );
217 }
218
mixer(void)219 void mixer (void)
220 {
221 #ifdef DEBUG
222 fprintf(stderr, "mixer()");
223 fprintf(stderr, "tempbuf=%p\n", tempbuf);
224 fprintf(stderr, "outbuf=%p\n", outbuf);
225 fprintf(stderr, "nsamples=%d (samples to mix)\n", (int)nsamples);
226 fprintf(stderr, "nvoices=%d (voices to mix)\n", (int)nvoices);
227 {
228 int i;
229 for (i=0;i<nvoices;i++)
230 {
231 fprintf(stderr, "freqw.f[%d]=%u.%u\n", i, (unsigned int)freqw[i], (unsigned int)freqf[i]);
232 fprintf(stderr, "smpposw.f[%d]=%p.%u\n", i, smpposw[i], (unsigned int)smpposf[i]);
233 fprintf(stderr, "loopend[%d]=%p\n", i, loopend[i]);
234 fprintf(stderr, "looplen[%d]=%u\n", i, (unsigned int)looplen[i]);
235 fprintf(stderr, "volleft[%d]=%f\n", i, volleft[i]);
236 fprintf(stderr, "volright[%d]=%f\n", i, volright[i]);
237 fprintf(stderr, "rampleft[%d]=%f\n", i, rampleft[i]);
238 fprintf(stderr, "rampright[%d]=%f\n", i, rampright[i]);
239 fprintf(stderr, "voiceflags[%d]=0x%08x\n", i, (unsigned int)voiceflags[i]);
240 fprintf(stderr, "ffreq[%d]=%f\n", i, ffreq[i]);
241 fprintf(stderr, "freso[%d]=%f\n", i, freso[i]);
242 fprintf(stderr, "fl1[%d]=%f\n", i, fl1[i]);
243 fprintf(stderr, "fb1[%d]=%f\n", i, fb1[i]);
244 }
245 }
246 fprintf(stderr, "fadeleft=%f\n", fadeleft);
247 fprintf(stderr, "faderight=%f\n", faderight);
248 fprintf(stderr, "isstereo=%d\n", isstereo);
249 fprintf(stderr, "outfmt=%d\n", outfmt);
250 /* ct0, ct1, ct2, ct3 */
251 fprintf(stderr, "\n");
252 #endif
253
254 __asm__ __volatile__
255 (
256 #ifdef __PIC__
257 "pushl %%ebx\n"
258 "call " GET_PC_THUNK_STR(bx) "\n"
259 "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n"
260 "pushl %%ebx\n"
261 "movl dwmixfa_state@GOT(%%ebx), %%ebx\n"
262 #else
263 "movl $dwmixfa_state, %%ebx\n"
264 #endif
265 "pushl %%ebp\n"
266
267 "finit\n"
268
269
270 /* STACK: +4 (optional) caller EBX (PIC)
271 +0 caller EBP
272 */
273 /* range check for declick values */
274 " xorl %%edx, %%edx\n"
275 " movl fadeleft_ofs(%%ebx), %%eax\n"
276 " andl $0x7fffffff, %%eax\n"
277 #if 1
278 " cmpl %1, %%eax\n" /* %1 == minampl */
279 #else
280 " cmpl minampl, %%eax\n"
281 #endif
282 " jbe mixer_nocutfl\n"
283 " movl %%edx, fadeleft_ofs(%%ebx)\n"
284 " mixer_nocutfl:\n"
285 " movl faderight_ofs(%%ebx), %%eax\n"
286 " andl $0x7fffffff, %%eax\n"
287 #if 1
288 " cmpl %1, %%eax\n" /* %1 == minampl */
289 #else
290 " cmpl minampl, %%eax\n"
291 #endif
292 " jbe mixer_nocutfr\n"
293 " movl %%edx, faderight_ofs(%%ebx)\n"
294 " mixer_nocutfr:\n"
295
296 /* clear and declick buffer */
297 " movl tempbuf_ofs(%%ebx), %%edi\n"
298 " movl nsamples_ofs(%%ebx), %%ecx\n"
299 " orl %%ecx, %%ecx\n"
300 " jz mixer_endall\n"
301 " movl isstereo_ofs(%%ebx), %%eax\n" /* STEREO DEP 1 EAX */
302 " orl %%eax, %%eax\n" /* STEREO DEP 1 EAX */
303 " jnz mixer_clearst\n" /* STEREO DEP 1 BRANCH */
304 " call clearbufm\n" /* STEREO DEP 1 BRANCH */
305 " jmp mixer_clearend\n" /* STEREO DEP 1 BRANCH */
306 " mixer_clearst:\n" /* STEREO DEP 1 BRANCH */
307 " call clearbufs\n" /* STEREO DEP 1 BRANCH */
308 " mixer_clearend:\n" /* STEREO DEP 1 BRANCH */
309
310 " movl nvoices_ofs(%%ebx), %%ecx\n"
311 " decl %%ecx\n"
312
313 " mixer_MixNext:\n"
314 " movl voiceflags_ofs(%%ebx,%%ecx,4), %%eax\n" /* VOICEFLAGS DEP 2 EAX */
315 " testl %0, %%eax\n" /* VOICEFLAGS DEP 2 EAX */
316 " jz mixer_SkipVoice\n" /* VOICEFLAGS DEP 2 BRANCH */
317
318 /* set loop type */
319 " movl %%eax, looptype_ofs(%%ebx)\n" /* VOICEFLAGS DEP 2 EAX,LOOPTYPE */
320
321 /* calc l/r relative vols from vol/panning/amplification */
322 " movl volleft_ofs(%%ebx,%%ecx,4), %%eax\n"
323 " movl volright_ofs(%%ebx,%%ecx,4), %%edx\n"
324 " movl %%eax, voll_ofs(%%ebx)\n"
325 " movl %%edx, volr_ofs(%%ebx)\n"
326
327 " movl rampleft_ofs(%%ebx,%%ecx,4), %%eax\n"
328 " movl rampright_ofs(%%ebx,%%ecx,4), %%edx\n"
329 " movl %%eax, volrl_ofs(%%ebx)\n"
330 " movl %%edx, volrr_ofs(%%ebx)\n"
331
332 /* set up filter vals */
333 " movl ffreq_ofs(%%ebx,%%ecx,4), %%eax\n"
334 " movl %%eax, ffrq_ofs(%%ebx)\n"
335 " movl freso_ofs(%%ebx,%%ecx,4), %%eax\n"
336 " movl %%eax, frez_ofs(%%ebx)\n"
337 " movl fl1_ofs(%%ebx,%%ecx,4), %%eax\n"
338 " movl %%eax, __fl1_ofs(%%ebx)\n"
339 " movl fb1_ofs(%%ebx,%%ecx,4), %%eax\n"
340 " movl %%eax, __fb1_ofs(%%ebx)\n"
341
342 /* length of loop */
343 " movl looplen_ofs(%%ebx,%%ecx,4), %%eax\n"
344 " movl %%eax, mixlooplen_ofs(%%ebx)\n"
345
346 /* sample delta: */
347
348 " movl freqf_ofs(%%ebx,%%ecx,4), %%esi\n" /* this used to be be sent as ESI parameter */
349 " pushl %%esi\n"
350 " movl freqw_ofs(%%ebx,%%ecx,4), %%esi\n" /* this used to configure ebx, we just store it on the stack for now */
351 " pushl %%esi\n"
352 /* STACK: +16 (optional) caller EBX (PIC)
353 +12 (optional) PIC
354 +8 caller EBP
355 +4 freqf_ofs parameter (used to be ESI)
356 +0 freqw_ofs parameter (used to be EBX)
357 */
358
359 /* Sample base Pointer */
360 " movl smpposw_ofs(%%ebx,%%ecx,4), %%eax\n"
361 " movl smpposf_ofs(%%ebx,%%ecx,4), %%edx\n"
362
363 /* Loop end Pointer */
364 " movl loopend_ofs(%%ebx,%%ecx,4), %%ebp\n"
365
366
367 " movl tempbuf_ofs(%%ebx), %%edi\n"
368
369 #warning ISSTEREO is masked in at reserved input bit for now...
370 " pushl %%ecx\n"
371 /* STACK: +20 (optional) caller EBX (PIC)
372 +16 (optional) PIC
373 +12 caller EBP
374 +8 freqf_ofs parameter (used to be ESI)
375 +4 freqw_ofs parameter (used to be EBX)
376 +0 saved ECX
377 */
378 " movl isstereo_ofs(%%ebx), %%ecx\n" /* STEREO DEP 3, ECX */
379 " orl voiceflags_ofs(%%ebx,%%ecx,4), %%ecx\n" /* VOICEFLAGS,STEREO DEP 3, ECX.. we can use looptype instead, less complex */
380 " andl $15, %%ecx\n"
381 #ifdef __PIC__
382 " movl 16(%%esp), %%esi\n"
383 " movl mixers@GOTOFF(%%esi, %%ecx, 4), %%ecx\n"
384 #else
385 " movl mixers(,%%ecx,4), %%ecx\n" /* VOICEFLAGS,STEREO,MIXERS DEP 3,ECX */
386 #endif
387
388 /* sample base ptr fraction part */
389 " call *%%ecx\n" /* this call modifies LOOPTYPE */
390
391 " popl %%ecx\n"
392
393 /* STACK: +16 (optional) caller EBX (PIC)
394 +12 (optional) PIC
395 +8 caller EBP
396 +4 freqw_ofs parameter (used to be EBX)
397 +0 freqw_ofs parameter (used to be EBX)
398 */
399 #if 1
400 " addl $8, %%esp\n" /* popl and discard the two top entries on the stack */
401 #else
402 " popl %%ebp\n" /* we have two "junk" on the stack we need to remove, and this register is free */
403 " popl %%ebp\n" /* we have one "junk" on the stack we need to remove, and this register is free */
404 #endif
405 /* STACK: +4 (optional) caller EBX (PIC)
406 +8 (optional) PIC
407 +0 caller EBP
408 */
409 /* calculate sample relative position */
410 " movl %%eax, smpposw_ofs(%%ebx,%%ecx,4)\n"
411 " movl %%edx, smpposf_ofs(%%ebx,%%ecx,4)\n"
412
413 /* update flags */
414 " movl looptype_ofs(%%ebx), %%eax\n" /* VOICEFLAG DEP 4, EAX */
415 " movl %%eax, voiceflags_ofs(%%ebx,%%ecx,4)\n"/* VOICEFLAG DEP 4, EAX,VOICEFLAGS (copy back from LOOPTYPE) */
416
417 /* update volumes */
418 " movl voll_ofs(%%ebx), %%eax\n"
419 " movl %%eax, volleft_ofs(%%ebx,%%ecx,4)\n"
420 " movl volr_ofs(%%ebx), %%eax\n"
421 " movl %%eax, volright_ofs(%%ebx,%%ecx,4)\n"
422
423 /* update filter buffers */
424 " movl __fl1_ofs(%%ebx), %%eax\n"
425 " movl %%eax, fl1_ofs(%%ebx,%%ecx,4)\n"
426 " movl __fb1_ofs(%%ebx), %%eax\n"
427 " movl %%eax, fb1_ofs(%%ebx,%%ecx,4)\n"
428
429 " mixer_SkipVoice:\n"
430 " decl %%ecx\n"
431 " jns mixer_MixNext\n"
432
433 /* ryg990504 - changes for floatpostprocs start here */
434
435 /* how parameters are sent needs to be redone for gcc
436 *
437 * (and even gcc can been overriden for an arch due to optimization)
438 * - Stian TODO TODO TODO TODO
439 */
440 #warning this needs to be updated into more generic code
441 " movl postprocs_ofs(%%ebx), %%esi\n"
442
443 " mixer_PostprocLoop:\n"
444 " orl %%esi, %%esi\n"
445 " jz mixer_PostprocEnd\n"
446
447 " movl nsamples_ofs(%%ebx), %%edx\n"
448 " movl isstereo_ofs(%%ebx), %%ecx\n"
449 " movl tempbuf_ofs(%%ebx), %%eax\n"
450 " pushl %%ebx\n"
451 " movl samprate_ofs(%%ebx), %%ebx\n"
452 " call *%%esi\n"
453 " popl %%ebx\n"
454
455 " movl %c2(%%esi), %%esi\n"
456
457 " jmp mixer_PostprocLoop\n"
458
459 "mixer_PostprocEnd:\n"
460
461 /* ryg990504 - changes for floatpostprocs end here */
462 " movl outbuf_ofs(%%ebx), %%edi\n"
463 " movl tempbuf_ofs(%%ebx), %%esi\n"
464 " movl nsamples_ofs(%%ebx), %%ecx\n"
465
466 " movl isstereo_ofs(%%ebx), %%edx\n"
467 " orl %%edx, %%edx\n"
468 " jz mixer_clipmono\n"
469 " addl %%ecx, %%ecx\n"
470 "mixer_clipmono:\n"
471
472 " movl outfmt_ofs(%%ebx), %%eax\n"
473 #ifdef __PIC__
474 " movl 4(%%esp), %%ebx\n" /* put PIC in EBX */
475 " movl clippers@GOTOFF(%%ebx,%%eax,4), %%eax\n"
476 #else
477 " movl clippers(,%%eax,4), %%eax\n"
478 #endif
479
480 " call *%%eax\n"
481
482 "mixer_endall:\n"
483 "popl %%ebp\n"
484 #ifdef __PIC__
485 "popl %%ebx\n"
486 "popl %%ebx\n"
487 #endif
488 :
489 : "n"(MIXF_PLAYING),
490 "n"(minampl),
491 "n"(offsetof(struct mixfpostprocregstruct, next))
492 #ifdef __PIC__
493 : "memory", "eax", "ecx", "edx", "edi", "esi"
494 #else
495 : "memory", "eax", "ebx", "ecx", "edx", "edi", "esi"
496 #endif
497 );
498 }
499
dummy(void)500 static __attribute__ ((used)) void dummy(void)
501 {
502 __asm__ __volatile__
503 (
504 ".cfi_endproc\n"
505 );
506
507 /* clear routines:
508 * edi : 32 bit float buffer
509 * ecx : # of samples
510 *
511 * STACK
512 *
513 * +12 caller EBX if defined(__PIC__)
514 * +8 PIC if defined(__PIC__)
515 * +4 caller EBP
516 * +0 return ptr
517 */
518
519 /* clears and declicks tempbuffer (mono) */
520 __asm__ __volatile__
521 (
522 ".type clearbufm, @function\n"
523 "clearbufm:\n"
524 ".cfi_startproc\n"
525 ".cfi_def_cfa_offset 4\n"
526 #ifdef __PIC__
527 "pushl %ebx\n"
528 "movl 12(%esp), %ebx\n"
529 "flds cremoveconst@GOTOFF(%ebx)\n"
530 "popl %ebx\n"
531 #else
532 "flds cremoveconst\n" /* (fc) */
533 #endif
534 "flds fadeleft_ofs(%ebx)\n" /* (fl) (fc) */
535
536 "clearbufm_clloop:\n"
537 " fsts (%edi)\n"
538 " fmul %st(1),%st\n" /* (fl') (fc) */
539 " leal 4(%edi), %edi\n"
540 " decl %ecx\n"
541 "jnz clearbufm_clloop\n"
542
543 "fstps fadeleft_ofs(%ebx)\n" /* (fc) */
544 "fstp %st\n" /* - */
545
546 "ret\n"
547 ".cfi_endproc\n"
548 ".size clearbufm, .-clearbufm\n"
549 );
550
551
552 /* clears and declicks tempbuffer (stereo)
553 * edi : 32 bit float buffer
554 * ecx : # of samples
555 */
556 __asm__ __volatile__
557 (
558 ".type clearbufs, @function\n"
559 "clearbufs:\n"
560 ".cfi_startproc\n"
561 ".cfi_def_cfa_offset 4\n"
562 #ifdef __PIC__
563 "pushl %ebx\n"
564 "movl 12(%esp), %ebx\n"
565 "flds cremoveconst@GOTOFF(%ebx)\n"
566 "popl %ebx\n"
567 #else
568 "flds cremoveconst\n" /* (fc) */
569 #endif
570 "flds faderight_ofs(%ebx)\n" /* (fr) (fc) */
571 "flds fadeleft_ofs(%ebx)\n" /* (fl) (fr) (fc) */
572
573 "clearbufs_clloop:\n"
574 " fsts (%edi)\n"
575 " fmul %st(2), %st\n" /* (fl') (fr) (fc) */
576 " fxch %st(1)\n" /* (fr) (fl') (fc) */
577 " fsts 4(%edi)\n"
578 " fmul %st(2), %st\n" /* (fr') (fl') (fc) */
579 " fxch %st(1)\n" /* (fl') (fr') (fc) */
580 " leal 8(%edi),%edi\n"
581 " decl %ecx\n"
582 "jnz clearbufs_clloop\n"
583
584 "fstps fadeleft_ofs(%ebx)\n" /* (fr') (fc) */
585 "fstps faderight_ofs(%ebx)\n" /* (fc) */
586 "fstp %st\n" /* - */
587
588 "ret\n"
589 ".cfi_endproc\n"
590 ".size clearbufs, .-clearbufs\n"
591 );
592
593 /* STACK: +20 (optional) caller EBX (PIC)
594 +16 caller EBP
595 +12 freqf_ofs parameter (used to be ESI)
596 +8 freqw_ofs parameter (used to be EBX)
597 +4 saved ECX
598 +0 caller return address
599 * mixing routines:
600 * eax = sample loop length.
601 * ebx = dwmixfa_state, used to be delta to next sample (whole part)
602 * ecx = # of samples to mix
603 * edx = fraction of sample position
604 * edi = dest ptr auf outbuffer
605 * esi = PIC if in PIC mode (not used at the momement)
606 * ebp = ptr to loop end
607 */
608
609 __asm__ __volatile__
610 (
611 ".type mix_0, @function\n"
612 "mix_0:\n"
613 ".cfi_startproc\n"
614 ".cfi_def_cfa_offset 4\n"
615 /* mixing, MUTED
616 * quite sub-obtimal to do this with a loop, too, but this is really
617 * the only way to ensure maximum precision - and it's fully using
618 * the vast potential of the coder's lazyness.
619 */
620 "movl nsamples_ofs(%%ebx), %%ecx\n"
621 "shrl $2, %%ebp\n"
622 "pushl %%ebp\n"
623 "movl %%eax, %%ebp\n"
624 "shrl $2, %%ebp\n"
625 "mix_0_next:\n"
626 " addl 16(%%esp), %%edx\n"
627 " adcl 12(%%esp), %%ebp\n"
628 "mix_0_looped:\n"
629 " cmpl (%%esp), %%ebp\n"
630 " jae mix_0_LoopHandler\n"
631 " decl %%ecx\n"
632 "jnz mix_0_next\n"
633 "mix_0_ende:\n"
634 "shll $2, %%ebp\n"
635 "movl %%ebp, %%eax\n"
636 "popl %%ecx\n" /* just a garbage register */
637 "ret\n"
638 "mix_0_LoopHandler:\n"
639 "movl looptype_ofs(%%ebx), %%eax\n"
640 "testl %0, %%eax\n"
641 "jnz mix_0_loopme\n"
642 /*"movl looptype_ofs(%%ebx), %%eax\n"*/
643 "andl %1, %%eax\n"
644 "movl %%eax, looptype_ofs(%%ebx)\n"
645 "jmp mix_0_ende\n"
646 "mix_0_loopme:\n"
647 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
648 "jmp mix_0_looped\n"
649 ".cfi_endproc\n"
650 ".size mix_0, .-mix_0\n"
651 :
652 : "n"(MIXF_LOOPED),
653 "n"(FLAG_DISABLED)
654 );
655
656 __asm__ __volatile__
657 (
658 ".type mixm_n, @function\n"
659 "mixm_n:\n"
660 ".cfi_startproc\n"
661 ".cfi_def_cfa_offset 4\n"
662 /* mixing, mono w/o interpolation
663 */
664 "movl nsamples_ofs(%%ebx), %%ecx\n"
665 "flds voll_ofs(%%ebx)\n" /* (vl) */
666 "shrl $2, %%ebp\n"
667 "pushl %%ebp\n"
668 "movl %%eax, %%ebp\n"
669 "shrl $2, %%ebp\n"
670 /* align dword we don't need.. alignment is 32bit by default on gnu i386*/
671 "mixm_n_next:\n" /* (vl) */
672 " flds (,%%ebp,4)\n" /* (wert) (vl) */
673 " fld %%st(1)\n" /* (vl) (wert) (vl) */
674 " addl 16(%%esp), %%edx\n"
675 " leal 4(%%edi), %%edi\n"
676 " adcl 12(%%esp), %%ebp\n"
677 " fmulp %%st, %%st(1)\n" /* (left) (vl) */
678 " fxch %%st(1)\n" /* (vl) (left) */
679 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) */
680 " fxch %%st(1)\n" /* (left) (vl) */
681 " fadds -4(%%edi)\n" /* (lfinal) (vl') */
682 "mixm_n_looped:\n"
683 " cmpl (%%esp), %%ebp\n"
684 " jae mixm_n_LoopHandler\n"
685 " fstps -4(%%edi)\n" /* (vl') (-1) */
686 " decl %%ecx\n"
687 "jnz mixm_n_next\n"
688 "mixm_n_ende:\n"
689 "fstps voll_ofs(%%ebx)\n" /* - */
690 "shll $2, %%ebp\n"
691 "movl %%ebp, %%eax\n"
692 "popl %%ecx\n" /* just a garbage register */
693 "ret\n"
694
695 "mixm_n_LoopHandler:\n"
696 "fstps -4(%%edi)\n" /* (vl') */
697 "movl looptype_ofs(%%ebx), %%eax\n"
698 "testl %0, %%eax\n"
699 "jnz mixm_n_loopme\n"
700 "subl 16(%%esp), %%edx\n"
701 "sbbl 12(%%esp), %%ebp\n"
702 "flds (,%%ebp,4)\n" /* (wert) (vl) */
703 "mixm_n_fill:\n" /* sample ends -> fill rest of buffer with last sample value */
704 " fld %%st(1)\n" /* (vl) (wert) (vl) */
705 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) */
706 " fadds -4(%%edi)\n" /* (wert) (vl) */
707 " fstps -4(%%edi)\n" /* (wert) (vl) */
708 " fxch %%st(1)\n" /* (vl) (wert) */
709 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) */
710 " fxch %%st(1)\n" /* (wert) (vl') */
711 " leal 4(%%edi), %%edi\n"
712 " decl %%ecx\n"
713 "jnz mixm_n_fill\n"
714 /* update click-removal fade values */
715 "fmul %%st(1), %%st\n" /* (left) (vl) */
716 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) */
717 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) */
718 "movl looptype_ofs(%%ebx), %%eax\n"
719 "andl %1, %%eax\n"
720 "movl %%eax, looptype_ofs(%%ebx)\n"
721 "jmp mixm_n_ende\n"
722
723 "mixm_n_loopme:\n" /* sample loops -> jump to loop start */
724 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
725 " cmpl (%%esp), %%ebp\n"
726 "jae mixm_n_loopme\n"
727 "decl %%ecx\n"
728 "jz mixm_n_ende\n"
729 "jmp mixm_n_next\n"
730 ".cfi_endproc\n"
731 ".size mixm_n, .-mixm_n\n"
732 :
733 : "n"(MIXF_LOOPED),
734 "n"(FLAG_DISABLED)
735 );
736
737 __asm__ __volatile__
738 (
739 ".type mixs_n, @function\n"
740 "mixs_n:\n"
741 ".cfi_startproc\n"
742 ".cfi_def_cfa_offset 4\n"
743 /* mixing, stereo w/o interpolation
744 */
745 "movl nsamples_ofs(%%ebx), %%ecx\n"
746 "flds voll_ofs(%%ebx)\n" /* (vl) */
747 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) */
748 "shrl $2, %%ebp\n"
749 "pushl %%ebp\n"
750 "movl %%eax, %%ebp\n"
751 "shrl $2, %%ebp\n"
752 /* align dword.... we are already align 32bit */
753 "mixs_n_next:\n"
754 " flds (,%%ebp,4)\n" /* (wert) (vr) (vl) */
755 " addl 16(%%esp), %%edx\n"
756 " leal 8(%%edi), %%edi\n"
757 " adcl 12(%%esp), %%ebp\n"
758 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) */
759 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) */
760 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) */
761 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) */
762 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) */
763 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) */
764 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) */
765 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) */
766 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) */
767 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') */
768 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') */
769 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') */
770 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') */
771 "mixs_n_looped:\n"
772 " cmpl (%%esp), %%ebp\n"
773 " jae mixs_n_LoopHandler\n"
774 /* hier 1 cycle frei */
775 " fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
776 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
777 " fstps -8(%%edi)\n" /* (vl) (vr) */
778 " fxch %%st(1)\n" /* (vr) (vl) */
779 " decl %%ecx\n"
780 "jnz mixs_n_next\n"
781 "mixs_n_ende:\n"
782 "fstps volr_ofs(%%ebx)\n" /* (vl) */
783 "fstps voll_ofs(%%ebx)\n" /* - */
784 "shll $2, %%ebp\n"
785 "movl %%ebp, %%eax\n"
786 "popl %%ecx\n" /* just a garbage register */
787 "ret\n"
788
789 "mixs_n_LoopHandler:\n"
790 "fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
791 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
792 "fstps -8(%%edi)\n" /* (vl) (vr) */
793 "fxch %%st(1)\n" /* (vr) (vl) */
794 "movl looptype_ofs(%%ebx), %%eax\n"
795 "testl %0, %%eax\n"
796 "jnz mixs_n_loopme\n"
797 "fxch %%st(1)\n" /* (vl) (vr) */
798 "subl 16(%%esp), %%edx\n"
799 "sbbl 12(%%esp), %%ebp\n"
800 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
801 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
802 "mixs_n_fill:\n" /* sample ends -> fill rest of buffer with last sample value */
803 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
804 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
805 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
806 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
807 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
808 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
809 " fadds -8(%%edi)\n"
810 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
811 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
812 " fadds -4(%%edi)\n"
813 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
814 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
815 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
816 " leal 8(%%edi), %%edi\n"
817 " decl %%ecx\n"
818 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
819 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
820 "jnz mixs_n_fill\n"
821 /* update click-removal fade values */
822 "fxch %%st(2)\n" /* (wert) (vl) (vr) */
823 "fld %%st\n" /* (wert) (wert) (vl) (vr) */
824 "fmul %%st(2), %%st\n" /* (left) (wert) (vl) (vr) */
825 "fxch %%st(1)\n" /* (wert) (left) (vl) (vr) */
826 "fmul %%st(3), %%st\n" /* (rite) (left) (vl) (vr) */
827 "fxch %%st(1)\n" /* (left) (rite) (vl) (vr) */
828 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vl) (vr) */
829 "fxch %%st(1)\n" /* (rite) (fl') (vl) (vr) */
830 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vl) (vr) */
831 "fxch %%st(1)\n" /* (fl') (fr') (vl) (vr) */
832 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vl) (vr) */
833 "fstps faderight_ofs(%%ebx)\n" /* (vl) (vr) */
834 "fxch %%st(1)\n" /* (vr) (vl) */
835 "movl looptype_ofs(%%ebx), %%eax\n"
836 "andl %1, %%eax\n"
837 "movl %%eax, looptype_ofs(%%ebx)\n"
838 "jmp mixs_n_ende\n"
839
840 "mixs_n_loopme:\n"
841 /* sample loops -> jump to loop start */
842 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
843 " cmpl (%%esp), %%ebp\n"
844 "jae mixs_n_loopme\n"
845 "decl %%ecx\n"
846 "jz mixs_n_ende\n"
847 "jmp mixs_n_next\n"
848 ".cfi_endproc\n"
849 ".size mixs_n, .-mixs_n\n"
850 :
851 : "n"(MIXF_LOOPED),
852 "n"(FLAG_DISABLED)
853 );
854
855 __asm__ __volatile__
856 (
857 ".type mixm_i, @function\n"
858 "mixm_i:\n"
859 ".cfi_startproc\n"
860 ".cfi_def_cfa_offset 4\n"
861 /* mixing, mono+interpolation */
862 "movl nsamples_ofs(%%ebx), %%ecx\n"
863 #if 1
864 "fld1\n" /* (1) */
865 "fchs\n" /* (-1) */
866 #else
867 "flds minuseins\n" /* (-1) */
868 #endif
869 "flds voll_ofs(%%ebx)\n" /* (vl) (-1) */
870 "shrl $2, %%ebp\n"
871 "pushl %%ebp\n"
872 "movl %%eax, %%ebp\n"
873 "movl %%edx, %%eax\n"
874 "shrl $9, %%eax\n"
875 "shrl $2, %%ebp\n"
876 "orl $0x3f800000, %%eax\n"
877 "movl %%eax, magic1_ofs(%%ebx)\n"
878
879 /* align dword... we don't need to align shit here? */
880 "mixm_i_next:\n" /* (vl) (-1) */
881 " flds 0(,%%ebp,4)\n" /* (a) (vl) (-1) */
882 " fld %%st(0)\n" /* (a) (a) (vl) (-1) */
883 " fld %%st(3)\n" /* (-1) (a) (a) (vl) (-1) */
884 " fadds magic1_ofs(%%ebx)\n" /* (t) (a) (a) (vl) (-1) */
885 " fxch %%st(1)\n" /* (a) (t) (a) (vl) (-1) */
886 " fsubrs 4(,%%ebp,4)\n" /* (b-a) (t) (a) (vl) (-1) */
887 " addl 16(%%esp), %%edx\n"
888 " leal 4(%%edi), %%edi\n"
889 " adcl 12(%%esp), %%ebp\n"
890 " fmulp %%st(1)\n" /* ((b-a)*t) (a) (vl) (-1) */
891 " movl %%edx, %%eax\n"
892 " shrl $9, %%eax\n"
893 " faddp %%st(1)\n" /* (wert) (vl) (-1) */
894 " fld %%st(1)\n" /* (vl) (wert) (vl) (-1) */
895 " fmulp %%st, %%st(1)\n" /* (left) (vl) (-1) */
896 " fxch %%st(1)\n" /* (vl) (left) (-1) */
897 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) (-1) */
898 " fxch %%st(1)\n" /* (left) (vl) (-1) */
899 " fadds -4(%%edi)\n" /* (lfinal) (vl') (-1) */
900 " orl $0x3f800000, %%eax\n"
901 "mixm_i_looped:\n"
902 " cmpl (%%esp), %%ebp\n"
903 " movl %%eax, magic1_ofs(%%ebx)\n"
904 " jae mixm_i_LoopHandler\n"
905 /* hier 1 cycle frei */
906 " fstps -4(%%edi)\n" /* (vl') (-1) */
907 " decl %%ecx\n"
908 "jnz mixm_i_next\n"
909 "mixm_i_ende:\n"
910 "fstps voll_ofs(%%ebx)\n" /* (whatever) */
911 "fstp %%st\n" /* - */
912 "shll $2, %%ebp\n"
913 "movl %%ebp, %%eax\n"
914 "popl %%ecx\n" /* just a garbage register */
915 "ret\n"
916
917 "mixm_i_LoopHandler:\n"
918 "fstps -4(%%edi)\n" /* (vl') (-1) */
919 "movl looptype_ofs(%%ebx), %%eax\n"
920 "testl %0, %%eax\n"
921 "jnz mixm_i_loopme\n"
922 "subl 16(%%esp), %%edx\n"
923 "sbbl 12(%%esp), %%ebp\n"
924 "flds (,%%ebp,4)\n" /* (wert) (vl) (-1) */
925 "mixm_i_fill:\n" /* sample ends -> fill rest of buffer with last sample value */
926 " fld %%st(1)\n" /* (vl) (wert) (vl) (-1) */
927 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) (-1) */
928 " fadds -4(%%edi)\n"
929 " fstps -4(%%edi)\n" /* (wert) (vl) (-1) */
930 " fxch %%st(1)\n" /* (vl) (wert) (-1) */
931 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) (-1) */
932 " fxch %%st(1)\n" /* (wert) (vl') (-1) */
933 " leal 4(%%edi), %%edi\n"
934 " decl %%ecx\n"
935 "jnz mixm_i_fill\n"
936 /* update click-removal fade values */
937 "fmul %%st(1), %%st\n" /* (left) (vl) (-1) */
938 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) (-1) */
939 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) (-1) */
940 "movl looptype_ofs(%%ebx), %%eax\n"
941 "andl %1, %%eax\n"
942 "movl %%eax, looptype_ofs(%%ebx)\n"
943 "jmp mixm_i_ende\n"
944
945 "mixm_i_loopme:\n"
946 /* sample loops -> jump to loop start */
947 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
948 " cmpl (%%esp), %%ebp\n"
949 "jae mixm_i_loopme\n"
950 "decl %%ecx\n"
951 "jz mixm_i_ende\n"
952 "jmp mixm_i_next\n"
953 ".cfi_endproc\n"
954 ".size mixm_i, .-mixm_i\n"
955 :
956 : "n"(MIXF_LOOPED),
957 "n"(FLAG_DISABLED)
958 );
959
960 __asm__ __volatile__
961 (
962 ".type mixs_i, @function\n"
963 "mixs_i:\n"
964 ".cfi_startproc\n"
965 ".cfi_def_cfa_offset 4\n"
966 /* mixing, stereo+interpolation */
967 "movl nsamples_ofs(%%ebx), %%ecx\n"
968 #if 1
969 "fld1\n" /* (1) */
970 "fchs\n" /* (-1) */
971 #else
972 "flds minuseins\n" /* (-1) */
973 #endif
974 "flds voll_ofs(%%ebx)\n" /* (vl) (-1) */
975 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) (-1) */
976 "shrl $2, %%ebp\n"
977 "pushl %%ebp\n"
978 "movl %%eax, %%ebp\n"
979 "movl %%edx, %%eax\n"
980 "shrl $9, %%eax\n"
981 "shrl $2, %%ebp\n"
982 "orl $0x3f800000, %%eax\n"
983 "movl %%eax, magic1_ofs(%%ebx)\n"
984
985 /* align dword... njet! */
986 "mixs_i_next:\n" /* (vr) (vl) (-1) */
987 " flds 0(,%%ebp,4)\n" /* (a) (vr) (vl) (-1) */
988 " fld %%st(0)\n" /* (a) (a) (vr) (vl) (-1) */
989 " fld %%st(4)\n" /* (-1) (a) (a) (vr) (vl) (-1) */
990 " fadds magic1_ofs(%%ebx)\n" /* (t) (a) (a) (vr) (vl) (-1) */
991 " fxch %%st(1)\n" /* (a) (t) (a) (vr) (vl) (-1) */
992 " fsubrs 4(,%%ebp,4)\n" /* (b-a) (t) (a) (vr) (vl) (-1) */
993 " addl 16(%%esp), %%edx\n"
994 " leal 8(%%edi), %%edi\n"
995 " adcl 12(%%esp), %%ebp\n"
996 " fmulp %%st(1)\n" /* ((b-a)*t) (a) (vr) (vl) (-1) */
997 " movl %%edx, %%eax\n"
998 " shrl $9, %%eax\n"
999 " faddp %%st(1)\n" /* (wert) (vr) (vl) (-1) */
1000 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) (-1) */
1001 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) (-1) */
1002 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) (-1) */
1003 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) (-1) */
1004 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) (-1) */
1005 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) (-1) */
1006 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) (-1) */
1007 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) (-1) */
1008 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) (-1) */
1009 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') (-1) */
1010 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') (-1) */
1011 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') (-1) */
1012 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') (-1) */
1013 " orl $0x3f800000, %%eax\n"
1014 "mixs_i_looped:\n"
1015 " cmpl (%%esp), %%ebp\n"
1016 " movl %%eax, magic1_ofs(%%ebx)\n"
1017 " jae mixs_i_LoopHandler\n"
1018 /* hier 1 cycle frei */
1019 " fstps -4(%%edi)\n" /* (vl') (lfinal) <vr'> (-1) */
1020 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) (-1) */
1021 " fstps -8(%%edi)\n" /* (vl) (vr) (-1) */
1022 " fxch %%st(1)\n" /* (vr) (vl) (-1) */
1023 " decl %%ecx\n"
1024 "jnz mixs_i_next\n"
1025 "mixs_i_ende:\n"
1026 "fstps volr_ofs(%%ebx)\n"
1027 "fstps voll_ofs(%%ebx)\n"
1028 "fstp %%st\n"
1029 "shll $2, %%ebp\n"
1030 "movl %%ebp, %%eax\n"
1031 "popl %%ecx\n" /* just a garbage register */
1032 "ret\n"
1033
1034 "mixs_i_LoopHandler:\n"
1035 "fstps -4(%%edi)\n" /* (vl') (lfinal) <vr'> (-1) */
1036 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) (-1) */
1037 "fstps -8(%%edi)\n" /* (vl) (vr) (-1) */
1038 "fxch %%st(1)\n" /* (vr) (vl) (-1) */
1039 "movl looptype_ofs(%%ebx), %%eax\n"
1040 "testl %0, %%eax\n"
1041 "jnz mixs_i_loopme\n"
1042 "fxch %%st(2)\n" /* (-1) (vl) (vr) */
1043 "fstp %%st\n" /* (vl) (vr) */
1044 "subl 16(%%esp), %%edx\n"
1045 "sbbl 12(%%esp), %%ebp\n"
1046 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
1047 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
1048 "mixs_i_fill:\n"
1049 /* sample ends -> fill rest of buffer with last sample value */
1050 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
1051 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
1052 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
1053 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
1054 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
1055 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
1056 " fadds -8(%%edi)\n" /* (vr) (vl) (wert) This should be (lfinal) (vr) (right) (vl) (wert) - stian */
1057 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
1058 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
1059 " fadds -4(%%edi)\n" /* (vr) (vl) (wert) This should be (rfinal) (vr) (vl) (wert) - stian */
1060 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
1061 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
1062 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
1063 " leal 8(%%edi), %%edi\n"
1064 " decl %%ecx\n"
1065 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
1066 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
1067 "jnz mixs_i_fill\n"
1068 /* update click-removal fade values */
1069 "fld %%st(2)\n" /* (wert) (vr) (vl) (wert) */
1070 "fld %%st\n" /* (wert) (wert) (vr) (vl) (wert) */
1071 "fmul %%st(3), %%st\n" /* (left) (wert) (vr) (vl) (wert) */
1072 "fxch %%st(1)\n" /* (wert) (left) (vr) (vl) (wert) */
1073 "fmul %%st(2), %%st\n" /* (rite) (left) (vr) (vl) (wert) */
1074 "fxch %%st(1)\n" /* (left) (rite) (vr) (vl) (wert) */
1075 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vr) (vl) (wert) */
1076 "fxch %%st(1)\n" /* (rite) (fl') (vr) (vl) (wert) */
1077 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vr) (vl) (wert) */
1078 "fxch %%st(1)\n" /* (fl') (fr') (vr) (vl) (wert) */
1079 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vr) (vl) (wert) */
1080 "fstps faderight_ofs(%%ebx)\n" /* (vr) (vl) (wert) */
1081 "movl looptype_ofs(%%ebx), %%eax\n"
1082 "andl %1, %%eax\n"
1083 "movl %%eax, looptype_ofs(%%ebx)\n"
1084 "jmp mixs_i_ende\n"
1085
1086 "mixs_i_loopme:\n"
1087 /* sample loops -> jump to loop start */
1088 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1089 " cmpl (%%esp), %%ebp\n"
1090 "jae mixs_i_loopme\n"
1091 "decl %%ecx\n"
1092 "jz mixs_i_ende\n"
1093 "jmp mixs_i_next\n"
1094 ".cfi_endproc\n"
1095 ".size mixs_i, .-mixs_i\n"
1096 :
1097 : "n"(MIXF_LOOPED),
1098 "n"(FLAG_DISABLED)
1099 );
1100
1101 __asm__ __volatile__
1102 (
1103 ".type mixm_i2, @function\n"
1104 "mixm_i2:\n"
1105 ".cfi_startproc\n"
1106 ".cfi_def_cfa_offset 4\n"
1107 /* mixing, mono w/ cubic interpolation */
1108 "movl nsamples_ofs(%%ebx), %%ecx\n"
1109 "flds voll_ofs(%%ebx)\n" /* (vl) */
1110 "shrl $2, %%ebp\n"
1111 "pushl %%ebp\n"
1112 "movl %%eax, %%ebp\n"
1113 "shrl $2, %%ebp\n"
1114 "movl %%edx, %%eax\n"
1115 "shrl $24, %%eax\n"
1116 /* align dword we don't give a rats ass about */
1117 "mixm_i2_next:\n" /* (vl) */
1118 " flds (,%%ebp,4)\n" /* (w0) (vl) */
1119 " fmuls ct0_ofs(%%ebx,%%eax,4)\n" /* (w0') (vl) */
1120 " flds 4(,%%ebp,4)\n" /* (w1) (w0') (vl) */
1121 " fmuls ct1_ofs(%%ebx,%%eax,4)\n" /* (w1') (w0') (vl) */
1122 " flds 8(,%%ebp,4)\n" /* (w2) (w1') (w0') (vl) */
1123 " fmuls ct2_ofs(%%ebx,%%eax,4)\n" /* (w2') (w1') (w0') (vl) */
1124 " flds 12(,%%ebp,4)\n" /* (w3) (w2') (w1') (w0') (vl) */
1125 " fmuls ct3_ofs(%%ebx,%%eax,4)\n" /* (w3') (w2') (w1') (w0') (vl) */
1126 " fxch %%st(2)\n" /* (w1') (w2') (w3') (w0') (vl) */
1127 " faddp %%st, %%st(3)\n" /* (w2') (w3') (w0+w1) (vl) */
1128 " addl 16(%%esp), %%edx\n"
1129 " leal 4(%%edi), %%edi\n"
1130 " faddp %%st, %%st(2)\n" /* (w2+w3) (w0+w1) (vl) */ /* I find this to be wrong - Stian TODO faddp %st %st(1) anybody ? */
1131 " adcl 12(%%esp), %%ebp\n"
1132 " movl %%edx, %%eax\n"
1133 " faddp %%st,%%st(1)\n" /* (wert) (vl) */ /* But since we add them together here it all ends correct - Stian */
1134 " shrl $24, %%eax\n"
1135 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1136 " fmulp %%st, %%st(1)\n" /* (left) (vl) */
1137 " fxch %%st(1)\n" /* (vl) (left) */
1138 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) */
1139 " fxch %%st(1)\n" /* (left) (vl) */
1140 " fadds -4(%%edi)\n" /* (lfinal) (vl') */
1141 "mixm_i2_looped:\n"
1142 " cmpl (%%esp), %%ebp\n"
1143 " jae mixm_i2_LoopHandler\n"
1144 " fstps -4(%%edi)\n" /* (vl') */
1145 " decl %%ecx\n"
1146 "jnz mixm_i2_next\n"
1147 "mixm_i2_ende:\n"
1148 "fstps voll_ofs(%%ebx)\n" /* - */
1149 "shll $2, %%ebp\n"
1150 "movl %%ebp, %%eax\n"
1151 "popl %%ecx\n" /* just a garbage register */
1152 "ret\n"
1153
1154 "mixm_i2_LoopHandler:\n"
1155 "fstps -4(%%edi)\n" /* (vl') */
1156 "pushl %%eax\n"
1157 "movl looptype_ofs(%%ebx), %%eax\n"
1158 "testl %0, %%eax\n"
1159 "jnz mixm_i2_loopme\n"
1160 "popl %%eax\n"
1161 "subl 16(%%esp), %%edx\n"
1162 "sbbl 12(%%esp), %%ebp\n"
1163 "flds (,%%ebp,4)\n" /* (wert) (vl) */
1164 "mixm_i2_fill:\n"
1165 /* sample ends -> fill rest of buffer with last sample value */
1166 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1167 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) */
1168 " fadds -4(%%edi)\n" /* (lfinal) (wert) (vl) */
1169 " fstps -4(%%edi)\n" /* (wert) (vl) */
1170 " fxch %%st(1)\n" /* (vl) (wert) */
1171 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) */
1172 " fxch %%st(1)\n" /* (wert) (vl') */
1173 " leal 4(%%edi), %%edi\n"
1174 " decl %%ecx\n"
1175 "jnz mixm_i2_fill\n"
1176 /* update click-removal fade values */
1177 "fmul %%st(1), %%st\n" /* (left) (vl) */
1178 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) */
1179 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) */
1180 "movl looptype_ofs(%%ebx), %%eax\n"
1181 "andl %1, %%eax\n"
1182 "movl %%eax, looptype_ofs(%%ebx)\n"
1183 "jmp mixm_i2_ende\n"
1184
1185 "mixm_i2_loopme:\n"
1186 /* sample loops -> jump to loop start */
1187 "popl %%eax\n"
1188 "mixm_i2_loopme2:\n"
1189 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1190 " cmpl (%%esp), %%ebp\n"
1191 "jae mixm_i2_loopme2\n"
1192 "decl %%ecx\n"
1193 "jz mixm_i2_ende\n"
1194 "jmp mixm_i2_next\n"
1195 ".cfi_endproc\n"
1196 ".size mixm_i2, .-mixm_i2\n"
1197 :
1198 : "n"(MIXF_LOOPED),
1199 "n"(FLAG_DISABLED)
1200 );
1201
1202 __asm__ __volatile__
1203 (
1204 ".type mixs_i2, @function\n"
1205 "mixs_i2:\n"
1206 ".cfi_startproc\n"
1207 ".cfi_def_cfa_offset 4\n"
1208 /* mixing, stereo w/ cubic interpolation */
1209 "movl nsamples_ofs(%%ebx), %%ecx\n"
1210 "flds voll_ofs(%%ebx)\n" /* (vl) */
1211 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) */
1212 "shrl $2, %%ebp\n"
1213 "pushl %%ebp\n"
1214 "movl %%eax, %%ebp\n"
1215 "shrl $2, %%ebp\n"
1216 "movl %%edx, %%eax\n"
1217 "shrl $24, %%eax\n"
1218 /* align dword... see I care to do that */
1219 "mixs_i2_next:\n"
1220 " flds (,%%ebp,4)\n" /* (w0) (vr) (vl) */
1221 " fmuls ct0_ofs(%%ebx,%%eax,4)\n" /* (w0') (vr) (vl) */
1222 " flds 4(,%%ebp,4)\n" /* (w1) (w0') (vr) (vl) */
1223 " fmuls ct1_ofs(%%ebx,%%eax,4)\n" /* (w1') (w0') (vr) (vl) */
1224 " flds 8(,%%ebp,4)\n" /* (w2) (w1') (w0') (vr) (vl) */
1225 " fmuls ct2_ofs(%%ebx,%%eax,4)\n" /* (w2') (w1') (w0') (vr) (vl) */
1226 " flds 12(,%%ebp,4)\n" /* (w3) (w2') (w1') (w0') (vr) (vl) */
1227 " fmuls ct3_ofs(%%ebx,%%eax,4)\n" /* (w3') (w2') (w1') (w0') (vr) (vl) */
1228 " fxch %%st(2)\n" /* (w1') (w2') (w3') (w0') (vr) (vl) */
1229 " faddp %%st, %%st(3)\n" /* (w2') (w3') (w0+w1) (vr) (vl) */
1230 " addl 16(%%esp), %%edx\n"
1231 " leal 8(%%edi), %%edi\n"
1232 " faddp %%st, %%st(2)\n" /* (w2+w3) (w0+w1) (vr) (vl) I find this comment to be wrong, be the next addp merges them all together - Stian*/
1233 " adcl 12(%%esp), %%ebp\n"
1234 " movl %%edx, %%eax\n"
1235 " faddp %%st, %%st(1)\n" /* wert) (vr) (vl) */
1236 " shrl $24, %%eax\n"
1237 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) */
1238 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) */
1239 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) */
1240 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) */
1241 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) */
1242 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) */
1243 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) */
1244 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) */
1245 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) */
1246 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') */
1247 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') */
1248 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') */
1249 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') */
1250 "mixs_i2_looped:\n"
1251 " cmpl (%%esp), %%ebp\n"
1252 " jae mixs_i2_LoopHandler\n"
1253 /* hier 1 cycle frei */
1254 " fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
1255 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
1256 " fstps -8(%%edi)\n" /* (vl) (vr) */
1257 " fxch %%st(1)\n" /* (vr) (vl) */
1258 " decl %%ecx\n"
1259 "jnz mixs_i2_next\n"
1260 "mixs_i2_ende:\n"
1261 "fstps volr_ofs(%%ebx)\n" /* (vl) */
1262 "fstps voll_ofs(%%ebx)\n" /* - */
1263 "shll $2, %%ebp\n"
1264 "movl %%ebp, %%eax\n"
1265 "popl %%ecx\n" /* just a garbage register */
1266 "ret\n"
1267
1268 "mixs_i2_LoopHandler:\n"
1269 "fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
1270 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
1271 "fstps -8(%%edi)\n" /* (vl) (vr) */
1272 "fxch %%st(1)\n" /* (vr) (vl) */
1273 "pushl %%eax\n"
1274 "movl looptype_ofs(%%ebx), %%eax\n"
1275 "testl %0, %%eax\n"
1276 "jnz mixs_i2_loopme\n"
1277 "popl %%eax\n"
1278 "fxch %%st(1)\n" /* (vl) (vr) */
1279 "subl 16(%%esp), %%edx\n"
1280 "sbbl 12(%%esp), %%ebp\n"
1281 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
1282 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
1283 "mixs_i2_fill:\n"
1284 /* sample ends -> fill rest of buffer with last sample value */
1285 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
1286 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
1287 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
1288 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
1289 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
1290 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
1291 " fadds -8(%%edi)\n"
1292 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
1293 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
1294 " fadds -4(%%edi)\n"
1295 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
1296 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
1297 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
1298 " leal 8(%%edi), %%edi\n"
1299 " decl %%ecx\n"
1300 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
1301 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
1302 "jnz mixs_i2_fill\n"
1303 /* update click-removal fade values */
1304 "fxch %%st(2)\n" /* (wert) (vl) (vr) */
1305 "fld %%st\n" /* (wert) (wert) (vl) (vr) */
1306 "fmul %%st(2), %%st\n" /* (left) (wert) (vl) (vr) */
1307 "fxch %%st(1)\n" /* (wert) (left) (vl) (vr) */
1308 "fmul %%st(3), %%st\n" /* (rite) (left) (vl) (vr) */
1309 "fxch %%st(1)\n" /* (left) (rite) (vl) (vr) */
1310 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vl) (vr) */
1311 "fxch %%st(1)\n" /* (rite) (fl') (vl) (vr) */
1312 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vl) (vr) */
1313 "fxch %%st(1)\n" /* (fl') (fr') (vl) (vr) */
1314 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vl) (vr) */
1315 "fstps faderight_ofs(%%ebx)\n" /* (vl) (vr) */
1316 "fxch %%st(1)\n" /* (vr) (vl) */
1317 "movl looptype_ofs(%%ebx), %%eax\n"
1318 "andl %1, %%eax\n"
1319 "movl %%eax, looptype_ofs(%%ebx)\n"
1320 "jmp mixs_i2_ende\n"
1321
1322 "mixs_i2_loopme:\n"
1323 /* sample loops -> jump to loop start */
1324 "popl %%eax\n"
1325 "mixs_i2_loopme2:\n"
1326 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1327 " cmpl (%%esp), %%ebp\n"
1328 "jae mixs_i2_loopme2\n"
1329 "decl %%ecx\n"
1330 "jz mixs_i2_ende\n"
1331 "jmp mixs_i2_next\n"
1332 ".cfi_endproc\n"
1333 ".size mixs_i2, .-mixs_i2\n"
1334 :
1335 : "n"(MIXF_LOOPED),
1336 "n"(FLAG_DISABLED)
1337 );
1338
1339 __asm__ __volatile__
1340 (
1341 ".type mixm_nf, @function\n"
1342 "mixm_nf:\n"
1343 ".cfi_startproc\n"
1344 ".cfi_def_cfa_offset 4\n"
1345 /* mixing, mono w/o interpolation, FILTERED */
1346 "movl nsamples_ofs(%%ebx), %%ecx\n"
1347 "flds voll_ofs(%%ebx)\n" /* (vl) */
1348 "shrl $2, %%ebp\n"
1349 "pushl %%ebp\n"
1350 "movl %%eax, %%ebp\n"
1351 "shrl $2, %%ebp\n"
1352 /* align dword sucks */
1353 "mixm_nf_next:\n" /* (vl) */
1354 " flds (,%%ebp,4)\n" /* (wert) (vl) */
1355
1356 /* FILTER HIER:
1357 * b=reso*b+freq*(in-l);
1358 * l+=freq*b;
1359 */
1360 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
1361 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
1362 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
1363 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
1364 " faddp %%st, %%st(1)\n" /* (b') .. */
1365 " fsts __fb1_ofs(%%ebx)\n"
1366 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
1367 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
1368 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vl) */
1369
1370 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1371 " addl 16(%%esp), %%edx\n"
1372 " leal 4(%%edi), %%edi\n"
1373 " adcl 12(%%esp), %%ebp\n"
1374 " fmulp %%st, %%st(1)\n" /* (left) (vl) */
1375 " fxch %%st(1)\n" /* (vl) (left) */
1376 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) */
1377 " fxch %%st(1)\n" /* (left) (vl) */
1378 " fadds -4(%%edi)\n" /* (lfinal) (vl') */
1379 "mixm_nf_looped:\n"
1380 " cmpl (%%esp), %%ebp\n"
1381 " jae mixm_nf_LoopHandler\n"
1382 " fstps -4(%%edi)\n" /* (vl') */
1383 " decl %%ecx\n"
1384 "jnz mixm_nf_next\n"
1385 "mixm_nf_ende:\n"
1386 "fstps voll_ofs(%%ebx)\n" /* - */
1387 "shll $2, %%ebp\n"
1388 "movl %%ebp, %%eax\n"
1389 "popl %%ecx\n" /* just a garbage register */
1390 "ret\n"
1391
1392 "mixm_nf_LoopHandler:\n"
1393 "fstps -4(%%edi)\n" /* (vl') */
1394 "movl looptype_ofs(%%ebx), %%eax\n"
1395 "testl %0, %%eax\n"
1396 "jnz mixm_nf_loopme\n"
1397 "subl 16(%%esp), %%edx\n"
1398 "sbbl 12(%%esp), %%ebp\n"
1399 "flds (,%%ebp,4)\n" /* (wert) (vl) */
1400 "mixm_nf_fill:\n"
1401 /* sample ends -> fill rest of buffer with last sample value */
1402 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1403 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) */
1404 " fadds -4(%%edi)\n" /* (lfinal) (wert) (vl) */
1405 " fstps -4(%%edi)\n" /* (wert) (vl) */
1406 " fxch %%st(1)\n" /* (vl) (wert) */
1407 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) */
1408 " fxch %%st(1)\n" /* (wert) (vl') */
1409 " leal 4(%%edi), %%edi\n"
1410 " decl %%ecx\n"
1411 "jnz mixm_nf_fill\n"
1412 /* update click-removal fade values */
1413 "fmul %%st(1), %%st\n" /* (left) (vl) */
1414 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) */
1415 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) */
1416 "movl looptype_ofs(%%ebx), %%eax\n"
1417 "andl %1, %%eax\n"
1418 "movl %%eax, looptype_ofs(%%ebx)\n"
1419 "jmp mixm_nf_ende\n"
1420
1421 "mixm_nf_loopme:\n"
1422 /* sample loops -> jump to loop start */
1423 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1424 " cmpl (%%esp), %%ebp\n"
1425 "jae mixm_nf_loopme\n"
1426 "decl %%ecx\n"
1427 "jz mixm_nf_ende\n"
1428 "jmp mixm_nf_next\n"
1429 ".cfi_endproc\n"
1430 ".size mixm_nf, .-mixm_nf\n"
1431 :
1432 : "n"(MIXF_LOOPED),
1433 "n"(FLAG_DISABLED)
1434 );
1435
1436 __asm__ __volatile__
1437 (
1438 ".type mixs_nf, @function\n"
1439 "mixs_nf:\n"
1440 ".cfi_startproc\n"
1441 ".cfi_def_cfa_offset 4\n"
1442 /* mixing, stereo w/o interpolation, FILTERED */
1443 "movl nsamples_ofs(%%ebx), %%ecx\n"
1444 "flds voll_ofs(%%ebx)\n" /* (vl) */
1445 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) */
1446 "shrl $2, %%ebp\n"
1447 "pushl %%ebp\n"
1448 "movl %%eax, %%ebp\n"
1449 "shrl $2, %%ebp\n"
1450 /* align dword is for clows */
1451 "mixs_nf_next:\n"
1452 " flds (,%%ebp,4)\n" /* (wert) (vr) (vl) */
1453
1454 /* FILTER HIER:
1455 * b=reso*b+freq*(in-l);
1456 * l+=freq*b;
1457 */
1458 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
1459 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
1460 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
1461 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
1462 " faddp %%st, %%st(1)\n" /* (b') .. */
1463 " fsts __fb1_ofs(%%ebx)\n"
1464 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
1465 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
1466 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vr) (vl) */
1467
1468 " addl 16(%%esp), %%edx\n"
1469 " leal 8(%%edi), %%edi\n"
1470 " adcl 12(%%esp), %%ebp\n"
1471 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) */
1472 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) */
1473 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) */
1474 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) */
1475 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) */
1476 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) */
1477 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) */
1478 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) */
1479 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) */
1480 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') */
1481 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') */
1482 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') */
1483 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') */
1484 "mixs_nf_looped:\n"
1485 " cmpl (%%esp), %%ebp\n"
1486 " jae mixs_nf_LoopHandler\n"
1487 /* hier 1 cycle frei */
1488 " fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
1489 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
1490 " fstps -8(%%edi)\n" /* (vl) (vr) */
1491 " fxch %%st(1)\n" /* (vr) (vl) */
1492 " decl %%ecx\n"
1493 "jnz mixs_nf_next\n"
1494 "mixs_nf_ende:\n"
1495 "fstps volr_ofs(%%ebx)\n" /* (vl) */
1496 "fstps voll_ofs(%%ebx)\n" /* - */
1497 "shll $2, %%ebp\n"
1498 "movl %%ebp, %%eax\n"
1499 "popl %%ecx\n" /* just a garbage register */
1500 "ret\n"
1501
1502 "mixs_nf_LoopHandler:\n"
1503 "fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
1504 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
1505 "fstps -8(%%edi)\n" /* (vl) (vr) */
1506 "fxch %%st(1)\n" /* (vr) (vl) */
1507 "movl looptype_ofs(%%ebx), %%eax\n"
1508 "testl %0, %%eax\n"
1509 "jnz mixs_nf_loopme\n"
1510 "fxch %%st(1)\n" /* (vl) (vr) */
1511 "subl 16(%%esp), %%edx\n"
1512 "sbbl 12(%%esp), %%ebp\n"
1513 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
1514 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
1515 "mixs_nf_fill:\n"
1516 /* sample ends -> fill rest of buffer with last sample value */
1517 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
1518 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
1519 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
1520 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
1521 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
1522 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
1523 " fadds -8(%%edi)\n"
1524 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
1525 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
1526 " fadds -4(%%edi)\n"
1527 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
1528 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
1529 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
1530 " leal 8(%%edi), %%edi\n"
1531 " decl %%ecx\n"
1532 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
1533 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
1534 "jnz mixs_nf_fill\n"
1535 /* update click-removal fade values */
1536 "fxch %%st(2)\n" /* (wert) (vl) (vr) */
1537 "fld %%st\n" /* (wert) (wert) (vl) (vr) */
1538 "fmul %%st(2), %%st\n" /* (left) (wert) (vl) (vr) */
1539 "fxch %%st(1)\n" /* (wert) (left) (vl) (vr) */
1540 "fmul %%st(3), %%st\n" /* (rite) (left) (vl) (vr) */
1541 "fxch %%st(1)\n" /* (left) (rite) (vl) (vr) */
1542 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vl) (vr) */
1543 "fxch %%st(1)\n" /* (rite) (fl') (vl) (vr) */
1544 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vl) (vr) */
1545 "fxch %%st(1)\n" /* (fl') (fr') (vl) (vr) */
1546 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vl) (vr) */
1547 "fstps faderight_ofs(%%ebx)\n" /* (vl) (vr) */
1548 "fxch %%st(1)\n" /* (vr) (vl) */
1549 "movl looptype_ofs(%%ebx), %%eax\n"
1550 "andl %1, %%eax\n"
1551 "movl %%eax, looptype_ofs(%%ebx)\n"
1552 "jmp mixs_nf_ende\n"
1553
1554 "mixs_nf_loopme:\n"
1555 /* sample loops -> jump to loop start */
1556 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1557 " cmpl (%%esp), %%ebp\n"
1558 "jae mixs_nf_loopme\n"
1559 "decl %%ecx\n"
1560 "jz mixs_nf_ende\n"
1561 "jmp mixs_nf_next\n"
1562 ".cfi_endproc\n"
1563 ".size mixs_nf, .-mixs_nf\n"
1564 :
1565 : "n"(MIXF_LOOPED),
1566 "n"(FLAG_DISABLED)
1567 );
1568
1569 __asm__ __volatile__
1570 (
1571 ".type mixm_if, @function\n"
1572 "mixm_if:\n"
1573 ".cfi_startproc\n"
1574 ".cfi_def_cfa_offset 4\n"
1575 /* mixing, mono+interpolation, FILTERED */
1576 "movl nsamples_ofs(%%ebx), %%ecx\n"
1577 #if 1
1578 "fld1\n" /* (1) */
1579 "fchs\n" /* (-1) */
1580 #else
1581 "flds minuseins\n" /* (-1) */
1582 #endif
1583 "flds voll_ofs(%%ebx)\n" /* (vl) (-1) */
1584 "shrl $2, %%ebp\n"
1585 "pushl %%ebp\n"
1586 "movl %%eax, %%ebp\n"
1587 "movl %%edx, %%eax\n"
1588 "shrl $9, %%eax\n"
1589 "shrl $2, %%ebp\n"
1590 "orl $0x3f800000, %%eax\n"
1591 "movl %%eax, magic1_ofs(%%ebx)\n"
1592
1593 /* align dword is for pussies */
1594 "mixm_if_next:\n" /* (vl) (-1) */
1595 " flds 0(,%%ebp,4)\n" /* (a) (vl) (-1) */
1596 " fld %%st(0)\n" /* (a) (a) (vl) (-1) */
1597 " fld %%st(3)\n" /* (-1) (a) (a) (vl) (-1) */
1598 " fadds magic1_ofs(%%ebx)\n" /* (t) (a) (a) (vl) (-1) */
1599 " fxch %%st(1)\n" /* (a) (t) (a) (vl) (-1) */
1600 " fsubrs 4(,%%ebp,4)\n" /* (b-a) (t) (a) (vl) (-1) */
1601 " addl 16(%%esp), %%edx\n"
1602 " leal 4(%%edi), %%edi\n"
1603 " adcl 12(%%ebx), %%ebp\n"
1604 " fmulp %%st(1)\n" /* ((b-a)*t) (a) (vl) (-1) */
1605 " movl %%edx, %%eax\n"
1606 " shrl $9, %%eax\n"
1607 " faddp %%st(1)\n" /* (wert) (vl) (-1) */
1608
1609 /* FILTER HIER:
1610 * b=reso*b+freq*(in-l);
1611 * l+=freq*b;
1612 */
1613 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
1614 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
1615 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
1616 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
1617 " faddp %%st, %%st(1)\n" /* (b') .. */
1618 " fsts __fb1_ofs(%%ebx)\n"
1619 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
1620 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
1621 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vl) (-1) */
1622
1623 " fld %%st(1)\n" /* (vl) (wert) (vl) (-1) */
1624 " fmulp %%st, %%st(1)\n" /* (left) (vl) (-1) */
1625 " fxch %%st(1)\n" /* (vl) (left) (-1) */
1626 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) (-1) */
1627 " fxch %%st(1)\n" /* (left) (vl) (-1) */
1628 " fadds -4(%%edi)\n" /* (lfinal) (vl') (-1) */
1629 " orl $0x3f800000, %%eax\n"
1630 "mixm_if_looped:\n"
1631 " cmpl (%%esp), %%ebp\n"
1632 " movl %%eax, magic1_ofs(%%ebx)\n"
1633 " jae mixm_if_LoopHandler\n"
1634 /* hier 1 cycle frei */
1635 " fstps -4(%%edi)\n" /* (vl') (-1) */
1636 " decl %%ecx\n"
1637 "jnz mixm_if_next\n"
1638 "mixm_if_ende:\n"
1639 "fstps voll_ofs(%%ebx)\n" /* (whatever) */
1640 "fstp %%st\n" /* - */
1641 "shll $2, %%ebp\n"
1642 "movl %%ebp, %%eax\n"
1643 "popl %%ecx\n" /* just a garbage register */
1644 "ret\n"
1645
1646 "mixm_if_LoopHandler:\n"
1647 "fstps -4(%%edi)\n" /* (vl') (-1) */
1648 "movl looptype_ofs(%%ebx), %%eax\n"
1649 "testl %0, %%eax\n"
1650 "jnz mixm_if_loopme\n"
1651 "subl 16(%%esp), %%edx\n"
1652 "sbbl 12(%%ebx), %%ebp\n"
1653 "flds (,%%ebp,4)\n" /* (wert) (vl) (-1) */
1654 "mixm_if_fill:\n"
1655 /* sample ends -> fill rest of buffer with last sample value */
1656 " fld %%st(1)\n" /* (vl) (wert) (vl) (-1) */
1657 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) (-1) */
1658 " fadds -4(%%edi)\n"
1659 " fstps -4(%%edi)\n" /* (wert) (vl) (-1) */
1660 " fxch %%st(1)\n" /* (vl) (wert) (-1) */
1661 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) (-1) */
1662 " fxch %%st(1)\n" /* (wert) (vl') (-1) */
1663 " leal 4(%%edi), %%edi\n"
1664 " decl %%ecx\n"
1665 "jnz mixm_if_fill\n"
1666 /* update click-removal fade values */
1667 "fmul %%st(1), %%st\n" /* (left) (vl) (-1) */
1668 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) (-1) */
1669 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) (-1) */
1670 "movl looptype_ofs(%%ebx), %%eax\n"
1671 "andl %1, %%eax\n"
1672 "movl %%eax, looptype_ofs(%%ebx)\n"
1673 "jmp mixm_if_ende\n"
1674
1675 "mixm_if_loopme:\n"
1676 /* sample loops -> jump to loop start */
1677 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1678 " cmpl (%%esp), %%ebp\n"
1679 "jae mixm_if_loopme\n"
1680 "decl %%ecx\n"
1681 "jz mixm_if_ende\n"
1682 "jmp mixm_if_next\n"
1683 ".cfi_endproc\n"
1684 ".size mixm_if, .-mixm_if\n"
1685 :
1686 : "n"(MIXF_LOOPED),
1687 "n"(FLAG_DISABLED)
1688 );
1689
1690 __asm__ __volatile__
1691 (
1692 ".type mixs_if, @function\n"
1693 "mixs_if:\n"
1694 ".cfi_startproc\n"
1695 ".cfi_def_cfa_offset 4\n"
1696 /* mixing, stereo+interpolation, FILTERED */
1697 "movl nsamples_ofs(%%ebx), %%ecx\n"
1698 #if 1
1699 "fld1\n" /* (1) */
1700 "fchs\n" /* (-1) */
1701 #else
1702 "flds minuseins\n" /* (-1) */
1703 #endif
1704 "flds voll_ofs(%%ebx)\n" /* (vl) (-1) */
1705 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) (-1) */
1706 "shrl $2, %%ebp\n"
1707 "pushl %%ebp\n"
1708 "movl %%eax, %%ebp\n"
1709 "movl %%edx, %%eax\n"
1710 "shrl $9, %%eax\n"
1711 "shrl $2, %%ebp\n"
1712 "orl $0x3f800000, %%eax\n"
1713 "movl %%eax, magic1_ofs(%%ebx)\n"
1714
1715 /* align dword is boring */
1716 "mixs_if_next:\n" /* (vr) (vl) (-1) */
1717 " flds 0(,%%ebp,4)\n" /* (a) (vr) (vl) (-1) */
1718 " fld %%st(0)\n" /* (a) (a) (vr) (vl) (-1) */
1719 " fld %%st(4)\n" /* (-1) (a) (a) (vr) (vl) (-1) */
1720 " fadds magic1_ofs(%%ebx)\n" /* (t) (a) (a) (vr) (vl) (-1) */
1721 " fxch %%st(1)\n" /* (a) (t) (a) (vr) (vl) (-1) */
1722 " fsubrs 4(,%%ebp,4)\n" /* (b-a) (t) (a) (vr) (vl) (-1) */
1723 " addl 16(%%esp), %%edx\n"
1724 " leal 8(%%edi), %%edi\n"
1725 " adcl 12(%%ebx), %%ebp\n"
1726 " fmulp %%st(1)\n" /* ((b-a)*t) (a) (vr) (vl) (-1) */
1727 " movl %%edx, %%eax\n"
1728 " shrl $9, %%eax\n"
1729 " faddp %%st(1)\n" /* (wert) (vr) (vl) (-1) */
1730
1731 /* FILTER HIER:
1732 * b=reso*b+freq*(in-l);
1733 * l+=freq*b;
1734 */
1735 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
1736 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
1737 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
1738 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
1739 " faddp %%st, %%st(1)\n" /* (b') .. */
1740 " fsts __fb1_ofs(%%ebx)\n"
1741 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
1742 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
1743 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vr) (vl) */
1744
1745 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) (-1) */
1746 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) (-1) */
1747 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) (-1) */
1748 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) (-1) */
1749 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) (-1) */
1750 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) (-1) */
1751 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) (-1) */
1752 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) (-1) */
1753 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) (-1) */
1754 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') (-1) */
1755 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') (-1) */
1756 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') (-1) */
1757 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') (-1) */
1758 " orl $0x3f800000, %%eax\n"
1759 "mixs_if_looped:\n"
1760 " cmpl (%%esp), %%ebp\n"
1761 " movl %%eax, magic1_ofs(%%ebx)\n"
1762 " jae mixs_if_LoopHandler;\n"
1763 /* hier 1 cycle frei */
1764 " fstps -4(%%edi)\n" /* (vl') (lfinal) <vr'> (-1) */
1765 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) (-1) */
1766 " fstps -8(%%edi)\n" /* (vl) (vr) (-1) */
1767 " fxch %%st(1)\n" /* (vr) (vl) (-1) */
1768 " decl %%ecx\n"
1769 "jnz mixs_if_next\n"
1770 "mixs_if_ende:\n"
1771 "fstps volr_ofs(%%ebx)\n"
1772 "fstps voll_ofs(%%ebx)\n"
1773 "fstp %%st\n"
1774 "shll $2, %%ebp\n"
1775 "movl %%ebp, %%eax\n"
1776 "popl %%ecx\n" /* just a garbage register */
1777 "ret\n"
1778
1779 "mixs_if_LoopHandler:\n"
1780 "fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') (-1) */
1781 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) (-1) */
1782 "fstps -8(%%edi)\n" /* (vl) (vr) (-1) */
1783 "fxch %%st(1)\n" /* (vr) (vl) (-1) */
1784 "movl looptype_ofs(%%ebx), %%eax\n"
1785 "testl %0, %%eax\n"
1786 "jnz mixs_if_loopme\n"
1787 "fxch %%st(2)\n" /* (-1) (vl) (vr) */
1788 "fstp %%st\n" /* (vl) (vr) */
1789 "subl 16(%%esp), %%edx\n"
1790 "sbbl 12(%%ebx), %%ebp\n"
1791 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
1792 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
1793 "mixs_if_fill:\n"
1794 /* sample ends -> fill rest of buffer with last sample value */
1795 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
1796 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
1797 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
1798 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
1799 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
1800 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
1801 " fadds -8(%%edi)\n" /* (vr) (vl) (wert) */
1802 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
1803 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
1804 " fadds -4(%%edi)\n" /* (vr) (vl) (wert) */
1805 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
1806 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
1807 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
1808 " leal 8(%%edi), %%edi\n"
1809 " decl %%ecx\n"
1810 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
1811 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
1812 "jnz mixs_if_fill\n"
1813 /* update click-removal fade values */
1814 "fld %%st(2)\n" /* (wert) (vr) (vl) (wert) */
1815 "fld %%st\n" /* (wert) (wert) (vr) (vl) (wert) */
1816 "fmul %%st(3), %%st\n" /* (left) (wert) (vr) (vl) (wert) */
1817 "fxch %%st(1)\n" /* (wert) (left) (vr) (vl) (wert) */
1818 "fmul %%st(2), %%st\n" /* (rite) (left) (vr) (vl) (wert) */
1819 "fxch %%st(1)\n" /* (left) (rite) (vr) (vl) (wert) */
1820 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vr) (vl) (wert) */
1821 "fxch %%st(1)\n" /* (rite) (fl') (vr) (vl) (wert) */
1822 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vr) (vl) (wert) */
1823 "fxch %%st(1)\n" /* (fl') (fr') (vr) (vl) (wert) */
1824 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vr) (vl) (wert) */
1825 "fstps faderight_ofs(%%ebx)\n" /* (vr) (vl) (wert) */
1826 "movl looptype_ofs(%%ebx), %%eax\n"
1827 "andl %1, %%eax\n"
1828 "movl %%eax, looptype_ofs(%%ebx)\n"
1829 "jmp mixs_if_ende\n"
1830
1831 "mixs_if_loopme:\n"
1832 /* sample loops -> jump to loop start */
1833 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1834 " cmpl (%%esp), %%ebp\n"
1835 "jae mixs_if_loopme\n"
1836 "decl %%ecx\n"
1837 "jz mixs_if_ende\n"
1838 "jmp mixs_if_next\n"
1839 ".cfi_endproc\n"
1840 ".size mixs_if, .-mixs_if\n"
1841 :
1842 : "n"(MIXF_LOOPED),
1843 "n"(FLAG_DISABLED)
1844 );
1845
1846 __asm__ __volatile__
1847 (
1848 ".type mim_i2f, @function\n"
1849 "mixm_i2f:\n"
1850 ".cfi_startproc\n"
1851 ".cfi_def_cfa_offset 4\n"
1852 /* mixing, mono w/ cubic interpolation, FILTERED */
1853 "movl nsamples_ofs(%%ebx), %%ecx\n"
1854 "flds voll_ofs(%%ebx)\n" /* (vl) */
1855 "shrl $2, %%ebp\n"
1856 "pushl %%ebp\n"
1857 "movl %%eax, %%ebp\n"
1858 "shrl $2, %%ebp\n"
1859 "movl %%edx, %%eax\n"
1860 "shrl $24, %%eax\n"
1861 /* align dword... how many times have we ignored this now? */
1862 "mixm_i2f_next:\n" /* (vl) */
1863 " flds (,%%ebp,4)\n" /* (w0) (vl) */
1864 " fmuls ct0_ofs(%%ebx,%%eax,4)\n" /* (w0') (vl) */
1865 " flds 4(,%%ebp,4)\n" /* (w1) (w0') (vl) */
1866 " fmuls ct1_ofs(%%ebx,%%eax,4)\n" /* (w1') (w0') (vl) */
1867 " flds 8(,%%ebp,4)\n" /* (w2) (w1') (w0') (vl) */
1868 " fmuls ct2_ofs(%%ebx,%%eax,4)\n" /* (w2') (w1') (w0') (vl) */
1869 " flds 12(,%%ebp,4)\n" /* (w3) (w2') (w1') (w0') (vl) */
1870 " fmuls ct3_ofs(%%ebx,%%eax,4)\n" /* (w3') (w2') (w1') (w0') (vl) */
1871 " fxch %%st(2)\n" /* (w1') (w2') (w3') (w0') (vl) */
1872 " faddp %%st, %%st(3)\n" /* (w2') (w3') (w0+w1) (vl) */
1873 " addl 16(%%esp), %%edx\n"
1874 " leal 4(%%edi), %%edi\n"
1875 " faddp %%st, %%st(2)\n" /* (w2+w3) (w0+w1) (vl) */
1876 " adcl 12(%%ebx), %%ebp\n"
1877 " movl %%edx, %%eax\n"
1878 " faddp %%st, %%st(1)\n" /* (wert) (vl) */
1879
1880 /* FILTER HIER:
1881 * b=reso*b+freq*(in-l);
1882 * l+=freq*b;
1883 */
1884 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
1885 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
1886 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
1887 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
1888 " faddp %%st, %%st(1)\n" /* (b') .. */
1889 " fsts __fb1_ofs(%%ebx)\n"
1890 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
1891 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
1892 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vr) (vl) */
1893
1894 " shrl $24, %%eax\n"
1895 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1896 " fmulp %%st, %%st(1)\n" /* (left) (vl) */
1897 " fxch %%st(1)\n" /* (vl) (left) */
1898 " fadds volrl_ofs(%%ebx)\n" /* (vl') (left) */
1899 " fxch %%st(1)\n" /* (left) (vl) */
1900 " fadds -4(%%edi)\n" /* (lfinal) (vl') */
1901 "mixm_i2f_looped:\n"
1902 " cmpl (%%esp), %%ebp\n"
1903 " jae mixm_i2f_LoopHandler\n"
1904 " fstps -4(%%edi)\n" /* (vl') */
1905 " decl %%ecx\n"
1906 "jnz mixm_i2f_next\n"
1907 "mixm_i2f_ende:\n"
1908 "fstps voll_ofs(%%ebx)\n" /* - */
1909 "shll $2, %%ebp\n"
1910 "movl %%ebp, %%eax\n"
1911 "popl %%ecx\n" /* just a garbage register */
1912 "ret\n"
1913
1914 "mixm_i2f_LoopHandler:\n"
1915 "fstps -4(%%edi)\n" /* (vl') */
1916 "pushl %%eax\n"
1917 "movl looptype_ofs(%%ebx), %%eax\n"
1918 "testl %0, %%eax\n"
1919 "jnz mixm_i2f_loopme\n"
1920 "popl %%eax\n"
1921 "subl 16(%%esp), %%edx\n"
1922 "sbbl 12(%%ebx), %%ebp\n"
1923 "flds (,%%ebp,4)\n" /* (wert) (vl) */
1924 "mixm_i2f_fill:\n"
1925 /* sample ends -> fill rest of buffer with last sample value */
1926 " fld %%st(1)\n" /* (vl) (wert) (vl) */
1927 " fmul %%st(1), %%st\n" /* (left) (wert) (vl) */
1928 " fadds -4(%%edi)\n" /* (lfinal) (wert) (vl) */
1929 " fstps -4(%%edi)\n" /* (wert) (vl) */
1930 " fxch %%st(1)\n" /* (vl) (wert) */
1931 " fadds volrl_ofs(%%ebx)\n" /* (vl') (wert) */
1932 " fxch %%st(1)\n" /* (wert) (vl') */
1933 " leal 4(%%edi), %%edi\n"
1934 " decl %%ecx\n"
1935 "jnz mixm_i2f_fill\n"
1936 /* update click-removal fade values */
1937 "fmul %%st(1), %%st\n" /* (left) (vl) */
1938 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (vl) */
1939 "fstps fadeleft_ofs(%%ebx)\n" /* (vl) */
1940 "movl looptype_ofs(%%ebx), %%eax\n"
1941 "andl %1, %%eax\n"
1942 "movl %%eax, looptype_ofs(%%ebx)\n"
1943 "jmp mixm_i2f_ende\n"
1944
1945 "mixm_i2f_loopme:\n"
1946 /* sample loops -> jump to loop start */
1947 "popl %%eax\n"
1948 "mixm_i2f_loopme2:\n"
1949 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
1950 " cmpl (%%esp), %%ebp\n"
1951 "jae mixm_i2f_loopme2\n"
1952 "decl %%ecx\n"
1953 "jz mixm_i2f_ende\n"
1954 "jmp mixm_i2f_next\n"
1955 ".cfi_endproc\n"
1956 ".size mixm_i2f, .-mixm_i2f\n"
1957 :
1958 : "n"(MIXF_LOOPED),
1959 "n"(FLAG_DISABLED)
1960 );
1961
1962 __asm__ __volatile__
1963 (
1964 ".type mixs_i2f, @function\n"
1965 "mixs_i2f:\n"
1966 ".cfi_startproc\n"
1967 ".cfi_def_cfa_offset 4\n"
1968 /* mixing, stereo w/ cubic interpolation, FILTERED */
1969 "movl nsamples_ofs(%%ebx), %%ecx\n"
1970 "flds voll_ofs(%%ebx)\n" /* (vl) */
1971 "flds volr_ofs(%%ebx)\n" /* (vr) (vl) */
1972 "shrl $2, %%ebp\n"
1973 "pushl %%ebp\n"
1974 "movl %%eax, %%ebp\n"
1975 "shrl $2, %%ebp\n"
1976 "movl %%edx, %%eax\n"
1977 "shrl $24, %%eax\n"
1978 /* and again we ignore align dword */
1979 "mixs_i2f_next:\n"
1980 " flds (,%%ebp,4)\n" /* (w0) (vr) (vl) */
1981 " fmuls ct0_ofs(%%ebx,%%eax,4)\n" /* (w0') (vr) (vl) */
1982 " flds 4(,%%ebp,4)\n" /* (w1) (w0') (vr) (vl) */
1983 " fmuls ct1_ofs(%%ebx,%%eax,4)\n" /* (w1') (w0') (vr) (vl) */
1984 " flds 8(,%%ebp,4)\n" /* (w2) (w1') (w0') (vr) (vl) */
1985 " fmuls ct2_ofs(%%ebx,%%eax,4)\n" /* (w2') (w1') (w0') (vr) (vl) */
1986 " flds 12(,%%ebp,4)\n" /* (w3) (w2') (w1') (w0') (vr) (vl) */
1987 " fmuls ct3_ofs(%%ebx,%%eax,4)\n" /* (w3') (w2') (w1') (w0') (vr) (vl) */
1988 " fxch %%st(2)\n" /* (w1') (w2') (w3') (w0') (vr) (vl) */
1989 " faddp %%st, %%st(3)\n" /* (w2') (w3') (w0+w1) (vr) (vl) */
1990 " addl 16(%%esp), %%edx\n"
1991 " leal 8(%%edi), %%edi\n"
1992 " faddp %%st, %%st(2)\n" /* (w2+w3) (w0+w1) (vr) (vl) */
1993 " adcl 12(%%ebx), %%ebp\n"
1994 " movl %%edx, %%eax\n"
1995 " faddp %%st, %%st(1)\n" /* (wert) (vr) (vl) */
1996
1997 /* FILTER HIER:
1998 * b=reso*b+freq*(in-l);
1999 * l+=freq*b;
2000 */
2001 " fsubs __fl1_ofs(%%ebx)\n" /* (in-l) .. */
2002 " fmuls ffrq_ofs(%%ebx)\n" /* (f*(in-l)) .. */
2003 " flds __fb1_ofs(%%ebx)\n" /* (b) (f*(in-l)) .. */
2004 " fmuls frez_ofs(%%ebx)\n" /* (r*b) (f*(in-l)) .. */
2005 " faddp %%st, %%st(1)\n" /* (b') .. */
2006 " fsts __fb1_ofs(%%ebx)\n"
2007 " fmuls ffrq_ofs(%%ebx)\n" /* (f*b') .. */
2008 " fadds __fl1_ofs(%%ebx)\n" /* (l') .. */
2009 " fsts __fl1_ofs(%%ebx)\n" /* (out) (vr) (vl) */
2010
2011 " shrl $24, %%eax\n"
2012 " fld %%st(1)\n" /* (vr) (wert) (vr) (vl) */
2013 " fld %%st(3)\n" /* (vl) (vr) (wert) (vr) (vl) */
2014 " fmul %%st(2), %%st\n" /* (left) (vr) (wert) (vr) (vl) */
2015 " fxch %%st(4)\n" /* (vl) (vr) (wert) (vr) (left) */
2016 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr) (wert) (vr) (left) */
2017 " fxch %%st(2)\n" /* (wert) (vr) (vl') (vr) (left) */
2018 " fmulp %%st(1)\n" /* (right) (vl') (vr) (left) */
2019 " fxch %%st(2)\n" /* (vr) (vl') (right) (left) */
2020 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl') (right) (left) */
2021 " fxch %%st(3)\n" /* (left) (vl') (right) (vr') */
2022 " fadds -8(%%edi)\n" /* (lfinal) (vl') <right> (vr') */
2023 " fxch %%st(2)\n" /* (right) (vl') (lfinal) (vr') */
2024 " fadds -4(%%edi)\n" /* (rfinal) (vl') (lfinal) (vr') */
2025 "mixs_i2f_looped:\n"
2026 " cmpl (%%esp), %%ebp\n"
2027 " jae mixs_i2f_LoopHandler\n"
2028 /* hier 1 cycle frei */
2029 " fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
2030 " fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
2031 " fstps -8(%%edi)\n" /* (vl) (vr) */
2032 " fxch %%st(1)\n" /* (vr) (vl) */
2033 " decl %%ecx\n"
2034 "jnz mixs_i2f_next\n"
2035 "mixs_i2f_ende:\n"
2036 "fstps volr_ofs(%%ebx)\n" /* (vl) */
2037 "fstps voll_ofs(%%ebx)\n" /* - */
2038 "shll $2, %%ebp\n"
2039 "movl %%ebp, %%eax\n"
2040 "popl %%ecx\n" /* just a garbage register */
2041 "ret\n"
2042
2043 "mixs_i2f_LoopHandler:\n"
2044 "fstps -4(%%edi)\n" /* (vl') (lfinal) (vr') */
2045 "fxch %%st(1)\n" /* (lfinal) (vl) (vr) */
2046 "fstps -8(%%edi)\n" /* (vl) (vr) */
2047 "fxch %%st(1)\n" /* (vr) (vl) */
2048 "pushl %%eax\n"
2049 "movl looptype_ofs(%%ebx), %%eax\n"
2050 "testl %0, %%eax\n"
2051 "jnz mixs_i2f_loopme\n"
2052 "popl %%eax\n"
2053 "fxch %%st(1)\n" /* (vl) (vr) */
2054 "subl 16(%%esp), %%edx\n"
2055 "sbbl 12(%%ebx), %%ebp\n"
2056 "flds (,%%ebp,4)\n" /* (wert) (vl) (vr) */
2057 "fxch %%st(2)\n" /* (vr) (vl) (wert) */
2058 "mixs_i2f_fill:\n"
2059 /* sample ends -> fill rest of buffer with last sample value */
2060 " fld %%st(1)\n" /* (vl) (vr) (vl) (wert) */
2061 " fmul %%st(3), %%st\n" /* (left) (vr) (vl) (wert) */
2062 " fxch %%st(1)\n" /* (vr) (left) (vl) (wert) */
2063 " fld %%st\n" /* (vr) (vr) (left) (vl) (wert) */
2064 " fmul %%st(4), %%st\n" /* (right) (vr) (left) (vl) (wert) */
2065 " fxch %%st(2)\n" /* (left) (vr) (right) (vl) (wert) */
2066 " fadds -8(%%edi)\n"
2067 " fstps -8(%%edi)\n" /* (vr) (right) (vl) (wert) */
2068 " fxch %%st(1)\n" /* (right) (vr) (vl) (wert) */
2069 " fadds -4(%%edi)\n"
2070 " fstps -4(%%edi)\n" /* (vr) (vl) (wert) */
2071 " fadds volrr_ofs(%%ebx)\n" /* (vr') (vl) (wert) */
2072 " fxch %%st(1)\n" /* (vl) (vr') (wert) */
2073 " leal 8(%%edi), %%edi\n"
2074 " decl %%ecx\n"
2075 " fadds volrl_ofs(%%ebx)\n" /* (vl') (vr') (wert) */
2076 " fxch %%st(1)\n" /* (vr') (vl') (wert) */
2077 "jnz mixs_i2f_fill\n"
2078 /* update click-removal fade values */
2079 "fxch %%st(2)\n" /* (wert) (vl) (vr) */
2080 "fld %%st\n" /* (wert) (wert) (vl) (vr) */
2081 "fmul %%st(2), %%st\n" /* (left) (wert) (vl) (vr) */
2082 "fxch %%st(1)\n" /* (wert) (left) (vl) (vr) */
2083 "fmul %%st(3), %%st\n" /* (rite) (left) (vl) (vr) */
2084 "fxch %%st(1)\n" /* (left) (rite) (vl) (vr) */
2085 "fadds fadeleft_ofs(%%ebx)\n" /* (fl') (rite) (vl) (vr) */
2086 "fxch %%st(1)\n" /* (rite) (fl') (vl) (vr) */
2087 "fadds faderight_ofs(%%ebx)\n" /* (fr') (fl') (vl) (vr) */
2088 "fxch %%st(1)\n" /* (fl') (fr') (vl) (vr) */
2089 "fstps fadeleft_ofs(%%ebx)\n" /* (fr') (vl) (vr) */
2090 "fstps faderight_ofs(%%ebx)\n" /* (vl) (vr) */
2091 "fxch %%st(1)\n" /* (vr) (vl) */
2092 "movl looptype_ofs(%%ebx), %%eax\n"
2093 "andl %1, %%eax\n"
2094 "movl %%eax, looptype_ofs(%%ebx)\n"
2095 "jmp mixs_i2f_ende\n"
2096
2097 "mixs_i2f_loopme:\n"
2098 /* sample loops -> jump to loop start */
2099 "popl %%eax\n"
2100 "mixs_i2f_loopme2:\n"
2101 "subl mixlooplen_ofs(%%ebx), %%ebp\n"
2102 " cmpl (%%esp), %%ebp\n"
2103 "jae mixs_i2f_loopme2\n"
2104 "decl %%ecx\n"
2105 "jz mixs_i2f_ende\n"
2106 "jmp mixs_i2f_next\n"
2107 ".cfi_endproc\n"
2108 ".size mixs_i2f, .-mixs_i2f\n"
2109 :
2110 : "n"(MIXF_LOOPED),
2111 "n"(FLAG_DISABLED)
2112 );
2113
2114 /*
2115 * clip routines:
2116 * ebx is PIC, if in PIC mode
2117 * esi : 32 bit float input buffer
2118 * edi : 8/16 bit output buffer
2119 * ecx : # of samples to clamp (*2 if stereo!)
2120 */
2121 __asm__ __volatile__
2122 (
2123 ".type clip_16s, @function\n"
2124 "clip_16s:\n"
2125 ".cfi_startproc\n"
2126 ".cfi_def_cfa_offset 4\n"
2127 /* convert/clip samples, 16bit signed */
2128 #ifdef __PIC__
2129 "flds clampmin@GOTOFF(%ebx)\n" /* (min) */
2130 "flds clampmax@GOTOFF(%ebx)\n" /* (max) (min) */
2131 "movl dwmixfa_state@GOT(%ebx), %ebx\n"
2132 #else
2133 "flds clampmin\n" /* (min) */
2134 "flds clampmax\n" /* (max) (min) */
2135 #endif
2136 "movw $32767, %bp\n"
2137 "movw $-32768, %dx\n"
2138
2139 "clip_16s_lp:\n"
2140 " flds (%esi)\n" /* (ls) (max) (min) */
2141 " fcom %st(1)\n"
2142 " fnstsw %ax\n"
2143 " sahf\n"
2144 " ja clip_16s_max\n"
2145 " fcom %st(2)\n"
2146 " fstsw %ax\n"
2147 " sahf\n"
2148 " jb clip_16s_min\n"
2149 " fistps (%edi)\n" /* (max) (min) fi*s is 16bit */
2150 "clip_16s_next:\n"
2151 " addl $4, %esi\n"
2152 " addl $2, %edi\n"
2153 " decl %ecx\n"
2154 "jnz clip_16s_lp\n"
2155 "jmp clip_16s_ende\n"
2156
2157 "clip_16s_max:\n"
2158 "fstp %st\n" /* (max) (min) */
2159 "movw %bp, (%edi)\n"
2160 "jmp clip_16s_next\n"
2161 "clip_16s_min:\n"
2162 "fstp %st\n"
2163 "movw %dx, (%edi)\n"
2164 "jmp clip_16s_next\n"
2165
2166 "clip_16s_ende:\n"
2167 "fstp %st\n" /* (min) */
2168 "fstp %st\n" /* - */
2169 "ret\n"
2170 ".cfi_endproc\n"
2171 ".size clip_16s, .-clip_16s\n"
2172 );
2173
2174 __asm__ __volatile__
2175 (
2176 ".type clip_16u, @function\n"
2177 "clip_16u:\n"
2178 ".cfi_startproc\n"
2179 ".cfi_def_cfa_offset 4\n"
2180 /* convert/clip samples, 16bit unsigned */
2181 #ifdef __PIC__
2182 "flds clampmin@GOTOFF(%ebx)\n" /* (min) */
2183 "flds clampmax@GOTOFF(%ebx)\n" /* (max) (min) */
2184 "movl dwmixfa_state@GOT(%ebx), %ebx\n"
2185 #else
2186 "flds clampmin\n" /* (min) */
2187 "flds clampmax\n" /* (max) (min) */
2188 #endif
2189 "movw $32767, %bp\n"
2190 "movw $-32768, %dx\n"
2191
2192 "clip_16u_lp:\n"
2193 " flds (%esi)\n" /* (ls) (max) (min) */
2194 " fcom %st(1)\n"
2195 " fnstsw %ax\n"
2196 " sahf\n"
2197 " ja clip_16u_max\n"
2198 " fcom %st(2)\n"
2199 " fstsw %ax\n"
2200 " sahf\n"
2201 " jb clip_16u_min\n"
2202 " fistps clipval_ofs(%ebx)\n" /* (max) (min) */
2203 " movw clipval_ofs(%ebx), %ax\n"
2204 "clip_16u_next:\n"
2205 " xorw $0x8000, %ax\n"
2206 " movw %ax, (%edi)\n"
2207 " addl $4, %esi\n"
2208 " addl $2, %edi\n"
2209 " decl %ecx\n"
2210 "jnz clip_16u_lp\n"
2211 "jmp clip_16u_ende\n"
2212
2213 "clip_16u_max:\n"
2214 "fstp %st\n" /* (max) (min) */
2215 "movw %bp, %ax\n"
2216 "jmp clip_16u_next\n"
2217 "clip_16u_min:\n"
2218 "fstp %st\n" /* (max) (min) */
2219 "movw %dx, %ax\n"
2220 "jmp clip_16u_next\n"
2221
2222 "clip_16u_ende:\n"
2223 "fstp %st\n" /* (min) */
2224 "fstp %st\n" /* - */
2225 "ret\n"
2226 ".cfi_endproc\n"
2227 ".size clip_16u, .-clip_16u\n"
2228 );
2229
2230 __asm__ __volatile__
2231 (
2232 ".type clip_8s, @function\n"
2233 "clip_8s:\n"
2234 ".cfi_startproc\n"
2235 ".cfi_def_cfa_offset 4\n"
2236 /* convert/clip samples, 8bit signed */
2237 #ifdef __PIC__
2238 "flds clampmin@GOTOFF(%ebx)\n" /* (min) */
2239 "flds clampmax@GOTOFF(%ebx)\n" /* (max) (min) */
2240 "movl dwmixfa_state@GOT(%ebx), %ebx\n"
2241 #else
2242 "flds clampmin\n" /* (min) */
2243 "flds clampmax\n" /* (max) (min) */
2244 #endif
2245 "movw $32767, %bp\n"
2246 "movw $-32768, %dx\n"
2247
2248 "clip_8s_lp:\n"
2249 " flds (%esi)\n" /* (ls) (max) (min) */
2250 " fcom %st(1)\n"
2251 " fnstsw %ax\n"
2252 " sahf\n"
2253 " ja clip_8s_max\n"
2254 " fcom %st(2)\n"
2255 " fstsw %ax\n"
2256 " sahf\n"
2257 " jb clip_8s_min\n"
2258 " fistps clipval_ofs(%ebx)\n" /* (max) (min) */
2259 " movw clipval_ofs(%ebx), %ax\n"
2260 "clip_8s_next:\n"
2261 " movb %ah, (%edi)\n"
2262 " addl $4, %esi\n"
2263 " addl $1, %edi\n"
2264 " decl %ecx\n"
2265 "jnz clip_8s_lp\n"
2266 "jmp clip_8s_ende\n"
2267
2268 "clip_8s_max:\n"
2269 "fstp %st\n" /* (max) (min) */
2270 "movw %bp, %ax\n"
2271 "jmp clip_8s_next\n"
2272 "clip_8s_min:\n"
2273 "fstp %st\n" /* (max) (min) */
2274 "movw %dx, %ax\n"
2275 "jmp clip_8s_next\n"
2276
2277 "clip_8s_ende:\n"
2278 "fstp %st\n" /* (min) */
2279 "fstp %st\n" /* - */
2280 "ret\n"
2281 ".cfi_endproc\n"
2282 ".size clip_8s, .-clip_8s\n"
2283 );
2284
2285 __asm__ __volatile__
2286 (
2287 ".type clip_8u, @function\n"
2288 "clip_8u:\n"
2289 ".cfi_startproc\n"
2290 ".cfi_def_cfa_offset 4\n"
2291 /* convert/clip samples, 8bit unsigned */
2292 #ifdef __PIC__
2293 "flds clampmin@GOTOFF(%ebx)\n" /* (min) */
2294 "flds clampmax@GOTOFF(%ebx)\n" /* (max) (min) */
2295 "movl dwmixfa_state@GOT(%ebx), %ebx\n"
2296 #else
2297 "flds clampmin\n" /* (min) */
2298 "flds clampmax\n" /* (max) (min) */
2299 #endif
2300 "movw $32767, %bp\n"
2301 "movw $-32767, %dx\n"
2302
2303 "clip_8u_lp:\n"
2304 " flds (%esi)\n" /* (ls) (max) (min) */
2305 " fcom %st(1)\n"
2306 " fnstsw %ax\n"
2307 " sahf\n"
2308 " ja clip_8u_max\n"
2309 " fcom %st(2)\n"
2310 " fstsw %ax\n"
2311 " sahf\n"
2312 " jb clip_8u_min\n"
2313 " fistps clipval_ofs(%ebx)\n" /* (max) (min) */
2314 " movw clipval_ofs(%ebx), %ax\n"
2315 "clip_8u_next:\n"
2316 " xorw $0x8000, %ax\n"
2317 " movb %ah, (%edi)\n"
2318 " addl $4, %esi\n"
2319 " addl $1, %edi\n"
2320 " decl %ecx\n"
2321 "jnz clip_8u_lp\n"
2322 "jmp clip_8u_ende\n"
2323
2324 "clip_8u_max:\n"
2325 "fstp %st\n" /* (max) (min) */
2326 "movw %bp, %ax\n"
2327 "jmp clip_8u_next\n"
2328 "clip_8u_min:\n"
2329 "fstp %st\n" /* (max) (min) */
2330 "movw %dx, %ax\n"
2331 "jmp clip_8u_next\n"
2332
2333 "clip_8u_ende:\n"
2334 "fstp %st\n" /* (min) */
2335 "fstp %st\n" /* - */
2336 "ret\n"
2337 ".cfi_endproc\n"
2338 ".size clip_8u, .-clip_8u\n"
2339 );
2340
2341 __asm__ __volatile__
2342 (
2343 ".cfi_startproc\n"
2344 ".data\n"
2345 "clippers:\n"
2346 ".long clip_8s, clip_8u, clip_16s, clip_16u\n"
2347
2348 "mixers:\n"
2349 /* bit 0 stereo/mono output (this needs to move when we add support for stereo input samples)
2350 * bit 1 interpolate
2351 * bit 2 interpolateq
2352 * bit 3 FILTER
2353 */
2354 ".long mixm_n, mixs_n, mixm_i, mixs_i\n" /* 0,0,0,0 0,0,0,1 0,0,1,0 0,0,1,1 */
2355 ".long mixm_i2, mixs_i2, mix_0, mix_0\n" /* 0,1,0,0 0,1,0,1 0,1,1,0 0,1,1,1 */
2356 ".long mixm_n, mixs_nf, mixm_if, mixs_if\n" /* 1,0,0,0 1,0,0,1 1,0,1,0 1,0,1,1 */
2357 ".long mixm_i2f, mixs_i2f, mix_0, mix_0\n" /* 1,1,0,0 1,1,0,1 1,1,1,0 1,1,1,1 */
2358 ".previous\n"
2359 );
2360 }
2361
getchanvol(int n,int len)2362 void getchanvol (int n, int len)
2363 {
2364 int d0;
2365 __asm__ __volatile__
2366 (
2367 /* parm
2368 * eax : channel #
2369 * ecx : no of samples
2370 */
2371 #ifdef __PIC__
2372 "pushl %%ebx\n"
2373 "call " GET_PC_THUNK_STR(bx) "\n"
2374 "addl $_GLOBAL_OFFSET_TABLE_, %%ebx\n"
2375 "movl dwmixfa_state@GOT(%%ebx), %%ebx\n"
2376 #else
2377 "movl $dwmixfa_state, %%ebx\n"
2378 #endif
2379 "pushl %%ebp\n"
2380 "fldz\n" /* (0) */
2381
2382 "movl voiceflags_ofs(%%ebx,%%eax,4), %%esi\n"
2383 "testl %3, %%esi\n"
2384 "jz getchanvol_SkipVoice\n"
2385 "movl freqf_ofs(%%ebx,%%eax,4), %%esi\n"
2386 "movl smpposf_ofs(%%ebx,%%eax,4), %%edx\n"
2387 "movl loopend_ofs(%%ebx,%%eax,4), %%edi\n"
2388 "shrl $2, %%edi\n"
2389 "movl smpposw_ofs(%%ebx,%%eax,4), %%ebp\n"
2390 "shrl $2, %%ebp\n"
2391
2392 "movl %%ecx, nsamples_ofs(%%ebx)\n"
2393
2394 "getchanvol_next:\n" /* (sum) */
2395 " flds (,%%ebp,4)\n" /* (wert) (sum) */
2396 " testl $0x80000000, (,%%ebp,4)\n"
2397 " jnz getchanvol_neg\n"
2398 " faddp %%st, %%st(1)\n" /* (sum') */
2399 " jmp getchanvol_goon\n"
2400 "getchanvol_neg:\n"
2401 " fsubp %%st, %%st(1)\n"
2402 "getchanvol_goon:\n"
2403 " addl %%esi, %%edx\n"
2404 " adcl freqw_ofs(%%ebx,%%eax,4), %%ebp\n" /* used to use ebx instead of memory reference, but we now we need the EBX register */
2405 "getchanvol_looped:\n"
2406 " cmpl %%edi, %%ebp\n"
2407 " jae getchanvol_LoopHandler\n"
2408 " decl %%ecx\n"
2409 "jnz getchanvol_next\n"
2410 "jmp getchanvol_SkipVoice\n"
2411 "getchanvol_LoopHandler:\n"
2412 "testl %2, voiceflags_ofs(%%ebx,%%eax,4)\n"
2413 "jz getchanvol_SkipVoice\n"
2414 "subl looplen_ofs(%%ebx,%%eax,4), %%ebp\n"
2415 "jmp getchanvol_looped\n"
2416 "getchanvol_SkipVoice:\n"
2417 "fidivl nsamples_ofs(%%ebx)\n" /* (sum'') */
2418 "fld %%st(0)\n" /* (s) (s) */
2419 "fmuls volleft_ofs(%%ebx,%%eax,4)\n" /* (sl) (s) */
2420 "fstps voll_ofs(%%ebx)\n" /* (s) */
2421 "fmuls volright_ofs(%%ebx,%%eax,4)\n" /* (sr) */
2422 "fstps volr_ofs(%%ebx)\n" /* - */
2423
2424 "popl %%ebp\n"
2425 #ifdef __PIC__
2426 "popl %%ebx\n"
2427 #endif
2428 : "=&c" (d0)
2429 : "a" (n),
2430 "n" (MIXF_LOOPED),
2431 "n" (MIXF_PLAYING),
2432 "0" (len)
2433 #ifdef __PIC__
2434 : "edx", "edi", "esi"
2435 #else
2436 : "ebx", "edx", "edi", "esi"
2437 #endif
2438 );
2439 }
2440
stop_dwmixfa(void)2441 void stop_dwmixfa(void)
2442 {
2443 }
2444
2445