From: Tyler Retzlaff <roret...@linux.microsoft.com> Provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in intrinsics.
Signed-off-by: Tyler Retzlaff <roret...@linux.microsoft.com> --- lib/eal/include/rte_bitops.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/lib/eal/include/rte_bitops.h b/lib/eal/include/rte_bitops.h index deb1fd43f2..14074850ec 100644 --- a/lib/eal/include/rte_bitops.h +++ b/lib/eal/include/rte_bitops.h @@ -958,6 +958,28 @@ rte_popcount64(uint64_t v) return (unsigned int)__popcnt64(v); } +static inline unsigned int +rte_ffs32(uint32_t v) +{ + unsigned long rv; + + if (_BitScanForward(&rv, v) == 0) + return 0; + + return (unsigned int)rv + 1; +} + +static inline unsigned int +rte_ffs64(uint64_t v) +{ + unsigned long rv; + + if (_BitScanForward64(&rv, v) == 0) + return 0; + + return (unsigned int)rv + 1; +} + #else /** @@ -1044,6 +1066,18 @@ rte_popcount64(uint64_t v) return (unsigned int)__builtin_popcountll(v); } +static inline unsigned int +rte_ffs32(uint32_t v) +{ + return (unsigned int)__builtin_ffs(v); +} + +static inline unsigned int +rte_ffs64(uint64_t v) +{ + return (unsigned int)__builtin_ffsll(v); +} + #endif /** -- 2.47.0.vfs.0.3