1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2015 Intel Corporation 3 */ 4 5 #include <rte_vect.h> 6 7 /* Functions to compare multiple of 16 byte keys (up to 128 bytes) */ 8 static int 9 rte_hash_k16_cmp_eq(const void *key1, const void *key2, size_t key_len __rte_unused) 10 { 11 const __m128i k1 = _mm_loadu_si128((const __m128i *) key1); 12 const __m128i k2 = _mm_loadu_si128((const __m128i *) key2); 13 const __m128i x = _mm_xor_si128(k1, k2); 14 15 return !_mm_test_all_zeros(x, x); 16 } 17 18 static int 19 rte_hash_k32_cmp_eq(const void *key1, const void *key2, size_t key_len) 20 { 21 return rte_hash_k16_cmp_eq(key1, key2, key_len) || 22 rte_hash_k16_cmp_eq((const char *) key1 + 16, 23 (const char *) key2 + 16, key_len); 24 } 25 26 static int 27 rte_hash_k48_cmp_eq(const void *key1, const void *key2, size_t key_len) 28 { 29 return rte_hash_k16_cmp_eq(key1, key2, key_len) || 30 rte_hash_k16_cmp_eq((const char *) key1 + 16, 31 (const char *) key2 + 16, key_len) || 32 rte_hash_k16_cmp_eq((const char *) key1 + 32, 33 (const char *) key2 + 32, key_len); 34 } 35 36 static int 37 rte_hash_k64_cmp_eq(const void *key1, const void *key2, size_t key_len) 38 { 39 return rte_hash_k32_cmp_eq(key1, key2, key_len) || 40 rte_hash_k32_cmp_eq((const char *) key1 + 32, 41 (const char *) key2 + 32, key_len); 42 } 43 44 static int 45 rte_hash_k80_cmp_eq(const void *key1, const void *key2, size_t key_len) 46 { 47 return rte_hash_k64_cmp_eq(key1, key2, key_len) || 48 rte_hash_k16_cmp_eq((const char *) key1 + 64, 49 (const char *) key2 + 64, key_len); 50 } 51 52 static int 53 rte_hash_k96_cmp_eq(const void *key1, const void *key2, size_t key_len) 54 { 55 return rte_hash_k64_cmp_eq(key1, key2, key_len) || 56 rte_hash_k32_cmp_eq((const char *) key1 + 64, 57 (const char *) key2 + 64, key_len); 58 } 59 60 static int 61 rte_hash_k112_cmp_eq(const void *key1, const void *key2, size_t key_len) 62 { 63 return rte_hash_k64_cmp_eq(key1, key2, key_len) || 64 rte_hash_k32_cmp_eq((const char *) key1 + 64, 65 (const char *) key2 + 64, key_len) || 66 rte_hash_k16_cmp_eq((const char *) key1 + 96, 67 (const char *) key2 + 96, key_len); 68 } 69 70 static int 71 rte_hash_k128_cmp_eq(const void *key1, const void *key2, size_t key_len) 72 { 73 return rte_hash_k64_cmp_eq(key1, key2, key_len) || 74 rte_hash_k64_cmp_eq((const char *) key1 + 64, 75 (const char *) key2 + 64, key_len); 76 } 77