Why is it still hissing?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux