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

Last change on this file since 486 was 486, checked in by ayache, 8 years ago

Deliverable D2.2

File size: 3.5 KB
Line 
1
2let int_size = 1
3let ptr_size = 2
4let alignment = None
5
6type opaccs =
7  | Mul
8  | Divu
9  | Modu
10
11type op1 =
12  | Cmpl
13  | Inc
14
15type op2 =
16  | Add
17  | Addc
18  | Sub
19  | And
20  | Or
21  | Xor
22
23let print_opaccs = function
24  | Mul -> "mul"
25  | Divu -> "divu"
26  | Modu -> "modu"
27
28let print_op1 = function
29  | Cmpl -> "cmpl"
30  | Inc -> "inc"
31
32let print_op2 = function
33  | Add -> "add"
34  | Addc -> "addc"
35  | Sub -> "sub"
36  | And -> "and"
37  | Or -> "or"
38  | Xor -> "xor"
39
40
41module Eval (Val : Value.S) = struct
42
43  let opaccs = function
44    | Mul -> Val.mul
45    | Divu -> Val.divu
46    | Modu -> Val.modu
47
48  let op1 = function
49    | Cmpl -> Val.cmpl
50    | Inc -> Val.succ
51
52  let op2 carry op2 v1 v2 = match op2 with
53    | Add -> Val.add_and_of v1 v2
54    | Addc ->
55      let (res1, of1) = Val.add_and_of v1 v2 in
56      let (res2, of2) = Val.add_and_of res1 carry in
57      (res2, Val.or_op of1 of2)
58    | Sub ->
59      let (res1, uf1) = Val.sub_and_of v1 v2 in
60      let (res2, uf2) = Val.sub_and_of res1 carry in
61      (res2, Val.or_op uf1 uf2)
62    | And -> (Val.and_op v1 v2, carry)
63    | Or -> (Val.or_op v1 v2, carry)
64    | Xor -> (Val.xor v1 v2, carry)
65
66end
67
68
69type register = int
70let compare_reg = Pervasives.compare
71let eq_reg r1 r2 = r1 = r2
72
73module OrdReg = struct type t = register let compare = compare_reg end
74module RegisterSet = Set.Make (OrdReg)
75module RegisterMap = Map.Make (OrdReg)
76
77let r00 = 0
78let r01 = 1
79let r02 = 2
80let r03 = 3
81let r04 = 4
82let r05 = 5
83let r06 = 6
84let r07 = 7
85let r10 = 8
86let r11 = 9
87let r12 = 10
88let r13 = 11
89let r14 = 12
90let r15 = 13
91let r16 = 14
92let r17 = 15
93let r20 = 16
94let r21 = 17
95let r22 = 18
96let r23 = 19
97let r24 = 20
98let r25 = 21
99let r26 = 22
100let r27 = 23
101let r30 = 24
102let r31 = 25
103let r32 = 26
104let r33 = 27
105let r34 = 28
106let r35 = 29
107let r36 = 30
108let r37 = 31
109let a = 224
110let b = 240
111let dpl = 130
112let dph = 131
113let carry = -1 (* only used for the liveness analysis. *)
114
115let print_register = function
116  | 0 -> "R00"
117  | 1 -> "R01"
118  | 2 -> "R02"
119  | 3 -> "R03"
120  | 4 -> "R04"
121  | 5 -> "R05"
122  | 6 -> "R06"
123  | 7 -> "R07"
124  | 8 -> "R10"
125  | 9 -> "R11"
126  | 10 -> "R12"
127  | 11 -> "R13"
128  | 12 -> "R14"
129  | 13 -> "R15"
130  | 14 -> "R16"
131  | 15 -> "R17"
132  | 16 -> "R20"
133  | 17 -> "R21"
134  | 18 -> "R22"
135  | 19 -> "R23"
136  | 20 -> "R24"
137  | 21 -> "R25"
138  | 22 -> "R26"
139  | 23 -> "R27"
140  | 24 -> "R30"
141  | 25 -> "R31"
142  | 26 -> "R32"
143  | 27 -> "R33"
144  | 28 -> "R34"
145  | 29 -> "R35"
146  | 30 -> "R36"
147  | 31 -> "R37"
148  | 224 -> "A"
149  | 240 -> "B"
150  | 130 -> "DPL"
151  | 131 -> "DPH"
152  | _ -> assert false (* impossible *)
153
154let sst = r03
155let st0 = r04
156let st1 = r05
157let spl = r06
158let sph = r07
159
160let set_of_list rl = List.fold_right RegisterSet.add rl RegisterSet.empty
161let list_of_set rs = RegisterSet.fold (fun r l -> r :: l) rs []
162
163let registers =
164  set_of_list [r00 ; r01 ; r02 ; r03 ; r04 ; r05 ; r06 ; r07 ;
165               r10 ; r11 ; r12 ; r13 ; r14 ; r15 ; r16 ; r17 ;
166               r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27 ;
167               r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37 ;
168               a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; sst]
169
170let forbidden =
171  set_of_list [(* a ; b ; dpl ; dph ; *) spl ; sph ; st0 ; st1 ; sst]
172
173let parameters =
174  let params = set_of_list [r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37] in
175  list_of_set (RegisterSet.diff params forbidden)
176
177let callee_saved =
178  RegisterSet.diff (set_of_list [r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27])
179    forbidden
180let caller_saved =
181  RegisterSet.diff (RegisterSet.diff registers callee_saved) forbidden
182let allocatable  = RegisterSet.diff registers forbidden
183
184let reg_addr r = `DIRECT (BitVectors.vect_of_int r `Eight)
Note: See TracBrowser for help on using the repository browser.