| 1 | functor 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 | |
| 43 | structure 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]) |
| 48 | structure 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 | *) |