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