diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/mono/builtins.sail | 57 | ||||
| -rw-r--r-- | test/mono/not-yet/builtins | 1 | ||||
| -rw-r--r-- | test/mono/not-yet/control_deps (renamed from test/mono/pass/control_deps) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/feature (renamed from test/mono/pass/feature) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/fnreduce (renamed from test/mono/pass/fnreduce) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/fnreduce_manual (renamed from test/mono/pass/fnreduce_manual) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/times8 (renamed from test/mono/pass/times8) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/union-exist (renamed from test/mono/pass/union-exist) | 0 | ||||
| -rw-r--r-- | test/mono/not-yet/union-exist_manual (renamed from test/mono/pass/union-exist_manual) | 0 | ||||
| -rw-r--r-- | test/mono/test_extra.lem | 17 |
10 files changed, 75 insertions, 0 deletions
diff --git a/test/mono/builtins.sail b/test/mono/builtins.sail new file mode 100644 index 00000000..e565ab58 --- /dev/null +++ b/test/mono/builtins.sail @@ -0,0 +1,57 @@ +$include <smt.sail> +$include <flow.sail> +default Order dec +type bits ('n : Int) = vector('n, dec, bit) +val operator & = "and_bool" : (bool, bool) -> bool +val eq_vec = {ocaml: "eq_list", lem: "eq_vec"} : forall 'n. (bits('n), bits('n)) -> bool +overload operator == = {eq_int, eq_vec} +val neq_vec = {lem: "neq"} : forall 'n. (bits('n), bits('n)) -> bool +function neq_vec (x, y) = not_bool(eq_vec(x, y)) +overload operator != = {neq_atom, neq_vec} +val vector_subrange = {ocaml: "subrange", lem: "subrange_vec_dec"} : forall ('n : Int) ('m : Int) ('o : Int), 'o <= 'm <= 'n. + (bits('n), atom('m), atom('o)) -> bits('m - ('o - 1)) +val mult_int = {ocaml: "mult", lem: "integerMult"} : (int, int) -> int +overload operator * = {mult_range, mult_int, mult_real} +val "extz_vec" : forall 'n 'm. (atom('m),vector('n, dec, bit)) -> vector('m, dec, bit) effect pure +val extz : forall 'n 'm. vector('n, dec, bit) -> vector('m, dec, bit) effect pure +function extz(v) = extz_vec(sizeof('m),v) +val "exts_vec" : forall 'n 'm. (atom('m),vector('n, dec, bit)) -> vector('m, dec, bit) effect pure +val exts : forall 'n 'm. vector('n, dec, bit) -> vector('m, dec, bit) effect pure +function exts(v) = exts_vec(sizeof('m),v) +val UInt = { + ocaml: "uint", + lem: "uint", + interpreter: "uint", + c: "sail_uint" +} : forall 'n. bits('n) -> range(0, 2 ^ 'n - 1) +val bitvector_cast = "zeroExtend" : forall 'n. bits('n) -> bits('n) effect pure +val slice = "slice" : forall ('n : Int) ('m : Int), 'm >= 0 & 'n >= 0. + (bits('m), int, atom('n)) -> bits('n) + +/* Test constant propagation's implementation of builtins + TODO: need some way to check that everything has propagated. */ + +register r8 : bits(8) +register r16 : bits(16) + +val test : bool -> unit effect {escape,rreg,wreg} + +function test(b) = { + let 'n : {'n, 'n in {8,16}. atom('n)} = if b then 8 else 16; + let x : bits('n) = match 'n { 8 => 0x12, 16 => 0x1234 }; + /* Constant propagation doesn't do registers, so uses of x' will be + evaluated at runtime */ + let x' : bits('n) = match 'n { 8 => {r8 = x; r8}, 16 => {r16 = x; r16} }; + let y : bits('n) = match 'n { 8 => 0x35, 16 => 0x5637 }; + assert(x != y); + assert(slice(x, 0, 4) == slice(x',0,4)); + assert(0x3 == slice(y, 4, 4)); + assert(UInt(x) == (match n { 8 => 18, 16 => 4660 })); +} + +val run : unit -> unit effect {escape,rreg,wreg} + +function run() = { + test(true); + test(false); +}
\ No newline at end of file diff --git a/test/mono/not-yet/builtins b/test/mono/not-yet/builtins new file mode 100644 index 00000000..3abb0198 --- /dev/null +++ b/test/mono/not-yet/builtins @@ -0,0 +1 @@ +builtins.sail -auto_mono
\ No newline at end of file diff --git a/test/mono/pass/control_deps b/test/mono/not-yet/control_deps index e173c42f..e173c42f 100644 --- a/test/mono/pass/control_deps +++ b/test/mono/not-yet/control_deps diff --git a/test/mono/pass/feature b/test/mono/not-yet/feature index 9363dd68..9363dd68 100644 --- a/test/mono/pass/feature +++ b/test/mono/not-yet/feature diff --git a/test/mono/pass/fnreduce b/test/mono/not-yet/fnreduce index 4237c34a..4237c34a 100644 --- a/test/mono/pass/fnreduce +++ b/test/mono/not-yet/fnreduce diff --git a/test/mono/pass/fnreduce_manual b/test/mono/not-yet/fnreduce_manual index 25d8256c..25d8256c 100644 --- a/test/mono/pass/fnreduce_manual +++ b/test/mono/not-yet/fnreduce_manual diff --git a/test/mono/pass/times8 b/test/mono/not-yet/times8 index 1315855d..1315855d 100644 --- a/test/mono/pass/times8 +++ b/test/mono/not-yet/times8 diff --git a/test/mono/pass/union-exist b/test/mono/not-yet/union-exist index ebb89267..ebb89267 100644 --- a/test/mono/pass/union-exist +++ b/test/mono/not-yet/union-exist diff --git a/test/mono/pass/union-exist_manual b/test/mono/not-yet/union-exist_manual index d35c3d48..d35c3d48 100644 --- a/test/mono/pass/union-exist_manual +++ b/test/mono/not-yet/union-exist_manual diff --git a/test/mono/test_extra.lem b/test/mono/test_extra.lem new file mode 100644 index 00000000..a567257c --- /dev/null +++ b/test/mono/test_extra.lem @@ -0,0 +1,17 @@ +open import Pervasives_extra +open import Sail_instr_kinds +open import Sail_values +open import Sail_operators_mwords +open import Prompt_monad +open import State + +let undefined_int () = (0:ii) +val undefined_bitvector : forall 'a. Size 'a => integer -> mword 'a +let undefined_bitvector len = duplicate B0 len + +val uint : forall 'a. Size 'a => mword 'a -> integer +let uint = unsigned + +val slice : forall 'a 'b. Size 'a, Size 'b => mword 'a -> integer -> integer -> mword 'b +let slice v lo len = + subrange_vec_dec v (lo + len - 1) lo |
