lavu: add ff_parity()
authorClément Bœsch <u@pkh.me>
Sun, 3 Jan 2016 19:14:37 +0000 (20:14 +0100)
committerClément Bœsch <u@pkh.me>
Thu, 7 Jan 2016 21:51:31 +0000 (22:51 +0100)
configure
libavutil/intmath.h

index 1bff7f6..90b8fcc 100755 (executable)
--- a/configure
+++ b/configure
@@ -1736,6 +1736,7 @@ BUILTIN_LIST="
     machine_rw_barrier
     MemoryBarrier
     mm_empty
+    parity
     rdtsc
     sarestart
     sync_val_compare_and_swap
@@ -5241,6 +5242,7 @@ check_builtin sarestart signal.h "SA_RESTART"
 check_builtin sync_val_compare_and_swap "" "int *ptr; int oldval, newval; __sync_val_compare_and_swap(ptr, oldval, newval)"
 check_builtin gmtime_r time.h "time_t *time; struct tm *tm; gmtime_r(time, tm)"
 check_builtin localtime_r time.h "time_t *time; struct tm *tm; localtime_r(time, tm)"
+check_builtin parity "" "__builtin_parity(123)"
 
 case "$custom_allocator" in
     jemalloc)
index 82193a6..17c4f1b 100644 (file)
@@ -153,6 +153,18 @@ static av_always_inline av_const unsigned ff_clz_c(unsigned x)
 }
 #endif
 
+#ifndef ff_parity
+#define ff_parity ff_parity_c
+static av_always_inline av_const int ff_parity_c(uint32_t v)
+{
+#if HAVE_PARITY
+    return __builtin_parity(v);
+#else
+    return av_popcount(v) & 1;
+#endif
+}
+#endif
+
 /**
  * @}
  */