[FFmpeg-devel] [PATCH] Fix compilation on clang 2.8, which doesn't support 3dnow inline asm.

Ronald S. Bultje rsbultje
Fri Feb 11 18:40:10 CET 2011


---
 configure                       |    8 +++++---
 libavcodec/x86/cavsdsp_mmx.c    |    4 ++++
 libavcodec/x86/dsputil_mmx.c    |   39 ++++++++++++++++++++++++++++++++-------
 libavcodec/x86/dsputilenc_mmx.c |    4 ++++
 libavcodec/x86/fmtconvert_mmx.c |   10 ++++++++++
 libavcodec/x86/h264_qpel_mmx.c  |    2 ++
 libswscale/rgb2rgb.c            |    4 ++++
 7 files changed, 61 insertions(+), 10 deletions(-)

diff --git a/configure b/configure
index a3ca15d..48e7d60 100755
--- a/configure
+++ b/configure
@@ -2649,9 +2649,11 @@ int main(void) {
 }
 EOF
 
-    # check whether binutils is new enough to compile SSSE3/MMX2
-    enabled ssse3 && check_asm ssse3 '"pabsw %xmm0, %xmm0"'
-    enabled mmx2  && check_asm mmx2  '"pmaxub %mm0, %mm1"'
+    # check whether binutils is new enough to compile SSSE3/MMX2/3dnow
+    enabled ssse3    && check_asm ssse3    '"pabsw  %xmm0, %xmm0"'
+    enabled mmx2     && check_asm mmx2     '"pmaxub  %mm0, %mm1"'
+    enabled amd3dnow && check_asm amd3dnow '"pavgusb %mm0, %mm1"'
+    enabled amd3dnowext && enabled amd3dnow || disable amd3dnowext
 
     check_asm bswap '"bswap %%eax" ::: "%eax"'
 
diff --git a/libavcodec/x86/cavsdsp_mmx.c b/libavcodec/x86/cavsdsp_mmx.c
index 0f5fdaa..e17d18c 100644
--- a/libavcodec/x86/cavsdsp_mmx.c
+++ b/libavcodec/x86/cavsdsp_mmx.c
@@ -425,8 +425,10 @@ static void ff_ ## OPNAME ## cavs_qpel ## SIZE ## _mc03_ ## MMX(uint8_t *dst, ui
 "pavgb " #temp ", " #a "          \n\t"\
 "mov" #size " " #a ", " #b "      \n\t"
 
+#if HAVE_AMD3DNOW
 QPEL_CAVS(put_,       PUT_OP, 3dnow)
 QPEL_CAVS(avg_, AVG_3DNOW_OP, 3dnow)
+#endif
 QPEL_CAVS(put_,       PUT_OP, mmx2)
 QPEL_CAVS(avg_,  AVG_MMX2_OP, mmx2)
 
@@ -476,5 +478,7 @@ void ff_cavsdsp_init_mmx(CAVSDSPContext *c, AVCodecContext *avctx)
     int mm_flags = av_get_cpu_flags();
 
     if (mm_flags & AV_CPU_FLAG_MMX2)  ff_cavsdsp_init_mmx2 (c, avctx);
+#if HAVE_AMD3DNOW
     if (mm_flags & AV_CPU_FLAG_3DNOW) ff_cavsdsp_init_3dnow(c, avctx);
+#endif
 }
diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c
index 39bf3f2..ceb9f5d 100644
--- a/libavcodec/x86/dsputil_mmx.c
+++ b/libavcodec/x86/dsputil_mmx.c
@@ -190,6 +190,7 @@ DECLARE_ALIGNED(16, const double, ff_pd_2)[2] = { 2.0, 2.0 };
 /***********************************/
 /* 3Dnow specific */
 
+#if HAVE_AMD3DNOW
 #define DEF(x) x ## _3dnow
 #define PAVGB "pavgusb"
 #define OP_AVG PAVGB
@@ -199,6 +200,7 @@ DECLARE_ALIGNED(16, const double, ff_pd_2)[2] = { 2.0, 2.0 };
 #undef DEF
 #undef PAVGB
 #undef OP_AVG
+#endif
 
 /***********************************/
 /* MMX2 specific */
@@ -967,7 +969,7 @@ PAETH(ssse3, ABS3_SSSE3)
         "packuswb %%mm5, %%mm5            \n\t"\
         OP(%%mm5, out, %%mm7, d)
 
