summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lem_interp/interp_lib.lem27
-rw-r--r--src/type_internal.ml6
2 files changed, 32 insertions, 1 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
index 696e0547..860f76d7 100644
--- a/src/lem_interp/interp_lib.lem
+++ b/src/lem_interp/interp_lib.lem
@@ -242,6 +242,32 @@ let rec arith_op_overflow_vec op sign size (V_tuple args) = match args with
| [V_unknown;_] -> V_tuple [V_unknown;V_unknown]
| [_;V_unknown] -> V_tuple [V_unknown;V_unknown]
end ;;
+let rec arith_op_overflow_vec_bit op sign size (V_tuple args) = match args with
+ | [(V_vector b ord cs as l1);(V_lit (L_aux L_one li))] ->
+ let l1' = to_num sign l1 in
+ let n = arith_op op (V_tuple [l1';(V_lit (L_aux (L_num 1) li))]) in
+ let correct_size_num = to_vec ord ((List.length cs) * size) n in
+ let one_larger = to_num Signed (to_vec ord (((List.length cs) * size) +1) n) in
+ let overflow = neq (V_tuple [correct_size_num;one_larger]) in
+ V_tuple [correct_size_num;overflow]
+ | [(V_vector b ord cs as l1);(V_lit (L_aux L_zero li))] ->
+ let l1' = to_num sign l1 in
+ let n = arith_op op (V_tuple [l1';(V_lit (L_aux (L_num 0) li))]) in
+ let correct_size_num = to_vec ord ((List.length cs) * size) n in
+ let one_larger = to_num Signed (to_vec ord (((List.length cs) * size) +1) n) in
+ let overflow = neq (V_tuple [correct_size_num;one_larger]) in
+ V_tuple [correct_size_num;overflow]
+ | [V_track v1 r1;V_track v2 r2] ->
+ taint (arith_op_overflow_vec_bit op sign size (V_tuple [v1;v2])) (r1++r2)
+ | [V_track v1 r1;v2] ->
+ taint (arith_op_overflow_vec_bit op sign size (V_tuple [v1;v2])) r1
+ | [v1;V_track v2 r2] ->
+ taint (arith_op_overflow_vec_bit op sign size (V_tuple [v1;v2])) r2
+ | [V_unknown;_] -> V_tuple [V_unknown;V_unknown]
+ | [_;V_unknown] -> V_tuple [V_unknown;V_unknown]
+end ;;
+
+
let rec arith_op_range_vec op sign size (V_tuple args) = match args with
| [V_track v1 r1;V_track v2 r2] ->
taint (arith_op_range_vec op sign size (V_tuple [v1;v2])) (r1++r2)
@@ -441,6 +467,7 @@ let function_map = [
("add_vec_vec_range_signed", arith_op_vec_vec_range (+) Signed);
("add_vec_bit_signed", arith_op_vec_bit (+) Signed 1);
("add_overflow_vec_signed", arith_op_overflow_vec (+) Signed 1);
+ ("add_overflow_vec_bit_signed", arith_op_overflow_vec_bit (+) Signed 1);
("minus", arith_op (-));
("minus_vec", arith_op_vec (-) Unsigned 1);
("minus_vec_range", arith_op_vec_range (-) Unsigned 1);
diff --git a/src/type_internal.ml b/src/type_internal.ml
index 2ae210da..e2399d88 100644
--- a/src/type_internal.ml
+++ b/src/type_internal.ml
@@ -964,7 +964,11 @@ let initial_typ_env =
Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
(mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t])
(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))),
- External (Some "add_vec_bit"), [], pure_e);
+ External (Some "add_vec_bit_signed"), [], pure_e);
+ Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
+ (mk_pure_fun (mk_tup [mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p"); bit_t])
+ (mk_tup [(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")); bit_t]))),
+ External (Some "add_overflow_vec_bit_signed"), [], pure_e);
Base(((mk_nat_params ["o";"p"]@(mk_ord_params["ord"])),
(mk_pure_fun (mk_tup [bit_t; mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")])
(mk_vector bit_t (Ovar "ord") (Nvar "o") (Nvar "p")))),