@@ -169,15 +169,17 @@ module Thumb(CT : Theory.Core) = struct
169
169
info " unhandled memory operation: %a" pp_insn insn;
170
170
!! Insn. empty
171
171
172
+ let lift_bits opcode insn =
173
+ let open Thumb_bits.Make (CT) in
174
+ match opcode, (MC.Insn. ops insn : Op.t array ) with
175
+ | `tSXTB , [|Reg rd; Reg rm; _; _|] -> sx (reg rd) (reg rm)
176
+ | `tSXTH , [|Reg rd; Reg rm; _; _|] -> sx (reg rd) (reg rm)
177
+ | `tUXTB , [|Reg rd; Reg rm; _; _|] -> ux (reg rd) (reg rm)
178
+ | `tUXTH , [|Reg rd; Reg rm; _; _|] -> ux (reg rd) (reg rm)
179
+ | insn ->
180
+ info " unhandled bit-wise instruction: %a" pp_insn insn;
181
+ !! Insn. empty
172
182
173
- (* let lift_bits insn ops =
174
- * let open Bits in
175
- * match insn, ops with
176
- * | `tSXTB, [|dest; src; _unknown; _|] -> sxtb dest src
177
- * | `tSXTH, [|dest; src; _unknown; _|] -> sxth dest src
178
- * | `tUXTB, [|dest; src; _unknown; _|] -> uxtb dest src
179
- * | `tUXTH, [|dest; src; _unknown; _|] -> uxth dest src
180
- * | _ -> [] *)
181
183
182
184
(* these are not entirely complete *)
183
185
let lift_branch pc opcode insn =
@@ -192,6 +194,8 @@ module Thumb(CT : Theory.Core) = struct
192
194
| `tBLXr , [|_; _; Reg dst|]-> blxr pc (reg dst)
193
195
| `tBX , [|Reg dst; _; _|]when is_pc (reg dst) -> bxi pc 0
194
196
| `tBX , [|Reg dst;_;_|] -> bxr (reg dst)
197
+ | `tCBNZ , [|Reg rn; Imm c|] -> cbnz pc (reg rn) (imm c)
198
+ | `tCBZ , [|Reg rn; Imm c|] -> cbz pc (reg rn) (imm c)
195
199
| insn ->
196
200
info " unhandled branch: %a" pp_insn insn;
197
201
!! Insn. empty
@@ -200,9 +204,7 @@ module Thumb(CT : Theory.Core) = struct
200
204
| #opmem as op -> lift_mem addr op insn
201
205
| #opmov as op -> lift_move addr op insn
202
206
| #opbranch as op -> lift_branch addr op insn
203
- | op ->
204
- info " unsupported opcode: %s" (string_of_opcode op);
205
- !! Insn. empty
207
+ | #opbit as op -> lift_bits op insn
206
208
end
207
209
208
210
@@ -237,7 +239,8 @@ module Main = struct
237
239
match decode_opcode (MC.Insn. name insn) with
238
240
| None ->
239
241
info " failed to decode MC instruction, unknown opcode: \
240
- %s => %a"
242
+ %a: %s => %a"
243
+ Memory. pp mem
241
244
(MC.Insn. asm insn)
242
245
Sexp. pp_hum (MC.Insn. sexp_of_t insn);
243
246
!! Insn. empty
0 commit comments