6 val fromInt
: int -> word
8 val rol
: word * Word.word -> word
9 val ror
: word * Word.word -> word
10 val toString
: word -> string
17 val rots
= List.tabulate (wordSize
+ 1, Word.fromInt
)
19 fun p w
= print (concat
[toString w
, "\n"])
22 val _
= List.app (p
o ~
) trials
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
]
38 (fn w
=> List.app (fn w
' => p (oper (w
, w
'))) rots
)
43 structure Z
= F (open Word MLton
.Word
45 val max
: word = 0wxFFFFFFFF
46 val trials
: word list
=
47 [0w0
, 0w1
, 0wxF
, 0wx7F7F7F7F
, 0wxFFFFFFFF
])
48 structure Z
= F (open Word8 MLton
.Word8
51 val trials
: word list
=
52 [0w0
, 0w1
, 0wxF
, 0wx7F
, 0wxFF
])
55 (* Test unsigned addition
and multiplication
with overflow checking
. *)
57 * (MLton
.Word.addCheck (0wxFFFFFFFF
, 0wx1
)
59 * handle Overflow
=> print
"OK\n"
61 * fun doit (name
, f
, all
) =
65 * val _
= print (concat
["0x", Word.toString w
, " ", name
, " ",
66 * "0x", Word.toString w
'])
68 * val _
= print (concat
[" = ", Word.toString res
, "\n"])
71 * end handle Overflow
=> print
" --> Overflow\n")
74 * val _
= doit ("+", MLton
.Word.addCheck
,
75 * [(0wx7FFFFFFF
, 0wx1
),
76 * (0wxFFFFFFFE
, 0wx1
),
77 * (0wxFFFFFFFD
, 0wx2
),
78 * (0wxFFFFFFFF
, 0wx1
)])
80 * val _
= doit ("*", MLton
.Word.mulCheck
,
81 * [(0wxFFFFFFFF
, 0wx1
),
82 * (0wx7FFFFFFF
, 0wx2
),
83 * (0wx80000000
, 0wx2
),
84 * (0wxFFFFFFFF
, 0wx2
)])