Line data Source code
1 : /* 2 : * Copyright (c) 2016 Cisco and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : 16 : #undef BIHASH_TYPE 17 : #undef BIHASH_KVP_PER_PAGE 18 : #undef BIHASH_32_64_SVM 19 : #undef BIHASH_ENABLE_STATS 20 : #undef BIHASH_KVP_AT_BUCKET_LEVEL 21 : #undef BIHASH_LAZY_INSTANTIATE 22 : #undef BIHASH_BUCKET_PREFETCH_CACHE_LINES 23 : 24 : #define BIHASH_TYPE _48_8 25 : #define BIHASH_KVP_PER_PAGE 4 26 : #define BIHASH_KVP_AT_BUCKET_LEVEL 0 27 : #define BIHASH_LAZY_INSTANTIATE 1 28 : #define BIHASH_BUCKET_PREFETCH_CACHE_LINES 1 29 : 30 : #ifndef __included_bihash_48_8_h__ 31 : #define __included_bihash_48_8_h__ 32 : 33 : #include <vppinfra/crc32.h> 34 : #include <vppinfra/heap.h> 35 : #include <vppinfra/format.h> 36 : #include <vppinfra/pool.h> 37 : #include <vppinfra/xxhash.h> 38 : 39 : typedef struct 40 : { 41 : u64 key[6]; 42 : u64 value; 43 : } clib_bihash_kv_48_8_t; 44 : 45 : static inline void 46 143837 : clib_bihash_mark_free_48_8 (clib_bihash_kv_48_8_t *v) 47 : { 48 143837 : v->value = 0xFEEDFACE8BADF00DULL; 49 143837 : } 50 : 51 : static inline int 52 195506 : clib_bihash_is_free_48_8 (const clib_bihash_kv_48_8_t * v) 53 : { 54 195506 : if (v->value == 0xFEEDFACE8BADF00DULL) 55 9576 : return 1; 56 185930 : return 0; 57 : } 58 : 59 : static inline u64 60 182354 : clib_bihash_hash_48_8 (const clib_bihash_kv_48_8_t * v) 61 : { 62 : #ifdef clib_crc32c_uses_intrinsics 63 182354 : return clib_crc32c ((u8 *) v->key, 48); 64 : #else 65 : u64 tmp = v->key[0] ^ v->key[1] ^ v->key[2] ^ v->key[3] ^ v->key[4] 66 : ^ v->key[5]; 67 : return clib_xxhash (tmp); 68 : #endif 69 : } 70 : 71 : static inline u8 * 72 0 : format_bihash_kvp_48_8 (u8 * s, va_list * args) 73 : { 74 0 : clib_bihash_kv_48_8_t *v = va_arg (*args, clib_bihash_kv_48_8_t *); 75 : 76 0 : s = format (s, "key %llu %llu %llu %llu %llu %llu value %llu", v->key[0], 77 : v->key[1], v->key[2], v->key[3], v->key[4], v->key[5], 78 : v->value); 79 0 : return s; 80 : } 81 : 82 : static inline int 83 124502 : clib_bihash_key_compare_48_8 (u64 * a, u64 * b) 84 : { 85 : #if defined (CLIB_HAVE_VEC512) 86 0 : return u64x8_is_equal (u64x8_mask_load_zero (a, 0x3f), 87 : u64x8_mask_load_zero (b, 0x3f)); 88 : #elif defined (CLIB_HAVE_VEC256) 89 9348 : u64x4 v = { 0 }; 90 18696 : v = u64x4_insert_lo (v, u64x2_load_unaligned (a + 4) ^ 91 9348 : u64x2_load_unaligned (b + 4)); 92 9348 : v |= u64x4_load_unaligned (a) ^ u64x4_load_unaligned (b); 93 9348 : return u64x4_is_all_zero (v); 94 : #elif defined(CLIB_HAVE_VEC128) && defined(CLIB_HAVE_VEC128_UNALIGNED_LOAD_STORE) 95 : u64x2 v; 96 115154 : v = u64x2_load_unaligned (a) ^ u64x2_load_unaligned (b); 97 115153 : v |= u64x2_load_unaligned (a + 2) ^ u64x2_load_unaligned (b + 2); 98 115153 : v |= u64x2_load_unaligned (a + 4) ^ u64x2_load_unaligned (b + 4); 99 115152 : return u64x2_is_all_zero (v); 100 : #else 101 : return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2]) | (a[3] ^ b[3]) 102 : | (a[4] ^ b[4]) | (a[5] ^ b[5])) == 0; 103 : #endif 104 : } 105 : 106 : #undef __included_bihash_template_h__ 107 : #include <vppinfra/bihash_template.h> 108 : 109 : #endif /* __included_bihash_48_8_h__ */ 110 : 111 : /* 112 : * fd.io coding-style-patch-verification: ON 113 : * 114 : * Local Variables: 115 : * eval: (c-set-style "gnu") 116 : * End: 117 : */