source: Deliverables/D2.2/8051/src/ASM/I8051.ml @ 1568

Last change on this file since 1568 was 1568, checked in by tranquil, 8 years ago
  • Immediates introduced (but not fully used yet in RTLabs to RTL pass)
  • translation streamlined
  • BUGGY: interpretation fails in LTL, trying to fetch a function with incorrect address
File size: 4.4 KB
Line 
1
2let int_size = 1
3let ptr_size = 2
4let alignment = None
5
6type opaccs =
7  | Mul
8  | DivuModu
9
10type op1 =
11  | Cmpl
12  | Inc
13  (* | Dec *)
14  | Rl
15
16type op2 =
17  | Add
18  | Addc
19  | Sub
20  | And
21  | Or
22  | Xor
23
24let print_opaccs = function
25  | Mul -> "mul"
26  | DivuModu -> "divu"
27
28let print_op1 = function
29  | Cmpl -> "cmpl"
30  | Inc -> "inc"
31  | Rl -> "rotl"
32
33let print_op2 = function
34  | Add -> "add"
35  | Addc -> "addc"
36  | Sub -> "sub"
37  | And -> "and"
38  | Or -> "or"
39  | Xor -> "xor"
40
41
42module Eval (Val : Value.S) = struct
43
44  let eval_int_mul size i1 i2 =
45    let module Int = IntValue.Make (struct let size = 2 * size end) in
46    match Int.break (Int.mul i1 i2) 2 with
47      | res1 :: res2 :: _ -> (Val.of_int_repr res1, Val.of_int_repr res2)
48      | _ -> assert false (* should be impossible *)
49
50  let eval_mul v1 v2 =
51    if Val.is_int v1 && Val.is_int v2 then
52      eval_int_mul Val.int_size (Val.to_int_repr v1) (Val.to_int_repr v2)
53    else (Val.undef, Val.undef)
54
55  let opaccs op v1 v2 = match op with
56    | Mul -> eval_mul v1 v2
57    | DivuModu -> (Val.divu v1 v2, Val.modulou v1 v2)
58
59  let op1 = function
60    | Cmpl -> Val.cmpl
61    | Inc -> Val.succ
62    | Rl -> Val.rotl
63
64  let op2 carry op2 v1 v2 = match op2 with
65    | Add -> Val.add_and_of v1 v2
66    | Addc ->
67      let (res1, of1) = Val.add_and_of v1 v2 in
68      let (res2, of2) = Val.add_and_of res1 carry in
69      (res2, Val.or_op of1 of2)
70    | Sub ->
71      let (res1, uf1) = Val.sub_and_uf v1 v2 in
72      let (res2, uf2) = Val.sub_and_uf res1 carry in
73      (res2, Val.or_op uf1 uf2)
74    | And -> (Val.and_op v1 v2, carry)
75    | Or -> (Val.or_op v1 v2, carry)
76    | Xor -> (Val.xor v1 v2, carry)
77
78end
79
80
81type register = int
82let compare_reg = Pervasives.compare
83let eq_reg r1 r2 = r1 = r2
84
85module OrdReg = struct type t = register let compare = compare_reg end
86module RegisterSet = Set.Make (OrdReg)
87module RegisterMap = Map.Make (OrdReg)
88
89let r00 = 0
90let r01 = 1
91let r02 = 2
92let r03 = 3
93let r04 = 4
94let r05 = 5
95let r06 = 6
96let r07 = 7
97let r10 = 8
98let r11 = 9
99let r12 = 10
100let r13 = 11
101let r14 = 12
102let r15 = 13
103let r16 = 14
104let r17 = 15
105let r20 = 16
106let r21 = 17
107let r22 = 18
108let r23 = 19
109let r24 = 20
110let r25 = 21
111let r26 = 22
112let r27 = 23
113let r30 = 24
114let r31 = 25
115let r32 = 26
116let r33 = 27
117let r34 = 28
118let r35 = 29
119let r36 = 30
120let r37 = 31
121let a = 224
122let b = 240
123let dpl = 130
124let dph = 131
125let carry = -1 (* only used for the liveness analysis. *)
126
127let print_register = function
128  | 0 -> "R00"
129  | 1 -> "R01"
130  | 2 -> "R02"
131  | 3 -> "R03"
132  | 4 -> "R04"
133  | 5 -> "R05"
134  | 6 -> "R06"
135  | 7 -> "R07"
136  | 8 -> "R10"
137  | 9 -> "R11"
138  | 10 -> "R12"
139  | 11 -> "R13"
140  | 12 -> "R14"
141  | 13 -> "R15"
142  | 14 -> "R16"
143  | 15 -> "R17"
144  | 16 -> "R20"
145  | 17 -> "R21"
146  | 18 -> "R22"
147  | 19 -> "R23"
148  | 20 -> "R24"
149  | 21 -> "R25"
150  | 22 -> "R26"
151  | 23 -> "R27"
152  | 24 -> "R30"
153  | 25 -> "R31"
154  | 26 -> "R32"
155  | 27 -> "R33"
156  | 28 -> "R34"
157  | 29 -> "R35"
158  | 30 -> "R36"
159  | 31 -> "R37"
160  | 224 -> "A"
161  | 240 -> "B"
162  | 130 -> "DPL"
163  | 131 -> "DPH"
164  | _ -> assert false (* impossible *)
165
166let sst = r10
167let st0 = r02
168let st1 = r03
169let st2 = r04
170let st3 = r05
171let sts = [st0 ; st1 ; st2 ; st3]
172let spl = r06
173let sph = r07
174let rets = [dpl ; dph ; r00 ; r01]
175
176let spl_addr = spl
177let spl_init = 255
178let sph_addr = sph
179let sph_init = 255
180let isp_addr = 129
181let isp_init = 47
182
183let set_of_list rl = List.fold_right RegisterSet.add rl RegisterSet.empty
184let list_of_set rs = RegisterSet.fold (fun r l -> r :: l) rs []
185
186let registers =
187  set_of_list [r00 ; r01 ; r02 ; r03 ; r04 ; r05 ; r06 ; r07 ;
188               r10 ; r11 ; r12 ; r13 ; r14 ; r15 ; r16 ; r17 ;
189               r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27 ;
190               r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37 ;
191               a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; sst]
192
193let forbidden =
194  set_of_list
195    [a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; st2 ; st3 ; sst]
196
197let parameters =
198  let params = set_of_list [r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37] in
199  list_of_set (RegisterSet.diff params forbidden)
200
201let callee_saved =
202  RegisterSet.diff (set_of_list [r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27])
203    forbidden
204let caller_saved =
205  RegisterSet.diff (RegisterSet.diff registers callee_saved) forbidden
206let allocatable  = RegisterSet.diff registers forbidden
207
208let reg_addr r = `DIRECT (BitVectors.vect_of_int r `Eight)
209
210(* External RAM size *)
211let ext_ram_size = MiscPottier.pow 2 16
212(* Internal RAM size *)
213let int_ram_size = MiscPottier.pow 2 8
Note: See TracBrowser for help on using the repository browser.