[pulseaudio-discuss] Why is it still hissing?

Andrew Lutomirski luto at mit.edu
Wed May 25 05:41:39 PDT 2011


On Tue, May 24, 2011 at 10:04 AM, David Henningsson
<david.henningsson at canonical.com> wrote:
> 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?


Either use "+D" for channel or "&rm" for channels.

The manual here:

http://gcc.gnu.org/onlinedocs/gcc/Modifiers.html#Modifiers

is pretty good.

--Andy



More information about the pulseaudio-discuss mailing list