summaryrefslogtreecommitdiff
path: root/src/new32.c
blob: 9136115c753562ffb9822286434d11129c42acb1 (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
#include <stdint.h>

static const unsigned int divtab[244] = {
	[1] = 0xffff + 1l,
	[3] = 0x5555 + 1l,
	[9] = 0x1c71 + 1l,
	[27] = 0x097b + 1l,
	[81] = 0x0329 + 1l,
	[243] = 0x010d + 1l
};

#define FASTDIV(n, C) (((n) * (C)) >> 16)
#define FASTMOD(n, d, C) ((n) - (d) * FASTDIV((n), (C)))

int new32(int i, int x, int y)
{
	int A, B, C;

	A = FASTDIV(i, divtab[y]);
	B = FASTMOD(A, 3, divtab[3]);
	C = FASTMOD(A + x, 3, divtab[3]);

	return i + (C - B) * y;
}