-#define QPEL_BASE(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
+#define QPEL_BASE_MMX2_16(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
 static void OPNAME ## mpeg4_qpel16_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
     uint64_t temp;\
 \
@@ -1087,7 +1089,8 @@ static void OPNAME ## mpeg4_qpel16_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, in
         : "memory"\
     );\
 }\
-\
+
+#define QPEL_BASE_3DNOW_16(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
 static void OPNAME ## mpeg4_qpel16_h_lowpass_3dnow(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
     int i;\
     int16_t temp[16];\
@@ -1134,7 +1137,8 @@ static void OPNAME ## mpeg4_qpel16_h_lowpass_3dnow(uint8_t *dst, uint8_t *src, i
         src+=srcStride;\
     }\
 }\
-\
+
+#define QPEL_BASE_MMX2_8(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
 static void OPNAME ## mpeg4_qpel8_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
     __asm__ volatile(\
         "pxor %%mm7, %%mm7                \n\t"\
@@ -1198,7 +1202,8 @@ static void OPNAME ## mpeg4_qpel8_h_lowpass_mmx2(uint8_t *dst, uint8_t *src, int
         : "memory"\
     );\
 }\
-\
+
+#define QPEL_BASE_3DNOW_8(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
 static void OPNAME ## mpeg4_qpel8_h_lowpass_3dnow(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int h){\
     int i;\
     int16_t temp[8];\
@@ -1603,12 +1608,26 @@ static void OPNAME ## qpel16_mc22_ ## MMX(uint8_t *dst, uint8_t *src, int stride
 "pavgb " #temp ", " #a "          \n\t"\
 "mov" #size " " #a ", " #b "      \n\t"
 
+#if HAVE_AMD3DNOW
+#define QPEL_BASE(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
+QPEL_BASE_MMX2_16(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW) \
+QPEL_BASE_MMX2_8(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW) \
+QPEL_BASE_3DNOW_16(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW) \
+QPEL_BASE_3DNOW_8(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)
+#else
+#define QPEL_BASE(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)\
+QPEL_BASE_MMX2_16(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW) \
+QPEL_BASE_MMX2_8(OPNAME, ROUNDER, RND, OP_MMX2, OP_3DNOW)
+#endif
+
 QPEL_BASE(put_       , ff_pw_16, _       , PUT_OP, PUT_OP)
 QPEL_BASE(avg_       , ff_pw_16, _       , AVG_MMX2_OP, AVG_3DNOW_OP)
 QPEL_BASE(put_no_rnd_, ff_pw_15, _no_rnd_, PUT_OP, PUT_OP)
+#if HAVE_AMD3DNOW
 QPEL_OP(put_       , ff_pw_16, _       , PUT_OP, 3dnow)
 QPEL_OP(avg_       , ff_pw_16, _       , AVG_3DNOW_OP, 3dnow)
 QPEL_OP(put_no_rnd_, ff_pw_15, _no_rnd_, PUT_OP, 3dnow)
+#endif
 QPEL_OP(put_       , ff_pw_16, _       , PUT_OP, mmx2)
 QPEL_OP(avg_       , ff_pw_16, _       , AVG_MMX2_OP, mmx2)
 QPEL_OP(put_no_rnd_, ff_pw_15, _no_rnd_, PUT_OP, mmx2)
@@ -1654,10 +1673,12 @@ QPEL_2TAP(put_, 16, mmx2)
 QPEL_2TAP(avg_, 16, mmx2)
 QPEL_2TAP(put_,  8, mmx2)
 QPEL_2TAP(avg_,  8, mmx2)
+#if HAVE_AMD3DNOW
 QPEL_2TAP(put_, 16, 3dnow)
 QPEL_2TAP(avg_, 16, 3dnow)
 QPEL_2TAP(put_,  8, 3dnow)
 QPEL_2TAP(avg_,  8, 3dnow)
+#endif
 
 
 #if 0
@@ -1887,7 +1908,9 @@ static void name(void *mem, int stride, int h){\
     }while(--h);\
 }
 PREFETCH(prefetch_mmx2,  prefetcht0)
+#if HAVE_AMD3DNOW
 PREFETCH(prefetch_3dnow, prefetch)
+#endif
 #undef PREFETCH
 
 #include "h264_qpel_mmx.c"
@@ -2640,6 +2663,7 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
                 ff_vc1dsp_init_mmx(c, avctx);
 
             c->add_png_paeth_prediction= add_png_paeth_prediction_mmx2;
