Repository navigation
Expand file tree
/
Copy pathsmallint.ml
More file actions
108 lines (92 loc) · 3.22 KB
/
Copy pathsmallint.ml
File metadata and controls
108 lines (92 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
(* Simple, non-exhaustive tests for small ints (i8, i16). *)
let s32max = 0x7fffffffl
let s32min = 0x80000000l
let u32max = 0xffffffffl
let u32min = 0l
(* Smaller ints are stored sign extended in an Int32. *)
let s16max = 32767l
let s16min = -32768l
let u16max = u32max
let u16min = 0l
let s8max = 127l
let s8min = -128l
let u8max = u32max
let u8min = 0l
let assert_equal x y =
if x <> y then raise (Failure
(Printf.sprintf "Expected: %ld, but got %ld." x y))
let () =
(* test addition wrap around *)
assert_equal u32min (I32.add u32max 1l);
assert_equal u16min (I16.add u16max 1l);
assert_equal u8min (I8.add u8max 1l);
assert_equal s32min (I32.add s32max 1l);
assert_equal s16min (I16.add s16max 1l);
assert_equal s8min (I8.add s8max 1l);
(* test subtraction wrap around *)
assert_equal u32max (I32.sub u32min 1l);
assert_equal u16max (I16.sub u16min 1l);
assert_equal u8max (I8.sub u8min 1l);
assert_equal s32max (I32.sub s32min 1l);
assert_equal s16max (I16.sub s16min 1l);
assert_equal s8max (I8.sub s8min 1l);
(* test mul wrap around *)
assert_equal 1l (I32.mul u32max u32max);
assert_equal 1l (I16.mul u16max u16max);
assert_equal 1l (I8.mul u8max u8max);
assert_equal 1l (I32.mul s32max s32max);
assert_equal 1l (I16.mul s16max s16max);
assert_equal 1l (I8.mul s8max s8max);
(* test add_sat_s *)
assert_equal s16max (I16.add_sat_s s16max 1l);
assert_equal s8max (I8.add_sat_s s8max 1l);
assert_equal u16max (I16.add_sat_u u16max 1l);
assert_equal u8max (I8.add_sat_u u8max 1l);
(* test sub_sat_s *)
assert_equal s16min (I16.sub_sat_s s16min 1l);
assert_equal s8min (I8.sub_sat_s s8min 1l);
assert_equal 0l (I16.sub_sat_u 0l 1l);
assert_equal 0l (I8.sub_sat_u 0l 1l);
(* test div wrap around *)
try
ignore (I32.div_s s32min (-1l));
ignore (I16.div_s s16min (-1l));
ignore (I8.div_s s8min (-1l));
assert false
with Ixx.Overflow ->
();
(* test shifts overflow *)
assert_equal s16min (I16.shl 16384l 1l);
assert_equal s8min (I8.shl 64l 1l);
assert_equal 0x7fffl (I16.shr_u u16max 1l);
assert_equal 0x7fl (I8.shr_u u8max 1l);
(* check that the top bits are not messed with *)
assert_equal u16max (I16.shr_u u16max 0l);
assert_equal u8max (I8.shr_u u8max 0l);
(* check rotation *)
assert_equal 1l (I16.rotl s16min 1l);
assert_equal 1l (I8.rotl s8min 1l);
assert_equal s16min (I16.rotl 0x4000l 1l);
assert_equal s8min (I8.rotl 0x40l 1l);
assert_equal s32min (I32.rotr 1l 1l);
assert_equal s16min (I16.rotr 1l 1l);
assert_equal s8min (I8.rotr 1l 1l);
assert_equal 1l (I32.rotr s32min 31l);
assert_equal 1l (I16.rotr s16min 15l);
assert_equal 1l (I8.rotr s8min 7l);
assert_equal 0x40000000l (I32.rotr s32min 1l);
assert_equal 0x4000l (I16.rotr s16min 1l);
assert_equal 0x40l (I8.rotr s8min 1l);
(* check clz *)
assert_equal 0l (I16.clz s16min);
assert_equal 0l (I8.clz s8min);
assert_equal 1l (I16.clz s16max);
assert_equal 1l (I8.clz s8max);
(* check popcnt *)
assert_equal 1l (I32.popcnt s32min);
assert_equal 1l (I16.popcnt s16min);
assert_equal 1l (I8.popcnt s8min);
assert_equal 16l (I16.popcnt (-1l));
assert_equal 8l (I8.popcnt (-1l));
assert_equal 15l (I16.popcnt s16max);
assert_equal 7l (I8.popcnt s8max);