1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause 2*d30ea906Sjfb8856606 * Copyright(c) 2010-2018 Intel Corporation 3*d30ea906Sjfb8856606 */ 4*d30ea906Sjfb8856606 5*d30ea906Sjfb8856606 #ifndef __INCLUDE_RTE_TABLE_HASH_FUNC_H__ 6*d30ea906Sjfb8856606 #define __INCLUDE_RTE_TABLE_HASH_FUNC_H__ 7*d30ea906Sjfb8856606 8*d30ea906Sjfb8856606 #ifdef __cplusplus 9*d30ea906Sjfb8856606 extern "C" { 10*d30ea906Sjfb8856606 #endif 11*d30ea906Sjfb8856606 12*d30ea906Sjfb8856606 #include <stdint.h> 13*d30ea906Sjfb8856606 14*d30ea906Sjfb8856606 #include <rte_compat.h> 15*d30ea906Sjfb8856606 #include <rte_common.h> 16*d30ea906Sjfb8856606 17*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 18*d30ea906Sjfb8856606 rte_crc32_u64_generic(uint64_t crc, uint64_t value) 19*d30ea906Sjfb8856606 { 20*d30ea906Sjfb8856606 int i; 21*d30ea906Sjfb8856606 22*d30ea906Sjfb8856606 crc = (crc & 0xFFFFFFFFLLU) ^ value; 23*d30ea906Sjfb8856606 for (i = 63; i >= 0; i--) { 24*d30ea906Sjfb8856606 uint64_t mask; 25*d30ea906Sjfb8856606 26*d30ea906Sjfb8856606 mask = -(crc & 1LLU); 27*d30ea906Sjfb8856606 crc = (crc >> 1LLU) ^ (0x82F63B78LLU & mask); 28*d30ea906Sjfb8856606 } 29*d30ea906Sjfb8856606 30*d30ea906Sjfb8856606 return crc; 31*d30ea906Sjfb8856606 } 32*d30ea906Sjfb8856606 33*d30ea906Sjfb8856606 #if defined(RTE_ARCH_X86_64) 34*d30ea906Sjfb8856606 35*d30ea906Sjfb8856606 #include <x86intrin.h> 36*d30ea906Sjfb8856606 37*d30ea906Sjfb8856606 static inline uint64_t 38*d30ea906Sjfb8856606 rte_crc32_u64(uint64_t crc, uint64_t v) 39*d30ea906Sjfb8856606 { 40*d30ea906Sjfb8856606 return _mm_crc32_u64(crc, v); 41*d30ea906Sjfb8856606 } 42*d30ea906Sjfb8856606 43*d30ea906Sjfb8856606 #elif defined(RTE_ARCH_ARM64) 44*d30ea906Sjfb8856606 #include "rte_table_hash_func_arm64.h" 45*d30ea906Sjfb8856606 #else 46*d30ea906Sjfb8856606 47*d30ea906Sjfb8856606 static inline uint64_t 48*d30ea906Sjfb8856606 rte_crc32_u64(uint64_t crc, uint64_t v) 49*d30ea906Sjfb8856606 { 50*d30ea906Sjfb8856606 return rte_crc32_u64_generic(crc, v); 51*d30ea906Sjfb8856606 } 52*d30ea906Sjfb8856606 53*d30ea906Sjfb8856606 #endif 54*d30ea906Sjfb8856606 55*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 56*d30ea906Sjfb8856606 rte_table_hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size, 57*d30ea906Sjfb8856606 uint64_t seed) 58*d30ea906Sjfb8856606 { 59*d30ea906Sjfb8856606 uint64_t *k = key; 60*d30ea906Sjfb8856606 uint64_t *m = mask; 61*d30ea906Sjfb8856606 uint64_t crc0; 62*d30ea906Sjfb8856606 63*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(seed, k[0] & m[0]); 64*d30ea906Sjfb8856606 65*d30ea906Sjfb8856606 return crc0; 66*d30ea906Sjfb8856606 } 67*d30ea906Sjfb8856606 68*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 69*d30ea906Sjfb8856606 rte_table_hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size, 70*d30ea906Sjfb8856606 uint64_t seed) 71*d30ea906Sjfb8856606 { 72*d30ea906Sjfb8856606 uint64_t *k = key; 73*d30ea906Sjfb8856606 uint64_t *m = mask; 74*d30ea906Sjfb8856606 uint64_t k0, crc0, crc1; 75*d30ea906Sjfb8856606 76*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 77*d30ea906Sjfb8856606 78*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 79*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 80*d30ea906Sjfb8856606 81*d30ea906Sjfb8856606 crc0 ^= crc1; 82*d30ea906Sjfb8856606 83*d30ea906Sjfb8856606 return crc0; 84*d30ea906Sjfb8856606 } 85*d30ea906Sjfb8856606 86*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 87*d30ea906Sjfb8856606 rte_table_hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size, 88*d30ea906Sjfb8856606 uint64_t seed) 89*d30ea906Sjfb8856606 { 90*d30ea906Sjfb8856606 uint64_t *k = key; 91*d30ea906Sjfb8856606 uint64_t *m = mask; 92*d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1; 93*d30ea906Sjfb8856606 94*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 95*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 96*d30ea906Sjfb8856606 97*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 98*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 99*d30ea906Sjfb8856606 100*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, k2); 101*d30ea906Sjfb8856606 102*d30ea906Sjfb8856606 crc0 ^= crc1; 103*d30ea906Sjfb8856606 104*d30ea906Sjfb8856606 return crc0; 105*d30ea906Sjfb8856606 } 106*d30ea906Sjfb8856606 107*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 108*d30ea906Sjfb8856606 rte_table_hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size, 109*d30ea906Sjfb8856606 uint64_t seed) 110*d30ea906Sjfb8856606 { 111*d30ea906Sjfb8856606 uint64_t *k = key; 112*d30ea906Sjfb8856606 uint64_t *m = mask; 113*d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1, crc2, crc3; 114*d30ea906Sjfb8856606 115*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 116*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 117*d30ea906Sjfb8856606 118*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 119*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 120*d30ea906Sjfb8856606 121*d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 122*d30ea906Sjfb8856606 crc3 = k2 >> 32; 123*d30ea906Sjfb8856606 124*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, crc1); 125*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc2, crc3); 126*d30ea906Sjfb8856606 127*d30ea906Sjfb8856606 crc0 ^= crc1; 128*d30ea906Sjfb8856606 129*d30ea906Sjfb8856606 return crc0; 130*d30ea906Sjfb8856606 } 131*d30ea906Sjfb8856606 132*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 133*d30ea906Sjfb8856606 rte_table_hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size, 134*d30ea906Sjfb8856606 uint64_t seed) 135*d30ea906Sjfb8856606 { 136*d30ea906Sjfb8856606 uint64_t *k = key; 137*d30ea906Sjfb8856606 uint64_t *m = mask; 138*d30ea906Sjfb8856606 uint64_t k0, k2, crc0, crc1, crc2, crc3; 139*d30ea906Sjfb8856606 140*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 141*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 142*d30ea906Sjfb8856606 143*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 144*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 145*d30ea906Sjfb8856606 146*d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 147*d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 148*d30ea906Sjfb8856606 149*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, crc1); 150*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc2, crc3); 151*d30ea906Sjfb8856606 152*d30ea906Sjfb8856606 crc0 ^= crc1; 153*d30ea906Sjfb8856606 154*d30ea906Sjfb8856606 return crc0; 155*d30ea906Sjfb8856606 } 156*d30ea906Sjfb8856606 157*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 158*d30ea906Sjfb8856606 rte_table_hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size, 159*d30ea906Sjfb8856606 uint64_t seed) 160*d30ea906Sjfb8856606 { 161*d30ea906Sjfb8856606 uint64_t *k = key; 162*d30ea906Sjfb8856606 uint64_t *m = mask; 163*d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3; 164*d30ea906Sjfb8856606 165*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 166*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 167*d30ea906Sjfb8856606 k5 = k[5] & m[5]; 168*d30ea906Sjfb8856606 169*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 170*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 171*d30ea906Sjfb8856606 172*d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 173*d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 174*d30ea906Sjfb8856606 175*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 176*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, k5); 177*d30ea906Sjfb8856606 178*d30ea906Sjfb8856606 crc0 ^= crc1; 179*d30ea906Sjfb8856606 180*d30ea906Sjfb8856606 return crc0; 181*d30ea906Sjfb8856606 } 182*d30ea906Sjfb8856606 183*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 184*d30ea906Sjfb8856606 rte_table_hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size, 185*d30ea906Sjfb8856606 uint64_t seed) 186*d30ea906Sjfb8856606 { 187*d30ea906Sjfb8856606 uint64_t *k = key; 188*d30ea906Sjfb8856606 uint64_t *m = mask; 189*d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5; 190*d30ea906Sjfb8856606 191*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 192*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 193*d30ea906Sjfb8856606 k5 = k[5] & m[5]; 194*d30ea906Sjfb8856606 195*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 196*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 197*d30ea906Sjfb8856606 198*d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 199*d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 200*d30ea906Sjfb8856606 201*d30ea906Sjfb8856606 crc4 = rte_crc32_u64(k5, k[6] & m[6]); 202*d30ea906Sjfb8856606 crc5 = k5 >> 32; 203*d30ea906Sjfb8856606 204*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 205*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5); 206*d30ea906Sjfb8856606 207*d30ea906Sjfb8856606 crc0 ^= crc1; 208*d30ea906Sjfb8856606 209*d30ea906Sjfb8856606 return crc0; 210*d30ea906Sjfb8856606 } 211*d30ea906Sjfb8856606 212*d30ea906Sjfb8856606 static inline uint64_t __rte_experimental 213*d30ea906Sjfb8856606 rte_table_hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size, 214*d30ea906Sjfb8856606 uint64_t seed) 215*d30ea906Sjfb8856606 { 216*d30ea906Sjfb8856606 uint64_t *k = key; 217*d30ea906Sjfb8856606 uint64_t *m = mask; 218*d30ea906Sjfb8856606 uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5; 219*d30ea906Sjfb8856606 220*d30ea906Sjfb8856606 k0 = k[0] & m[0]; 221*d30ea906Sjfb8856606 k2 = k[2] & m[2]; 222*d30ea906Sjfb8856606 k5 = k[5] & m[5]; 223*d30ea906Sjfb8856606 224*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(k0, seed); 225*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(k0 >> 32, k[1] & m[1]); 226*d30ea906Sjfb8856606 227*d30ea906Sjfb8856606 crc2 = rte_crc32_u64(k2, k[3] & m[3]); 228*d30ea906Sjfb8856606 crc3 = rte_crc32_u64(k2 >> 32, k[4] & m[4]); 229*d30ea906Sjfb8856606 230*d30ea906Sjfb8856606 crc4 = rte_crc32_u64(k5, k[6] & m[6]); 231*d30ea906Sjfb8856606 crc5 = rte_crc32_u64(k5 >> 32, k[7] & m[7]); 232*d30ea906Sjfb8856606 233*d30ea906Sjfb8856606 crc0 = rte_crc32_u64(crc0, (crc1 << 32) ^ crc2); 234*d30ea906Sjfb8856606 crc1 = rte_crc32_u64(crc3, (crc4 << 32) ^ crc5); 235*d30ea906Sjfb8856606 236*d30ea906Sjfb8856606 crc0 ^= crc1; 237*d30ea906Sjfb8856606 238*d30ea906Sjfb8856606 return crc0; 239*d30ea906Sjfb8856606 } 240*d30ea906Sjfb8856606 241*d30ea906Sjfb8856606 #ifdef __cplusplus 242*d30ea906Sjfb8856606 } 243*d30ea906Sjfb8856606 #endif 244*d30ea906Sjfb8856606 245*d30ea906Sjfb8856606 #endif 246