|
1 | 1 | module Backend = struct |
2 | 2 | open Smtml |
| 3 | + include Symbolic_memory_base |
3 | 4 |
|
4 | 5 | type address = Int32.t |
5 | 6 |
|
@@ -36,65 +37,16 @@ module Backend = struct |
36 | 37 | | None -> Expr.value (Num (I8 0)) |
37 | 38 | | Some parent -> load_byte parent a ) |
38 | 39 |
|
39 | | - (* TODO: don't rebuild so many values it generates unecessary hc lookups *) |
40 | | - let merge_extracts (e1, h, m1) (e2, m2, l) = |
41 | | - let ty = Expr.ty e1 in |
42 | | - if m1 = m2 && Expr.equal e1 e2 then |
43 | | - if h - l = Ty.size ty then e1 else Expr.make (Extract (e1, h, l)) |
44 | | - else |
45 | | - Expr.( |
46 | | - make (Concat (make (Extract (e1, h, m1)), make (Extract (e2, m2, l)))) ) |
47 | | - |
48 | | - let concat ~msb ~lsb offset = |
49 | | - assert (offset > 0 && offset <= 8); |
50 | | - match (Expr.view msb, Expr.view lsb) with |
51 | | - | Val (Num (I8 i1)), Val (Num (I8 i2)) -> |
52 | | - Symbolic_value.const_i32 Int32.(logor (shl (of_int i1) 8l) (of_int i2)) |
53 | | - | Val (Num (I8 i1)), Val (Num (I32 i2)) -> |
54 | | - let offset = offset * 8 in |
55 | | - if offset < 32 then |
56 | | - Symbolic_value.const_i32 |
57 | | - Int32.(logor (shl (of_int i1) (of_int offset)) i2) |
58 | | - else |
59 | | - let i1' = Int64.of_int i1 in |
60 | | - let i2' = Int64.of_int32 i2 in |
61 | | - Symbolic_value.const_i64 Int64.(logor (shl i1' (of_int offset)) i2') |
62 | | - | Val (Num (I8 i1)), Val (Num (I64 i2)) -> |
63 | | - let offset = Int64.of_int (offset * 8) in |
64 | | - Symbolic_value.const_i64 Int64.(logor (shl (of_int i1) offset) i2) |
65 | | - | Extract (e1, h, m1), Extract (e2, m2, l) -> |
66 | | - merge_extracts (e1, h, m1) (e2, m2, l) |
67 | | - | Extract (e1, h, m1), Concat ({ node = Extract (e2, m2, l); _ }, e3) -> |
68 | | - Expr.(make (Concat (merge_extracts (e1, h, m1) (e2, m2, l), e3))) |
69 | | - | _ -> Expr.make (Concat (msb, lsb)) |
70 | | - |
71 | 40 | let loadn m a n = |
72 | | - let rec loop addr size i acc = |
73 | | - if i = size then acc |
| 41 | + let rec loop addr i acc = |
| 42 | + if i = n then acc |
74 | 43 | else |
75 | 44 | let addr' = Int32.(add addr (of_int i)) in |
76 | 45 | let byte = load_byte m addr' in |
77 | | - loop addr size (i + 1) (concat i ~msb:byte ~lsb:acc) |
| 46 | + loop addr (i + 1) (concat i ~msb:byte ~lsb:acc) |
78 | 47 | in |
79 | 48 | let v0 = load_byte m a in |
80 | | - loop a n 1 v0 |
81 | | - |
82 | | - let extract v pos = |
83 | | - match Expr.view v with |
84 | | - | Val (Num (I8 _)) -> v |
85 | | - | Val (Num (I32 i)) -> |
86 | | - let i' = Int32.(to_int @@ logand 0xffl @@ shr_s i @@ of_int (pos * 8)) in |
87 | | - Expr.value (Num (I8 i')) |
88 | | - | Val (Num (I64 i)) -> |
89 | | - let i' = Int64.(to_int @@ logand 0xffL @@ shr_s i @@ of_int (pos * 8)) in |
90 | | - Expr.value (Num (I8 i')) |
91 | | - | Cvtop |
92 | | - (_, Zero_extend 24, ({ node = Symbol { ty = Ty_bitv 8; _ }; _ } as sym)) |
93 | | - | Cvtop |
94 | | - (_, Sign_extend 24, ({ node = Symbol { ty = Ty_bitv 8; _ }; _ } as sym)) |
95 | | - -> |
96 | | - sym |
97 | | - | _ -> Expr.make (Extract (v, pos + 1, pos)) |
| 49 | + loop a 1 v0 |
98 | 50 |
|
99 | 51 | let storen m a v n = |
100 | 52 | for i = 0 to n - 1 do |
|
0 commit comments