Ok, so there is still a high-pitched noise with 5.1, although I tried to fix that a while ago. I now know what the error is, but perhaps somewhat with more GCC-ASM skills can help me fix it. I spent parts of yesterday and today analysing it and came up with the following conclusion: Here's the asm code as written in svolume_sse.c, function pa_volume_s16ne_sse2: #define MOD_ADD(a,b) \ " add "#a", %3 \n\t" /* channel += inc */ \ " mov %3, %4 \n\t" \ " sub "#b", %4 \n\t" /* tmp = channel - channels */ \ " cmovae %4, %3 \n\t" /* if (tmp >= 0) channel = tmp */ And called with: MOD_ADD($8, %5) Here's what it shows up with gdb (on i386) : 0x00f3fbe6 <+550>: add $0x8,%edi 0x00f3fbe9 <+553>: mov %edi,%ecx 0x00f3fbeb <+555>: sub %edi,%ecx 0x00f3fbed <+557>: cmovae %ecx,%edi The error: both %3 and %5 is turned into the %edi register. Here's the register allocation: : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) : "rm" ((pa_reg_x86)channels) : "cc" As I can tell from the above the "=D" forces %3 to go into %edi, but I don't know how to tell GCC not to use %edi for %5 (channels) as well, does anybody know? Can this be a GCC bug? (Btw, based on this analysis, I'm guessing that my former fix fixed the problem for amd64, but not i386.) -- David Henningsson, Canonical Ltd. http://launchpad.net/~diwic