* modules/video_chroma/i420_rgb_mmx.h: work around a GCC 3.4.x bug.
authorSam Hocevar <sam@videolan.org>
Tue, 20 Sep 2005 00:11:35 +0000 (00:11 +0000)
committerSam Hocevar <sam@videolan.org>
Tue, 20 Sep 2005 00:11:35 +0000 (00:11 +0000)
    /* 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
modules/video_chroma/i420_rgb_mmx.h

index e222194..84107c2 100644 (file)
@@ -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;
index e1e3240..2a2ed8e 100644 (file)
@@ -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;
 
 /*