[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
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
More information about the pulseaudio-discuss
mailing list