22#include <rte_compat.h>
24#include <rte_stdatomic.h>
36#define RTE_BIT64(nr) (UINT64_C(1) << (nr))
44#define RTE_BIT32(nr) (UINT32_C(1) << (nr))
54#define RTE_SHIFT_VAL32(val, nr) ((uint32_t)(val) << (nr))
64#define RTE_SHIFT_VAL64(val, nr) ((uint64_t)(val) << (nr))
75#define RTE_GENMASK32(high, low) \
76 (((~UINT32_C(0)) << (low)) & (~UINT32_C(0) >> (31u - (high))))
87#define RTE_GENMASK64(high, low) \
88 (((~UINT64_C(0)) << (low)) & (~UINT64_C(0) >> (63u - (high))))
98#define RTE_FIELD_GET32(mask, reg) \
99 ((typeof(mask))(((reg) & (mask)) >> rte_ctz32(mask)))
109#define RTE_FIELD_GET64(mask, reg) \
110 ((typeof(mask))(((reg) & (mask)) >> rte_ctz64(mask)))
127#define rte_bit_test(addr, nr) \
129 uint32_t *: __rte_bit_test32, \
130 const uint32_t *: __rte_bit_test32, \
131 volatile uint32_t *: __rte_bit_v_test32, \
132 const volatile uint32_t *: __rte_bit_v_test32, \
133 uint64_t *: __rte_bit_test64, \
134 const uint64_t *: __rte_bit_test64, \
135 volatile uint64_t *: __rte_bit_v_test64, \
136 const volatile uint64_t *: __rte_bit_v_test64) \
154#define rte_bit_set(addr, nr) \
156 uint32_t *: __rte_bit_set32, \
157 volatile uint32_t *: __rte_bit_v_set32, \
158 uint64_t *: __rte_bit_set64, \
159 volatile uint64_t *: __rte_bit_v_set64) \
177#define rte_bit_clear(addr, nr) \
179 uint32_t *: __rte_bit_clear32, \
180 volatile uint32_t *: __rte_bit_v_clear32, \
181 uint64_t *: __rte_bit_clear64, \
182 volatile uint64_t *: __rte_bit_v_clear64) \
201#define rte_bit_assign(addr, nr, value) \
203 uint32_t *: __rte_bit_assign32, \
204 volatile uint32_t *: __rte_bit_v_assign32, \
205 uint64_t *: __rte_bit_assign64, \
206 volatile uint64_t *: __rte_bit_v_assign64) \
224#define rte_bit_flip(addr, nr) \
226 uint32_t *: __rte_bit_flip32, \
227 volatile uint32_t *: __rte_bit_v_flip32, \
228 uint64_t *: __rte_bit_flip64, \
229 volatile uint64_t *: __rte_bit_v_flip64) \
248#define rte_bit_atomic_test(addr, nr, memory_order) \
250 uint32_t *: __rte_bit_atomic_test32, \
251 const uint32_t *: __rte_bit_atomic_test32, \
252 volatile uint32_t *: __rte_bit_atomic_v_test32, \
253 const volatile uint32_t *: __rte_bit_atomic_v_test32, \
254 uint64_t *: __rte_bit_atomic_test64, \
255 const uint64_t *: __rte_bit_atomic_test64, \
256 volatile uint64_t *: __rte_bit_atomic_v_test64, \
257 const volatile uint64_t *: __rte_bit_atomic_v_test64) \
258 (addr, nr, memory_order)
274#define rte_bit_atomic_set(addr, nr, memory_order) \
276 uint32_t *: __rte_bit_atomic_set32, \
277 volatile uint32_t *: __rte_bit_atomic_v_set32, \
278 uint64_t *: __rte_bit_atomic_set64, \
279 volatile uint64_t *: __rte_bit_atomic_v_set64) \
280 (addr, nr, memory_order)
296#define rte_bit_atomic_clear(addr, nr, memory_order) \
298 uint32_t *: __rte_bit_atomic_clear32, \
299 volatile uint32_t *: __rte_bit_atomic_v_clear32, \
300 uint64_t *: __rte_bit_atomic_clear64, \
301 volatile uint64_t *: __rte_bit_atomic_v_clear64) \
302 (addr, nr, memory_order)
320#define rte_bit_atomic_assign(addr, nr, value, memory_order) \
322 uint32_t *: __rte_bit_atomic_assign32, \
323 volatile uint32_t *: __rte_bit_atomic_v_assign32, \
324 uint64_t *: __rte_bit_atomic_assign64, \
325 volatile uint64_t *: __rte_bit_atomic_v_assign64) \
326 (addr, nr, value, memory_order)
343#define rte_bit_atomic_flip(addr, nr, memory_order) \
345 uint32_t *: __rte_bit_atomic_flip32, \
346 volatile uint32_t *: __rte_bit_atomic_v_flip32, \
347 uint64_t *: __rte_bit_atomic_flip64, \
348 volatile uint64_t *: __rte_bit_atomic_v_flip64) \
349 (addr, nr, memory_order)
367#define rte_bit_atomic_test_and_set(addr, nr, memory_order) \
369 uint32_t *: __rte_bit_atomic_test_and_set32, \
370 volatile uint32_t *: __rte_bit_atomic_v_test_and_set32, \
371 uint64_t *: __rte_bit_atomic_test_and_set64, \
372 volatile uint64_t *: __rte_bit_atomic_v_test_and_set64) \
373 (addr, nr, memory_order)
391#define rte_bit_atomic_test_and_clear(addr, nr, memory_order) \
393 uint32_t *: __rte_bit_atomic_test_and_clear32, \
394 volatile uint32_t *: __rte_bit_atomic_v_test_and_clear32, \
395 uint64_t *: __rte_bit_atomic_test_and_clear64, \
396 volatile uint64_t *: __rte_bit_atomic_v_test_and_clear64) \
397 (addr, nr, memory_order)
418#define rte_bit_atomic_test_and_assign(addr, nr, value, memory_order) \
420 uint32_t *: __rte_bit_atomic_test_and_assign32, \
421 volatile uint32_t *: __rte_bit_atomic_v_test_and_assign32, \
422 uint64_t *: __rte_bit_atomic_test_and_assign64, \
423 volatile uint64_t *: __rte_bit_atomic_v_test_and_assign64) \
424 (addr, nr, value, memory_order)
426#define __RTE_GEN_BIT_TEST(variant, qualifier, size) \
428__rte_bit_ ## variant ## test ## size(const qualifier uint ## size ## _t *addr, unsigned int nr) \
430 RTE_ASSERT(nr < size); \
431 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
432 return *addr & mask; \
435#define __RTE_GEN_BIT_SET(variant, qualifier, size) \
437__rte_bit_ ## variant ## set ## size(qualifier uint ## size ## _t *addr, unsigned int nr) \
439 RTE_ASSERT(nr < size); \
440 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
444#define __RTE_GEN_BIT_CLEAR(variant, qualifier, size) \
446__rte_bit_ ## variant ## clear ## size(qualifier uint ## size ## _t *addr, unsigned int nr) \
448 RTE_ASSERT(nr < size); \
449 uint ## size ## _t mask = ~((uint ## size ## _t)1 << nr); \
453#define __RTE_GEN_BIT_ASSIGN(variant, qualifier, size) \
455__rte_bit_ ## variant ## assign ## size(qualifier uint ## size ## _t *addr, unsigned int nr, \
459 __rte_bit_ ## variant ## set ## size(addr, nr); \
461 __rte_bit_ ## variant ## clear ## size(addr, nr); \
464#define __RTE_GEN_BIT_FLIP(variant, qualifier, size) \
466__rte_bit_ ## variant ## flip ## size(qualifier uint ## size ## _t *addr, unsigned int nr) \
469 value = __rte_bit_ ## variant ## test ## size(addr, nr); \
470 __rte_bit_ ## variant ## assign ## size(addr, nr, !value); \
473#define __RTE_GEN_BIT_OPS(v, qualifier, size) \
474 __RTE_GEN_BIT_TEST(v, qualifier, size) \
475 __RTE_GEN_BIT_SET(v, qualifier, size) \
476 __RTE_GEN_BIT_CLEAR(v, qualifier, size) \
477 __RTE_GEN_BIT_ASSIGN(v, qualifier, size) \
478 __RTE_GEN_BIT_FLIP(v, qualifier, size)
480#define __RTE_GEN_BIT_OPS_SIZE(size) \
481 __RTE_GEN_BIT_OPS(,, size) \
482 __RTE_GEN_BIT_OPS(v_, volatile, size)
484__RTE_GEN_BIT_OPS_SIZE(32)
485__RTE_GEN_BIT_OPS_SIZE(64)
487#define __RTE_GEN_BIT_ATOMIC_TEST(variant, qualifier, size) \
489__rte_bit_atomic_ ## variant ## test ## size(const qualifier uint ## size ## _t *addr, \
490 unsigned int nr, int memory_order) \
492 RTE_ASSERT(nr < size); \
493 const qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
494 (const qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
495 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
496 return rte_atomic_load_explicit(a_addr, memory_order) & mask; \
499#define __RTE_GEN_BIT_ATOMIC_SET(variant, qualifier, size) \
501__rte_bit_atomic_ ## variant ## set ## size(qualifier uint ## size ## _t *addr, \
502 unsigned int nr, int memory_order) \
504 RTE_ASSERT(nr < size); \
505 qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
506 (qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
507 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
508 rte_atomic_fetch_or_explicit(a_addr, mask, memory_order); \
511#define __RTE_GEN_BIT_ATOMIC_CLEAR(variant, qualifier, size) \
513__rte_bit_atomic_ ## variant ## clear ## size(qualifier uint ## size ## _t *addr, \
514 unsigned int nr, int memory_order) \
516 RTE_ASSERT(nr < size); \
517 qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
518 (qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
519 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
520 rte_atomic_fetch_and_explicit(a_addr, ~mask, memory_order); \
523#define __RTE_GEN_BIT_ATOMIC_FLIP(variant, qualifier, size) \
525__rte_bit_atomic_ ## variant ## flip ## size(qualifier uint ## size ## _t *addr, \
526 unsigned int nr, int memory_order) \
528 RTE_ASSERT(nr < size); \
529 qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
530 (qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
531 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
532 rte_atomic_fetch_xor_explicit(a_addr, mask, memory_order); \
535#define __RTE_GEN_BIT_ATOMIC_ASSIGN(variant, qualifier, size) \
537__rte_bit_atomic_## variant ## assign ## size(qualifier uint ## size ## _t *addr, \
538 unsigned int nr, bool value, int memory_order) \
541 __rte_bit_atomic_ ## variant ## set ## size(addr, nr, memory_order); \
543 __rte_bit_atomic_ ## variant ## clear ## size(addr, nr, memory_order); \
546#define __RTE_GEN_BIT_ATOMIC_TEST_AND_SET(variant, qualifier, size) \
548__rte_bit_atomic_ ## variant ## test_and_set ## size(qualifier uint ## size ## _t *addr, \
549 unsigned int nr, int memory_order) \
551 RTE_ASSERT(nr < size); \
552 qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
553 (qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
554 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
555 uint ## size ## _t prev; \
556 prev = rte_atomic_fetch_or_explicit(a_addr, mask, memory_order); \
557 return prev & mask; \
560#define __RTE_GEN_BIT_ATOMIC_TEST_AND_CLEAR(variant, qualifier, size) \
562__rte_bit_atomic_ ## variant ## test_and_clear ## size(qualifier uint ## size ## _t *addr, \
563 unsigned int nr, int memory_order) \
565 RTE_ASSERT(nr < size); \
566 qualifier RTE_ATOMIC(uint ## size ## _t) *a_addr = \
567 (qualifier RTE_ATOMIC(uint ## size ## _t) *)addr; \
568 uint ## size ## _t mask = (uint ## size ## _t)1 << nr; \
569 uint ## size ## _t prev; \
570 prev = rte_atomic_fetch_and_explicit(a_addr, ~mask, memory_order); \
571 return prev & mask; \
574#define __RTE_GEN_BIT_ATOMIC_TEST_AND_ASSIGN(variant, qualifier, size) \
576__rte_bit_atomic_ ## variant ## test_and_assign ## size( \
577 qualifier uint ## size ## _t *addr, unsigned int nr, bool value, \
581 return __rte_bit_atomic_ ## variant ## test_and_set ## size(addr, nr, \
584 return __rte_bit_atomic_ ## variant ## test_and_clear ## size(addr, nr, \
588#define __RTE_GEN_BIT_ATOMIC_OPS(variant, qualifier, size) \
589 __RTE_GEN_BIT_ATOMIC_TEST(variant, qualifier, size) \
590 __RTE_GEN_BIT_ATOMIC_SET(variant, qualifier, size) \
591 __RTE_GEN_BIT_ATOMIC_CLEAR(variant, qualifier, size) \
592 __RTE_GEN_BIT_ATOMIC_ASSIGN(variant, qualifier, size) \
593 __RTE_GEN_BIT_ATOMIC_TEST_AND_SET(variant, qualifier, size) \
594 __RTE_GEN_BIT_ATOMIC_TEST_AND_CLEAR(variant, qualifier, size) \
595 __RTE_GEN_BIT_ATOMIC_TEST_AND_ASSIGN(variant, qualifier, size) \
596 __RTE_GEN_BIT_ATOMIC_FLIP(variant, qualifier, size)
598#define __RTE_GEN_BIT_ATOMIC_OPS_SIZE(size) \
599 __RTE_GEN_BIT_ATOMIC_OPS(,, size) \
600 __RTE_GEN_BIT_ATOMIC_OPS(v_, volatile, size)
602__RTE_GEN_BIT_ATOMIC_OPS_SIZE(32)
603__RTE_GEN_BIT_ATOMIC_OPS_SIZE(64)
617static inline uint32_t
622 uint32_t mask = UINT32_C(1) << nr;
623 return (*addr) & mask;
640 *addr = (*addr) | mask;
657 *addr = (*addr) & (~mask);
671static inline uint32_t
677 uint32_t val = *addr;
693static inline uint32_t
699 uint32_t val = *addr;
700 *addr = val & (~mask);
716static inline uint64_t
722 return (*addr) & mask;
739 (*addr) = (*addr) | mask;
756 *addr = (*addr) & (~mask);
770static inline uint64_t
776 uint64_t val = *addr;
792static inline uint64_t
798 uint64_t val = *addr;
799 *addr = val & (~mask);
803#ifdef RTE_TOOLCHAIN_MSVC
813static inline unsigned int
818 (void)_BitScanReverse(&rv, v);
820 return (
unsigned int)(
sizeof(v) * CHAR_BIT - 1 - rv);
831static inline unsigned int
836 (void)_BitScanReverse64(&rv, v);
838 return (
unsigned int)(
sizeof(v) * CHAR_BIT - 1 - rv);
849static inline unsigned int
854 (void)_BitScanForward(&rv, v);
856 return (
unsigned int)rv;
867static inline unsigned int
872 (void)_BitScanForward64(&rv, v);
874 return (
unsigned int)rv;
885static inline unsigned int
888 return (
unsigned int)__popcnt(v);
899static inline unsigned int
902 return (
unsigned int)__popcnt64(v);
918static inline unsigned int
923 if (_BitScanForward(&rv, v) == 0)
926 return (
unsigned int)rv + 1;
942static inline unsigned int
947 if (_BitScanForward64(&rv, v) == 0)
950 return (
unsigned int)rv + 1;
963static inline unsigned int
966 return (
unsigned int)__builtin_clz(v);
977static inline unsigned int
980 return (
unsigned int)__builtin_clzll(v);
991static inline unsigned int
994 return (
unsigned int)__builtin_ctz(v);
1005static inline unsigned int
1008 return (
unsigned int)__builtin_ctzll(v);
1019static inline unsigned int
1022 return (
unsigned int)__builtin_popcount(v);
1033static inline unsigned int
1036 return (
unsigned int)__builtin_popcountll(v);
1052static inline unsigned int
1055 return (
unsigned int)__builtin_ffs(v);
1071static inline unsigned int
1074 return (
unsigned int)__builtin_ffsll(v);
1089static inline uint32_t
1111static inline uint64_t
1135static inline uint32_t
1176static inline uint32_t
1217static inline uint32_t
1220 return (x == 0) ? 0 : 32 -
rte_clz32(x);
1235static inline uint32_t
1238 return (x == 0) ? 0 : 64 -
rte_clz64(x);
1246#define RTE_IS_POWER_OF_2(n) ((n) != 0 && (((n) - 1) & (n)) == 0)
1257 return n && !(n & (n - 1));
1269static inline uint32_t
1287static inline uint32_t
1292 return x - (x >> 1);
1304static inline uint64_t
1322static inline uint64_t
1327 return v - (v >> 1);
1341static inline uint32_t
1361static inline uint32_t
1383#undef rte_bit_assign
1386#undef rte_bit_atomic_test
1387#undef rte_bit_atomic_set
1388#undef rte_bit_atomic_clear
1389#undef rte_bit_atomic_assign
1390#undef rte_bit_atomic_flip
1391#undef rte_bit_atomic_test_and_set
1392#undef rte_bit_atomic_test_and_clear
1393#undef rte_bit_atomic_test_and_assign
1395#define __RTE_BIT_OVERLOAD_V_2(family, v, fun, qualifier, size, arg1_type, arg1_name) \
1397rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name) \
1399 __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name); \
1402#define __RTE_BIT_OVERLOAD_SZ_2(family, fun, qualifier, size, arg1_type, arg1_name) \
1403 __RTE_BIT_OVERLOAD_V_2(family,, fun, qualifier, size, arg1_type, arg1_name) \
1404 __RTE_BIT_OVERLOAD_V_2(family, v_, fun, qualifier volatile, size, arg1_type, arg1_name)
1406#define __RTE_BIT_OVERLOAD_2(family, fun, qualifier, arg1_type, arg1_name) \
1407 __RTE_BIT_OVERLOAD_SZ_2(family, fun, qualifier, 32, arg1_type, arg1_name) \
1408 __RTE_BIT_OVERLOAD_SZ_2(family, fun, qualifier, 64, arg1_type, arg1_name)
1410#define __RTE_BIT_OVERLOAD_V_2R(family, v, fun, qualifier, size, ret_type, arg1_type, arg1_name) \
1411static inline ret_type \
1412rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name) \
1414 return __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name); \
1417#define __RTE_BIT_OVERLOAD_SZ_2R(family, fun, qualifier, size, ret_type, arg1_type, arg1_name) \
1418 __RTE_BIT_OVERLOAD_V_2R(family,, fun, qualifier, size, ret_type, arg1_type, arg1_name) \
1419 __RTE_BIT_OVERLOAD_V_2R(family, v_, fun, qualifier volatile, size, ret_type, arg1_type, \
1422#define __RTE_BIT_OVERLOAD_2R(family, fun, qualifier, ret_type, arg1_type, arg1_name) \
1423 __RTE_BIT_OVERLOAD_SZ_2R(family, fun, qualifier, 32, ret_type, arg1_type, arg1_name) \
1424 __RTE_BIT_OVERLOAD_SZ_2R(family, fun, qualifier, 64, ret_type, arg1_type, arg1_name)
1426#define __RTE_BIT_OVERLOAD_V_3(family, v, fun, qualifier, size, arg1_type, arg1_name, \
1427 arg2_type, arg2_name) \
1429rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name, \
1430 arg2_type arg2_name) \
1432 __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name, arg2_name); \
1435#define __RTE_BIT_OVERLOAD_SZ_3(family, fun, qualifier, size, arg1_type, arg1_name, \
1436 arg2_type, arg2_name) \
1437 __RTE_BIT_OVERLOAD_V_3(family,, fun, qualifier, size, arg1_type, arg1_name, \
1438 arg2_type, arg2_name) \
1439 __RTE_BIT_OVERLOAD_V_3(family, v_, fun, qualifier volatile, size, arg1_type, arg1_name, \
1440 arg2_type, arg2_name)
1442#define __RTE_BIT_OVERLOAD_3(family, fun, qualifier, arg1_type, arg1_name, arg2_type, arg2_name) \
1443 __RTE_BIT_OVERLOAD_SZ_3(family, fun, qualifier, 32, arg1_type, arg1_name, \
1444 arg2_type, arg2_name) \
1445 __RTE_BIT_OVERLOAD_SZ_3(family, fun, qualifier, 64, arg1_type, arg1_name, \
1446 arg2_type, arg2_name)
1448#define __RTE_BIT_OVERLOAD_V_3R(family, v, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1449 arg2_type, arg2_name) \
1450static inline ret_type \
1451rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name, \
1452 arg2_type arg2_name) \
1454 return __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name, arg2_name); \
1457#define __RTE_BIT_OVERLOAD_SZ_3R(family, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1458 arg2_type, arg2_name) \
1459 __RTE_BIT_OVERLOAD_V_3R(family,, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1460 arg2_type, arg2_name) \
1461 __RTE_BIT_OVERLOAD_V_3R(family, v_, fun, qualifier volatile, size, ret_type, \
1462 arg1_type, arg1_name, arg2_type, arg2_name)
1464#define __RTE_BIT_OVERLOAD_3R(family, fun, qualifier, ret_type, arg1_type, arg1_name, \
1465 arg2_type, arg2_name) \
1466 __RTE_BIT_OVERLOAD_SZ_3R(family, fun, qualifier, 32, ret_type, arg1_type, arg1_name, \
1467 arg2_type, arg2_name) \
1468 __RTE_BIT_OVERLOAD_SZ_3R(family, fun, qualifier, 64, ret_type, arg1_type, arg1_name, \
1469 arg2_type, arg2_name)
1471#define __RTE_BIT_OVERLOAD_V_4(family, v, fun, qualifier, size, arg1_type, arg1_name, \
1472 arg2_type, arg2_name, arg3_type, arg3_name) \
1474rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name, \
1475 arg2_type arg2_name, arg3_type arg3_name) \
1477 __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name, arg2_name, arg3_name); \
1480#define __RTE_BIT_OVERLOAD_SZ_4(family, fun, qualifier, size, arg1_type, arg1_name, \
1481 arg2_type, arg2_name, arg3_type, arg3_name) \
1482 __RTE_BIT_OVERLOAD_V_4(family,, fun, qualifier, size, arg1_type, arg1_name, \
1483 arg2_type, arg2_name, arg3_type, arg3_name) \
1484 __RTE_BIT_OVERLOAD_V_4(family, v_, fun, qualifier volatile, size, arg1_type, arg1_name, \
1485 arg2_type, arg2_name, arg3_type, arg3_name)
1487#define __RTE_BIT_OVERLOAD_4(family, fun, qualifier, arg1_type, arg1_name, arg2_type, arg2_name, \
1488 arg3_type, arg3_name) \
1489 __RTE_BIT_OVERLOAD_SZ_4(family, fun, qualifier, 32, arg1_type, arg1_name, \
1490 arg2_type, arg2_name, arg3_type, arg3_name) \
1491 __RTE_BIT_OVERLOAD_SZ_4(family, fun, qualifier, 64, arg1_type, arg1_name, \
1492 arg2_type, arg2_name, arg3_type, arg3_name)
1494#define __RTE_BIT_OVERLOAD_V_4R(family, v, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1495 arg2_type, arg2_name, arg3_type, arg3_name) \
1496static inline ret_type \
1497rte_bit_ ## family ## fun(qualifier uint ## size ## _t *addr, arg1_type arg1_name, \
1498 arg2_type arg2_name, arg3_type arg3_name) \
1500 return __rte_bit_ ## family ## v ## fun ## size(addr, arg1_name, arg2_name, \
1504#define __RTE_BIT_OVERLOAD_SZ_4R(family, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1505 arg2_type, arg2_name, arg3_type, arg3_name) \
1506 __RTE_BIT_OVERLOAD_V_4R(family,, fun, qualifier, size, ret_type, arg1_type, arg1_name, \
1507 arg2_type, arg2_name, arg3_type, arg3_name) \
1508 __RTE_BIT_OVERLOAD_V_4R(family, v_, fun, qualifier volatile, size, ret_type, \
1509 arg1_type, arg1_name, arg2_type, arg2_name, arg3_type, arg3_name)
1511#define __RTE_BIT_OVERLOAD_4R(family, fun, qualifier, ret_type, arg1_type, arg1_name, \
1512 arg2_type, arg2_name, arg3_type, arg3_name) \
1513 __RTE_BIT_OVERLOAD_SZ_4R(family, fun, qualifier, 32, ret_type, arg1_type, arg1_name, \
1514 arg2_type, arg2_name, arg3_type, arg3_name) \
1515 __RTE_BIT_OVERLOAD_SZ_4R(family, fun, qualifier, 64, ret_type, arg1_type, arg1_name, \
1516 arg2_type, arg2_name, arg3_type, arg3_name)
1518__RTE_BIT_OVERLOAD_2R(, test,
const,
bool,
unsigned int, nr)
1519__RTE_BIT_OVERLOAD_2(, set,,
unsigned int, nr)
1520__RTE_BIT_OVERLOAD_2(, clear,,
unsigned int, nr)
1521__RTE_BIT_OVERLOAD_3(, assign,,
unsigned int, nr,
bool, value)
1522__RTE_BIT_OVERLOAD_2(, flip,,
unsigned int, nr)
1524__RTE_BIT_OVERLOAD_3R(atomic_, test,
const,
bool,
unsigned int, nr,
int, memory_order)
1525__RTE_BIT_OVERLOAD_3(atomic_, set,,
unsigned int, nr,
int, memory_order)
1526__RTE_BIT_OVERLOAD_3(atomic_, clear,,
unsigned int, nr,
int, memory_order)
1527__RTE_BIT_OVERLOAD_4(atomic_, assign,,
unsigned int, nr,
bool, value,
int, memory_order)
1528__RTE_BIT_OVERLOAD_3(atomic_, flip,,
unsigned int, nr,
int, memory_order)
1529__RTE_BIT_OVERLOAD_3R(atomic_, test_and_set,,
bool,
unsigned int, nr,
int, memory_order)
1530__RTE_BIT_OVERLOAD_3R(atomic_, test_and_clear,,
bool,
unsigned int, nr,
int, memory_order)
1531__RTE_BIT_OVERLOAD_4R(atomic_, test_and_assign,,
bool,
unsigned int, nr,
bool, value,
static void rte_bit_relaxed_set32(unsigned int nr, volatile uint32_t *addr)
static __rte_experimental unsigned int rte_ffs64(uint64_t v)
static uint32_t rte_log2_u32(uint32_t v)
static uint32_t rte_fls_u32(uint32_t x)
static void rte_bit_relaxed_clear64(unsigned int nr, volatile uint64_t *addr)
static int rte_bsf32_safe(uint32_t v, uint32_t *pos)
static uint64_t rte_bit_relaxed_test_and_clear64(unsigned int nr, volatile uint64_t *addr)
static uint32_t rte_bsf64(uint64_t v)
static unsigned int rte_clz32(uint32_t v)
static uint32_t rte_bit_relaxed_test_and_set32(unsigned int nr, volatile uint32_t *addr)
static uint32_t rte_align32pow2(uint32_t x)
static uint32_t rte_bit_relaxed_test_and_clear32(unsigned int nr, volatile uint32_t *addr)
static unsigned int rte_popcount32(uint32_t v)
static uint32_t rte_align32prevpow2(uint32_t x)
static uint64_t rte_bit_relaxed_test_and_set64(unsigned int nr, volatile uint64_t *addr)
static uint64_t rte_align64pow2(uint64_t v)
static unsigned int rte_ctz64(uint64_t v)
static uint32_t rte_bsf32(uint32_t v)
static int rte_bsf64_safe(uint64_t v, uint32_t *pos)
static uint64_t rte_bit_relaxed_get64(unsigned int nr, volatile uint64_t *addr)
static unsigned int rte_popcount64(uint64_t v)
static unsigned int rte_ctz32(uint32_t v)
static uint64_t rte_align64prevpow2(uint64_t v)
static unsigned int rte_clz64(uint64_t v)
static void rte_bit_relaxed_clear32(unsigned int nr, volatile uint32_t *addr)
static uint32_t rte_bit_relaxed_get32(unsigned int nr, volatile uint32_t *addr)
static void rte_bit_relaxed_set64(unsigned int nr, volatile uint64_t *addr)
static int rte_is_power_of_2(uint32_t n)
static uint64_t rte_combine64ms1b(uint64_t v)
static uint32_t rte_combine32ms1b(uint32_t x)
static __rte_experimental unsigned int rte_ffs32(uint32_t v)
static uint32_t rte_log2_u64(uint64_t v)
static uint32_t rte_fls_u64(uint64_t x)