[FFmpeg-devel] [PATCH 2/2] libavutil: add bmi2 optimized av_mod_uintp2

James Almer jamrial at gmail.com
Thu Mar 19 06:35:20 CET 2015


Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavutil/x86/intmath.h | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/libavutil/x86/intmath.h b/libavutil/x86/intmath.h
index 7aa6bc4..c42fa83 100644
--- a/libavutil/x86/intmath.h
+++ b/libavutil/x86/intmath.h
@@ -24,15 +24,35 @@
 #include <stdint.h>
 #include "config.h"
 
+#if defined(__GNUC__)
+
 /* Our generic version of av_popcount is faster than GCC's built-in on
  * CPUs that don't support the popcnt instruction.
  */
-#if defined(__GNUC__) && defined(__POPCNT__)
+#if defined(__POPCNT__)
     #define av_popcount   __builtin_popcount
 #if ARCH_X86_64
     #define av_popcount64 __builtin_popcountll
 #endif
 
-#endif /* defined(__GNUC__) && defined(__POPCNT__) */
+#endif /* __POPCNT__ */
+
+#if defined(__BMI2__)
+
+#define av_mod_uintp2 av_mod_uintp2_bmi2
+static av_always_inline av_const unsigned av_mod_uintp2_bmi2(unsigned a, unsigned p)
+{
+    if (av_builtin_constant_p(p))
+        return a & ((1 << p) - 1);
+    else {
+        unsigned x;
+        __asm__ ("bzhi %2, %1, %0 \n\t" : "=r"(x) : "rm"(a), "r"(p));
+        return x;
+    }
+}
+
+#endif /* __BMI2__ */
+
+#endif /* __GNUC__ */
 
 #endif /* AVUTIL_X86_INTMATH_H */
-- 
2.3.2



More information about the ffmpeg-devel mailing list