+#if HAVE_AMD3DNOW
         } else if (mm_flags & AV_CPU_FLAG_3DNOW) {
             c->prefetch = prefetch_3dnow;
 
@@ -2700,6 +2724,7 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
             c->avg_rv40_chroma_pixels_tab[0]= ff_avg_rv40_chroma_mc8_3dnow;
             c->avg_rv40_chroma_pixels_tab[1]= ff_avg_rv40_chroma_mc4_3dnow;
 #endif
+#endif /* HAVE_AMD3DNOW */
         }
 
 
@@ -2758,11 +2783,11 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
         }
 #endif
 
-        if(mm_flags & AV_CPU_FLAG_3DNOW){
+        if(HAVE_AMD3DNOW && mm_flags & AV_CPU_FLAG_3DNOW){
             c->vorbis_inverse_coupling = vorbis_inverse_coupling_3dnow;
             c->vector_fmul = vector_fmul_3dnow;
         }
-        if(mm_flags & AV_CPU_FLAG_3DNOWEXT){
+        if(HAVE_AMD3DNOWEXT && mm_flags & AV_CPU_FLAG_3DNOWEXT){
             c->vector_fmul_reverse = vector_fmul_reverse_3dnow2;
 #if HAVE_6REGS
             c->vector_fmul_window = vector_fmul_window_3dnow2;
@@ -2788,7 +2813,7 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
             c->scalarproduct_float = ff_scalarproduct_float_sse;
 #endif
         }
-        if(mm_flags & AV_CPU_FLAG_3DNOW)
+        if(HAVE_AMD3DNOW && mm_flags & AV_CPU_FLAG_3DNOW)
             c->vector_fmul_add = vector_fmul_add_3dnow; // faster than sse
         if(mm_flags & AV_CPU_FLAG_SSE2){
 #if HAVE_YASM
diff --git a/libavcodec/x86/dsputilenc_mmx.c b/libavcodec/x86/dsputilenc_mmx.c
index bd31205..6966c91 100644
--- a/libavcodec/x86/dsputilenc_mmx.c
+++ b/libavcodec/x86/dsputilenc_mmx.c
@@ -1059,6 +1059,7 @@ static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2, int si
 #undef SCALE_OFFSET
 #undef PMULHRW
 
+#if HAVE_AMD3DNOW
 #define DEF(x) x ## _3dnow
 #define SET_RND(x)
 #define SCALE_OFFSET 0
@@ -1072,6 +1073,7 @@ static int ssd_int8_vs_int16_mmx(const int8_t *pix1, const int16_t *pix2, int si
 #undef SET_RND
 #undef SCALE_OFFSET
 #undef PMULHRW
+#endif
 
 #if HAVE_SSSE3
 #undef PHADDD
@@ -1180,12 +1182,14 @@ void dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx)
         }
 #endif
 
+#if HAVE_AMD3DNOW
         if(mm_flags & AV_CPU_FLAG_3DNOW){
             if(!(avctx->flags & CODEC_FLAG_BITEXACT)){
                 c->try_8x8basis= try_8x8basis_3dnow;
             }
             c->add_8x8basis= add_8x8basis_3dnow;
         }
+#endif
     }
 
     dsputil_init_pix_mmx(c, avctx);
diff --git a/libavcodec/x86/fmtconvert_mmx.c b/libavcodec/x86/fmtconvert_mmx.c
index ea41f73..ac1367c 100644
--- a/libavcodec/x86/fmtconvert_mmx.c
+++ b/libavcodec/x86/fmtconvert_mmx.c
@@ -70,6 +70,7 @@ static void int32_to_float_fmul_scalar_sse2(float *dst, const int *src, float mu
     );
 }
 
+#if HAVE_AMD3DNOW
 static void float_to_int16_3dnow(int16_t *dst, const float *src, long len){
     x86_reg reglen = len;
     // not bit-exact: pf2id uses different rounding than C and SSE
@@ -93,6 +94,7 @@ static void float_to_int16_3dnow(int16_t *dst, const float *src, long len){
         :"+r"(reglen), "+r"(dst), "+r"(src)
     );
 }
+#endif
 
 static void float_to_int16_sse(int16_t *dst, const float *src, long len){
     x86_reg reglen = len;
@@ -180,6 +182,7 @@ static void float_to_int16_interleave_##cpu(int16_t *dst, const float **src, lon
         float_to_int16_interleave_misc_##cpu(dst, src, len, channels);\
 }
 
