[FFmpeg-cvslog] libavutil: add bmi2 optimized av_mod_uintp2

James Almer git at videolan.org
Fri Mar 20 19:48:43 CET 2015


ffmpeg | branch: master | James Almer <jamrial at gmail.com> | Wed Mar 18 22:43:33 2015 -0300| [60b9373dbd52bba91d2286d5f8a1366090a9df08] | committer: James Almer

libavutil: add bmi2 optimized av_mod_uintp2

Reviewed-by: Michael Niedermayer <michaelni at gmx.at>
Signed-off-by: James Almer <jamrial at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=60b9373dbd52bba91d2286d5f8a1366090a9df08
---

 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 */



More information about the ffmpeg-cvslog mailing list