1 #include <stddef.h>
2 
remap_range1_start(void)3 void remap_range1_start(void){}
4 
5 
nonepublic_dwmixa3(void)6 void nonepublic_dwmixa3(void)
7 {
8 	__asm__ __volatile__
9 	(
10 		".cfi_endproc\n"
11 
12 		".type mixrFadeChannel_, @function\n"
13 		"mixrFadeChannel_:\n"
14 		".cfi_startproc\n"
15 
16 		"  movl %c0(%%edi), %%ebx\n"      /*  %0 = curvol[0] */
17 		"  movl %c1(%%edi), %%ecx\n"      /*  %1 = curvol[1] */
18 		"  shll $8, %%ebx\n"
19 		"  shll $8, %%ecx\n"
20 		"  movl %c2(%%edi),%%eax\n"       /*  %2 = ch->samp */
21 		"  addl %c3(%%edi),%%eax\n"       /*  %3 = ch->pos */
22 		"  testb %5, %c4(%%edi)\n"        /*  %5 = MIXRQ_PLAY16BIT */
23 		                                  /*  %4 = ch->status, */
24 		"  jnz mixrFadeChannel16\n"
25 		"    movb (%%eax), %%bl\n"
26 		"  jmp mixrFadeChanneldo\n"
27 		"mixrFadeChannel16:\n"
28 		"    movb 1(,%%eax,2),%%bl\n"
29 		"mixrFadeChanneldo:\n"
30 		"  movb %%bl, %%cl\n"
31 		"  movl 1234(,%%ebx,4),%%ebx\n"
32 		"mixrFadeChannelvoltab1:\n"
33 		"  movl 1234(,%%ecx,4),%%ecx\n"
34 		"mixrFadeChannelvoltab2:\n"
35 		"  addl %%ebx, (%%esi)\n"
36 		"  addl %%ecx, 4(%%esi)\n"
37 		"  movl $0, %c0(%%edi)\n"         /* %0 = curvol[0] */
38 		"  movl $0, %c1(%%edi)\n"         /* %1 = curvol[1] */
39 		"  ret\n"
40 		".cfi_endproc\n"
41 		".size mixrFadeChannel_, .-mixrFadeChannel_\n"
42 
43 		".type setupfade, @function\n"
44 		"setupfade:\n" /* CALLED FROM EXTERNAL */
45 		".cfi_startproc\n"
46 		"  movl %%eax, (mixrFadeChannelvoltab1-4)\n"
47 		"  movl %%eax, (mixrFadeChannelvoltab2-4)\n"
48 		"  ret\n"
49 		".cfi_endproc\n"
50 		".size setupfade, .-setupfade\n"
51 
52 		".cfi_startproc\n"
53 		:
54 		: "n" (offsetof(struct channel, curvols[0])), /*  0  */
55 		  "n" (offsetof(struct channel, curvols[1])), /*  1  */
56 		  "n" (offsetof(struct channel, samp)),       /*  2  */
57 		  "n" (offsetof(struct channel, pos)),        /*  3  */
58 		  "n" (offsetof(struct channel, status)),     /*  4  */
59 		  "n" (MIXRQ_PLAY16BIT)                       /*  5  */
60 	);
61 }
62 
63 __attribute__((optimize("-fno-omit-frame-pointer"))) /* we use the stack, so we need all access to go via EBP, not ESP */
mixrFadeChannel(int32_t * fade,struct channel * ch)64 void mixrFadeChannel(int32_t *fade, struct channel *ch)
65 {
66 	int d0, d1;
67 
68 	__asm__ __volatile__
69 	(
70 #ifdef __PIC__
71 		"pushl %%ebx\n"
72 #endif
73 		"call mixrFadeChannel_\n"
74 #ifdef __PIC__
75 		"popl %%ebx\n"
76 #endif
77 		: "=&S"(d0),
78 		  "=&D"(d1)
79 		: "0"(fade),
80 		  "1"(ch)
81 #ifdef __PIC__
82 		: "memory", "eax", "ecx", "edx"
83 #else
84 		: "memory", "eax", "ebx", "ecx", "edx"
85 #endif
86 	);
87 }
88 
nonepublic_dwmixa1(void)89 void nonepublic_dwmixa1(void)
90 {
91 	__asm__ __volatile__
92 	(
93 		".cfi_endproc\n"
94 	);
95 
96 	__asm__ __volatile__
97 	(
98 		".type playquiet, @function\n"
99 		"playquiet:\n"
100 		".cfi_startproc\n"
101 
102 		"  ret\n"
103 
104 		".cfi_endproc\n"
105 		".size playquiet, .-playquiet\n"
106 	);
107 
108 	__asm__ __volatile__
109 	(
110 		".type playmono, @function\n"
111 		"playmono:\n"
112 		".cfi_startproc\n"
113 
114 		"playmonolp:\n"
115 		"    movb (%esi), %bl\n"
116 		"    addl $1234,%edx\n"
117 		"monostepl:\n"
118 		"    movl 1234(,%ebx,4), %eax\n"
119 		"playmonomonosteplvol1:\n"
120 		"    adcl $1234, %esi\n"
121 		"monosteph:\n"
122 		"    addl %eax, (%edi)\n"
123 		"    addl $4, %edi\n"
124 		"    addl $1234, %ebx\n"
125 		"monoramp:\n"
126 		"  cmpl $1234, %edi\n"
127 		"monoendp:\n"
128 		"  jb playmonolp\n"
129 		"  ret\n"
130 
131 		".cfi_endproc\n"
132 		".size playmono, .-playmono\n"
133 
134 		".type setupmono, @function\n"
135 		"setupmono:\n" /* CALLED FROM EXTERNAL */
136 		".cfi_startproc\n"
137 
138 		"  movl %eax, (playmonomonosteplvol1-4)\n"
139 		"  ret\n"
140 
141 		".cfi_endproc\n"
142 		".size setupmono, .-setupmono\n"
143 	);
144 
145 	__asm__ __volatile__
146 	(
147 		".type playmono16, @function\n"
148 		"playmono16:\n"
149 		".cfi_startproc\n"
150 
151 		"playmono16lp:\n"
152 		"    movb 1(%esi,%esi), %bl\n"
153 		"    addl $1234, %edx\n"
154 		"mono16stepl:\n"
155 		"    movl 1234(,%ebx,4),%eax\n"
156 		"playmono16vol1:\n"
157 		"    adcl $1234, %esi\n"
158 		"mono16steph:\n"
159 		"    addl %eax, (%edi)\n"
160 		"    addl $4, %edi\n"
161 		"    addl $1234, %ebx\n"
162 		"mono16ramp:\n"
163 		"    cmpl $1234, %edi\n"
164 		"mono16endp:\n"
165 		"  jb playmono16lp\n"
166 		"  ret\n"
167 
168 		".cfi_endproc\n"
169 		".size playmono16, .-playmono16\n"
170 
171 		".type setupmono16, @function\n"
172 		"setupmono16:\n" /* usual CALLED from EXTERNAL crap*/
173 		".cfi_startproc\n"
174 
175 		"  movl %eax, (playmono16vol1-4)\n"
176 		"  ret\n"
177 
178 		".cfi_endproc\n"
179 		".size setupmono16, .-setupmono16\n"
180 	);
181 
182 	__asm__ __volatile__
183 	(
184 		".type playmonoi, @function\n"
185 		"playmonoi:\n"
186 		".cfi_startproc\n"
187 
188 		"playmonoilp:\n"
189 		"    movl %edx, %eax\n"
190 		"    shrl $20, %eax\n"
191 		"    movb (%esi), %al\n"
192 		"    movb 1234(%eax,%eax), %bl\n"
193 		"playmonoiint0:\n"
194 		"    movb 1(%esi), %al\n"
195 		"    addb 1234(%eax,%eax), %bl\n"
196 		"playmonoiint1:\n"
197 
198 		"    addl $1234, %edx\n"
199 		"monoistepl:\n"
200 		"    movl 1234(,%ebx,4),%eax\n"
201 		"playmonoivol1:\n"
202 		"    adcl $1234, %esi\n"
203 		"monoisteph:\n"
204 		"    addl %eax, (%edi)\n"
205 		"    addl $4, %edi\n"
206 		"    addl $1234, %ebx\n"
207 		"monoiramp:\n"
208 		"  cmpl $1234, %edi\n"
209 		"monoiendp:\n"
210 		"  jb playmonoilp\n"
211 		"  ret\n"
212 
213 		".cfi_endproc\n"
214 		".size playmonoi, .-playmonoi\n"
215 
216 		".type setupmonoi, @function\n"
217 		"setupmonoi:\n" /* need to comment??? external */
218 		".cfi_startproc\n"
219 
220 		"  movl %eax, (playmonoivol1-4)\n"
221 		"  movl %ebx, (playmonoiint0-4)\n"
222 		"  incl %ebx\n"
223 		"  movl %ebx, (playmonoiint1-4)\n"
224 		"  decl %ebx\n"
225 		"  ret\n"
226 
227 		".cfi_endproc\n"
228 		".size setupmonoi, .-setupmonoi\n"
229 	);
230 
231 	__asm__ __volatile__
232 	(
233 		".type playmonoi16, @function\n"
234 		"playmonoi16:\n"
235 		".cfi_startproc\n"
236 
237 		"playmonoi16lp:\n"
238 		"    movl %edx, %eax\n"
239 		"    shrl $20, %eax\n"
240 		"    movb 1(%esi,%esi), %al\n"
241 		"    movb 1234(%eax,%eax), %bl\n"
242 		"playmonoi16int0:\n"
243 		"    movb 3(%esi,%esi), %al\n"
244 		"    addb 1234(%eax,%eax), %bl\n"
245 		"playmonoi16int1:\n"
246 
247 		"    addl $1234, %edx\n"
248 		"monoi16stepl:\n"
249 		"    movl 1234(,%ebx,4), %eax\n"
250 		"playmonoi16vol1:\n"
251 		"    adcl $1234, %esi\n"
252 		"monoi16steph:\n"
253 		"    addl %eax, (%edi)\n"
254 		"    addl $4, %edi\n"
255 		"    addl $1234, %ebx\n"
256 		"monoi16ramp:\n"
257 		"  cmpl $1234, %edi\n"
258 		"monoi16endp:\n"
259 		"  jb playmonoi16lp\n"
260 		"  ret\n"
261 
262 		".cfi_endproc\n"
263 		".size playmonoi16, .-playmonoi16\n"
264 
265 		".type setupmonoi16, @function\n"
266 		"setupmonoi16:\n" /* WE ARE NOT SHOCKED ABOUT EXTERNAL STUFF? */
267 		".cfi_startproc\n"
268 
269 		"  movl %eax, (playmonoi16vol1-4)\n"
270 		"  movl %ebx, (playmonoi16int0-4)\n"
271 		"  incl %ebx\n"
272 		"  movl %ebx, (playmonoi16int1-4)\n"
273 		"  decl %ebx\n"
274 		"  ret\n"
275 
276 		".cfi_endproc\n"
277 		".size setupmonoi16, .-setupmonoi16\n"
278 	);
279 
280 	__asm__ __volatile__
281 	(
282 		".type playstereo, @function\n"
283 		"playstereo:\n"
284 		".cfi_startproc\n"
285 
286 		"playstereolp:\n"
287 		"    movb (%esi), %bl\n"
288 		"    addl $1234, %edx\n"
289 		"stereostepl:\n"
290 		"    movb (%esi), %cl\n"
291 		"    movl 1234(,%ebx,4), %eax\n"
292 		"playstereovol1:\n"
293 		"    adcl $1234, %esi\n"
294 		"stereosteph:\n"
295 		"    addl %eax, (%edi)\n"
296 		"    movl 1234(,%ecx,4), %eax\n"
297 		"playstereovol2:\n"
298 		"    addl %eax, 4(%edi)\n"
299 		"    addl $8, %edi\n"
300 		"    addl $1234, %ebx\n"
301 		"stereoramp0:\n"
302 		"    addl $1234, %ecx\n"
303 		"stereoramp1:\n"
304 		"  cmpl $1234, %edi\n"
305 		"stereoendp:\n"
306 		"  jb playstereolp\n"
307 		"  ret\n"
308 
309 		".cfi_endproc\n"
310 		".size playstereo, .-playstereo\n"
311 
312 		".type setupstereo, @function\n"
313 		"setupstereo:\n" /* TAKE A WILD GUESS */
314 		".cfi_startproc\n"
315 
316 		"  movl %eax, (playstereovol1-4)\n"
317 		"  movl %eax, (playstereovol2-4)\n"
318 		"  ret\n"
319 
320 		".cfi_endproc\n"
321 		".size setupstereo, .-setupstereo\n"
322 	);
323 
324 	__asm__ __volatile__
325 	(
326 		".type playstereo16, @function\n"
327 		"playstereo16:\n"
328 		".cfi_startproc\n"
329 
330 		"playstereo16lp:\n"
331 		"    movb 1(%esi,%esi), %bl\n"
332 		"    addl $1234, %edx\n"
333 		"stereo16stepl:\n"
334 		"    movb 1(%esi,%esi), %cl\n"
335 		"    movl 1234(,%ebx,4),%eax\n"
336 		"playstereo16vol1:\n"
337 		"    adcl $1234, %esi\n"
338 		"stereo16steph:\n"
339 		"    addl %eax,(%edi)\n"
340 		"    movl 1234(,%ecx,4), %eax\n"
341 		"playstereo16vol2:\n"
342 		"    addl %eax, 4(%edi)\n"
343 		"    addl $8, %edi\n"
344 		"    addl $1234,%ebx\n"
345 		"stereo16ramp0:\n"
346 		"    addl $1234,%ecx\n"
347 		"stereo16ramp1:\n"
348 		"  cmpl $1234, %edi\n"
349 		"stereo16endp:\n"
350 		"  jb playstereo16lp\n"
351 		"  ret\n"
352 
353 		".cfi_endproc\n"
354 		".size playstereo16, .-playstereo16\n"
355 
356 		".type setupstereo16, @function\n"
357 		"setupstereo16:\n" /* GUESS TWO TIMES? */
358 		".cfi_startproc\n"
359 
360 		"  movl %eax, (playstereo16vol1-4)\n"
361 		"  movl %eax, (playstereo16vol2-4)\n"
362 		"  ret\n"
363 
364 		".cfi_endproc\n"
365 		".size setupstereo16, .-setupstereo16\n"
366 	);
367 
368 	__asm__ __volatile__
369 	(
370 		".type playstereoi, @function\n"
371 		"playstereoi:\n"
372 		".cfi_startproc\n"
373 
374 		"playstereoilp:\n"
375 		"    movl %edx, %eax\n"
376 		"    shrl $20, %eax\n"
377 		"    movb (%esi), %al\n"
378 		"    movb 1234(%eax,%eax), %bl\n"
379 		"playstereoiint0:\n"
380 		"    movb 1(%esi), %al\n"
381 		"    addb 1234(%eax,%eax), %bl\n"
382 		"playstereoiint1:\n"
383 
384 		"    addl $1234, %edx\n"
385 		"stereoistepl:\n"
386 		"    movb %bl, %cl\n"
387 		"    movl 1234(,%ebx,4), %eax\n"
388 		"playstereoivol1:\n"
389 		"    adcl $1234, %esi\n"
390 		"stereoisteph:\n"
391 		"    addl %eax, (%edi)\n"
392 		"    movl 1234(,%ecx,4),%eax\n"
393 		"playstereoivol2:\n"
394 		"    addl %eax, 4(%edi)\n"
395 		"    addl $8, %edi\n"
396 		"    addl $1234, %ebx\n"
397 		"stereoiramp0:\n"
398 		"    addl $1234, %ecx\n"
399 		"stereoiramp1:\n"
400 		"  cmpl $1234, %edi\n"
401 		"stereoiendp:\n"
402 		"  jb playstereoilp\n"
403 		"  ret\n"
404 
405 		".cfi_endproc\n"
406 		".size playstereoi, .-playstereoi\n"
407 
408 		".type setupstereoi, @function\n"
409 		"setupstereoi:\n" /* THESE ARE STARTING TO BECOME A HABIT NOW*/
410 		".cfi_startproc\n"
411 
412 		"  movl %eax, (playstereoivol1-4)\n"
413 		"  movl %eax, (playstereoivol2-4)\n"
414 		"  movl %ebx, (playstereoiint0-4)\n"
415 		"  incl %ebx\n"
416 		"  movl %ebx, (playstereoiint1-4)\n"
417 		"  decl %ebx\n"
418 		"  ret\n"
419 
420 		".cfi_endproc\n"
421 		".size playstereoi, .-playstereoi\n"
422 	);
423 
424 	__asm__ __volatile__
425 	(
426 		".type playstereoi16, @function\n"
427 		"playstereoi16:\n"
428 		".cfi_startproc\n"
429 
430 		"playstereoi16lp:\n"
431 		"    movl %edx, %eax\n"
432 		"    shrl $20, %eax\n"
433 		"    movb 1(%esi,%esi), %al\n"
434 		"    movb 1234(%eax, %eax), %bl\n"
435 		"playstereoi16int0:\n"
436 		"    movb 3(%esi, %esi), %al\n"
437 		"    addb 1234(%eax, %eax), %bl\n"
438 		"playstereoi16int1:\n"
439 
440 		"    addl $1234, %edx\n"
441 		"stereoi16stepl:\n"
442 		"    movb %bl, %cl\n"
443 		"    movl 1234(,%ebx,4), %eax\n"
444 		"playstereoi16vol1:\n"
445 		"    adcl $1234, %esi\n"
446 		"stereoi16steph:\n"
447 		"    addl %eax, (%edi)\n"
448 		"    movl 1234(,%ecx,4), %eax\n"
449 		"playstereoi16vol2:\n"
450 		"    addl %eax, 4(%edi)\n"
451 		"    addl $8, %edi\n"
452 		"    addl $1234, %ebx\n"
453 		"stereoi16ramp0:\n"
454 		"    addl $1234, %ecx\n"
455 		"stereoi16ramp1:\n"
456 		"  cmpl $1234, %edi\n"
457 		"stereoi16endp:\n"
458 		"  jb playstereoi16lp\n"
459 		"  ret\n"
460 
461 		".cfi_endproc\n"
462 		".size playstereoi16, .-playstereoi16\n"
463 
464 		".type setupstereoi16, @function\n"
465 		"setupstereoi16:" /* THIS IS THE LAST ONE!!!!!!!!!! */
466 		".cfi_startproc\n"
467 
468 		"  movl %eax, (playstereoi16vol1-4)\n"
469 		"  movl %eax, (playstereoi16vol2-4)\n"
470 		"  movl %ebx, (playstereoi16int0-4)\n"
471 		"  incl %ebx\n"
472 		"  movl %ebx, (playstereoi16int1-4)\n"
473 		"  decl %ebx\n"
474 		"  ret\n"
475 
476 		".cfi_endproc\n"
477 		".size setupstereoi16, .-setupstereoi16\n"
478 	);
479 
480 	__asm__ __volatile__
481 	(
482 		".cfi_startproc\n"
483 
484 		".section .data\n"
485 		"dummydd: .long 0\n"
486 
487 		"routq:\n"
488 		".long   playquiet,       dummydd,         dummydd,         dummydd,         dummydd,         dummydd,         0,0\n"
489 		"routtab:\n"
490 		".long   playmono,        monostepl-4,     monosteph-4,     monoramp-4,      dummydd,         monoendp-4,      0,0\n"
491 		".long   playmono16,      mono16stepl-4,   mono16steph-4,   mono16ramp-4,    dummydd,         mono16endp-4,    0,0\n"
492 		".long   playmonoi,       monoistepl-4,    monoisteph-4,    monoiramp-4,     dummydd,         monoiendp-4,     0,0\n"
493 		".long   playmonoi16,     monoi16stepl-4,  monoi16steph-4,  monoi16ramp-4,   dummydd,         monoi16endp-4,   0,0\n"
494 		".long   playstereo,      stereostepl-4,   stereosteph-4,   stereoramp0-4,   stereoramp1-4,   stereoendp-4,    0,0\n"
495 		".long   playstereo16,    stereo16stepl-4, stereo16steph-4, stereo16ramp0-4, stereo16ramp1-4, stereo16endp-4,  0,0\n"
496 		".long   playstereoi,     stereoistepl-4,  stereoisteph-4,  stereoiramp0-4,  stereoiramp1-4,  stereoiendp-4,   0,0\n"
497 		".long   playstereoi16,   stereoi16stepl-4,stereoi16steph-4,stereoi16ramp0-4,stereoi16ramp1-4,stereoi16endp-4, 0,0\n"
498 
499 		".previous\n"
500 	);
501 }
502 
503 __attribute__((optimize("-fno-omit-frame-pointer"))) /* we use the stack, so we need all access to go via EBP, not ESP */
mixrPlayChannel(int32_t * buf,int32_t * fadebuf,uint32_t len,struct channel * chan,int stereo)504 void mixrPlayChannel(int32_t *buf, int32_t *fadebuf, uint32_t len, struct channel *chan, int stereo)
505 {
506 	void *routptr;
507 	uint32_t filllen,
508 	         ramping[2];
509 	int inloop;
510 	int ramploop;
511 	int dofade;
512 	__asm__ __volatile__
513 	(
514 #ifdef __PIC__
515 		"pushl %%ebx\n"
516 #endif
517 		"  movl %3, %%edi\n"              /*  %3 = chan */
518 		"  testb %25, %c12(%%edi)\n"      /* %25 = MIXRQ_PLAYING */
519 		                                  /* %12 = status */
520 		"  jz mixrPlayChannelexit\n"
521 
522 		"  movl $0, %6\n"                 /*  %6 = fillen */
523 		"  movl $0, %11\n"                /* %11 = dofade */
524 
525 		"  xorl %%eax, %%eax\n"
526 		"  cmpl $0, %4\n"                 /*  %4 = stereo */
527 		"  je mixrPlayChannelnostereo\n"
528 		"    addl $4, %%eax\n"
529 		"mixrPlayChannelnostereo:\n"
530 		"  testb %27, %c12(%%edi)\n"      /* %27 = MIXRQ_INTERPOLATE */
531 		                                  /* %12 = ch->status */
532 		"  jz mixrPlayChannelnointr\n"
533 		"    addl $2, %%eax\n"
534 		"mixrPlayChannelnointr:\n"
535 		"  testb %26, %c12(%%edi)\n"      /* %26 = MIXRQ_PLAY16BIT */
536 		                                  /* %12 = ch->status */
537 		"  jz mixrPlayChannelpsetrtn\n"
538 		"    incl %%eax\n"
539 		"mixrPlayChannelpsetrtn:\n"
540 		"  shll $5, %%eax\n"
541 		"  addl $routtab, %%eax\n"
542 		"  movl %%eax, %5\n"              /*  %5 = routeptr*/
543 
544 		"mixrPlayChannelbigloop:\n"
545 		"  movl %2, %%ecx\n"              /*  %2 = len */
546 		"  movl %c13(%%edi), %%ebx\n"     /* %13 = ch->step */
547 		"  movl %c14(%%edi), %%edx\n"     /* %14 = ch->pos */
548 		"  movw %c15(%%edi), %%si\n"      /* %15 = ch->fpos */
549 		"  movb $0, %9\n"                 /*  %9 = inloop */
550 		"  cmpl $0, %%ebx\n"
551 
552 		"  je mixrPlayChannelplayecx\n"
553 		"  jg mixrPlayChannelforward\n"
554 		"    negl %%ebx\n"
555 		"    movl %%edx, %%eax\n"
556 		"    testb %28, %c12(%%edi)\n"    /* %28 = MIXRQ_LOOPED */
557 		                                  /* %12 = ch->status */
558 		"    jz mixrPlayChannelmaxplaylen\n"
559 		"    cmpl %c16(%%edi), %%edx\n"   /* %16 = ch->loopstart */
560 		"    jb mixrPlayChannelmaxplaylen\n"
561 		"    subl %c16(%%edi), %%eax\n"   /* %16 = ch->loopstart */
562 		"    movb $1, %9\n"               /*  %9 = inloop */
563 		"    jmp mixrPlayChannelmaxplaylen\n"
564 		"mixrPlayChannelforward:\n"
565 		"    movl %c18(%%edi), %%eax\n"   /* %18 = length */
566 		"    negw %%si\n"
567 		"    sbbl %%edx, %%eax\n"
568 		"    testb %28, %c12(%%edi)\n"    /* %28 = MIXRQ_LOOPED */
569 		                                  /* %12 = ch->status */
570 		"    jz mixrPlayChannelmaxplaylen\n"
571 		"    cmpl %c17(%%edi), %%edx\n"   /* %17 = ch->loopend */
572 		"    jae mixrPlayChannelmaxplaylen\n"
573 		"    subl %c18(%%edi), %%eax\n"   /* %18 = ch->length */
574 		"    addl %c17(%%edi), %%eax\n"   /* %17 = ch->loopend*/
575 		"    movb $1, %9\n"               /*  %9 = inloop */
576 
577 		"mixrPlayChannelmaxplaylen:\n"
578 		"  xorl %%edx, %%edx\n"
579 		"  shld $16, %%eax, %%edx\n"
580 		"  shll $16, %%esi\n"
581 		"  shld $16, %%esi, %%eax\n"
582 		"  addl %%ebx, %%eax\n"
583 		"  adcl $0, %%edx\n"
584 		"  subl $1, %%eax\n"
585 		"  sbbl $0, %%edx\n"
586 		"  cmpl %%ebx, %%edx\n"
587 		"  jae mixrPlayChannelplayecx\n"
588 		"  divl %%ebx\n"
589 		"  cmpl %%eax, %%ecx\n"
590 		"  jb mixrPlayChannelplayecx\n"
591 		"    movl %%eax, %%ecx\n"
592 		"    cmpb $0, %9\n"               /*  %9 = inloop */
593 		"    jnz mixrPlayChannelplayecx\n"
594 #if MIXRQ_PLAYING != 1
595 #error This line bellow depends on MIXRQ_PLAYING = 1
596 #endif
597 		"      andb $254, %c12(%%edi)\n"  /* 254 = 255-MIXRQ_PLAYING */
598 		                                  /* %12 = ch->status */
599 		"      movl $1, %11\n"            /* %11 = dofade */
600 		"      movl %2, %%eax\n"          /*  %2 = len */
601 		"      subl %%ecx, %%eax\n"
602 		"      addl %%eax, %6\n"          /*  %6 = filllen */
603 		"      movl %%ecx, %2\n"          /*  %2 = len */
604 
605 		"mixrPlayChannelplayecx:\n"
606 		"  movb $0, %10\n"                /* %10 = ramploop */
607 		"  movl $0, %7\n"                 /*  %7 = ramping[0] */
608 		"  movl $0, %8\n"                 /*  %8 = ramping[1] */
609 
610 		"  cmpl $0, %%ecx\n"
611 		"  je mixrPlayChannelnoplay\n"
612 
613 		"  movl %c21(%%edi), %%edx\n"     /* %21 = ch->dstvols[0] */
614 		"  subl %c19(%%edi), %%edx\n"     /* %19 = ch->curvols[0] */
615 		"  je mixrPlayChannelnoramp0\n"
616 		"  jl mixrPlayChannelramp0down\n"
617 		"    movl $1, %7\n"               /*  %7 = ramping[0] */
618 		"    cmpl %%edx, %%ecx\n"
619 		"    jbe mixrPlayChannelnoramp0\n"
620 		"      movb $1, %10\n"            /* %10 = ramploop */
621 		"      movl %%edx, %%ecx\n"
622 		"      jmp mixrPlayChannelnoramp0\n"
623 		"mixrPlayChannelramp0down:\n"
624 		"    negl %%edx\n"
625 		"    movl $-1, %7\n"              /*  %7 = ramping[0] */
626 		"    cmpl %%edx, %%ecx\n"
627 		"    jbe mixrPlayChannelnoramp0\n"
628 		"      movb $1, %10\n"            /* %10 = ramploop */
629 		"      movl %%edx, %%ecx\n"
630 		"mixrPlayChannelnoramp0:\n"
631 
632 		"  movl %c22(%%edi), %%edx\n"     /* %22 = ch->dstvols[1] */
633 		"  subl %c20(%%edi), %%edx\n"     /* %20 = ch->curvols[1] */
634 		"  je mixrPlayChannelnoramp1\n"
635 		"  jl mixrPlayChannelramp1down\n"
636 		"    movl $1, %8\n"               /*  %8 = ramping[4] */
637 		"    cmpl %%edx, %%ecx\n"
638 		"    jbe mixrPlayChannelnoramp1\n"
639 		"      movb $1, %10\n"            /* %10 = ramploop */
640 		"      movl %%edx, %%ecx\n"
641 		"      jmp mixrPlayChannelnoramp1\n"
642 		"mixrPlayChannelramp1down:\n"
643 		"    negl %%edx\n"
644 		"    movl $-1, %8\n"              /*  %8 = ramping[1] */
645 		"    cmpl %%edx, %%ecx\n"
646 		"    jbe mixrPlayChannelnoramp1\n"
647 		"      movb $1, %10\n"            /* %10 = ramploop */
648 		"      movl %%edx, %%ecx\n"
649 		"mixrPlayChannelnoramp1:\n"
650 
651 		"  movl %5, %%edx\n"              /*  %5 = routptr */
652 		"  cmpl $0, %7\n"                 /*  %7 = ramping[0] */
653 		"  jne mixrPlayChannelnotquiet\n"
654 		"  cmpl $0, %8\n"                 /*  %8 = ramping[1] */
655 		"  jne mixrPlayChannelnotquiet\n"
656 		"  cmpl $0, %c19(%%edi)\n"        /* %19 = ch->curvols[0] */
657 		"  jne mixrPlayChannelnotquiet\n"
658 		"  cmpl $0, %c20(%%edi)\n"        /* %20 = ch->curvols[1] */
659 		"  jne mixrPlayChannelnotquiet\n"
660 		"    movl $routq, %%edx\n"
661 
662 		"mixrPlayChannelnotquiet:\n"
663 		"  movl 4(%%edx), %%ebx\n"
664 		"  movl %c13(%%edi), %%eax\n"     /* %13 = ch->step */
665 		"  shll $16, %%eax\n"
666 		"  movl %%eax, (%%ebx)\n"
667 		"  movl 8(%%edx), %%ebx\n"
668 		"  movl %c13(%%edi), %%eax\n"     /* %13 = ch->step */
669 		"  sarl $16, %%eax\n"
670 		"  movl %%eax, (%%ebx)\n"
671 		"  movl 12(%%edx), %%ebx\n"
672 		"  movl %7, %%eax\n"              /*  %7 = ramping[0] */
673 		"  shll $8, %%eax\n"
674 		"  movl %%eax, (%%ebx)\n"
675 		"  movl 16(%%edx), %%ebx\n"
676 		"  movl %8, %%eax\n"              /*  %8 = ramping[1] */
677 		"  shll $8, %%eax\n"
678 		"  movl %%eax, (%%ebx)\n"
679 		"  movl 20(%%edx), %%ebx\n"
680 		"  leal (,%%ecx,4), %%eax\n"
681 		"  cmpl $0, %4\n"                 /*  %4 = stereo */
682 		"  je mixrPlayChannelm1\n"
683 		"    shll $1, %%eax\n"
684 		"mixrPlayChannelm1:\n"
685 		"  addl %0, %%eax\n"              /*  %0 = buf */
686 		"  movl %%eax, (%%ebx)\n"
687 		"  pushl %%ecx\n"
688 		"  movl (%%edx), %%eax\n"
689 
690 		"  movl %c19(%%edi), %%ebx\n"     /* %19 = ch->curvols[0] */
691 		"  shll $8, %%ebx\n"
692 		"  movl %c20(%%edi), %%ecx\n"     /* %20 = ch->curvols[1] */
693 		"  shll $8, %%ecx\n"
694 		"  movw %c15(%%edi), %%dx\n"      /* %15 = ch->fpos */
695 		"  shll $16, %%edx\n"
696 		"  movl %c14(%%edi), %%esi\n"     /* %14 = ch->chpos */
697 		"  addl %c23(%%edi), %%esi\n"     /* %23 = ch->samp */
698 		"  movl %0, %%edi\n"              /*  %0 = buf */
699 
700 		"  call *%%eax\n"
701 
702 		"  popl %%ecx\n"
703 		"  movl %3, %%edi\n"              /*  %3 = chan */
704 
705 		"mixrPlayChannelnoplay:\n"
706 		"  movl %%ecx, %%eax\n"
707 		"  shll $2, %%eax\n"
708 		"  cmpl $0, %4\n"                 /*  %4 = stereo */
709 		"  je mixrPlayChannelm2\n"
710 		"    shll $1, %%eax\n"
711 		"mixrPlayChannelm2:\n"
712 		"  addl %%eax, %0\n"              /*  %0 = buf */
713 		"  subl %%ecx, %2\n"              /*  %2 = len */
714 
715 		"  movl %c13(%%edi), %%eax\n"     /* %13 = ch->step */
716 		"  imul %%ecx\n"
717 		"  shld $16, %%eax, %%edx\n"
718 		"  addw %%ax, %c15(%%edi)\n"      /* %15 = ch->fpos */
719 		"  adcl %%edx, %c14(%%edi)\n"     /* %14 = ch->pos */
720 
721 		"  movl %7, %%eax\n"              /*  %7 = ramping[0] */
722 		"  imul %%ecx, %%eax\n"
723 		"  addl %%eax, %c19(%%edi)\n"     /* %19 = ch->curvols[0] */
724 		"  movl %8, %%eax\n"              /*  %8 = ramping[1] */
725 		"  imul %%ecx, %%eax\n"
726 		"  addl %%eax, %c20(%%edi)\n"     /* %20 = ch->curvols[1] */
727 
728 		"  cmpb $0, %10\n"                /* %10 = ramploop */
729 		"  jnz mixrPlayChannelbigloop\n"
730 
731 		"  cmpb $0, %9\n"                 /*  %9 = inloop */
732 		"  jz mixrPlayChannelfill\n"
733 
734 		"  movl %c14(%%edi), %%eax\n"     /* %14 = ch->pos */
735 		"  cmpl $0, %c13(%%edi)\n"        /* %13 = ch->step */
736 		"  jge mixrPlayChannelforward2\n"
737 		"    cmpl %c16(%%edi), %%eax\n"   /* %16 = ch->loopstart */
738 		"    jge mixrPlayChannelexit\n"
739 		"    testb %29, %c12(%%edi)\n"    /* %29 = MIXRQ_PINGPONGLOOP */
740 		                                  /* %12 = ch->status */
741 		"    jnz mixrPlayChannelpong\n"
742 		"      addl %c24(%%edi), %%eax\n" /* %24 = ch->replen */
743 		"      jmp mixrPlayChannelloopiflen\n"
744 		"mixrPlayChannelpong:\n"
745 		"      negl %c13(%%edi)\n"        /* %13 = ch->step */
746 		"      negw %c15(%%edi)\n"        /* %15 = ch->fpos */
747 		"      adcl $0, %%eax\n"
748 		"      negl %%eax\n"
749 		"      addl %c16(%%edi), %%eax\n" /* %16 = ch->loopstart */
750 		"      addl %c16(%%edi), %%eax\n" /* %16 = ch->loopstart */
751 		"      jmp mixrPlayChannelloopiflen\n"
752 		"mixrPlayChannelforward2:\n"
753 		"    cmpl %c17(%%edi), %%eax\n"   /* %17 = ch->loopend */
754 		"    jb mixrPlayChannelexit\n"
755 		"    testb %29, %c12(%%edi)\n"    /* %29 = MIXRQ_PINGPONGLOOP */
756 		                                  /* %12 = ch->status */
757 		"    jnz mixrPlayChannelping\n"
758 		"      subl %c24(%%edi), %%eax\n" /* %24 = ch->replen */
759 		"      jmp mixrPlayChannelloopiflen\n"
760 		"mixrPlayChannelping:\n"
761 		"      negl %c13(%%edi)\n"        /* %13 = ch->step */
762 		"      negw %c15(%%edi)\n"        /* %15 = ch->fpos */
763 		"      adcl $0, %%eax\n"
764 		"      negl %%eax\n"
765 		"      addl %c17(%%edi), %%eax\n" /* %17 = ch->loopend */
766 		"      addl %c17(%%edi), %%eax\n" /* %17 = ch->loopend */
767 
768 		"mixrPlayChannelloopiflen:\n"
769 		"  movl %%eax, %c14(%%edi)\n"     /* %14 = ch->pos */
770 		"  cmpl $0, %2\n"                 /*  %2 = len */
771 		"  jne mixrPlayChannelbigloop\n"
772 		"  jmp mixrPlayChannelexit\n"
773 
774 		"mixrPlayChannelfill:\n"
775 		"  cmpl $0, %6\n"                 /*  %6 = filllen */
776 		"  je mixrPlayChannelfadechk\n"
777 		"  movl %c18(%%edi), %%eax\n"     /* %18 = ch->length */
778 		"  movl %%eax, %c14(%%edi)\n"     /* %14 = ch->pos */
779 		"  addl %c23(%%edi), %%eax\n"     /* %23 = ch->samp */
780 		"  movl %c19(%%edi), %%ebx\n"     /* %19 = ch->curvols[0] */
781 		"  movl %c20(%%edi), %%ecx\n"     /* %20 = ch->curvols[1] */
782 		"  shll $8, %%ebx\n"
783 		"  shll $8, %%ecx\n"
784 		"  testb %26, %c12(%%edi)\n"      /* %26 = MIXRQ_PLAY16BIT */
785 		                                  /* %12 = ch->status */
786 		"  jnz mixrPlayChannelfill16\n"
787 		"    movb (%%eax), %%bl\n"
788 		"    jmp mixrPlayChannelfilldo\n"
789 		"mixrPlayChannelfill16:\n"
790 		"    movb 1(%%eax, %%eax), %%bl\n"
791 		"mixrPlayChannelfilldo:\n"
792 		"  movb %%bl, %%cl\n"
793 		"  movl 1234(,%%ebx,4), %%ebx\n"
794 		"mixrPlayChannelvoltab1:\n"
795 		"  movl 1234(,%%ecx,4), %%ecx\n"
796 		"mixrPlayChannelvoltab2:\n"
797 		"  movl %6, %%eax\n"              /*  %6 = filllen */
798 		"  movl %0, %%edi\n"              /*  %0 = buf */
799 		"  cmpl $0, %4\n"                 /*  %4 = stereo */
800 		"  jne mixrPlayChannelfillstereo\n"
801 		"mixrPlayChannelfillmono:\n"
802 		"    addl %%ebx,(%%edi)\n"
803 		"    addl $4, %%edi\n"
804 		"  decl %%eax\n"
805 		"  jnz mixrPlayChannelfillmono\n"
806 		"  jmp mixrPlayChannelfade\n"
807 		"mixrPlayChannelfillstereo:\n"
808 		"    addl %%ebx, (%%edi)\n"
809 		"    addl %%ecx, 4(%%edi)\n"
810 		"    addl $8, %%edi\n"
811 		"  decl %%eax\n"
812 		"  jnz mixrPlayChannelfillstereo\n"
813 		"  jmp mixrPlayChannelfade\n"
814 
815 		"mixrPlayChannelfadechk:\n"
816 		"  cmpl $0, %11\n"                /* %11 = dofade */
817 		"  je mixrPlayChannelexit\n"
818 		"mixrPlayChannelfade:\n"
819 		"  movl %3, %%edi\n"              /* %3 = chan */
820 		"  movl %1, %%esi\n"              /* %1 = fadebuf */
821 		"  call mixrFadeChannel_\n"
822 		"  jmp mixrPlayChannelexit\n"
823 
824 		"setupplay:\n"
825 		"  movl %%eax, (mixrPlayChannelvoltab1-4)\n"
826 		"  movl %%eax, (mixrPlayChannelvoltab2-4)\n"
827 		"  ret\n"
828 
829 		"mixrPlayChannelexit:\n"
830 #ifdef __PIC__
831 		"popl %%ebx\n"
832 #endif
833 		:
834 		: "m" (buf),                                  /*   0  */
835 		  "m" (fadebuf),                              /*   1  */
836 		  "m" (len),                                  /*   2  */
837 		  "m" (chan),                                 /*   3  */
838 		  "m" (stereo),                               /*   4  */
839 		  "m" (routptr),                              /*   5  */
840 		  "m" (filllen),                              /*   6  */
841 		  "m" (ramping[0]),                           /*   7  */
842 		  "m" (ramping[1]),                           /*   8  */
843 		  "m" (inloop),                               /*   9  */
844 		  "m" (ramploop),                             /*  10  */
845 		  "m" (dofade),                               /*  11  */
846 		  "n" (offsetof(struct channel, status)),     /*  12  */
847 		  "n" (offsetof(struct channel, step)),       /*  13  */
848 		  "n" (offsetof(struct channel, pos)),        /*  14  */
849 		  "n" (offsetof(struct channel, fpos)),       /*  15  */
850 		  "n" (offsetof(struct channel, loopstart)),  /*  16  */
851 		  "n" (offsetof(struct channel, loopend)),    /*  17  */
852 		  "n" (offsetof(struct channel, length)),     /*  18  */
853 		  "n" (offsetof(struct channel, curvols[0])), /*  19  */
854 		  "n" (offsetof(struct channel, curvols[1])), /*  20  */
855 		  "n" (offsetof(struct channel, dstvols[0])), /*  21  */
856 		  "n" (offsetof(struct channel, dstvols[1])), /*  22  */
857 		  "n" (offsetof(struct channel, samp)),       /*  23  */
858 		  "n" (offsetof(struct channel, replen)),     /*  24  */
859 		  "n" (MIXRQ_PLAYING),                        /*  25  */
860 		  "n" (MIXRQ_PLAY16BIT),                      /*  26  */
861 		  "n" (MIXRQ_INTERPOLATE),                    /*  27  */
862 		  "n" (MIXRQ_LOOPED),                         /*  28  */
863 		  "n" (MIXRQ_PINGPONGLOOP)                    /*  29  */
864 #ifdef __PIC__
865 		: "memory", "eax", "ecx", "edx", "edi", "esi"
866 #else
867 		: "memory", "eax", "ebx", "ecx", "edx", "edi", "esi"
868 #endif
869 	);
870 }
871 
mixrSetupAddresses(int32_t (* vol)[256],uint8_t (* intr)[256][2])872 void mixrSetupAddresses(int32_t (*vol)[256], uint8_t (*intr)[256][2])
873 {
874 	__asm__ __volatile__
875 	(
876 #ifdef __PIC__
877 		"pushl %%ebx\n"
878 		"movl  %%ecx, %%ebx\n"
879 #endif
880 		"  call setupfade\n"
881 		"  call setupplay\n"
882 		"  call setupmono\n"
883 		"  call setupmono16\n"
884 		"  call setupmonoi\n"
885 		"  call setupmonoi16\n"
886 		"  call setupstereo\n"
887 		"  call setupstereo16\n"
888 		"  call setupstereoi\n"
889 		"  call setupstereoi16\n"
890 #ifdef __PIC__
891 		"popl %%ebx\n"
892 #endif
893 		:
894 		: "a" (vol),
895 #ifdef __PIC__
896 		  "c" (intr)
897 #else
898 		  "b" (intr)
899 #endif
900 		/* no registers should change, and .data/.bss is not touched */
901 	);
902 }
903 
mixrFade(int32_t * buf,int32_t * fade,int len,int stereo)904 void mixrFade(int32_t *buf, int32_t *fade, int len, int stereo)
905 {
906 	int d0, d1, d2;
907 	__asm__ __volatile__
908 	(
909 #ifdef __PIC__
910 		"pushl %%ebx\n"
911 #endif
912 		"  movl (%%esi), %%eax\n"
913 		"  movl 4(%%esi), %%ebx\n"
914 		"  cmpl $0, %%edx\n"
915 		"  jnz mixrFadestereo\n"
916 		"mixrFadelpm:\n"
917 		"      movl %%eax, (%%edi)\n"
918 		"      movl %%eax, %%edx\n"
919 		"      shll $7, %%eax\n"
920 		"      subl %%edx, %%eax\n"
921 		"      sarl $7, %%eax\n"
922 		"      addl $4, %%edi\n"
923 		"    decl %%ecx\n"
924 		"    jnz mixrFadelpm\n"
925 		"  jmp mixrFadedone\n"
926 		"mixrFadestereo:\n"
927 		"mixrFadelps:\n"
928 		"      movl %%eax, (%%edi)\n"
929 		"      movl %%ebx, 4(%%edi)\n"
930 		"      movl %%eax, %%edx\n"
931 		"      shll $7, %%eax\n"
932 		"      subl %%edx, %%eax\n"
933 		"      sarl $7, %%eax\n"
934 		"      movl %%ebx, %%edx\n"
935 		"      shll $7, %%ebx\n"
936 		"      subl %%edx, %%ebx\n"
937 		"      sarl $7, %%ebx\n"
938 		"      addl $8, %%edi\n"
939 		"    decl %%ecx\n"
940 		"    jnz mixrFadelps\n"
941 		"mixrFadedone:\n"
942 		"  movl %%eax, (%%esi)\n"
943 		"  movl %%ebx, 4(%%esi)\n"
944 #ifdef __PIC__
945 		"popl %%ebx\n"
946 #endif
947 		: "=&D"(d0),
948 		  "=&c"(d1),
949 		  "=&d"(d2)
950 		: "S" (fade),
951 		  "0" (buf),
952 		  "1" (len),
953 		  "2" (stereo)
954 #ifdef __PIC__
955 		: "memory", "eax"
956 #else
957 		: "memory", "eax", "ebx"
958 #endif
959 	);
960 }
961 
962 /******************************************************************************/
nonepublic_dwmixa2(void)963 void nonepublic_dwmixa2(void)
964 {
965 	__asm__ __volatile__
966 	(
967 		".cfi_endproc\n"
968 
969 		".type mixrClip8_, @function\n"
970 		"mixrClip8_:\n"
971 		".cfi_startproc\n"
972 
973 		"  movl %ebx, (mixrClip8amp1-4)\n"
974 		"  addl $512, %ebx\n"
975 		"  movl %ebx, (mixrClip8amp2-4)\n"
976 		"  addl $512, %ebx\n"
977 		"  movl %ebx, (mixrClip8amp3-4)\n"
978 		"  subl $1024, %ebx\n"
979 		"  movl %edx, (mixrClip8max-4)\n"
980 		"  negl %edx\n"
981 		"  movl %edx, (mixrClip8min-4)\n"
982 
983 		"  xorl %edx, %edx\n"
984 		"  movb (mixrClip8min-4), %dl\n"
985 		"  movl (%ebx, %edx, 2), %eax\n"
986 		"  movb (mixrClip8min-3), %dl\n"
987 		"  addl 512(%ebx, %edx, 2), %eax\n"
988 		"  movb (mixrClip8min-2), %dl\n"
989 		"  addl 1024(%ebx, %edx, 2), %eax\n"
990 		"  movb %ah, (mixrClip8minv-1)\n"
991 		"  movb (mixrClip8max-4), %dl\n"
992 		"  movl (%ebx, %edx, 2), %eax\n"
993 		"  movb (mixrClip8max-3), %dl\n"
994 		"  addl 512(%ebx, %edx, 2), %eax\n"
995 		"  movb (mixrClip8max-2), %dl\n"
996 		"  addl 1024(%ebx, %edx, 2), %eax\n"
997 		"  movb %ah, (mixrClip8maxv-1)\n"
998 		"  leal (%ecx, %edi), %ecx\n"
999 		"  movl %ecx, (mixrClip8endp1-4)\n"
1000 		"  movl %ecx, (mixrClip8endp2-4)\n"
1001 		"  movl %ecx, (mixrClip8endp3-4)\n"
1002 		"  xorl %ebx, %ebx\n"
1003 		"  xorl %ecx, %ecx\n"
1004 		"  xorl %edx, %edx\n"
1005 
1006 		"mixrClip8lp:\n"
1007 		"  cmpl $1234, (%esi)\n"
1008 		"    mixrClip8min:\n"
1009 		"  jl mixrClip8low\n"
1010 		"  cmpl $1234, (%esi)\n"
1011 		"    mixrClip8max:\n"
1012 		"  jg mixrClip8high\n"
1013 
1014 		"    movb (%esi), %bl\n"
1015 		"    movb 1(%esi), %cl\n"
1016 		"    movb 2(%esi), %dl\n"
1017 		"    movl 1234(,%ebx,2), %eax\n"
1018 		"      mixrClip8amp1:\n"
1019 		"    addl 1234(,%ecx,2), %eax\n"
1020 		"      mixrClip8amp2:\n"
1021 		"    addl 1234(,%edx,2), %eax\n"
1022 		"      mixrClip8amp3:\n"
1023 		"    movb %ah, (%edi)\n"
1024 		"    incl %edi\n"
1025 		"    addl $4, %esi\n"
1026 		"  cmpl $1234, %edi\n"
1027 		"mixrClip8endp1:\n"
1028 		"  jb mixrClip8lp\n"
1029 		"mixrClip8done:\n"
1030 		"  jmp mixrClip8out\n"
1031 
1032 		"mixrClip8low:\n"
1033 		"    movb $12, (%edi)\n"
1034 		"      mixrClip8minv:\n"
1035 		"    incl %edi\n"
1036 		"    addl $4, %esi\n"
1037 		"    cmpl $1234, %edi\n"
1038 		"mixrClip8endp2:\n"
1039 		"  jb mixrClip8lp\n"
1040 		"  jmp mixrClip8done\n"
1041 
1042 		"mixrClip8high:\n"
1043 		"    movb $12, (%edi)\n"
1044 		"      mixrClip8maxv:\n"
1045 		"    incl %edi\n"
1046 		"    addl $4, %esi\n"
1047 		"    cmpl $1234, %edi\n"
1048 		"mixrClip8endp3:\n"
1049 		"  jb mixrClip8lp\n"
1050 		"  jmp mixrClip8done\n"
1051 
1052 		".cfi_endproc\n"
1053 		".size mixrClip8_, .-mixrClip8_\n"
1054 
1055 		".cfi_startproc\n"
1056 	);
1057 }
1058 
mixrClip(void * dst,int32_t * src,int len,void * tab,int32_t max,int b16)1059 void mixrClip(void *dst, int32_t *src, int len, void *tab, int32_t max, int b16)
1060 {
1061 	int d0, d1, d2, d3, d4, d5;
1062 #ifdef __PIC__
1063 	d2=(int)tab;
1064 #endif
1065 	__asm__ __volatile__
1066 	(
1067 #ifdef __PIC__
1068 		"pushl %%ebx\n"
1069 		"movl %10, %%ebx\n"
1070 #endif
1071 		"  cmpl $0, %%eax\n"
1072 		"  je mixrClip8_\n"
1073 
1074 		"  movl %%ebx, (mixrClipamp1-4)\n"
1075 		"  addl $512, %%ebx\n"
1076 		"  movl %%ebx, (mixrClipamp2-4)\n"
1077 		"  addl $512, %%ebx\n"
1078 		"  movl %%ebx, (mixrClipamp3-4)\n"
1079 		"  subl $1024, %%ebx\n"
1080 		"  movl %%edx, (mixrClipmax-4)\n"
1081 		"  negl %%edx\n"
1082 		"  movl %%edx, (mixrClipmin-4)\n"
1083 
1084 		"  xorl %%edx, %%edx\n"
1085 		"  movb (mixrClipmin-4), %%dl\n"
1086 		"  movl (%%ebx, %%edx, 2), %%eax\n"
1087 		"  movb (mixrClipmin-3), %%dl\n"
1088 		"  addl 512(%%ebx, %%edx, 2), %%eax\n"
1089 		"  movb (mixrClipmin-2), %%dl\n"
1090 		"  addl 1024(%%ebx, %%edx, 2), %%eax\n"
1091 		"  movw %%ax, (mixrClipminv-2)\n"
1092 		"  movb (mixrClipmax-4), %%dl\n"
1093 		"  movl (%%ebx, %%edx, 2), %%eax\n"
1094 		"  movb (mixrClipmax-3), %%dl\n"
1095 		"  addl 512(%%ebx, %%edx, 2), %%eax\n"
1096 		"  movb (mixrClipmax-2), %%dl\n"
1097 		"  addl 1024(%%ebx, %%edx, 2), %%eax\n"
1098 		"  movw %%ax, (mixrClipmaxv-2)\n"
1099 		"  leal (%%edi, %%ecx, 2), %%ecx\n"
1100 		"  movl %%ecx, (mixrClipendp1-4)\n"
1101 		"  movl %%ecx, (mixrClipendp2-4)\n"
1102 		"  movl %%ecx, (mixrClipendp3-4)\n"
1103 		"  xorl %%ebx, %%ebx\n"
1104 		"  xorl %%ecx, %%ecx\n"
1105 		"  xorl %%edx, %%edx\n"
1106 
1107 		"mixrCliplp:\n"
1108 		"    cmpl $1234, (%%esi)\n"
1109 		"      mixrClipmin:\n"
1110 		"    jl mixrCliplow\n"
1111 		"    cmpl $1234, (%%esi)\n"
1112 		"      mixrClipmax:\n"
1113 		"    jg mixrCliphigh\n"
1114 
1115 		"    movb (%%esi), %%bl\n"
1116 		"    movb 1(%%esi), %%cl\n"
1117 		"    movb 2(%%esi), %%dl\n"
1118 		"    movl 1234(,%%ebx,2), %%eax\n"
1119 		"      mixrClipamp1:\n"
1120 		"    addl 1234(,%%ecx,2), %%eax\n"
1121 		"      mixrClipamp2:\n"
1122 		"    addl 1234(,%%edx,2), %%eax\n"
1123 		"      mixrClipamp3:\n"
1124 		"    movw %%ax, (%%edi)\n"
1125 		"    addl $2, %%edi\n"
1126 		"    addl $4, %%esi\n"
1127 		"  cmpl $1234, %%edi\n"
1128 		"    mixrClipendp1:\n"
1129 		"  jb mixrCliplp\n"
1130 		"  jmp mixrClipdone\n"
1131 
1132 		"mixrCliplow:\n"
1133 		"    movw $1234, (%%edi)\n"
1134 		"      mixrClipminv:\n"
1135 		"    addl $2, %%edi\n"
1136 		"    addl $4, %%esi\n"
1137 		"  cmpl $1234, %%edi\n"
1138 		"    mixrClipendp2:\n"
1139 		"  jb mixrCliplp\n"
1140 		"  jmp mixrClipdone\n"
1141 		"mixrCliphigh:\n"
1142 		"    movw $1234, (%%edi)\n"
1143 		"      mixrClipmaxv:\n"
1144 		"    addl $2, %%edi\n"
1145 		"    addl $4, %%esi\n"
1146 		"  cmpl $1234, %%edi\n"
1147 		"    mixrClipendp3:\n"
1148 		"  jb mixrCliplp\n"
1149 		/* jmp mixrClipdone\n" */
1150 		"mixrClipdone:"
1151 		"mixrClip8out:"
1152 #ifdef __PIC__
1153 		"popl %%ebx\n"
1154 #endif
1155 		: "=&S" (d0),
1156 		  "=&D" (d1),
1157 		  "=&c" (d3),
1158 		  "=&d" (d4),
1159 #ifdef __PIC__
1160 		  "=&a" (d5)
1161 #else
1162 		  "=&a" (d5),
1163 		  "=&b" (d2)
1164 #endif
1165 		: "0" (src),
1166 		  "1" (dst),
1167 		  "2" (len),
1168 		  "3" (max),
1169 		  "4" (b16),
1170 #ifdef __PIC__
1171 		  "m" (tab)
1172 #else
1173 		  "5" (tab)
1174 #endif
1175 		: "memory"
1176 	);
1177 }
1178 
remap_range1_stop(void)1179 void remap_range1_stop(void){}
1180 
1181