1*537d1343SAlexander V. Chernikov /* SPDX-License-Identifier: BSD-3-Clause
2*537d1343SAlexander V. Chernikov * Copyright(c) 2010-2015 Intel Corporation.
3*537d1343SAlexander V. Chernikov */
4*537d1343SAlexander V. Chernikov
5*537d1343SAlexander V. Chernikov #ifndef _RTE_JHASH_H
6*537d1343SAlexander V. Chernikov #define _RTE_JHASH_H
7*537d1343SAlexander V. Chernikov
8*537d1343SAlexander V. Chernikov /**
9*537d1343SAlexander V. Chernikov * @file
10*537d1343SAlexander V. Chernikov *
11*537d1343SAlexander V. Chernikov * jhash functions.
12*537d1343SAlexander V. Chernikov */
13*537d1343SAlexander V. Chernikov
14*537d1343SAlexander V. Chernikov #ifdef __cplusplus
15*537d1343SAlexander V. Chernikov extern "C" {
16*537d1343SAlexander V. Chernikov #endif
17*537d1343SAlexander V. Chernikov
18*537d1343SAlexander V. Chernikov //#include <rte_byteorder.h>
19*537d1343SAlexander V. Chernikov
20*537d1343SAlexander V. Chernikov /* jhash.h: Jenkins hash support.
21*537d1343SAlexander V. Chernikov *
22*537d1343SAlexander V. Chernikov * Copyright (C) 2006 Bob Jenkins (bob_jenkins@burtleburtle.net)
23*537d1343SAlexander V. Chernikov *
24*537d1343SAlexander V. Chernikov * http://burtleburtle.net/bob/hash/
25*537d1343SAlexander V. Chernikov *
26*537d1343SAlexander V. Chernikov * These are the credits from Bob's sources:
27*537d1343SAlexander V. Chernikov *
28*537d1343SAlexander V. Chernikov * lookup3.c, by Bob Jenkins, May 2006, Public Domain.
29*537d1343SAlexander V. Chernikov *
30*537d1343SAlexander V. Chernikov * These are functions for producing 32-bit hashes for hash table lookup.
31*537d1343SAlexander V. Chernikov * hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
32*537d1343SAlexander V. Chernikov * are externally useful functions. Routines to test the hash are included
33*537d1343SAlexander V. Chernikov * if SELF_TEST is defined. You can use this free for any purpose. It's in
34*537d1343SAlexander V. Chernikov * the public domain. It has no warranty.
35*537d1343SAlexander V. Chernikov *
36*537d1343SAlexander V. Chernikov * $FreeBSD$
37*537d1343SAlexander V. Chernikov */
38*537d1343SAlexander V. Chernikov
39*537d1343SAlexander V. Chernikov #define rot(x, k) (((x) << (k)) | ((x) >> (32-(k))))
40*537d1343SAlexander V. Chernikov
41*537d1343SAlexander V. Chernikov /** @internal Internal function. NOTE: Arguments are modified. */
42*537d1343SAlexander V. Chernikov #define __rte_jhash_mix(a, b, c) do { \
43*537d1343SAlexander V. Chernikov a -= c; a ^= rot(c, 4); c += b; \
44*537d1343SAlexander V. Chernikov b -= a; b ^= rot(a, 6); a += c; \
45*537d1343SAlexander V. Chernikov c -= b; c ^= rot(b, 8); b += a; \
46*537d1343SAlexander V. Chernikov a -= c; a ^= rot(c, 16); c += b; \
47*537d1343SAlexander V. Chernikov b -= a; b ^= rot(a, 19); a += c; \
48*537d1343SAlexander V. Chernikov c -= b; c ^= rot(b, 4); b += a; \
49*537d1343SAlexander V. Chernikov } while (0)
50*537d1343SAlexander V. Chernikov
51*537d1343SAlexander V. Chernikov #define __rte_jhash_final(a, b, c) do { \
52*537d1343SAlexander V. Chernikov c ^= b; c -= rot(b, 14); \
53*537d1343SAlexander V. Chernikov a ^= c; a -= rot(c, 11); \
54*537d1343SAlexander V. Chernikov b ^= a; b -= rot(a, 25); \
55*537d1343SAlexander V. Chernikov c ^= b; c -= rot(b, 16); \
56*537d1343SAlexander V. Chernikov a ^= c; a -= rot(c, 4); \
57*537d1343SAlexander V. Chernikov b ^= a; b -= rot(a, 14); \
58*537d1343SAlexander V. Chernikov c ^= b; c -= rot(b, 24); \
59*537d1343SAlexander V. Chernikov } while (0)
60*537d1343SAlexander V. Chernikov
61*537d1343SAlexander V. Chernikov /** The golden ratio: an arbitrary value. */
62*537d1343SAlexander V. Chernikov #define RTE_JHASH_GOLDEN_RATIO 0xdeadbeef
63*537d1343SAlexander V. Chernikov
64*537d1343SAlexander V. Chernikov #if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN
65*537d1343SAlexander V. Chernikov #define BIT_SHIFT(x, y, k) (((x) >> (k)) | ((uint64_t)(y) << (32-(k))))
66*537d1343SAlexander V. Chernikov #else
67*537d1343SAlexander V. Chernikov #define BIT_SHIFT(x, y, k) (((uint64_t)(x) << (k)) | ((y) >> (32-(k))))
68*537d1343SAlexander V. Chernikov #endif
69*537d1343SAlexander V. Chernikov
70*537d1343SAlexander V. Chernikov #define LOWER8b_MASK rte_le_to_cpu_32(0xff)
71*537d1343SAlexander V. Chernikov #define LOWER16b_MASK rte_le_to_cpu_32(0xffff)
72*537d1343SAlexander V. Chernikov #define LOWER24b_MASK rte_le_to_cpu_32(0xffffff)
73*537d1343SAlexander V. Chernikov
74*537d1343SAlexander V. Chernikov static inline void
__rte_jhash_2hashes(const void * key,uint32_t length,uint32_t * pc,uint32_t * pb,unsigned check_align)75*537d1343SAlexander V. Chernikov __rte_jhash_2hashes(const void *key, uint32_t length, uint32_t *pc,
76*537d1343SAlexander V. Chernikov uint32_t *pb, unsigned check_align)
77*537d1343SAlexander V. Chernikov {
78*537d1343SAlexander V. Chernikov uint32_t a, b, c;
79*537d1343SAlexander V. Chernikov
80*537d1343SAlexander V. Chernikov /* Set up the internal state */
81*537d1343SAlexander V. Chernikov a = b = c = RTE_JHASH_GOLDEN_RATIO + ((uint32_t)length) + *pc;
82*537d1343SAlexander V. Chernikov c += *pb;
83*537d1343SAlexander V. Chernikov
84*537d1343SAlexander V. Chernikov /*
85*537d1343SAlexander V. Chernikov * Check key alignment. For x86 architecture, first case is always optimal
86*537d1343SAlexander V. Chernikov * If check_align is not set, first case will be used
87*537d1343SAlexander V. Chernikov */
88*537d1343SAlexander V. Chernikov #if defined(RTE_ARCH_X86_64) || defined(RTE_ARCH_I686) || defined(RTE_ARCH_X86_X32)
89*537d1343SAlexander V. Chernikov const uint32_t *k = (const uint32_t *)key;
90*537d1343SAlexander V. Chernikov const uint32_t s = 0;
91*537d1343SAlexander V. Chernikov #else
92*537d1343SAlexander V. Chernikov const uint32_t *k = (uint32_t *)((uintptr_t)key & (uintptr_t)~3);
93*537d1343SAlexander V. Chernikov const uint32_t s = ((uintptr_t)key & 3) * CHAR_BIT;
94*537d1343SAlexander V. Chernikov #endif
95*537d1343SAlexander V. Chernikov if (!check_align || s == 0) {
96*537d1343SAlexander V. Chernikov while (length > 12) {
97*537d1343SAlexander V. Chernikov a += k[0];
98*537d1343SAlexander V. Chernikov b += k[1];
99*537d1343SAlexander V. Chernikov c += k[2];
100*537d1343SAlexander V. Chernikov
101*537d1343SAlexander V. Chernikov __rte_jhash_mix(a, b, c);
102*537d1343SAlexander V. Chernikov
103*537d1343SAlexander V. Chernikov k += 3;
104*537d1343SAlexander V. Chernikov length -= 12;
105*537d1343SAlexander V. Chernikov }
106*537d1343SAlexander V. Chernikov
107*537d1343SAlexander V. Chernikov switch (length) {
108*537d1343SAlexander V. Chernikov case 12:
109*537d1343SAlexander V. Chernikov c += k[2]; b += k[1]; a += k[0]; break;
110*537d1343SAlexander V. Chernikov case 11:
111*537d1343SAlexander V. Chernikov c += k[2] & LOWER24b_MASK; b += k[1]; a += k[0]; break;
112*537d1343SAlexander V. Chernikov case 10:
113*537d1343SAlexander V. Chernikov c += k[2] & LOWER16b_MASK; b += k[1]; a += k[0]; break;
114*537d1343SAlexander V. Chernikov case 9:
115*537d1343SAlexander V. Chernikov c += k[2] & LOWER8b_MASK; b += k[1]; a += k[0]; break;
116*537d1343SAlexander V. Chernikov case 8:
117*537d1343SAlexander V. Chernikov b += k[1]; a += k[0]; break;
118*537d1343SAlexander V. Chernikov case 7:
119*537d1343SAlexander V. Chernikov b += k[1] & LOWER24b_MASK; a += k[0]; break;
120*537d1343SAlexander V. Chernikov case 6:
121*537d1343SAlexander V. Chernikov b += k[1] & LOWER16b_MASK; a += k[0]; break;
122*537d1343SAlexander V. Chernikov case 5:
123*537d1343SAlexander V. Chernikov b += k[1] & LOWER8b_MASK; a += k[0]; break;
124*537d1343SAlexander V. Chernikov case 4:
125*537d1343SAlexander V. Chernikov a += k[0]; break;
126*537d1343SAlexander V. Chernikov case 3:
127*537d1343SAlexander V. Chernikov a += k[0] & LOWER24b_MASK; break;
128*537d1343SAlexander V. Chernikov case 2:
129*537d1343SAlexander V. Chernikov a += k[0] & LOWER16b_MASK; break;
130*537d1343SAlexander V. Chernikov case 1:
131*537d1343SAlexander V. Chernikov a += k[0] & LOWER8b_MASK; break;
132*537d1343SAlexander V. Chernikov /* zero length strings require no mixing */
133*537d1343SAlexander V. Chernikov case 0:
134*537d1343SAlexander V. Chernikov *pc = c;
135*537d1343SAlexander V. Chernikov *pb = b;
136*537d1343SAlexander V. Chernikov return;
137*537d1343SAlexander V. Chernikov };
138*537d1343SAlexander V. Chernikov } else {
139*537d1343SAlexander V. Chernikov /* all but the last block: affect some 32 bits of (a, b, c) */
140*537d1343SAlexander V. Chernikov while (length > 12) {
141*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
142*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
143*537d1343SAlexander V. Chernikov c += BIT_SHIFT(k[2], k[3], s);
144*537d1343SAlexander V. Chernikov __rte_jhash_mix(a, b, c);
145*537d1343SAlexander V. Chernikov
146*537d1343SAlexander V. Chernikov k += 3;
147*537d1343SAlexander V. Chernikov length -= 12;
148*537d1343SAlexander V. Chernikov }
149*537d1343SAlexander V. Chernikov
150*537d1343SAlexander V. Chernikov /* last block: affect all 32 bits of (c) */
151*537d1343SAlexander V. Chernikov switch (length) {
152*537d1343SAlexander V. Chernikov case 12:
153*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
154*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
155*537d1343SAlexander V. Chernikov c += BIT_SHIFT(k[2], k[3], s);
156*537d1343SAlexander V. Chernikov break;
157*537d1343SAlexander V. Chernikov case 11:
158*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
159*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
160*537d1343SAlexander V. Chernikov c += BIT_SHIFT(k[2], k[3], s) & LOWER24b_MASK;
161*537d1343SAlexander V. Chernikov break;
162*537d1343SAlexander V. Chernikov case 10:
163*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
164*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
165*537d1343SAlexander V. Chernikov c += BIT_SHIFT(k[2], k[3], s) & LOWER16b_MASK;
166*537d1343SAlexander V. Chernikov break;
167*537d1343SAlexander V. Chernikov case 9:
168*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
169*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
170*537d1343SAlexander V. Chernikov c += BIT_SHIFT(k[2], k[3], s) & LOWER8b_MASK;
171*537d1343SAlexander V. Chernikov break;
172*537d1343SAlexander V. Chernikov case 8:
173*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
174*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s);
175*537d1343SAlexander V. Chernikov break;
176*537d1343SAlexander V. Chernikov case 7:
177*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
178*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s) & LOWER24b_MASK;
179*537d1343SAlexander V. Chernikov break;
180*537d1343SAlexander V. Chernikov case 6:
181*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
182*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s) & LOWER16b_MASK;
183*537d1343SAlexander V. Chernikov break;
184*537d1343SAlexander V. Chernikov case 5:
185*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
186*537d1343SAlexander V. Chernikov b += BIT_SHIFT(k[1], k[2], s) & LOWER8b_MASK;
187*537d1343SAlexander V. Chernikov break;
188*537d1343SAlexander V. Chernikov case 4:
189*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s);
190*537d1343SAlexander V. Chernikov break;
191*537d1343SAlexander V. Chernikov case 3:
192*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s) & LOWER24b_MASK;
193*537d1343SAlexander V. Chernikov break;
194*537d1343SAlexander V. Chernikov case 2:
195*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s) & LOWER16b_MASK;
196*537d1343SAlexander V. Chernikov break;
197*537d1343SAlexander V. Chernikov case 1:
198*537d1343SAlexander V. Chernikov a += BIT_SHIFT(k[0], k[1], s) & LOWER8b_MASK;
199*537d1343SAlexander V. Chernikov break;
200*537d1343SAlexander V. Chernikov /* zero length strings require no mixing */
201*537d1343SAlexander V. Chernikov case 0:
202*537d1343SAlexander V. Chernikov *pc = c;
203*537d1343SAlexander V. Chernikov *pb = b;
204*537d1343SAlexander V. Chernikov return;
205*537d1343SAlexander V. Chernikov }
206*537d1343SAlexander V. Chernikov }
207*537d1343SAlexander V. Chernikov
208*537d1343SAlexander V. Chernikov __rte_jhash_final(a, b, c);
209*537d1343SAlexander V. Chernikov
210*537d1343SAlexander V. Chernikov *pc = c;
211*537d1343SAlexander V. Chernikov *pb = b;
212*537d1343SAlexander V. Chernikov }
213*537d1343SAlexander V. Chernikov
214*537d1343SAlexander V. Chernikov /**
215*537d1343SAlexander V. Chernikov * Same as rte_jhash, but takes two seeds and return two uint32_ts.
216*537d1343SAlexander V. Chernikov * pc and pb must be non-null, and *pc and *pb must both be initialized
217*537d1343SAlexander V. Chernikov * with seeds. If you pass in (*pb)=0, the output (*pc) will be
218*537d1343SAlexander V. Chernikov * the same as the return value from rte_jhash.
219*537d1343SAlexander V. Chernikov *
220*537d1343SAlexander V. Chernikov * @param key
221*537d1343SAlexander V. Chernikov * Key to calculate hash of.
222*537d1343SAlexander V. Chernikov * @param length
223*537d1343SAlexander V. Chernikov * Length of key in bytes.
224*537d1343SAlexander V. Chernikov * @param pc
225*537d1343SAlexander V. Chernikov * IN: seed OUT: primary hash value.
226*537d1343SAlexander V. Chernikov * @param pb
227*537d1343SAlexander V. Chernikov * IN: second seed OUT: secondary hash value.
228*537d1343SAlexander V. Chernikov */
229*537d1343SAlexander V. Chernikov static inline void
rte_jhash_2hashes(const void * key,uint32_t length,uint32_t * pc,uint32_t * pb)230*537d1343SAlexander V. Chernikov rte_jhash_2hashes(const void *key, uint32_t length, uint32_t *pc, uint32_t *pb)
231*537d1343SAlexander V. Chernikov {
232*537d1343SAlexander V. Chernikov __rte_jhash_2hashes(key, length, pc, pb, 1);
233*537d1343SAlexander V. Chernikov }
234*537d1343SAlexander V. Chernikov
235*537d1343SAlexander V. Chernikov /**
236*537d1343SAlexander V. Chernikov * Same as rte_jhash_32b, but takes two seeds and return two uint32_ts.
237*537d1343SAlexander V. Chernikov * pc and pb must be non-null, and *pc and *pb must both be initialized
238*537d1343SAlexander V. Chernikov * with seeds. If you pass in (*pb)=0, the output (*pc) will be
239*537d1343SAlexander V. Chernikov * the same as the return value from rte_jhash_32b.
240*537d1343SAlexander V. Chernikov *
241*537d1343SAlexander V. Chernikov * @param k
242*537d1343SAlexander V. Chernikov * Key to calculate hash of.
243*537d1343SAlexander V. Chernikov * @param length
244*537d1343SAlexander V. Chernikov * Length of key in units of 4 bytes.
245*537d1343SAlexander V. Chernikov * @param pc
246*537d1343SAlexander V. Chernikov * IN: seed OUT: primary hash value.
247*537d1343SAlexander V. Chernikov * @param pb
248*537d1343SAlexander V. Chernikov * IN: second seed OUT: secondary hash value.
249*537d1343SAlexander V. Chernikov */
250*537d1343SAlexander V. Chernikov static inline void
rte_jhash_32b_2hashes(const uint32_t * k,uint32_t length,uint32_t * pc,uint32_t * pb)251*537d1343SAlexander V. Chernikov rte_jhash_32b_2hashes(const uint32_t *k, uint32_t length, uint32_t *pc, uint32_t *pb)
252*537d1343SAlexander V. Chernikov {
253*537d1343SAlexander V. Chernikov __rte_jhash_2hashes((const void *) k, (length << 2), pc, pb, 0);
254*537d1343SAlexander V. Chernikov }
255*537d1343SAlexander V. Chernikov
256*537d1343SAlexander V. Chernikov /**
257*537d1343SAlexander V. Chernikov * The most generic version, hashes an arbitrary sequence
258*537d1343SAlexander V. Chernikov * of bytes. No alignment or length assumptions are made about
259*537d1343SAlexander V. Chernikov * the input key. For keys not aligned to four byte boundaries
260*537d1343SAlexander V. Chernikov * or a multiple of four bytes in length, the memory region
261*537d1343SAlexander V. Chernikov * just after may be read (but not used in the computation).
262*537d1343SAlexander V. Chernikov * This may cross a page boundary.
263*537d1343SAlexander V. Chernikov *
264*537d1343SAlexander V. Chernikov * @param key
265*537d1343SAlexander V. Chernikov * Key to calculate hash of.
266*537d1343SAlexander V. Chernikov * @param length
267*537d1343SAlexander V. Chernikov * Length of key in bytes.
268*537d1343SAlexander V. Chernikov * @param initval
269*537d1343SAlexander V. Chernikov * Initialising value of hash.
270*537d1343SAlexander V. Chernikov * @return
271*537d1343SAlexander V. Chernikov * Calculated hash value.
272*537d1343SAlexander V. Chernikov */
273*537d1343SAlexander V. Chernikov static inline uint32_t
rte_jhash(const void * key,uint32_t length,uint32_t initval)274*537d1343SAlexander V. Chernikov rte_jhash(const void *key, uint32_t length, uint32_t initval)
275*537d1343SAlexander V. Chernikov {
276*537d1343SAlexander V. Chernikov uint32_t initval2 = 0;
277*537d1343SAlexander V. Chernikov
278*537d1343SAlexander V. Chernikov rte_jhash_2hashes(key, length, &initval, &initval2);
279*537d1343SAlexander V. Chernikov
280*537d1343SAlexander V. Chernikov return initval;
281*537d1343SAlexander V. Chernikov }
282*537d1343SAlexander V. Chernikov
283*537d1343SAlexander V. Chernikov /**
284*537d1343SAlexander V. Chernikov * A special optimized version that handles 1 or more of uint32_ts.
285*537d1343SAlexander V. Chernikov * The length parameter here is the number of uint32_ts in the key.
286*537d1343SAlexander V. Chernikov *
287*537d1343SAlexander V. Chernikov * @param k
288*537d1343SAlexander V. Chernikov * Key to calculate hash of.
289*537d1343SAlexander V. Chernikov * @param length
290*537d1343SAlexander V. Chernikov * Length of key in units of 4 bytes.
291*537d1343SAlexander V. Chernikov * @param initval
292*537d1343SAlexander V. Chernikov * Initialising value of hash.
293*537d1343SAlexander V. Chernikov * @return
294*537d1343SAlexander V. Chernikov * Calculated hash value.
295*537d1343SAlexander V. Chernikov */
296*537d1343SAlexander V. Chernikov static inline uint32_t
rte_jhash_32b(const uint32_t * k,uint32_t length,uint32_t initval)297*537d1343SAlexander V. Chernikov rte_jhash_32b(const uint32_t *k, uint32_t length, uint32_t initval)
298*537d1343SAlexander V. Chernikov {
299*537d1343SAlexander V. Chernikov uint32_t initval2 = 0;
300*537d1343SAlexander V. Chernikov
301*537d1343SAlexander V. Chernikov rte_jhash_32b_2hashes(k, length, &initval, &initval2);
302*537d1343SAlexander V. Chernikov
303*537d1343SAlexander V. Chernikov return initval;
304*537d1343SAlexander V. Chernikov }
305*537d1343SAlexander V. Chernikov
306*537d1343SAlexander V. Chernikov static inline uint32_t
__rte_jhash_3words(uint32_t a,uint32_t b,uint32_t c,uint32_t initval)307*537d1343SAlexander V. Chernikov __rte_jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval)
308*537d1343SAlexander V. Chernikov {
309*537d1343SAlexander V. Chernikov a += RTE_JHASH_GOLDEN_RATIO + initval;
310*537d1343SAlexander V. Chernikov b += RTE_JHASH_GOLDEN_RATIO + initval;
311*537d1343SAlexander V. Chernikov c += RTE_JHASH_GOLDEN_RATIO + initval;
312*537d1343SAlexander V. Chernikov
313*537d1343SAlexander V. Chernikov __rte_jhash_final(a, b, c);
314*537d1343SAlexander V. Chernikov
315*537d1343SAlexander V. Chernikov return c;
316*537d1343SAlexander V. Chernikov }
317*537d1343SAlexander V. Chernikov
318*537d1343SAlexander V. Chernikov /**
319*537d1343SAlexander V. Chernikov * A special ultra-optimized versions that knows it is hashing exactly
320*537d1343SAlexander V. Chernikov * 3 words.
321*537d1343SAlexander V. Chernikov *
322*537d1343SAlexander V. Chernikov * @param a
323*537d1343SAlexander V. Chernikov * First word to calculate hash of.
324*537d1343SAlexander V. Chernikov * @param b
325*537d1343SAlexander V. Chernikov * Second word to calculate hash of.
326*537d1343SAlexander V. Chernikov * @param c
327*537d1343SAlexander V. Chernikov * Third word to calculate hash of.
328*537d1343SAlexander V. Chernikov * @param initval
329*537d1343SAlexander V. Chernikov * Initialising value of hash.
330*537d1343SAlexander V. Chernikov * @return
331*537d1343SAlexander V. Chernikov * Calculated hash value.
332*537d1343SAlexander V. Chernikov */
333*537d1343SAlexander V. Chernikov static inline uint32_t
rte_jhash_3words(uint32_t a,uint32_t b,uint32_t c,uint32_t initval)334*537d1343SAlexander V. Chernikov rte_jhash_3words(uint32_t a, uint32_t b, uint32_t c, uint32_t initval)
335*537d1343SAlexander V. Chernikov {
336*537d1343SAlexander V. Chernikov return __rte_jhash_3words(a + 12, b + 12, c + 12, initval);
337*537d1343SAlexander V. Chernikov }
338*537d1343SAlexander V. Chernikov
339*537d1343SAlexander V. Chernikov /**
340*537d1343SAlexander V. Chernikov * A special ultra-optimized versions that knows it is hashing exactly
341*537d1343SAlexander V. Chernikov * 2 words.
342*537d1343SAlexander V. Chernikov *
343*537d1343SAlexander V. Chernikov * @param a
344*537d1343SAlexander V. Chernikov * First word to calculate hash of.
345*537d1343SAlexander V. Chernikov * @param b
346*537d1343SAlexander V. Chernikov * Second word to calculate hash of.
347*537d1343SAlexander V. Chernikov * @param initval
348*537d1343SAlexander V. Chernikov * Initialising value of hash.
349*537d1343SAlexander V. Chernikov * @return
350*537d1343SAlexander V. Chernikov * Calculated hash value.
351*537d1343SAlexander V. Chernikov */
352*537d1343SAlexander V. Chernikov static inline uint32_t
rte_jhash_2words(uint32_t a,uint32_t b,uint32_t initval)353*537d1343SAlexander V. Chernikov rte_jhash_2words(uint32_t a, uint32_t b, uint32_t initval)
354*537d1343SAlexander V. Chernikov {
355*537d1343SAlexander V. Chernikov return __rte_jhash_3words(a + 8, b + 8, 8, initval);
356*537d1343SAlexander V. Chernikov }
357*537d1343SAlexander V. Chernikov
358*537d1343SAlexander V. Chernikov /**
359*537d1343SAlexander V. Chernikov * A special ultra-optimized versions that knows it is hashing exactly
360*537d1343SAlexander V. Chernikov * 1 word.
361*537d1343SAlexander V. Chernikov *
362*537d1343SAlexander V. Chernikov * @param a
363*537d1343SAlexander V. Chernikov * Word to calculate hash of.
364*537d1343SAlexander V. Chernikov * @param initval
365*537d1343SAlexander V. Chernikov * Initialising value of hash.
366*537d1343SAlexander V. Chernikov * @return
367*537d1343SAlexander V. Chernikov * Calculated hash value.
368*537d1343SAlexander V. Chernikov */
369*537d1343SAlexander V. Chernikov static inline uint32_t
rte_jhash_1word(uint32_t a,uint32_t initval)370*537d1343SAlexander V. Chernikov rte_jhash_1word(uint32_t a, uint32_t initval)
371*537d1343SAlexander V. Chernikov {
372*537d1343SAlexander V. Chernikov return __rte_jhash_3words(a + 4, 4, 4, initval);
373*537d1343SAlexander V. Chernikov }
374*537d1343SAlexander V. Chernikov
375*537d1343SAlexander V. Chernikov #ifdef __cplusplus
376*537d1343SAlexander V. Chernikov }
377*537d1343SAlexander V. Chernikov #endif
378*537d1343SAlexander V. Chernikov
379*537d1343SAlexander V. Chernikov #endif /* _RTE_JHASH_H */
380