summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKathy Gray2014-11-23 13:55:53 +0000
committerKathy Gray2014-11-23 13:57:59 +0000
commit87e4144957bebc63f690e66ff29c1f0e90c136a3 (patch)
treece600e9f591e04f64439ecdef2b7cbdecd5fb5e2 /src
parent99f4b57d01d500fb79f98802c1fbb18568dcc096 (diff)
properly name division operators in lib
Diffstat (limited to 'src')
-rw-r--r--src/lem_interp/interp_lib.lem20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/lem_interp/interp_lib.lem b/src/lem_interp/interp_lib.lem
index bdd5fcca..63faf4fe 100644
--- a/src/lem_interp/interp_lib.lem
+++ b/src/lem_interp/interp_lib.lem
@@ -371,6 +371,24 @@ let rec arith_op_vec_no0 op sign size (V_tuple args) = match args with
| [V_unknown;_] -> V_unknown
| [_;V_unknown] -> V_unknown
end ;;
+let rec arith_op_overflow_vec_no0 op sign size (V_tuple args) = match args with
+ | [(V_vector b ord cs as l1);(V_vector _ _ _ as l2)] ->
+ let (l1',l2') = (to_num sign l1,to_num sign l2) in
+ let n = arith_op_no0 op (V_tuple [l1';l2']) in
+ let correct_size_num = to_vec ord ((List.length cs) * size) n in
+ let one_larger = to_num sign (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 op sign size (V_tuple [v1;v2])) (r1++r2)
+ | [V_track v1 r1;v2] ->
+ taint (arith_op_overflow_vec op sign size (V_tuple [v1;v2])) r1
+ | [v1;V_track v2 r2] ->
+ taint (arith_op_overflow_vec 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_vec_range_no0 op sign size (V_tuple args) = match args with
| [V_track v1 r1;V_track v2 r2] ->
taint (arith_op_vec_range_no0 op sign size (V_tuple [v1;v2])) (r1++r2)
@@ -501,7 +519,9 @@ let function_map = [
("mod_vec_range", arith_op_vec_range_no0 (mod) Unsigned 1);
("quot", arith_op_no0 (/));
("quot_vec", arith_op_vec_no0 (/) Unsigned 1);
+ ("quot_overflow_vec", arith_op_overflow_vec_no0 (/) Unsigned 1);
("quot_vec_signed", arith_op_vec_no0 (/) Signed 1);
+ ("quot_overflow_vec_signed", arith_op_overflow_vec_no0 (/) Signed 1);
("eq", eq);
("eq_vec_range", eq_vec_range);
("eq_range_vec", eq_range_vec);