Ltac comput val :=
  let x := fresh in set val as x in *; vm_compute in x; subst x.Remark small_shift_amount_1:
  forall i,
  Int64.ltu i Int64.iwordsize = true ->
  Int.ltu (Int64.loword i) Int64.iwordsize' = true
  /\ Int64.unsigned i = Int.unsigned (Int64.loword i).Remark small_shift_amount_2:
  forall i,
  Int64.ltu i (Int64.repr 32) = true ->
  Int.ltu (Int64.loword i) Int.iwordsize = true.

(* Specifications: *)
Lemma small_shift_amount_3: forall i, Int.ltu i Int64.iwordsize' = true -> Int64.unsigned (Int64.repr (Int.unsigned i)) = Int.unsigned i.
Lemma make_shl_correct: binary_constructor_correct make_shl sem_shl.
Lemma make_shr_correct: binary_constructor_correct make_shr sem_shr.
Lemma make_cmp_correct: forall cmp a tya b tyb c va vb v e le m, sem_cmp cmp va tya vb tyb m = Some v -> make_cmp cmp a tya b tyb = OK c -> eval_expr ge e le m a va -> eval_expr ge e le m b vb -> eval_expr ge e le m c v.
Lemma transl_unop_correct: forall op a tya c va v e le m, transl_unop op a tya = OK c -> sem_unary_operation op va tya = Some v -> eval_expr ge e le m a va -> eval_expr ge e le m c v.
Lemma transl_binop_correct: forall op a tya b tyb c va vb v e le m, transl_binop op a tya b tyb = OK c -> sem_binary_operation op va tya vb tyb m = Some v -> eval_expr ge e le m a va -> eval_expr ge e le m b vb -> eval_expr ge e le m c v.
Lemma make_load_correct: forall addr ty code b ofs v e le m, make_load addr ty = OK code -> eval_expr ge e le m addr (Vptr b ofs) -> deref_loc ty m b ofs v -> eval_expr ge e le m code v.
Lemma make_store_correct: forall addr ty rhs code e le m b ofs v m' f k, make_store addr ty rhs = OK code -> eval_expr ge e le m addr (Vptr b ofs) -> eval_expr ge e le m rhs v -> assign_loc ty m b ofs v m' -> CSharpMin_corestep ge (CSharpMin_State f code k e le) m (CSharpMin_State f Sskip k e le) m'.
Lemma make_store_correct_StoreEffect: forall addr ty rhs code e le m b ofs v m' f k, make_store addr ty rhs = OK code -> eval_expr ge e le m addr (Vptr b ofs) -> eval_expr ge e le m rhs v -> assign_loc ty m b ofs v m' -> match access_mode ty with By_value chunk => effstep csharpmin_eff_sem ge (StoreEffect (Vptr b ofs) (encode_val chunk v)) (CSharpMin_State f code k e le) m (CSharpMin_State f Sskip k e le) m' | By_copy => True (*WILL be needed for builtin: exists b' ofs', v = Vptr b' ofs' /\ effstep csharpmin_eff_sem ge (BuiltinEffect ge (ef_sig (EF_memcpy (sizeof ty) (alignof_blockcopy ty))) (Vptr b ofs :: Vptr b' ofs' :: nil) m) (CSharpMin_State f code k e le) m (CSharpMin_State f Sskip k e le) m'*) | _ => False end.
Lemma make_store_correct_AssignlocEffect: forall addr ty rhs code e le m b ofs v m' f k, make_store addr ty rhs = OK code -> eval_expr ge e le m addr (Vptr b ofs) -> eval_expr ge e le m rhs v -> assign_loc ty m b ofs v m' -> effstep csharpmin_eff_sem ge (assign_loc_Effect ty b ofs v) (CSharpMin_State f code k e le) m (CSharpMin_State f Sskip k e le) m'.
Lemma symbols_preserved: forall s, Genv.find_symbol tge s = Genv.find_symbol ge s.
Lemma functions_translated: forall v f, Genv.find_funct ge v = Some f -> exists tf, Genv.find_funct tge v = Some tf /\ transl_fundef f = OK tf.
Lemma function_ptr_translated: forall b f, Genv.find_funct_ptr ge b = Some f -> exists tf, Genv.find_funct_ptr tge b = Some tf /\ transl_fundef f = OK tf.
Lemma var_info_translated: forall b v, Genv.find_var_info ge b = Some v -> exists tv, Genv.find_var_info tge b = Some tv /\ transf_globvar transl_globvar v = OK tv.
Lemma var_info_rev_translated: forall b tv, Genv.find_var_info tge b = Some tv -> exists v, Genv.find_var_info ge b = Some v /\ transf_globvar transl_globvar v = OK tv.
Lemma block_is_volatile_preserved: forall b, block_is_volatile tge b = block_is_volatile ge b.