Import Upstream version 20180207
[hcoop/debian/mlton.git] / regression / int-inf.bitops.sml
CommitLineData
7f918cf1
CE
1fun pr i = (print (IntInf.fmt StringCvt.HEX i);
2 print "\n")
3
4fun 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
12fun prUn oper a c =
13 (print " A: ";
14 pr a;
15 print (oper ^ " A: ");
16 pr c)
17
18fun 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
29fun mkInt i n = if n = 0
30 then i
31 else mkInt (IntInf.+ (IntInf.* (i, IntInf.fromInt 10),i))
32 (n - 1)
33
34val mkInt = fn i => fn n => mkInt (IntInf.fromInt i) n
35
36fun 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
44fun 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
53fun tryUn' a =
54 let
55 val _ = prUn "!" a (IntInf.notb a)
56 in
57 ()
58 end
59fun tryUn a =
60 let
61 val _ = tryUn' a
62 val _ = tryUn' (IntInf.~ a)
63 in
64 ()
65 end
66fun 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
75fun trySh a =
76 let
77(*
78 val _ = trySh' a
79*)
80 val _ = trySh' (IntInf.~ a)
81 in
82 ()
83 end
84
85fun 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
107val _ = loop (0, 0) (3, 3)
108val _ = loop (0, 8) (3, 10)
109val _ = loop (0, 20) (3, 22)
110val _ = loop (0, 30) (3, 31)