summaryrefslogtreecommitdiff
path: root/src/lem_interp/interp_lib.lem
diff options
context:
space:
mode:
Diffstat (limited to 'src/lem_interp/interp_lib.lem')
-rw-r--r--src/lem_interp/interp_lib.lem15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
index cd656f1e..483253b6 100644
--- a/src/lem_interp/interp_lib.lem
+++ b/src/lem_interp/interp_lib.lem
@@ -333,7 +333,18 @@ let rec arith_op_vec_no0 op size (V_tuple args) = match args with
| [V_unknown;_] -> V_unknown
| [_;V_unknown] -> V_unknown
end ;;
-
+let rec arith_op_vec_range_no0 op size (V_tuple args) = match args with
+ | [V_track v1 r1;V_track v2 r2] ->
+ taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) (r1++r2)
+ | [V_track v1 r1; v2] ->
+ taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) r1
+ | [v1;V_track v2 r2] ->
+ taint (arith_op_vec_range_no0 op size (V_tuple [v1;v2])) r2
+ | [V_unknown;_] -> V_unknown
+ | [_;V_unknown] -> V_unknown
+ | [(V_vector _ ord cs as l1);n] ->
+ arith_op_vec_no0 op size (V_tuple [l1;(to_vec ord (List.length cs) n)])
+end ;;
let rec compare_op op (V_tuple args) = match args with
| [V_track v1 r1;V_track v2 r2] ->
@@ -435,7 +446,7 @@ let function_map = [
("mult_overload_vec", arith_op_overflow_vec ( * ) 2);
("mod", arith_op_no0 (mod));
("mod_vec", arith_op_vec_no0 (mod) 1);
- ("mod_vec_range", arith_op_vec_range (mod) 1);
+ ("mod_vec_range", arith_op_vec_range_no0 (mod) 1);
("quot", arith_op_no0 (/));
("quot_vec", arith_op_vec_no0 (/) 1);
("eq", eq);