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
_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@mail.0pointer.de
https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss

Reply via email to