From ae7273d20f50ce62af7f7a27c86103813b0cf92d Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Tue, 20 Sep 2005 00:11:35 +0000 Subject: [PATCH] * modules/video_chroma/i420_rgb_mmx.h: work around a GCC 3.4.x bug. /* Using i586-mingw32msvc-gcc 3.4.2: */ uint32_t i; __m64 mm0 = (__m64)(uint64_t)i; /* ICE */ uint32_t i; uint64_t tmp = i; __m64 mm0 = (__m64)tmp; /* OK */ --- modules/video_chroma/i420_rgb16.c | 5 +++++ modules/video_chroma/i420_rgb_mmx.h | 21 ++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/modules/video_chroma/i420_rgb16.c b/modules/video_chroma/i420_rgb16.c index e2221941e7..84107c2f5b 100644 --- a/modules/video_chroma/i420_rgb16.c +++ b/modules/video_chroma/i420_rgb16.c @@ -283,6 +283,7 @@ void E_(I420_RGB16)( vout_thread_t *p_vout, picture_t *p_src, { # if defined (HAVE_MMX_INTRINSICS) __m64 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; + uint64_t tmp64; INTRINSICS_INIT_16 INTRINSICS_YUV_MUL INTRINSICS_YUV_ADD @@ -311,6 +312,7 @@ void E_(I420_RGB16)( vout_thread_t *p_vout, picture_t *p_src, { # if defined (HAVE_MMX_INTRINSICS) __m64 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; + uint64_t tmp64; INTRINSICS_INIT_16 INTRINSICS_YUV_MUL INTRINSICS_YUV_ADD @@ -341,6 +343,7 @@ void E_(I420_RGB16)( vout_thread_t *p_vout, picture_t *p_src, #if defined (MODULE_NAME_IS_i420_rgb_mmx) # if defined (HAVE_MMX_INTRINSICS) __m64 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; + uint64_t tmp64; # endif #endif p_y -= i_rewind; @@ -496,6 +499,7 @@ void E_(I420_RGB32)( vout_thread_t *p_vout, picture_t *p_src, #elif defined (MODULE_NAME_IS_i420_rgb_mmx) # if defined (HAVE_MMX_INTRINSICS) __m64 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; + uint64_t tmp64; INTRINSICS_INIT_32 INTRINSICS_YUV_MUL INTRINSICS_YUV_ADD @@ -525,6 +529,7 @@ void E_(I420_RGB32)( vout_thread_t *p_vout, picture_t *p_src, #if defined (MODULE_NAME_IS_i420_rgb_mmx) # if defined (HAVE_MMX_INTRINSICS) __m64 mm0, mm1, mm2, mm3, mm4, mm5, mm6, mm7; + uint64_t tmp64; # endif #endif p_y -= i_rewind; diff --git a/modules/video_chroma/i420_rgb_mmx.h b/modules/video_chroma/i420_rgb_mmx.h index e1e32405d0..2a2ed8e920 100644 --- a/modules/video_chroma/i420_rgb_mmx.h +++ b/modules/video_chroma/i420_rgb_mmx.h @@ -54,8 +54,10 @@ movq (%0), %%mm6 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ " #define INTRINSICS_INIT_16 \ - mm0 = (__m64)(uint64_t)*(uint32_t *)p_u; \ - mm1 = (__m64)(uint64_t)*(uint32_t *)p_v; \ + tmp64 = *(uint32_t *)p_u; \ + mm0 = (__m64)tmp64; \ + tmp64 = *(uint32_t *)p_v; \ + mm1 = (__m64)tmp64; \ mm4 = (__m64)(uint64_t)0; \ mm6 = (__m64)*(uint64_t *)p_y; \ /* *(uint16_t *)p_buffer = 0; */ @@ -74,9 +76,11 @@ movq (%0), %%mm6 # Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 \n\ " #define INTRINSICS_INIT_32 \ - mm0 = (__m64)(uint64_t)*(uint32_t *)p_u; \ + tmp64 = *(uint32_t *)p_u; \ + mm0 = (__m64)tmp64; \ *(uint16_t *)p_buffer = 0; \ - mm1 = (__m64)(uint64_t)*(uint32_t *)p_v; \ + tmp64 = *(uint32_t *)p_v; \ + mm1 = (__m64)tmp64; \ mm4 = (__m64)(uint64_t)0; \ mm6 = (__m64)*(uint64_t *)p_y; @@ -290,15 +294,18 @@ movq %%mm5, 8(%3) # store pixel 4-7 \n\ mm0 = _mm_unpacklo_pi8(mm0, mm1); \ mm2 = _mm_slli_pi16(mm2, 2); \ mm0 = _mm_or_si64(mm0, mm2); \ - mm6 = (__m64)*(uint64_t *)(p_y + 8); \ + tmp64 = *(uint64_t *)(p_y + 8); \ + mm6 = (__m64)tmp64; \ *(uint64_t *)p_buffer = (uint64_t)mm0; \ \ mm7 = _mm_unpackhi_pi8(mm7, mm4); \ mm5 = _mm_unpackhi_pi8(mm5, mm1); \ mm7 = _mm_slli_pi16(mm7, 2); \ - mm0 = (__m64)(uint64_t)*(uint32_t *)(p_u + 4); \ + tmp64 = (uint64_t)*(uint32_t *)(p_u + 4); \ + mm0 = (__m64)tmp64; \ mm5 = _mm_or_si64(mm5, mm7); \ - mm1 = (__m64)(uint64_t)*(uint32_t *)(p_v + 4); \ + tmp64 = (uint64_t)*(uint32_t *)(p_v + 4); \ + mm1 = (__m64)tmp64; \ *(uint64_t *)(p_buffer + 4) = (uint64_t)mm5; /* -- 2.39.5