[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