71 open Hints_declaration
89 (** val jump_expansion_step :
90 ASM.labelled_instruction List.list Types.sig0 -> Fetch.label_map
91 Types.sig0 -> PolicyFront.ppc_pc_map Types.sig0 -> (Bool.bool,
92 PolicyFront.ppc_pc_map Types.option) Types.prod Types.sig0 **)
93 let jump_expansion_step program labels old_sigma =
94 (let { Types.fst = final_added; Types.snd = final_policy } =
96 (FoldStuff.foldl_strong (Types.pi1 program) (fun prefix x tl _ acc ->
97 (let { Types.fst = inc_added; Types.snd = inc_pc_sigma } =
101 (let { Types.fst = label; Types.snd = instr } = x in
105 | ASM.Instruction i ->
106 PolicyFront.jump_expansion_step_instruction (Types.pi1 labels)
107 (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) i
108 | ASM.Comment x0 -> Types.None
109 | ASM.Cost x0 -> Types.None
112 (PolicyFront.select_jump_length (Types.pi1 labels)
113 (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) j)
114 | ASM.Jnz (x0, x1, x2) -> Types.None
117 (PolicyFront.select_call_length (Types.pi1 labels)
118 (Types.pi1 old_sigma) inc_pc_sigma (List.length prefix) c)
119 | ASM.Mov (x0, x1, x2) -> Types.None
121 let { Types.fst = inc_pc; Types.snd = inc_sigma } = inc_pc_sigma in
123 (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
124 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
125 (Nat.S Nat.O))))))))))))))))
126 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
127 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
128 (Nat.S (Nat.S Nat.O)))))))))))))))) (List.length prefix))
129 (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd =
130 Assembly.Short_jump }).Types.snd
132 let old_size = PolicyFront.instruction_size_jmplen old_length instr
134 let { Types.fst = new_length; Types.snd = isize } =
137 { Types.fst = Assembly.Short_jump; Types.snd =
138 (PolicyFront.instruction_size_jmplen Assembly.Short_jump
141 { Types.fst = (PolicyFront.max_length old_length pl);
143 (PolicyFront.instruction_size_jmplen
144 (PolicyFront.max_length old_length pl) instr) }
148 | Types.None -> inc_added
149 | Types.Some x0 -> Nat.plus inc_added (Nat.minus isize old_size)
152 (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
153 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
154 (Nat.S Nat.O))))))))))))))))
155 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
156 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
157 (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S
158 (List.length prefix))) (Types.pi1 old_sigma).Types.snd
159 { Types.fst = Nat.O; Types.snd = Assembly.Short_jump }).Types.snd
162 BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
163 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
164 (Nat.S Nat.O))))))))))))))))
165 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
166 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
167 (Nat.S (Nat.S Nat.O)))))))))))))))) (Nat.S
168 (List.length prefix))) { Types.fst = (Nat.plus inc_pc isize);
169 Types.snd = old_Slength }
170 (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
171 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
172 (Nat.S Nat.O))))))))))))))))
173 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S
174 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
175 (Nat.S (Nat.S (Nat.S (Nat.S Nat.O))))))))))))))))
176 (List.length prefix)) { Types.fst = inc_pc; Types.snd =
177 new_length } inc_sigma)
179 { Types.fst = new_added; Types.snd = { Types.fst =
180 (Nat.plus inc_pc isize); Types.snd = updated_sigma } })) __)) __)
181 { Types.fst = Nat.O; Types.snd = { Types.fst = Nat.O; Types.snd =
182 (BitVectorTrie.insert (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
183 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
184 (Nat.S Nat.O))))))))))))))))
185 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
186 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
187 (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O) { Types.fst = Nat.O;
189 (BitVectorTrie.lookup (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
190 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
191 (Nat.S Nat.O))))))))))))))))
192 (Arithmetic.bitvector_of_nat (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
193 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
194 (Nat.S (Nat.S Nat.O)))))))))))))))) Nat.O)
195 (Types.pi1 old_sigma).Types.snd { Types.fst = Nat.O; Types.snd =
196 Assembly.Short_jump }).Types.snd } (BitVectorTrie.Stub (Nat.S
197 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
198 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S Nat.O)))))))))))))))))) } })
201 (match Util.gtb final_policy.Types.fst
202 (Exp.exp (Nat.S (Nat.S Nat.O)) (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
203 (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S (Nat.S
204 (Nat.S (Nat.S Nat.O))))))))))))))))) with
206 (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd =
209 (fun _ -> { Types.fst = (Nat.eqb final_added Nat.O); Types.snd =
210 (Types.Some final_policy) })) __)) __