Hi,

found a small bug in MIX_AREAS2 (pcm_dmix_i386.h):
>        "\tmovl $0, %%eax\n"
>        "\tmovl $1, %%ecx\n"
>        "\tmovl (%%ebx), %%edx\n"
>        "\t" LOCK_PREFIX "cmpxchgl %%ecx, (%%edi)\n"
>        "\tjnz 2f\n"
>        "\tmovl (%%esi), %%ecx\n"
>        "\tshr $8, %%ecx\n"
>        "\tsubl %%edx, %%ecx\n"
>        "2:"
>        "\tmovl (%%esi), %%ecx\n"
>        "\tshr $8, %%ecx\n"
>        "\t" LOCK_PREFIX "addl %%ecx, (%%ebx)\n"

- subl %edx, %ecx has no effect (result is overwritten by the next ops)
- we have signed values so we have to use "sarl" (sign-extend) instead 
  of "shr".

A patch is appended.

 ciao 
    gd...

-- 
Gerhard Dirschl               !! See you at the LinuxTag 2003 !!
Karlsruhe
Germany
--- alsa-lib.old/src/pcm/pcm_dmix_i386.h        2003-03-18 19:00:20.000000000 +0100
+++ alsa-lib/src/pcm/pcm_dmix_i386.h    2003-07-09 13:47:35.000000000 +0200
@@ -283,16 +283,13 @@
                 *   xadd(*sum, sample);
                 */
                "\tmovl $0, %%eax\n"
-               "\tmovl $1, %%ecx\n"
-               "\tmovl (%%ebx), %%edx\n"
-               "\t" LOCK_PREFIX "cmpxchgl %%ecx, (%%edi)\n"
-               "\tjnz 2f\n"
+               "\tmovl $1, %%edx\n"
                "\tmovl (%%esi), %%ecx\n"
-               "\tshr $8, %%ecx\n"
-               "\tsubl %%edx, %%ecx\n"
+               "\tsarl $8, %%ecx\n"
+               "\t" LOCK_PREFIX "cmpxchgl %%edx, (%%edi)\n"
+               "\tjnz 2f\n"
+               "\tsubl (%%ebx), %%ecx\n"
                "2:"
-               "\tmovl (%%esi), %%ecx\n"
-               "\tshr $8, %%ecx\n"
                "\t" LOCK_PREFIX "addl %%ecx, (%%ebx)\n"
 
                /*
@@ -310,7 +307,7 @@
                "\tcmpl $-0x800000,%%ecx\n"
                "\tjl 5f\n"
                "\tmov %%ecx, %%eax\n"
-               "\tshl $8, %%eax\n"
+               "\tshll $8, %%eax\n"
                "\tmovl %%eax, (%%edi)\n"
                "\tcmpl %%ecx, (%%ebx)\n"
                "\tjnz 3b\n"

Reply via email to