1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2017-2018 Linaro Limited.
4 #ifndef __HASH_FUNC_ARM64_H__
5 #define __HASH_FUNC_ARM64_H__
7 #define _CRC32CX(crc, val) \
8 __asm__("crc32cx %w[c], %w[c], %x[v]":[c] "+r" (crc):[v] "r" (val))
10 static inline uint64_t
11 hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
19 _CRC32CX(crc0, k[0] & m[0]);
24 static inline uint64_t
25 hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
28 uint64_t *k = key, k0;
37 _CRC32CX(crc1, k[1] & m[1]);
44 static inline uint64_t
45 hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
48 uint64_t *k = key, k0, k2;
58 _CRC32CX(crc1, k[1] & m[1]);
67 static inline uint64_t
68 hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
71 uint64_t *k = key, k0, k2;
73 uint32_t crc0, crc1, crc2, crc3;
81 _CRC32CX(crc1, k[1] & m[1]);
84 _CRC32CX(crc2, k[3] & m[3]);
95 static inline uint64_t
96 hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
99 uint64_t *k = key, k0, k2;
101 uint32_t crc0, crc1, crc2, crc3;
107 _CRC32CX(crc0, seed);
109 _CRC32CX(crc1, k[1] & m[1]);
112 _CRC32CX(crc2, k[3] & m[3]);
114 _CRC32CX(crc3, k[4] & m[4]);
116 _CRC32CX(crc0, crc1);
117 _CRC32CX(crc2, crc3);
124 static inline uint64_t
125 hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
128 uint64_t *k = key, k0, k2, k5;
130 uint32_t crc0, crc1, crc2, crc3;
137 _CRC32CX(crc0, seed);
139 _CRC32CX(crc1, k[1] & m[1]);
142 _CRC32CX(crc2, k[3] & m[3]);
144 _CRC32CX(crc3, k[4] & m[4]);
146 _CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
154 static inline uint64_t
155 hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
158 uint64_t *k = key, k0, k2, k5;
160 uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
167 _CRC32CX(crc0, seed);
169 _CRC32CX(crc1, k[1] & m[1]);
172 _CRC32CX(crc2, k[3] & m[3]);
174 _CRC32CX(crc3, k[4] & m[4]);
177 _CRC32CX(crc4, k[6] & m[6]);
180 _CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
181 _CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
188 static inline uint64_t
189 hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
192 uint64_t *k = key, k0, k2, k5;
194 uint32_t crc0, crc1, crc2, crc3, crc4, crc5;
201 _CRC32CX(crc0, seed);
203 _CRC32CX(crc1, k[1] & m[1]);
206 _CRC32CX(crc2, k[3] & m[3]);
208 _CRC32CX(crc3, k[4] & m[4]);
211 _CRC32CX(crc4, k[6] & m[6]);
213 _CRC32CX(crc5, k[7] & m[7]);
215 _CRC32CX(crc0, ((uint64_t)crc1 << 32) ^ crc2);
216 _CRC32CX(crc3, ((uint64_t)crc4 << 32) ^ crc5);
223 #define hash_default_key8 hash_crc_key8
224 #define hash_default_key16 hash_crc_key16
225 #define hash_default_key24 hash_crc_key24
226 #define hash_default_key32 hash_crc_key32
227 #define hash_default_key40 hash_crc_key40
228 #define hash_default_key48 hash_crc_key48
229 #define hash_default_key56 hash_crc_key56
230 #define hash_default_key64 hash_crc_key64