* [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC @ 2024-03-20 21:24 Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 1/2] eal: provide movdiri " Tyler Retzlaff ` (3 more replies) 0 siblings, 4 replies; 15+ messages in thread From: Tyler Retzlaff @ 2024-03-20 21:24 UTC (permalink / raw) To: dev; +Cc: Bruce Richardson, Joyce Kong, Konstantin Ananyev, Tyler Retzlaff MSVC does not support inline assembly so use movdiri intrinsic and provide abstracted rte_ffs{32,64} inline functions instead of directly using GCC built-ins. Tyler Retzlaff (2): eal: provide movdiri for MSVC eal: add rte ffs32 and rte ffs64 inline functions lib/eal/include/rte_bitops.h | 34 ++++++++++++++++++++++++++++++++++ lib/eal/x86/include/rte_io.h | 4 ++++ 2 files changed, 38 insertions(+) -- 1.8.3.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 1/2] eal: provide movdiri for MSVC 2024-03-20 21:24 [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC Tyler Retzlaff @ 2024-03-20 21:24 ` Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions Tyler Retzlaff ` (2 subsequent siblings) 3 siblings, 0 replies; 15+ messages in thread From: Tyler Retzlaff @ 2024-03-20 21:24 UTC (permalink / raw) To: dev; +Cc: Bruce Richardson, Joyce Kong, Konstantin Ananyev, Tyler Retzlaff MSVC does not support inline assembly instead it provides compiler intrinsics. Provide conditional compile for MSVC for movdiri using the _directstoreu_u32 intrinsic. Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> --- lib/eal/x86/include/rte_io.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/eal/x86/include/rte_io.h b/lib/eal/x86/include/rte_io.h index 0e1fefd..2c72601 100644 --- a/lib/eal/x86/include/rte_io.h +++ b/lib/eal/x86/include/rte_io.h @@ -22,11 +22,15 @@ static __rte_always_inline void __rte_x86_movdiri(uint32_t value, volatile void *addr) { +#ifdef RTE_TOOLCHAIN_MSVC + _directstoreu_u32((void *)(uintptr_t)addr, value); +#else asm volatile( /* MOVDIRI */ ".byte 0x40, 0x0f, 0x38, 0xf9, 0x02" : : "a" (value), "d" (addr)); +#endif } __rte_experimental -- 1.8.3.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions 2024-03-20 21:24 [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 1/2] eal: provide movdiri " Tyler Retzlaff @ 2024-03-20 21:24 ` Tyler Retzlaff 2024-06-14 14:49 ` David Marchand 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie 3 siblings, 1 reply; 15+ messages in thread From: Tyler Retzlaff @ 2024-03-20 21:24 UTC (permalink / raw) To: dev; +Cc: Bruce Richardson, Joyce Kong, Konstantin Ananyev, Tyler Retzlaff provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in intrinsics. Signed-off-by: Tyler Retzlaff <roretzla@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 449565e..e157a45 100644 --- a/lib/eal/include/rte_bitops.h +++ b/lib/eal/include/rte_bitops.h @@ -405,6 +405,28 @@ return (unsigned int)__popcnt64(v); } +static inline unsigned int +rte_ffs32(uint32_t v) +{ + unsigned long rv; + + if (0 == _BitScanForward(&rv, v)) + return 0; + + return (unsigned int)rv + 1; +} + +static inline unsigned int +rte_ffs64(uint64_t v) +{ + unsigned long rv; + + if (0 == _BitScanForward64(&rv, v)) + return 0; + + return (unsigned int)rv + 1; +} + #else /** @@ -491,6 +513,18 @@ 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 /** -- 1.8.3.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions 2024-03-20 21:24 ` [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions Tyler Retzlaff @ 2024-06-14 14:49 ` David Marchand 2024-12-05 20:17 ` Andre Muezerie 0 siblings, 1 reply; 15+ messages in thread From: David Marchand @ 2024-06-14 14:49 UTC (permalink / raw) To: Tyler Retzlaff; +Cc: dev, Bruce Richardson, Joyce Kong, Konstantin Ananyev On Wed, Mar 20, 2024 at 10:25 PM Tyler Retzlaff <roretzla@linux.microsoft.com> wrote: > > provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in > intrinsics. > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> Please add a unit test and an entry in the release notes. > --- > 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 449565e..e157a45 100644 > --- a/lib/eal/include/rte_bitops.h > +++ b/lib/eal/include/rte_bitops.h > @@ -405,6 +405,28 @@ > return (unsigned int)__popcnt64(v); > } > > +static inline unsigned int > +rte_ffs32(uint32_t v) > +{ > + unsigned long rv; > + > + if (0 == _BitScanForward(&rv, v)) _BitScanForward(&rv, v) == 0 please. -- David Marchand ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions 2024-06-14 14:49 ` David Marchand @ 2024-12-05 20:17 ` Andre Muezerie 0 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2024-12-05 20:17 UTC (permalink / raw) To: David Marchand Cc: Tyler Retzlaff, dev, Bruce Richardson, Joyce Kong, Konstantin Ananyev On Fri, Jun 14, 2024 at 04:49:49PM +0200, David Marchand wrote: > On Wed, Mar 20, 2024 at 10:25 PM Tyler Retzlaff > <roretzla@linux.microsoft.com> wrote: > > > > provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in > > intrinsics. > > > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> > > Please add a unit test and an entry in the release notes. > > > --- > > 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 449565e..e157a45 100644 > > --- a/lib/eal/include/rte_bitops.h > > +++ b/lib/eal/include/rte_bitops.h > > @@ -405,6 +405,28 @@ > > return (unsigned int)__popcnt64(v); > > } > > > > +static inline unsigned int > > +rte_ffs32(uint32_t v) > > +{ > > + unsigned long rv; > > + > > + if (0 == _BitScanForward(&rv, v)) > > _BitScanForward(&rv, v) == 0 please. > > > -- > David Marchand > Thanks David. I'll make the change suggested and add some unit tests. -- Andre Muezerie ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri 2024-03-20 21:24 [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 1/2] eal: provide movdiri " Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions Tyler Retzlaff @ 2024-12-05 20:35 ` Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 1/3] eal: provide movdiri for MSVC Andre Muezerie ` (3 more replies) 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie 3 siblings, 4 replies; 15+ messages in thread From: Andre Muezerie @ 2024-12-05 20:35 UTC (permalink / raw) To: dev; +Cc: Andre Muezerie MSVC does not support inline assembly so use movdiri intrinsic and provide abstracted rte_ffs{32,64} inline functions instead of directly using GCC built-ins. v2: * Moved constants to the right side of the comparison * Added tests for rte_ffs32 and rte_ffs64 functions Andre Muezerie (1): app/test: add test for rte_ffs32 and rte_ffs64 functions. Tyler Retzlaff (2): eal: provide movdiri for MSVC eal: add rte ffs32 and rte ffs64 inline functions app/test/test_bitops.c | 38 ++++++++++++++++++++++++++++++++++++ lib/eal/include/rte_bitops.h | 34 ++++++++++++++++++++++++++++++++ lib/eal/x86/include/rte_io.h | 4 ++++ 3 files changed, 76 insertions(+) -- 2.47.0.vfs.0.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 1/3] eal: provide movdiri for MSVC 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie @ 2024-12-05 20:35 ` Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie ` (2 subsequent siblings) 3 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2024-12-05 20:35 UTC (permalink / raw) To: dev; +Cc: Tyler Retzlaff From: Tyler Retzlaff <roretzla@linux.microsoft.com> MSVC does not support inline assembly. Instead it provides compiler intrinsics. Provide conditional compile for MSVC for movdiri using the _directstoreu_u32 intrinsic. Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> --- lib/eal/x86/include/rte_io.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/eal/x86/include/rte_io.h b/lib/eal/x86/include/rte_io.h index f92a2e5295..7087e728ce 100644 --- a/lib/eal/x86/include/rte_io.h +++ b/lib/eal/x86/include/rte_io.h @@ -22,11 +22,15 @@ extern "C" { static __rte_always_inline void __rte_x86_movdiri(uint32_t value, volatile void *addr) { +#ifdef RTE_TOOLCHAIN_MSVC + _directstoreu_u32((void *)(uintptr_t)addr, value); +#else asm volatile( /* MOVDIRI */ ".byte 0x0f, 0x38, 0xf9, 0x02" : : "a" (value), "d" (addr)); +#endif } __rte_experimental -- 2.47.0.vfs.0.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 2/3] eal: add rte ffs32 and rte ffs64 inline functions 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 1/3] eal: provide movdiri for MSVC Andre Muezerie @ 2024-12-05 20:35 ` Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie 2025-01-24 14:53 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri David Marchand 3 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2024-12-05 20:35 UTC (permalink / raw) To: dev; +Cc: Tyler Retzlaff From: Tyler Retzlaff <roretzla@linux.microsoft.com> Provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in intrinsics. Signed-off-by: Tyler Retzlaff <roretzla@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 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions. 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 1/3] eal: provide movdiri for MSVC Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie @ 2024-12-05 20:35 ` Andre Muezerie 2025-01-24 14:53 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri David Marchand 3 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2024-12-05 20:35 UTC (permalink / raw) To: dev; +Cc: Andre Muezerie Add tests for new rte_ffs32 and rte_ffs64 functions. Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com> --- app/test/test_bitops.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/test/test_bitops.c b/app/test/test_bitops.c index 78a7df6bb1..dd374d7883 100644 --- a/app/test/test_bitops.c +++ b/app/test/test_bitops.c @@ -406,6 +406,42 @@ test_bit_relaxed_test_set_clear(void) return TEST_SUCCESS; } +static int +test_bit_scan_forward(void) +{ + unsigned int bit_nr; + + TEST_ASSERT((bit_nr = rte_ffs32(0)) == 0, + "rte_ffs32 returned unexpected %d", bit_nr); + + for (int i = 0; i < 32; ++i) { + uint32_t n = RTE_BIT32(i); + + TEST_ASSERT((bit_nr = rte_ffs32(n)) == (unsigned int)(i+1), + "rte_ffs32 returned unexpected %d", bit_nr); + } + + return TEST_SUCCESS; +} + +static int +test_bit_scan_forward64(void) +{ + unsigned int bit_nr; + + TEST_ASSERT((bit_nr = rte_ffs64(0)) == 0, + "rte_ffs64 returned unexpected %d", bit_nr); + + for (int i = 0; i < 64; ++i) { + uint64_t n = RTE_BIT64(i); + + TEST_ASSERT((bit_nr = rte_ffs64(n)) == (unsigned int)(i+1), + "rte_ffs64 returned unexpected %d", bit_nr); + } + + return TEST_SUCCESS; +} + static struct unit_test_suite test_suite = { .suite_name = "Bitops test suite", .unit_test_cases = { @@ -428,6 +464,8 @@ static struct unit_test_suite test_suite = { TEST_CASE(test_bit_relaxed_set), TEST_CASE(test_bit_relaxed_clear), TEST_CASE(test_bit_relaxed_test_set_clear), + TEST_CASE(test_bit_scan_forward), + TEST_CASE(test_bit_scan_forward64), TEST_CASES_END() } }; -- 2.47.0.vfs.0.3 ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie ` (2 preceding siblings ...) 2024-12-05 20:35 ` [PATCH v2 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie @ 2025-01-24 14:53 ` David Marchand 2025-01-24 16:16 ` Andre Muezerie 3 siblings, 1 reply; 15+ messages in thread From: David Marchand @ 2025-01-24 14:53 UTC (permalink / raw) To: Andre Muezerie; +Cc: dev, Jack Bond-Preston On Thu, Dec 5, 2024 at 9:36 PM Andre Muezerie <andremue@linux.microsoft.com> wrote: > > MSVC does not support inline assembly so use movdiri intrinsic and > provide abstracted rte_ffs{32,64} inline functions instead of directly > using GCC built-ins. > > v2: > * Moved constants to the right side of the comparison > * Added tests for rte_ffs32 and rte_ffs64 functions > > Andre Muezerie (1): > app/test: add test for rte_ffs32 and rte_ffs64 functions. > > Tyler Retzlaff (2): > eal: provide movdiri for MSVC > eal: add rte ffs32 and rte ffs64 inline functions > > app/test/test_bitops.c | 38 ++++++++++++++++++++++++++++++++++++ > lib/eal/include/rte_bitops.h | 34 ++++++++++++++++++++++++++++++++ > lib/eal/x86/include/rte_io.h | 4 ++++ > 3 files changed, 76 insertions(+) > I see nothing wrong with adding those wrappers to ease MSVC support. Just, those two ffs helpers should be marked experimental. And the unit tests for counting/searching bits had been separated in a dedicated app/test/test_bitcount.c. -- David Marchand ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri 2025-01-24 14:53 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri David Marchand @ 2025-01-24 16:16 ` Andre Muezerie 0 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2025-01-24 16:16 UTC (permalink / raw) To: David Marchand; +Cc: dev, Jack Bond-Preston On Fri, Jan 24, 2025 at 03:53:58PM +0100, David Marchand wrote: > On Thu, Dec 5, 2024 at 9:36 PM Andre Muezerie > <andremue@linux.microsoft.com> wrote: > > > > MSVC does not support inline assembly so use movdiri intrinsic and > > provide abstracted rte_ffs{32,64} inline functions instead of directly > > using GCC built-ins. > > > > v2: > > * Moved constants to the right side of the comparison > > * Added tests for rte_ffs32 and rte_ffs64 functions > > > > Andre Muezerie (1): > > app/test: add test for rte_ffs32 and rte_ffs64 functions. > > > > Tyler Retzlaff (2): > > eal: provide movdiri for MSVC > > eal: add rte ffs32 and rte ffs64 inline functions > > > > app/test/test_bitops.c | 38 ++++++++++++++++++++++++++++++++++++ > > lib/eal/include/rte_bitops.h | 34 ++++++++++++++++++++++++++++++++ > > lib/eal/x86/include/rte_io.h | 4 ++++ > > 3 files changed, 76 insertions(+) > > > > I see nothing wrong with adding those wrappers to ease MSVC support. > Just, those two ffs helpers should be marked experimental. > > And the unit tests for counting/searching bits had been separated in a > dedicated app/test/test_bitcount.c. > > > -- > David Marchand Thanks for the review David. I sent a v3 series addressing these issues. ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri 2024-03-20 21:24 [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC Tyler Retzlaff ` (2 preceding siblings ...) 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie @ 2025-01-24 16:14 ` Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 1/3] eal: provide movdiri for MSVC Andre Muezerie ` (2 more replies) 3 siblings, 3 replies; 15+ messages in thread From: Andre Muezerie @ 2025-01-24 16:14 UTC (permalink / raw) To: dev; +Cc: Andre Muezerie MSVC does not support inline assembly so use movdiri intrinsic and provide abstracted rte_ffs{32,64} inline functions instead of directly using GCC built-ins. v3: * Added __rte_experimental to the new functions. * Added comments to the new functions. * Moved tests to test_bitcount.c v2: * Moved constants to the right side of the comparison * Added tests for rte_ffs32 and rte_ffs64 functions Andre Muezerie (1): app/test: add test for rte_ffs32 and rte_ffs64 functions. Tyler Retzlaff (2): eal: provide movdiri for MSVC eal: add rte ffs32 and rte ffs64 inline functions app/test/test_bitcount.c | 38 ++++++++++++++++++ lib/eal/include/rte_bitops.h | 74 ++++++++++++++++++++++++++++++++++++ lib/eal/x86/include/rte_io.h | 4 ++ 3 files changed, 116 insertions(+) -- 2.47.2.vfs.0.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 1/3] eal: provide movdiri for MSVC 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie @ 2025-01-24 16:14 ` Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie 2 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2025-01-24 16:14 UTC (permalink / raw) To: dev; +Cc: Tyler Retzlaff From: Tyler Retzlaff <roretzla@linux.microsoft.com> MSVC does not support inline assembly. Instead it provides compiler intrinsics. Provide conditional compile for MSVC for movdiri using the _directstoreu_u32 intrinsic. Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> --- lib/eal/x86/include/rte_io.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/eal/x86/include/rte_io.h b/lib/eal/x86/include/rte_io.h index f92a2e5295..7087e728ce 100644 --- a/lib/eal/x86/include/rte_io.h +++ b/lib/eal/x86/include/rte_io.h @@ -22,11 +22,15 @@ extern "C" { static __rte_always_inline void __rte_x86_movdiri(uint32_t value, volatile void *addr) { +#ifdef RTE_TOOLCHAIN_MSVC + _directstoreu_u32((void *)(uintptr_t)addr, value); +#else asm volatile( /* MOVDIRI */ ".byte 0x0f, 0x38, 0xf9, 0x02" : : "a" (value), "d" (addr)); +#endif } __rte_experimental -- 2.47.2.vfs.0.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 2/3] eal: add rte ffs32 and rte ffs64 inline functions 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 1/3] eal: provide movdiri for MSVC Andre Muezerie @ 2025-01-24 16:14 ` Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie 2 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2025-01-24 16:14 UTC (permalink / raw) To: dev; +Cc: Tyler Retzlaff From: Tyler Retzlaff <roretzla@linux.microsoft.com> Provide toolchain abstraction for __builtin_ffs{,l,ll} gcc built-in intrinsics. Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com> --- lib/eal/include/rte_bitops.h | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/lib/eal/include/rte_bitops.h b/lib/eal/include/rte_bitops.h index deb1fd43f2..0862fd4008 100644 --- a/lib/eal/include/rte_bitops.h +++ b/lib/eal/include/rte_bitops.h @@ -958,6 +958,48 @@ rte_popcount64(uint64_t v) return (unsigned int)__popcnt64(v); } +/** + * Search v from least significant bit (LSB) to the most + * significant bit (MSB) for a set bit (1). + * + * @param v + * The value. + * @return + * Bit index + 1 if a set bit is found, zero otherwise. + */ +__rte_experimental +static inline unsigned int +rte_ffs32(uint32_t v) +{ + unsigned long rv; + + if (_BitScanForward(&rv, v) == 0) + return 0; + + return (unsigned int)rv + 1; +} + +/** + * Search v from least significant bit (LSB) to the most + * significant bit (MSB) for a set bit (1). + * + * @param v + * The value. + * @return + * Bit index + 1 if a set bit is found, zero otherwise. + */ +__rte_experimental +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 +1086,38 @@ rte_popcount64(uint64_t v) return (unsigned int)__builtin_popcountll(v); } +/** + * Search v from least significant bit (LSB) to the most + * significant bit (MSB) for a set bit (1). + * + * @param v + * The value. + * @return + * Bit index + 1 if a set bit is found, zero otherwise. + */ +__rte_experimental +static inline unsigned int +rte_ffs32(uint32_t v) +{ + return (unsigned int)__builtin_ffs(v); +} + +/** + * Search v from least significant bit (LSB) to the most + * significant bit (MSB) for a set bit (1). + * + * @param v + * The value. + * @return + * Bit index + 1 if a set bit is found, zero otherwise. + */ +__rte_experimental +static inline unsigned int +rte_ffs64(uint64_t v) +{ + return (unsigned int)__builtin_ffsll(v); +} + #endif /** -- 2.47.2.vfs.0.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions. 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 1/3] eal: provide movdiri for MSVC Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie @ 2025-01-24 16:14 ` Andre Muezerie 2 siblings, 0 replies; 15+ messages in thread From: Andre Muezerie @ 2025-01-24 16:14 UTC (permalink / raw) To: dev; +Cc: Andre Muezerie Add tests for new rte_ffs32 and rte_ffs64 functions. Signed-off-by: Andre Muezerie <andremue@linux.microsoft.com> --- app/test/test_bitcount.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/app/test/test_bitcount.c b/app/test/test_bitcount.c index 83c68feb7b..8eb4a460f2 100644 --- a/app/test/test_bitcount.c +++ b/app/test/test_bitcount.c @@ -12,6 +12,42 @@ RTE_LOG_REGISTER(bitcount_logtype_test, test.bitcount, INFO); +static int +test_bit_scan_forward(void) +{ + unsigned int bit_nr; + + TEST_ASSERT((bit_nr = rte_ffs32(0)) == 0, + "rte_ffs32 returned unexpected %d", bit_nr); + + for (int i = 0; i < 32; ++i) { + uint32_t n = RTE_BIT32(i); + + TEST_ASSERT((bit_nr = rte_ffs32(n)) == (unsigned int)(i+1), + "rte_ffs32 returned unexpected %d", bit_nr); + } + + return TEST_SUCCESS; +} + +static int +test_bit_scan_forward64(void) +{ + unsigned int bit_nr; + + TEST_ASSERT((bit_nr = rte_ffs64(0)) == 0, + "rte_ffs64 returned unexpected %d", bit_nr); + + for (int i = 0; i < 64; ++i) { + uint64_t n = RTE_BIT64(i); + + TEST_ASSERT((bit_nr = rte_ffs64(n)) == (unsigned int)(i+1), + "rte_ffs64 returned unexpected %d", bit_nr); + } + + return TEST_SUCCESS; +} + static int test_clz32(void) { @@ -117,6 +153,8 @@ static struct unit_test_suite bitcount_test_suite = { .setup = NULL, .teardown = NULL, .unit_test_cases = { + TEST_CASE(test_bit_scan_forward), + TEST_CASE(test_bit_scan_forward64), TEST_CASE(test_clz32), TEST_CASE(test_clz64), TEST_CASE(test_ctz32), -- 2.47.2.vfs.0.1 ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2025-01-24 16:16 UTC | newest] Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2024-03-20 21:24 [PATCH 0/2] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri for MSVC Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 1/2] eal: provide movdiri " Tyler Retzlaff 2024-03-20 21:24 ` [PATCH 2/2] eal: add rte ffs32 and rte ffs64 inline functions Tyler Retzlaff 2024-06-14 14:49 ` David Marchand 2024-12-05 20:17 ` Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 1/3] eal: provide movdiri for MSVC Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie 2024-12-05 20:35 ` [PATCH v2 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie 2025-01-24 14:53 ` [PATCH v2 0/3] provide rte_ffs32, rte_ffs64 and __rte_x86_movdiri David Marchand 2025-01-24 16:16 ` Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 " Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 1/3] eal: provide movdiri for MSVC Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 2/3] eal: add rte ffs32 and rte ffs64 inline functions Andre Muezerie 2025-01-24 16:14 ` [PATCH v3 3/3] app/test: add test for rte_ffs32 and rte_ffs64 functions Andre Muezerie
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).