Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | fun pr i = (print (IntInf.fmt StringCvt.HEX i); |
2 | print "\n") | |
3 | ||
4 | fun prBin oper a b c = | |
5 | (print " A: "; | |
6 | pr a; | |
7 | print " B: "; | |
8 | pr b; | |
9 | print ("A " ^ oper ^ " B: "); | |
10 | pr c) | |
11 | ||
12 | fun prUn oper a c = | |
13 | (print " A: "; | |
14 | pr a; | |
15 | print (oper ^ " A: "); | |
16 | pr c) | |
17 | ||
18 | fun prSh oper w a c = | |
19 | let | |
20 | val s = Word.fmt StringCvt.HEX w | |
21 | val sp = CharVector.tabulate(String.size s, fn _ => #" ") | |
22 | in | |
23 | print (" " ^ sp ^ "A: "); | |
24 | pr a; | |
25 | print ("A " ^ oper ^ " " ^ s ^ ": "); | |
26 | pr c | |
27 | end | |
28 | ||
29 | fun mkInt i n = if n = 0 | |
30 | then i | |
31 | else mkInt (IntInf.+ (IntInf.* (i, IntInf.fromInt 10),i)) | |
32 | (n - 1) | |
33 | ||
34 | val mkInt = fn i => fn n => mkInt (IntInf.fromInt i) n | |
35 | ||
36 | fun tryBin' (a, b) = | |
37 | let | |
38 | val _ = prBin "&" a b (IntInf.andb (a, b)) | |
39 | val _ = prBin "|" a b (IntInf.orb (a, b)) | |
40 | val _ = prBin "^" a b (IntInf.xorb (a, b)) | |
41 | in | |
42 | () | |
43 | end | |
44 | fun tryBin (a, b) = | |
45 | let | |
46 | val _ = tryBin' (a, b) | |
47 | val _ = tryBin' (IntInf.~ a, b) | |
48 | val _ = tryBin' (a, IntInf.~ b) | |
49 | val _ = tryBin' (IntInf.~ a, IntInf.~ b) | |
50 | in | |
51 | () | |
52 | end | |
53 | fun tryUn' a = | |
54 | let | |
55 | val _ = prUn "!" a (IntInf.notb a) | |
56 | in | |
57 | () | |
58 | end | |
59 | fun tryUn a = | |
60 | let | |
61 | val _ = tryUn' a | |
62 | val _ = tryUn' (IntInf.~ a) | |
63 | in | |
64 | () | |
65 | end | |
66 | fun trySh' a = | |
67 | let | |
68 | val _ = List.app (fn w => prSh "~>>" w a (IntInf.~>> (a, w))) | |
69 | [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] | |
70 | val _ = List.app (fn w => prSh " <<" w a (IntInf.<< (a, w))) | |
71 | [0wx0, 0wx1, 0wx2, 0wxF, 0wx10, 0wx11, 0wx12] | |
72 | in | |
73 | () | |
74 | end | |
75 | fun trySh a = | |
76 | let | |
77 | (* | |
78 | val _ = trySh' a | |
79 | *) | |
80 | val _ = trySh' (IntInf.~ a) | |
81 | in | |
82 | () | |
83 | end | |
84 | ||
85 | fun loop (n', m') (n, m) = | |
86 | let | |
87 | fun loop' i = | |
88 | let | |
89 | fun loop'' j = | |
90 | if j > m | |
91 | then loop' (i + 1) | |
92 | else (tryBin (mkInt i j, mkInt i j); | |
93 | tryBin (mkInt i j, mkInt (i + 1) j); | |
94 | tryBin (mkInt i j, mkInt i (j + 1)); | |
95 | tryBin (mkInt i j, mkInt (i + 1) (j + 1)); | |
96 | tryUn (mkInt i j); | |
97 | trySh (mkInt i j); | |
98 | loop'' (j + 1)) | |
99 | in | |
100 | if i > n | |
101 | then () | |
102 | else loop'' m' | |
103 | end | |
104 | in | |
105 | loop' n' | |
106 | end | |
107 | val _ = loop (0, 0) (3, 3) | |
108 | val _ = loop (0, 8) (3, 10) | |
109 | val _ = loop (0, 20) (3, 22) | |
110 | val _ = loop (0, 30) (3, 31) |