aboutsummaryrefslogtreecommitdiffstats
path: root/lfsr2.c
blob: 5c40bf9f4ebd0eeeb15acb81b9380a20d439d3bb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <linux/kernel.h>

void mix_lfsr2(u32 h[4], const u32 v[4])
{
	size_t i;
	u32 w;

#define R(a) ({ \
	u32 x = (a); \
	x ^= rol32(x,  1) ^ rol32(x,  2); \
	x ^= rol32(x,  7) ^ rol32(x, 14); \
	x ^= rol32(x, 12) ^ rol32(x, 24); \
	x; \
})
	for (i = 0; i < 4; ++i) {
		h[0] ^= v[i];
		w = R(h[0]) ^ (h[0] << 1) ^ (h[2] << 2) ^ R(h[3]);
		h[0] = h[1];
		h[1] = h[2];
		h[2] = h[3];
		h[3] = w;
	}
#undef R
}