[pulseaudio-discuss] Why is it still hissing?

David Henningsson david.henningsson at canonical.com
Tue May 24 07:04:27 PDT 2011

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 

#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" 
: "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.

More information about the pulseaudio-discuss mailing list