[FFmpeg-devel] [PATCH 1/3] configure: add x86 intrinsic support

Muhammad Faiz mfcc64 at gmail.com
Thu Mar 10 10:53:13 CET 2016


Signed-off-by: Muhammad Faiz <mfcc64 at gmail.com>
---
 configure                 | 42 ++++++++++++++++++++++++++++++++++
 libavutil/x86/intrinsic.h | 58 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 100 insertions(+)
 create mode 100644 libavutil/x86/intrinsic.h

diff --git a/configure b/configure
index 3299b1b..8f89e1e 100755
--- a/configure
+++ b/configure
@@ -386,6 +386,7 @@ Optimization options (experts only):
   --disable-neon           disable NEON optimizations
   --disable-inline-asm     disable use of inline assembly
   --disable-yasm           disable use of nasm/yasm assembly
+  --disable-intrinsic      disable use of intrinsic
   --disable-mipsdsp        disable MIPS DSP ASE R1 optimizations
   --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
   --disable-msa            disable MSA optimizations
@@ -932,6 +933,25 @@ check_yasm(){
     check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS
 }
 
+check_intrinsic_x86(){
+    log check_intrinsic "$@"
+    name="$1_intrinsic"
+    include="$2"
+    attr="av_intrinsic_$1"
+    type="$3"
+    code="$4"
+    shift 4
+    disable $name
+    {
+        cat "$source_path/libavutil/x86/intrinsic.h"
+        cat <<EOF
+
+#include <$include>
+$attr void foo($type *a, $type *b) { $code; }
+EOF
+    } | check_cc "$@" && enable $name
+}
+
 ld_o(){
     eval printf '%s\\n' $LD_O
 }
@@ -1748,6 +1768,7 @@ HAVE_LIST_CMDLINE="
     inline_asm
     symver
     yasm
+    intrinsic
 "
 
 HAVE_LIST_PUB="
@@ -1948,6 +1969,7 @@ HAVE_LIST="
     $ARCH_EXT_LIST
     $(add_suffix _external $ARCH_EXT_LIST)
     $(add_suffix _inline   $ARCH_EXT_LIST)
+    $(add_suffix _intrinsic $ARCH_EXT_LIST)
     $ARCH_FEATURES
     $ATOMICS_LIST
     $BUILTIN_LIST
@@ -3062,6 +3084,7 @@ enable safe_bitstream_reader
 enable static
 enable swscale_alpha
 enable valgrind_backtrace
+enable intrinsic
 
 sws_max_filter_size_default=256
 set_default sws_max_filter_size
@@ -5276,6 +5299,25 @@ EOF
     enabled ssse3  && check_inline_asm ssse3_inline  '"pabsw %xmm0, %xmm0"'
     enabled mmxext && check_inline_asm mmxext_inline '"pmaxub %mm0, %mm1"'
 
