fixed 32bit sample dmix code for i386.

This commit is contained in:
Takashi Iwai 2003-09-17 15:39:12 +00:00
parent 1adfe9fd0d
commit af0c81d4af

View file

@ -288,11 +288,15 @@ static void MIX_AREAS2(unsigned int size,
"\t" LOCK_PREFIX "cmpxchgl %%ecx, (%%edi)\n" "\t" LOCK_PREFIX "cmpxchgl %%ecx, (%%edi)\n"
"\tjnz 2f\n" "\tjnz 2f\n"
"\tmovl (%%esi), %%ecx\n" "\tmovl (%%esi), %%ecx\n"
"\tshr $8, %%ecx\n" /* sample >>= 8 */
"\tsarl $8, %%ecx\n"
"\tsubl %%edx, %%ecx\n" "\tsubl %%edx, %%ecx\n"
"\tjmp 21f\n"
"2:" "2:"
"\tmovl (%%esi), %%ecx\n" "\tmovl (%%esi), %%ecx\n"
"\tshr $8, %%ecx\n" /* sample >>= 8 */
"\tsarl $8, %%ecx\n"
"21:"
"\t" LOCK_PREFIX "addl %%ecx, (%%ebx)\n" "\t" LOCK_PREFIX "addl %%ecx, (%%ebx)\n"
/* /*
@ -305,12 +309,24 @@ static void MIX_AREAS2(unsigned int size,
"3:" "3:"
"\tmovl (%%ebx), %%ecx\n" "\tmovl (%%ebx), %%ecx\n"
"\tcmpl $0x7fffff,%%ecx\n" /*
* if (sample > 0x7fff00)
*/
"\tmovl $0x7fffff, %%eax\n"
"\tcmpl %%eax, %%ecx\n"
"\tjg 4f\n" "\tjg 4f\n"
"\tcmpl $-0x800000,%%ecx\n" /*
"\tjl 5f\n" * if (sample < -0x800000)
"\tmov %%ecx, %%eax\n" */
"\tshl $8, %%eax\n" "\tmovl $-0x800000, %%eax\n"
"\tcmpl %%eax, %%ecx\n"
"\tjl 4f\n"
"\tmovl %%ecx, %%eax\n"
"4:"
/*
* sample <<= 8;
*/
"\tsall $8, %%eax\n"
"\tmovl %%eax, (%%edi)\n" "\tmovl %%eax, (%%edi)\n"
"\tcmpl %%ecx, (%%ebx)\n" "\tcmpl %%ecx, (%%ebx)\n"
"\tjnz 3b\n" "\tjnz 3b\n"
@ -323,44 +339,9 @@ static void MIX_AREAS2(unsigned int size,
"\tadd %6, %%ebx\n" "\tadd %6, %%ebx\n"
"\tdecl %0\n" "\tdecl %0\n"
"\tjnz 1b\n" "\tjnz 1b\n"
"\tjmp 6f\n"
/*
* sample > 0x7fff00
*/
"\t.p2align 4,,15\n"
"4:"
"\tmovl $0x7fffffff, (%%edi)\n"
"\tcmpl %%ecx,(%%ebx)\n"
"\tjnz 3b\n"
"\tadd %4, %%edi\n"
"\tadd %5, %%esi\n"
"\tadd %6, %%ebx\n"
"\tdecl %0\n"
"\tjnz 1b\n"
"\tjmp 6f\n"
/*
* sample < -0x800000
*/
"\t.p2align 4,,15\n"
"5:"
"\tmovl $-0x80000000, (%%edi)\n"
"\tcmpl %%ecx, (%%ebx)\n"
"\tjnz 3b\n"
"\tadd %4, %%edi\n"
"\tadd %5, %%esi\n"
"\tadd %6, %%ebx\n"
"\tdecl %0\n"
"\tjnz 1b\n"
// "\tjmp 6f\n" // "\tjmp 6f\n"
"6:" "6:"
: /* no output regs */ : /* no output regs */
: "m" (size), "m" (dst), "m" (src), "m" (sum), "m" (dst_step), "m" (src_step), "m" (sum_step) : "m" (size), "m" (dst), "m" (src), "m" (sum), "m" (dst_step), "m" (src_step), "m" (sum_step)
: "esi", "edi", "edx", "ecx", "ebx", "eax" : "esi", "edi", "edx", "ecx", "ebx", "eax"