open Preamble open Assembly open Status open Fetch open BitVectorTrie open String open Exp open Arithmetic open Vector open FoldStuff open BitVector open Extranat open Integers open AST open LabelledObjects open Proper open PositiveMap open Deqsets open ErrorMessages open PreIdentifiers open Errors open Extralib open Setoids open Monad open Option open Div_and_mod open Jmeq open Russell open Util open List open Lists open Bool open Relations open Nat open Positive open Hints_declaration open Core_notation open Pts open Logic open Types open Identifiers open CostLabel open ASM open PolicyFront (** val jump_expansion_step : ASM.labelled_instruction List.list Types.sig0 -> Fetch.label_map Types.sig0 -> PolicyFront.ppc_pc_map Types.sig0 -> (Bool.bool, PolicyFront.ppc_pc_map Types.option) Types.prod Types.sig0 **) let jump_expansion_step program labels old_sigma = (let { Types.fst = final_added; Types.snd = final_policy } = Types.pi1 (FoldStuff.foldl_strong (Types.pi1 program) (fun prefix x tl _ acc -> (let { Types.fst = inc_added; Types.snd = inc_pc_sigma } = Types.pi1 acc in (fun _ -> (let { Types.fst = label; Types.snd = instr } = x in (fun _ -> let add_instr = match instr with | ASM.Instruction i -> PolicyFront.jump_expansion_step_instruction (Types.pi1 labels) (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) i | ASM.Comment x0 -> Types.None | ASM.Cost x0 -> Types.None | ASM.Jmp j -> Types.Some (PolicyFront.select_jump_length (Types.pi1 labels) (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) j) | ASM.Jnz (x0, x1, x2) -> Types.None | ASM.Call c -> Types.Some (PolicyFront.select_call_length (Types.pi1 labels) (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) c) | ASM.Mov (x0, x1, x2) -> Types.None in let { Types.fst = inc_pc; Types.snd = inc_sigma } = inc_pc_sigma in let old_length = (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (List.length prefix)) (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd = Assembly.Short_jump }).Types.snd in let old_size = PolicyFront.instruction_size_jmplen old_length instr in let { Types.fst = new_length; Types.snd = isize } = match add_instr with | Types.None -> { Types.fst = Assembly.Short_jump; Types.snd = (PolicyFront.instruction_size_jmplen Assembly.Short_jump instr) } | Types.Some pl -> { Types.fst = (PolicyFront.max_length old_length pl); Types.snd = (PolicyFront.instruction_size_jmplen (PolicyFront.max_length old_length pl) instr) } in let new_added = match add_instr with | Types.None -> inc_added | Types.Some x0 -> Nat.plus inc_added (Nat.minus isize old_size) in let old_Slength = (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S (List.length prefix))) (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd = Assembly.Short_jump }).Types.snd in let updated_sigma = BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S (List.length prefix))) { Types.fst = (Nat.plus inc_pc isize); Types.snd = old_Slength } (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (List.length prefix)) { Types.fst = inc_pc; Types.snd = new_length } inc_sigma) in { Types.fst = new_added; Types.snd = { Types.fst = (Nat.plus inc_pc isize); Types.snd = updated_sigma } })) __)) __) { Types.fst = Nat.O; Types.snd = { Types.fst = Nat.O; Types.snd = (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O) { Types.fst = Nat.O; Types.snd = (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O) (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd = Assembly.Short_jump }).Types.snd } (BitVectorTrie.Stub (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))))) } }) in (fun _ -> (match Util.gtb final_policy.Types.fst (Exp.exp (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))))))))))) with | Bool.True -> (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd = Types.None }) | Bool.False -> (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd = (Types.Some final_policy) })) __)) __