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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
/*% c99 -O3 -Wall -o # %
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <stdint.h>
char *tok[] = {
"add", "sub", "div", "rem", "udiv", "urem", "mul",
"and", "or", "xor", "sar", "shr", "shl", "stored",
"stores", "storel", "storew", "storeh", "storeb",
"load", "loadsw", "loaduw", "loadsh", "loaduh",
"loadsb", "loadub", "extsw", "extuw", "extsh",
"extuh", "extsb", "extub", "exts", "truncd",
"stosi", "dtosi", "swtof", "sltof", "cast", "copy",
"alloc4", "alloc8", "alloc16", "culew", "cultw",
"cslew", "csltw", "csgtw", "csgew", "cugtw",
"cugew", "ceqw", "cnew", "culel", "cultl", "cslel",
"csltl", "csgtl", "csgel", "cugtl", "cugel",
"ceql", "cnel", "cles", "clts", "cgts", "cges",
"cnes", "ceqs", "cos", "cuos", "cled", "cltd",
"cgtd", "cged", "cned", "ceqd", "cod", "cuod",
"vaarg", "vastart", "...",
"call", "phi", "jmp", "jnz", "ret", "export",
"function", "type", "data", "align", "l", "w",
"h", "b", "d", "s", "z", "loadw", "loadl", "loads",
"loadd", "alloc1", "alloc2",
};
enum {
Ntok = sizeof tok / sizeof tok[0]
};
uint32_t th[Ntok];
uint32_t
hash(char *s)
{
uint32_t h;
h = 0;
for (; *s; ++s)
h = *s + 17*h;
return h;
}
int
main()
{
char *bmap;
uint32_t h, M, K;
int i, j;
bmap = malloc(1u << 31);
for (i=0; i<Ntok; ++i) {
h = hash(tok[i]);
for (j=0; j<i; ++j)
if (th[j] == h) {
printf("error: hash()\n");
printf("\t%s\n", tok[i]);
printf("\t%s\n", tok[j]);
exit(1);
}
th[i] = h;
}
for (i=0; 1<<i < Ntok; ++i);
M = 32 - i;
for (;; --M) {
printf("trying M=%d...\n", M);
K = 1;
do {
memset(bmap, 0, 1 << (32 - M));
for (i=0; i<Ntok; ++i) {
h = (th[i]*K) >> M;
if (bmap[h])
break;
bmap[h] = 1;
}
if (i==Ntok) {
printf("found K=%d for M=%d\n", K, M);
exit(0);
}
K += 2;
} while (K != 1);
}
}
|