@@ -9,6 +9,32 @@ open Arm_flags
9
9
module Env = Arm_env
10
10
module Shift = Arm_shift
11
11
12
+ let width = 32
13
+
14
+
15
+ (* * Modified Immediate Constants *)
16
+ module MIC : sig
17
+ val decode : exp -> exp
18
+ end = struct
19
+ let ror value bits =
20
+ let p1 = Word. (value lsr bits) in
21
+ let rs = Word. (of_int ~width 32 - bits) in
22
+ let p2 = Word. (value lsl rs) in
23
+ Word. (p1 lor p2)
24
+
25
+ let mic x =
26
+ let shift = Word. extract_exn ~hi: 11 ~lo: 8 x
27
+ and value = Word. extract_exn ~hi: 7 ~lo: 0 x in
28
+ if Word. is_zero shift then x
29
+ else
30
+ let shift = Word. extract_exn ~hi: 31 shift in
31
+ let value = Word. extract_exn ~hi: 31 value in
32
+ ror value Word. (shift + shift)
33
+
34
+ let decode = function
35
+ | Bil. Int x -> Bil. Int (mic x)
36
+ | other -> other
37
+ end
12
38
13
39
let lift ?dest src1 ?src2 (itype ) ?sreg ?simm raw ~wflag cond =
14
40
let dest : var = match dest with
@@ -45,7 +71,7 @@ let lift ?dest src1 ?src2 (itype ) ?sreg ?simm raw ~wflag cond =
45
71
let shifted, carry = Shift. lift_i
46
72
~src: Bil. (var unshifted) simm reg32_t in
47
73
s1, shifted, [Bil. move unshifted s2], carry
48
- | _ -> s1, s2 , [] , Bil. var Env. cf in
74
+ | _ -> s1, ( MIC. decode s2) , [] , Bil. var Env. cf in
49
75
50
76
let stmts, flags = match itype, src1, src2 with
51
77
| `MOV , `Imm i64, _
0 commit comments