Import Upstream version 20180207
[hcoop/debian/mlton.git] / regression / mlton.word.sml
CommitLineData
7f918cf1
CE
1functor F (S: sig
2 type word
3
4 val trials: word list
5 val ~ : word -> word
6 val fromInt: int -> word
7 val max: word
8 val rol: word * Word.word -> word
9 val ror: word * Word.word -> word
10 val toString: word -> string
11 val wordSize: int
12 val zero: word
13 end) =
14 struct
15 open S
16
17 val rots = List.tabulate (wordSize + 1, Word.fromInt)
18
19 fun p w = print (concat [toString w, "\n"])
20
21 (* Test ~ *)
22 val _ = List.app (p o ~) trials
23
24 (* Test Algebraic simplifications. *)
25 val _ = List.app (fn w => p (rol (w, 0w0))) trials
26 val _ = List.app (fn w => p (ror (w, 0w0))) trials
27 val _ = List.app (fn w => p (rol (w, Word.fromInt wordSize))) trials
28 val _ = List.app (fn w => p (ror (w, Word.fromInt wordSize))) trials
29 val _ = List.app (fn w => p (rol (zero, w))) [0w1, 0w2, 0w3]
30 val _ = List.app (fn w => p (ror (zero, w))) [0w1, 0w2, 0w3]
31 val _ = List.app (fn w => p (rol (max, w))) [0w1, 0w2, 0w3]
32 val _ = List.app (fn w => p (ror (max, w))) [0w1, 0w2, 0w3]
33
34 val _ =
35 List.app
36 (fn oper =>
37 List.app
38 (fn w => List.app (fn w' => p (oper (w, w'))) rots)
39 trials)
40 [rol, ror]
41 end
42
43structure Z = F (open Word MLton.Word
44 val zero: word = 0w0
45 val max: word = 0wxFFFFFFFF
46 val trials: word list =
47 [0w0, 0w1, 0wxF, 0wx7F7F7F7F, 0wxFFFFFFFF])
48structure Z = F (open Word8 MLton.Word8
49 val zero: word = 0w0
50 val max: word = 0wxFF
51 val trials: word list =
52 [0w0, 0w1, 0wxF, 0wx7F, 0wxFF])
53
54
55(* Test unsigned addition and multiplication with overflow checking. *)
56(* val _ =
57 * (MLton.Word.addCheck (0wxFFFFFFFF, 0wx1)
58 * ; print "BUG\n")
59 * handle Overflow => print "OK\n"
60 *
61 * fun doit (name, f, all) =
62 * List.app
63 * (fn (w, w') =>
64 * let
65 * val _ = print (concat ["0x", Word.toString w, " ", name, " ",
66 * "0x", Word.toString w'])
67 * val res = f (w, w')
68 * val _ = print (concat [" = ", Word.toString res, "\n"])
69 * in
70 * ()
71 * end handle Overflow => print " --> Overflow\n")
72 * all
73 *
74 * val _ = doit ("+", MLton.Word.addCheck,
75 * [(0wx7FFFFFFF, 0wx1),
76 * (0wxFFFFFFFE, 0wx1),
77 * (0wxFFFFFFFD, 0wx2),
78 * (0wxFFFFFFFF, 0wx1)])
79 *
80 * val _ = doit ("*", MLton.Word.mulCheck,
81 * [(0wxFFFFFFFF, 0wx1),
82 * (0wx7FFFFFFF, 0wx2),
83 * (0wx80000000, 0wx2),
84 * (0wxFFFFFFFF, 0wx2)])
85 *)