[FFmpeg-devel] [PATCH] libavutil: add x86 optimized av_popcount
James Almer
jamrial at gmail.com
Wed Feb 25 02:05:24 CET 2015
Signed-off-by: James Almer <jamrial at gmail.com>
---
I decided to go the configure route since other features (cmov, clz) also do
it , but if prefered this could instead be done with a new intmath.h header
in the x86/ folder containing something like
#if defined(__GNUC__) && defined(__POPCNT__)
#define av_popcount __builtin_popcount
#if ARCH_X86_64
#define av_popcount64 __builtin_popcountll
#endif
#endif
For a cleaner compile time check.
configure | 12 ++++++++++--
libavutil/intmath.h | 13 +++++++++++++
2 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/configure b/configure
index d037da1..3f1c394 100755
--- a/configure
+++ b/configure
@@ -1610,6 +1610,7 @@ ARCH_FEATURES="
fast_64bit
fast_clz
fast_cmov
+ fast_popcnt
local_aligned_8
local_aligned_16
local_aligned_32
@@ -3908,13 +3909,20 @@ elif enabled x86; then
cpuflags="-march=$cpu"
disable i686
;;
- # targets that do support nopl and conditional mov (cmov)
+ # targets that do support nopl and conditional mov (cmov) but not popcnt
i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx\
- |core*|atom|bonnell|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|amdfam10|barcelona|b[dt]ver*)
+ |core2*|atom|bonnell)
cpuflags="-march=$cpu"
enable i686
enable fast_cmov
;;
+ # targets that do support nopl, conditional mov (cmov) and popcnt
+ core-*|corei*|nehalem|westmere|silvermont|sandybridge|ivybridge|haswell|broadwell|amdfam10|barcelona|b[dt]ver*)
+ cpuflags="-march=$cpu"
+ enable i686
+ enable fast_cmov
+ enable fast_popcnt
+ ;;
# targets that do support conditional mov but on which it's slow
pentium4|pentium4m|prescott|nocona)
cpuflags="-march=$cpu"
diff --git a/libavutil/intmath.h b/libavutil/intmath.h
index fa549c8..e95eced 100644
--- a/libavutil/intmath.h
+++ b/libavutil/intmath.h
@@ -53,6 +53,19 @@
#endif
#endif /* AV_GCC_VERSION_AT_LEAST(3,4) */
+#if HAVE_FAST_POPCNT
+#if AV_GCC_VERSION_AT_LEAST(4,5)
+#ifndef av_popcount
+ #define av_popcount __builtin_popcount
+#endif /* av_popcount */
+#if HAVE_FAST_64BIT
+#ifndef av_popcount64
+ #define av_popcount64 __builtin_popcountll
+#endif /* av_popcount64 */
+#endif /* HAVE_FAST_64BIT */
+#endif /* AV_GCC_VERSION_AT_LEAST(4,5) */
+#endif /* HAVE_FAST_POPCNT */
+
extern const uint8_t ff_log2_tab[256];
#ifndef ff_log2
--
2.3.0
More information about the ffmpeg-devel
mailing list