This patch dynamically selects x86 EFD functions at run-time. This patch uses function pointer and binds it to the relative function based on CPU flags at constructor time.
Signed-off-by: Xiaoyun Li <xiaoyun...@intel.com> --- lib/librte_efd/rte_efd_x86.h | 41 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/lib/librte_efd/rte_efd_x86.h b/lib/librte_efd/rte_efd_x86.h index 34f37d7..93b6743 100644 --- a/lib/librte_efd/rte_efd_x86.h +++ b/lib/librte_efd/rte_efd_x86.h @@ -43,12 +43,29 @@ #define EFD_LOAD_SI128(val) _mm_lddqu_si128(val) #endif +typedef efd_value_t +(*efd_lookup_internal_avx2_t)(const efd_hashfunc_t *group_hash_idx, + const efd_lookuptbl_t *group_lookup_table, + const uint32_t hash_val_a, const uint32_t hash_val_b); + +static efd_lookup_internal_avx2_t efd_lookup_internal_avx2_ptr; + static inline efd_value_t efd_lookup_internal_avx2(const efd_hashfunc_t *group_hash_idx, const efd_lookuptbl_t *group_lookup_table, const uint32_t hash_val_a, const uint32_t hash_val_b) { -#ifdef RTE_MACHINE_CPUFLAG_AVX2 + return (*efd_lookup_internal_avx2_ptr)(group_hash_idx, + group_lookup_table, + hash_val_a, hash_val_b); +} + +#ifdef CC_SUPPORT_AVX2 +static inline efd_value_t +efd_lookup_internal_avx2_AVX2(const efd_hashfunc_t *group_hash_idx, + const efd_lookuptbl_t *group_lookup_table, + const uint32_t hash_val_a, const uint32_t hash_val_b) +{ efd_value_t value = 0; uint32_t i = 0; __m256i vhash_val_a = _mm256_set1_epi32(hash_val_a); @@ -74,13 +91,31 @@ efd_lookup_internal_avx2(const efd_hashfunc_t *group_hash_idx, } return value; -#else +} +#endif + +static inline efd_value_t +efd_lookup_internal_avx2_DEFAULT(const efd_hashfunc_t *group_hash_idx, + const efd_lookuptbl_t *group_lookup_table, + const uint32_t hash_val_a, const uint32_t hash_val_b) +{ RTE_SET_USED(group_hash_idx); RTE_SET_USED(group_lookup_table); RTE_SET_USED(hash_val_a); RTE_SET_USED(hash_val_b); /* Return dummy value, only to avoid compilation breakage */ return 0; -#endif +} +static void __attribute__((constructor)) +rte_efd_x86_init(void) +{ +#ifdef CC_SUPPORT_AVX2 + if (rte_cpu_get_flag_enabled(RTE_CPUFLAG_AVX2)) + efd_lookup_internal_avx2_ptr = efd_lookup_internal_avx2_AVX2; + else + efd_lookup_internal_avx2_ptr = efd_lookup_internal_avx2_DEFAULT; +#else + efd_lookup_internal_avx2_ptr = efd_lookup_internal_avx2_DEFAULT; +#endif } -- 2.7.4