+    if enabled intrinsic; then
+        enabled mmx && check_intrinsic_x86 mmx mmintrin.h __m64 "*a = _mm_add_pi32(*a, *b)"
+        enabled mmxext && check_intrinsic_x86 mmxext xmmintrin.h __m64 "*a = _mm_max_pu8(*a, *b)"
+        enabled amd3dnow && check_intrinsic_x86 amd3dnow mm3dnow.h __m64 "*a = _m_pfadd(*a, *b)"
+        enabled amd3dnowext && check_intrinsic_x86 amd3dnowext mm3dnow.h __m64 "*a = _m_pfnacc(*a, *b)"
+        enabled sse && check_intrinsic_x86 sse xmmintrin.h __m128 "*a = _mm_add_ps(*a, *b)"
+        enabled sse2 && check_intrinsic_x86 sse2 emmintrin.h __m128d "*a = _mm_add_pd(*a, *b)"
+        enabled sse3 && check_intrinsic_x86 sse3 pmmintrin.h __m128 "*a = _mm_hadd_ps(*a, *b)"
+        enabled ssse3 && check_intrinsic_x86 ssse3 tmmintrin.h __m128i "*a = _mm_hadd_epi16(*a, *b)"
+        enabled sse4 && check_intrinsic_x86 sse4 smmintrin.h __m128 "*a = _mm_ceil_ps(*b)"
+        enabled sse42 && check_intrinsic_x86 sse42 smmintrin.h __m128i "*a = _mm_cmpistrm(*a, *b, 0)"
+        enabled avx && check_intrinsic_x86 avx immintrin.h __m256 "*a = _mm256_add_ps(*a, *b)"
+        enabled avx2 && check_intrinsic_x86 avx2 immintrin.h __m256i "*a = _mm256_add_epi8(*a, *b)"
+        enabled fma3 && check_intrinsic_x86 fma3 immintrin.h __m256 "*a = _mm256_fmadd_ps(*a, *b, *b)"
+        enabled fma4 && check_intrinsic_x86 fma4 x86intrin.h __m128 "*a = _mm_macc_ps(*a, *b, *b)"
+        enabled xop && check_intrinsic_x86 xop x86intrin.h __m128i "*a = _mm_macc_epi16(*a, *b, *a)"
+        enabled aesni && check_intrinsic_x86 aesni wmmintrin.h __m128i "*a = _mm_aesdec_si128(*a, *b)"
+    fi
+
     if ! disabled_any asm mmx yasm; then
         if check_cmd $yasmexe --version; then
             enabled x86_64 && yasm_extra="-m amd64"
diff --git a/libavutil/x86/intrinsic.h b/libavutil/x86/intrinsic.h
new file mode 100644
index 0000000..d424cd8
--- /dev/null
+++ b/libavutil/x86/intrinsic.h
@@ -0,0 +1,58 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_X86_INTRINSIC_H
+#define AVUTIL_X86_INTRINSIC_H
+
+#ifdef __GNUC__
+#    define av_intrinsic_mmx __attribute__((__target__("mmx")))
+#    define av_intrinsic_mmxext __attribute__((__target__("sse")))
+#    define av_intrinsic_amd3dnow __attribute__((__target__("3dnow")))
+#    define av_intrinsic_amd3dnowext __attribute__((__target__("3dnow")))
+#    define av_intrinsic_sse __attribute__((__target__("sse")))
+#    define av_intrinsic_sse2 __attribute__((__target__("sse2")))
+#    define av_intrinsic_sse3 __attribute__((__target__("sse3")))
+#    define av_intrinsic_ssse3 __attribute__((__target__("ssse3")))
+#    define av_intrinsic_sse4 __attribute__((__target__("sse4.1")))
+#    define av_intrinsic_sse42 __attribute__((__target__("sse4.2")))
+#    define av_intrinsic_avx __attribute__((__target__("avx")))
+#    define av_intrinsic_avx2 __attribute__((__target__("avx2")))
+#    define av_intrinsic_fma3 __attribute__((__target__("fma")))
+#    define av_intrinsic_fma4 __attribute__((__target__("fma4")))
+#    define av_intrinsic_xop __attribute__((__target__("xop")))
+#    define av_intrinsic_aesni __attribute__((__target__("aes")))
+#else
+#    define av_intrinsic_mmx
+#    define av_intrinsic_mmxext
+#    define av_intrinsic_amd3dnow
+#    define av_intrinsic_amd3dnowext
+#    define av_intrinsic_sse
+#    define av_intrinsic_sse2
+#    define av_intrinsic_sse3
+#    define av_intrinsic_ssse3
+#    define av_intrinsic_sse4
+#    define av_intrinsic_sse42
+#    define av_intrinsic_avx
+#    define av_intrinsic_avx2
+#    define av_intrinsic_fma
+#    define av_intrinsic_fma4
+#    define av_intrinsic_xop
+#    define av_intrinsic_aesni
+#endif
+
+#endif /* AVUTIL_X86_INTRINSIC_H */
-- 
2.5.0



More information about the ffmpeg-devel mailing list