summaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm/hash.h
blob: a881d784f04486b2335e3a91c143805aee11169a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#ifndef __ASM_X86_HASH_H
#define __ASM_X86_HASH_H

#include <linux/cpufeature.h>
#include <asm/alternative.h>

u32 __intel_crc4_2_hash(const void *data, u32 len, u32 seed);
u32 __intel_crc4_2_hash2(const u32 *data, u32 len, u32 seed);

/*
 * non-inline versions of jhash so gcc does not need to generate
 * duplicate code in every object file
 */
u32 __jhash(const void *data, u32 len, u32 seed);
u32 __jhash2(const u32 *data, u32 len, u32 seed);

/*
 * for documentation of these functions please look into
 * <include/asm-generic/hash.h>
 */

static inline u32 arch_fast_hash(const void *data, u32 len, u32 seed)
{
	u32 hash;

	alternative_call(__jhash, __intel_crc4_2_hash, X86_FEATURE_XMM4_2,
#ifdef CONFIG_X86_64
			 "=a" (hash), "D" (data), "S" (len), "d" (seed));
#else
			 "=a" (hash), "a" (data), "d" (len), "c" (seed));
#endif
	return hash;
}

static inline u32 arch_fast_hash2(const u32 *data, u32 len, u32 seed)
{
	u32 hash;

	alternative_call(__jhash2, __intel_crc4_2_hash2, X86_FEATURE_XMM4_2,
#ifdef CONFIG_X86_64
			 "=a" (hash), "D" (data), "S" (len), "d" (seed));
#else
			 "=a" (hash), "a" (data), "d" (len), "c" (seed));
#endif
	return hash;
}

#endif /* __ASM_X86_HASH_H */