The "rm" basm constraint doesn't work with my version of gcc (4.5.2), not even in a simple example. Since we usually only have 5 registers available on i386, force it to be memory on that architecture.
I've reported an Ubuntu bug on the "rm" constraint issue [1], and it seems to apply to a lot of gcc versions. In the meantime I recommend this patch to be applied to both master and stable-queue. I've got some positive feedback from testing in the Ubuntu community as well.
@Colin, I haven't forgot that there might still be issues if you completely silence one channel, it just hasn't been time/priority to deal with that yet, feel free to beat me to it if you like :-)
-- David Henningsson, Canonical Ltd. http://launchpad.net/~diwic [1] https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/789031
>From 75d0e5f5ad7764eba560810c958c5dfa4a248f81 Mon Sep 17 00:00:00 2001 From: David Henningsson <[email protected]> Date: Fri, 27 May 2011 09:28:57 +0200 Subject: [PATCH] SSE/MMX: Fix problem with highpitched noise on i386 The "rm" basm constraint doesn't work with my version of gcc (4.5.2), not even in a simple example. Since we usually only have 5 registers available on i386, force it to be memory on that architecture. Signed-off-by: David Henningsson <[email protected]> --- src/pulsecore/svolume_mmx.c | 12 ++++++++++-- src/pulsecore/svolume_sse.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/pulsecore/svolume_mmx.c b/src/pulsecore/svolume_mmx.c index a71a39b..129d7f0 100644 --- a/src/pulsecore/svolume_mmx.c +++ b/src/pulsecore/svolume_mmx.c @@ -155,7 +155,11 @@ pa_volume_s16ne_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi " emms \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } @@ -232,7 +236,11 @@ pa_volume_s16re_mmx (int16_t *samples, int32_t *volumes, unsigned channels, unsi " emms \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" ((pa_reg_x86)channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } diff --git a/src/pulsecore/svolume_sse.c b/src/pulsecore/svolume_sse.c index 5983164..ccf45e7 100644 --- a/src/pulsecore/svolume_sse.c +++ b/src/pulsecore/svolume_sse.c @@ -154,7 +154,11 @@ pa_volume_s16ne_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, uns "8: \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } @@ -244,7 +248,11 @@ pa_volume_s16re_sse2 (int16_t *samples, int32_t *volumes, unsigned channels, uns "8: \n\t" : "+r" (samples), "+r" (volumes), "+r" (length), "=D" (channel), "=&r" (temp) - : "rm" ((pa_reg_x86)channels) +#if defined (__i386__) + : "m" ((pa_reg_x86)channels) +#else + : "r" ((pa_reg_x86)channels) +#endif : "cc" ); } -- 1.7.4.1
_______________________________________________ pulseaudio-discuss mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