+#if HAVE_AMD3DNOW
 FLOAT_TO_INT16_INTERLEAVE(3dnow,
     "1:                         \n"
     "pf2id     (%2,%0), %%mm0   \n"
@@ -197,6 +200,7 @@ FLOAT_TO_INT16_INTERLEAVE(3dnow,
     "js 1b                      \n"
     "femms                      \n"
 )
+#endif
 
 FLOAT_TO_INT16_INTERLEAVE(sse,
     "1:                         \n"
@@ -228,12 +232,14 @@ FLOAT_TO_INT16_INTERLEAVE(sse2,
     "js 1b                      \n"
 )
 
+#if HAVE_AMD3DNOW
 static void float_to_int16_interleave_3dn2(int16_t *dst, const float **src, long len, int channels){
     if(channels==6)
         ff_float_to_int16_interleave6_3dn2(dst, src, len);
     else
         float_to_int16_interleave_3dnow(dst, src, len, channels);
 }
+#endif
 
 void ff_fmt_convert_init_x86(FmtConvertContext *c, AVCodecContext *avctx)
 {
@@ -241,17 +247,21 @@ void ff_fmt_convert_init_x86(FmtConvertContext *c, AVCodecContext *avctx)
 
     if (mm_flags & AV_CPU_FLAG_MMX) {
 
+#if HAVE_AMD3DNOW
         if(mm_flags & AV_CPU_FLAG_3DNOW){
             if(!(avctx->flags & CODEC_FLAG_BITEXACT)){
                 c->float_to_int16 = float_to_int16_3dnow;
                 c->float_to_int16_interleave = float_to_int16_interleave_3dnow;
             }
         }
+#endif
+#if HAVE_AMD3DNOWEXT
         if(mm_flags & AV_CPU_FLAG_3DNOWEXT){
             if(!(avctx->flags & CODEC_FLAG_BITEXACT)){
                 c->float_to_int16_interleave = float_to_int16_interleave_3dn2;
             }
         }
+#endif
         if(mm_flags & AV_CPU_FLAG_SSE){
             c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_sse;
             c->float_to_int16 = float_to_int16_sse;
diff --git a/libavcodec/x86/h264_qpel_mmx.c b/libavcodec/x86/h264_qpel_mmx.c
index d8ceca1..909b2b8 100644
--- a/libavcodec/x86/h264_qpel_mmx.c
+++ b/libavcodec/x86/h264_qpel_mmx.c
@@ -1191,7 +1191,9 @@ QPEL_H264_HV_XMM(avg_,  AVG_MMX2_OP, ssse3)
 #endif
 #undef PAVGB
 
+#if HAVE_AMD3DNOW
 H264_MC_4816(3dnow)
+#endif
 H264_MC_4816(mmx2)
 H264_MC_816(H264_MC_V, sse2)
 H264_MC_816(H264_MC_HV, sse2)
diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c
index 7226853..eae28ec 100644
--- a/libswscale/rgb2rgb.c
+++ b/libswscale/rgb2rgb.c
@@ -184,11 +184,13 @@ DECLARE_ASM_CONST(8, uint64_t, blue_15mask)  = 0x0000001f0000001fULL;
 #undef COMPILE_TEMPLATE_MMX2
 #undef COMPILE_TEMPLATE_SSE2
 #undef COMPILE_TEMPLATE_AMD3DNOW
+#if HAVE_AMD3DNOW
 #define COMPILE_TEMPLATE_MMX2 0
 #define COMPILE_TEMPLATE_SSE2 1
 #define COMPILE_TEMPLATE_AMD3DNOW 1
 #define RENAME(a) a ## _3DNOW
 #include "rgb2rgb_template.c"
+#endif
 
 #endif //ARCH_X86 || ARCH_X86_64
 
@@ -206,8 +208,10 @@ void sws_rgb2rgb_init(int flags)
         rgb2rgb_init_SSE2();
     else if (flags & SWS_CPU_CAPS_MMX2)
         rgb2rgb_init_MMX2();
+#if HAVE_AMD3DNOW
     else if (flags & SWS_CPU_CAPS_3DNOW)
         rgb2rgb_init_3DNOW();
+#endif
     else if (flags & SWS_CPU_CAPS_MMX)
         rgb2rgb_init_MMX();
     else
-- 
1.7.2.1




More information about the ffmpeg-devel mailing list