@@ -844,33 +844,13 @@ Definition to_bool_cast_exec_def:
844844End
845845
846846
847- (* * unops and predicates for bitvectors **)
848- Definition bitv_1comp_def:
849- bitv_1comp (v:bool list) = MAP $~ v
850- End
851-
852- Definition bitv_2comp_def:
853- bitv_2comp (v:bool list) l =
854- let a = 2 ** l in
855- let b = v2n v in
856- if b ≤ a
857- then SOME $ fixwidth l $ n2v (a - b)
858- else NONE
859- End
860-
861- Definition bitv_unplus_def:
862- bitv_unplus (v:bool list) = v
863- End
864-
865847Definition unop_exec'_def:
866848 (unop_exec' unop_neg (v'_bool b) = SOME (v'_bool ~b))
867849 /\
868850 (unop_exec' unop_compl (v'_bit (bl,n)) = SOME (v'_bit (bitv_1comp bl, n)))
869851 /\
870852 (unop_exec' unop_neg_signed (v'_bit (bl,n)) =
871- case bitv_2comp bl n of
872- | SOME res => SOME (v'_bit (res, n))
873- | NONE => NONE )
853+ SOME (v'_bit (bitv_2comp bl, n)))
874854 /\
875855 (unop_exec' unop_un_plus (v'_bit bitv) = SOME (v'_bit bitv))
876856 /\
@@ -901,172 +881,6 @@ Definition e_exec_cast'_def:
901881 (e_exec_cast' _ _ = NONE )
902882End
903883
904- (* * binops **)
905- (* Translation: dimword (:a) to (v2n (REPLICATE (LENGTH a) T) + 1)
906- * UINT_MAXw to above minus 1 *)
907-
908- Definition bitv_ls_def:
909- bitv_ls a b = (v2n a <= v2n b)
910- End
911-
912- Definition bitv_hs_def:
913- bitv_hs a b = (v2n a >= v2n b)
914- End
915-
916- Definition bitv_lo_def:
917- bitv_lo a b = (v2n a < v2n b)
918- End
919-
920- Definition bitv_hi_def:
921- bitv_hi a b = (v2n a > v2n b)
922- End
923-
924- Definition bitv_eq_def:
925- bitv_eq a b = AND_EL (MAP bit_eq (ZIP (a, b)))
926- End
927-
928- Definition bitv_neq_def:
929- bitv_neq a b = ~bitv_eq a b
930- End
931-
932- Definition bitv_saturate_add_def:
933- bitv_saturate_add a b l =
934- let res = (v2n a) + (v2n b) in
935- let limit = (v2n (REPLICATE l T) + 1 ) in
936- if limit <= res
937- then SOME $ (fixwidth l $ n2v (limit - 1 ), l)
938- else SOME $ (fixwidth l $ n2v res, l)
939- End
940-
941- Definition bitv_saturate_sub_def:
942- bitv_saturate_sub a b l =
943- (* TODO: Need this so that the CakeML translator can work *)
944- let av = v2n a in
945- let bv = v2n b in
946- SOME $ (fixwidth l $ n2v (if bv ≤ av then (av - bv) else 0 ), l)
947- End
948-
949- Definition bitv_lsl_bv_def:
950- bitv_lsl_bv a b l =
951- SOME $ (fixwidth l (a++(REPLICATE (v2n b) F)), l)
952- End
953-
954- (* We could use l instead of LENGTH a, but that gives a precondition *)
955- Definition bitv_lsr_bv_def:
956- bitv_lsr_bv a b l =
957- SOME $ (TAKE (LENGTH a) ((REPLICATE (v2n b) F)++a), l)
958- End
959-
960- Definition bitv_mul_def:
961- bitv_mul a b l = SOME $ (fixwidth l $ n2v (v2n a * v2n b), l)
962- End
963-
964- Definition bitv_div_def:
965- bitv_div a b l =
966- let divisor = v2n b in
967- if divisor <> 0
968- then
969- SOME $ (fixwidth l $ n2v (v2n a DIV divisor), l)
970- else NONE
971- End
972-
973- Definition bitv_mod_def:
974- bitv_mod a b l =
975- let modulus = v2n b in
976- if modulus <> 0
977- then
978- SOME $ (fixwidth l $ n2v (v2n a MOD modulus), l)
979- else NONE
980- End
981-
982- Definition bitv_add_def:
983- bitv_add a b (l:num) = SOME $ (fixwidth l $ n2v (v2n a + v2n b), l)
984- End
985-
986- (* OLD
987- Definition bitv_sub_def:
988- bitv_sub a b (l:num) = bitv_add a (bitv_2comp b l) l
989- End
990- *)
991- (* Note that this guard can never yield the NONE case in practice,
992- * it's just needed for translation *)
993- Definition bitv_sub_def:
994- bitv_sub a b (l:num) =
995- case bitv_2comp b l of
996- | SOME res => bitv_add a res l
997- | NONE => NONE
998- End
999-
1000- Definition band'_def:
1001- band' a b = MAP (\(x,y). x /\ y) (ZIP(a, b))
1002- End
1003- Definition bitv_and_def:
1004- bitv_and a b (l:num) = SOME $ (band' a b, l)
1005- End
1006-
1007- Definition bor'_def:
1008- bor' (a:bool list) b = MAP (\(x,y). (x \/ y)) (ZIP(a, b))
1009- End
1010- Definition bitv_or_def:
1011- bitv_or a b (l:num) = SOME $ (bor' a b, l)
1012- End
1013-
1014- Definition bitv_xor_def:
1015- bitv_xor a b (l:num) = SOME $ (bxor a b, l)
1016- End
1017-
1018- (* TODO: Split the binop type into binops and binpreds, more efficient... *)
1019- Definition get_bitv_binpred'_def:
1020- get_bitv_binpred' binop =
1021- case binop of
1022- | binop_le => SOME bitv_ls
1023- | binop_ge => SOME bitv_hs
1024- | binop_lt => SOME bitv_lo
1025- | binop_gt => SOME bitv_hi
1026- | binop_neq => SOME bitv_neq
1027- | binop_eq => SOME bitv_eq
1028- | _ => NONE
1029- End
1030-
1031- Definition bitv_binpred'_def:
1032- bitv_binpred' binpred (v, n) (v', n') =
1033- if n = n'
1034- then
1035- (case get_bitv_binpred' binpred of
1036- | SOME bp =>
1037- SOME $ bp v v'
1038- | NONE => NONE )
1039- else NONE
1040- End
1041-
1042- Definition get_bitv_binop'_def:
1043- get_bitv_binop' binop =
1044- case binop of
1045- | binop_mul => SOME bitv_mul
1046- | binop_div => SOME bitv_div
1047- | binop_mod => SOME bitv_mod
1048- | binop_add => SOME bitv_add
1049- | binop_sat_add => SOME bitv_saturate_add
1050- | binop_sub => SOME bitv_sub
1051- | binop_sat_sub => SOME bitv_saturate_sub
1052- | binop_shl => SOME bitv_lsl_bv
1053- | binop_shr => SOME bitv_lsr_bv
1054- | binop_and => SOME bitv_and
1055- | binop_xor => SOME bitv_xor
1056- | binop_or => SOME bitv_or
1057- | _ => NONE
1058- End
1059-
1060- Definition bitv_binop'_def:
1061- bitv_binop' binop (v, n) (v', n') =
1062- if n = n'
1063- then
1064- (case get_bitv_binop' binop of
1065- | SOME bo => bo v v' n
1066- | NONE => NONE )
1067- else NONE
1068- End
1069-
1070884Definition binop_exec'_def:
1071885 (binop_exec' binop_mul (v'_bit bitv1) (v'_bit bitv2) =
1072886 case bitv_binop' binop_mul bitv1 bitv2 of
0 commit comments