[FFmpeg-devel] [PATCH][RFC] Fix MMX rgb24 to yuv conversion with gcc 4.6

Ronald S. Bultje rsbultje
Sun Feb 13 13:52:53 CET 2011


Hi,

On Sun, Feb 13, 2011 at 4:35 AM, Zuxy Meng <zuxy.meng at gmail.com> wrote:
> 2011/2/13 Mans Rullgard <mans at mansr.com>:
>> When built with gcc 4.6, the MMX rgb24 to yuv conversion gives
>> wrong output. ?The compiler produces this warning:
>>
>> libswscale/swscale_template.c:1885:5: warning: use of memory input without lvalue in asm operand 4 is deprecated
>>
>> Changing the memory operand to a register makes it work, though
>> a better solution is perhaps possible.
>> ---
>> ?libswscale/swscale_template.c | ? 16 ++++++++--------
>> ?1 files changed, 8 insertions(+), 8 deletions(-)
>>
>> diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c
>> index 9da6b41..9863a7c 100644
>> --- a/libswscale/swscale_template.c
>> +++ b/libswscale/swscale_template.c
>> @@ -1883,7 +1883,7 @@ static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, const uint8_t *src, long w
>> ?static inline void RENAME(bgr24ToUV_mmx)(uint8_t *dstU, uint8_t *dstV, const uint8_t *src, long width, enum PixelFormat srcFormat)
>> ?{
>> ? ? __asm__ volatile(
>> - ? ? ? ?"movq ? ? ? ? ? ? ? ? ? ?24+%4, %%mm6 ? ? ? \n\t"
>> + ? ? ? ?"movq ? ? ? ? ? ? ? ? ? 24(%4), %%mm6 ? ? ? \n\t"
>> ? ? ? ? "mov ? ? ? ? ? ? ? ? ? ? ? ?%3, %%"REG_a" ? \n\t"
>> ? ? ? ? "pxor ? ? ? ? ? ? ? ? ? ?%%mm7, %%mm7 ? ? ? \n\t"
>> ? ? ? ? "1: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \n\t"
>> @@ -1894,9 +1894,9 @@ static inline void RENAME(bgr24ToUV_mmx)(uint8_t *dstU, uint8_t *dstV, const uin
>> ? ? ? ? "punpcklbw ? ? ? ? ? ? ? %%mm7, %%mm1 ? ? ? \n\t"
>> ? ? ? ? "movq ? ? ? ? ? ? ? ? ? ?%%mm0, %%mm2 ? ? ? \n\t"
>> ? ? ? ? "movq ? ? ? ? ? ? ? ? ? ?%%mm1, %%mm3 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ? ?%4, %%mm0 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ?8+%4, %%mm1 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? 16+%4, %%mm2 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ?(%4), %%mm0 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? 8(%4), %%mm1 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ?16(%4), %%mm2 ? ? ? \n\t"
>> ? ? ? ? "pmaddwd ? ? ? ? ? ? ? ? %%mm6, %%mm3 ? ? ? \n\t"
>> ? ? ? ? "paddd ? ? ? ? ? ? ? ? ? %%mm1, %%mm0 ? ? ? \n\t"
>> ? ? ? ? "paddd ? ? ? ? ? ? ? ? ? %%mm3, %%mm2 ? ? ? \n\t"
>> @@ -1908,9 +1908,9 @@ static inline void RENAME(bgr24ToUV_mmx)(uint8_t *dstU, uint8_t *dstV, const uin
>> ? ? ? ? "punpcklbw ? ? ? ? ? ? ? %%mm7, %%mm3 ? ? ? \n\t"
>> ? ? ? ? "movq ? ? ? ? ? ? ? ? ? ?%%mm1, %%mm4 ? ? ? \n\t"
>> ? ? ? ? "movq ? ? ? ? ? ? ? ? ? ?%%mm3, %%mm5 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ? ?%4, %%mm1 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ?8+%4, %%mm3 ? ? ? \n\t"
>> - ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? 16+%4, %%mm4 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? ?(%4), %%mm1 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ? 8(%4), %%mm3 ? ? ? \n\t"
>> + ? ? ? ?"pmaddwd ? ? ? ? ? ? ? ?16(%4), %%mm4 ? ? ? \n\t"
>> ? ? ? ? "pmaddwd ? ? ? ? ? ? ? ? %%mm6, %%mm5 ? ? ? \n\t"
>> ? ? ? ? "paddd ? ? ? ? ? ? ? ? ? %%mm3, %%mm1 ? ? ? \n\t"
>> ? ? ? ? "paddd ? ? ? ? ? ? ? ? ? %%mm5, %%mm4 ? ? ? \n\t"
>> @@ -1933,7 +1933,7 @@ static inline void RENAME(bgr24ToUV_mmx)(uint8_t *dstU, uint8_t *dstV, const uin
>> ? ? ? ? "add ? ? ? ? ? ? ? ? ? ? ? ?$4, %%"REG_a" ? \n\t"
>> ? ? ? ? " js ? ? ? ? ? ? ? ? ? ? ? ?1b ? ? ? ? ? ? ?\n\t"
>> ? ? : "+r" (src)
>> - ? ?: "r" (dstU+width), "r" (dstV+width), "g" ((x86_reg)-width), "m"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24][0])
>> + ? ?: "r" (dstU+width), "r" (dstV+width), "g" ((x86_reg)-width), "r"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24])
>> ? ? : "%"REG_a
>> ? ? );
>> ?}
>> --
>
> IIRC the code was written as such to make it compile on Darwin.

Both before and after compile on OSX 10.6, gcc 4.2.1.

Ronald



More information about the ffmpeg-devel mailing list