1 | |
---|
2 | let int_size = 1 |
---|
3 | let ptr_size = 2 |
---|
4 | let alignment = None |
---|
5 | |
---|
6 | type opaccs = |
---|
7 | | Mul |
---|
8 | | Divu |
---|
9 | | Modu |
---|
10 | |
---|
11 | type op1 = |
---|
12 | | Cmpl |
---|
13 | | Inc |
---|
14 | |
---|
15 | type op2 = |
---|
16 | | Add |
---|
17 | | Addc |
---|
18 | | Sub |
---|
19 | | And |
---|
20 | | Or |
---|
21 | | Xor |
---|
22 | |
---|
23 | let print_opaccs = function |
---|
24 | | Mul -> "mul" |
---|
25 | | Divu -> "divu" |
---|
26 | | Modu -> "modu" |
---|
27 | |
---|
28 | let print_op1 = function |
---|
29 | | Cmpl -> "cmpl" |
---|
30 | | Inc -> "inc" |
---|
31 | |
---|
32 | let print_op2 = function |
---|
33 | | Add -> "add" |
---|
34 | | Addc -> "addc" |
---|
35 | | Sub -> "sub" |
---|
36 | | And -> "and" |
---|
37 | | Or -> "or" |
---|
38 | | Xor -> "xor" |
---|
39 | |
---|
40 | |
---|
41 | module Eval (Val : Value.S) = struct |
---|
42 | |
---|
43 | let opaccs = function |
---|
44 | | Mul -> Val.mul |
---|
45 | | Divu -> Val.divu |
---|
46 | | Modu -> Val.modulou |
---|
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_uf v1 v2 in |
---|
60 | let (res2, uf2) = Val.sub_and_uf 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 | |
---|
66 | end |
---|
67 | |
---|
68 | |
---|
69 | type register = int |
---|
70 | let compare_reg = Pervasives.compare |
---|
71 | let eq_reg r1 r2 = r1 = r2 |
---|
72 | |
---|
73 | module OrdReg = struct type t = register let compare = compare_reg end |
---|
74 | module RegisterSet = Set.Make (OrdReg) |
---|
75 | module RegisterMap = Map.Make (OrdReg) |
---|
76 | |
---|
77 | let r00 = 0 |
---|
78 | let r01 = 1 |
---|
79 | let r02 = 2 |
---|
80 | let r03 = 3 |
---|
81 | let r04 = 4 |
---|
82 | let r05 = 5 |
---|
83 | let r06 = 6 |
---|
84 | let r07 = 7 |
---|
85 | let r10 = 8 |
---|
86 | let r11 = 9 |
---|
87 | let r12 = 10 |
---|
88 | let r13 = 11 |
---|
89 | let r14 = 12 |
---|
90 | let r15 = 13 |
---|
91 | let r16 = 14 |
---|
92 | let r17 = 15 |
---|
93 | let r20 = 16 |
---|
94 | let r21 = 17 |
---|
95 | let r22 = 18 |
---|
96 | let r23 = 19 |
---|
97 | let r24 = 20 |
---|
98 | let r25 = 21 |
---|
99 | let r26 = 22 |
---|
100 | let r27 = 23 |
---|
101 | let r30 = 24 |
---|
102 | let r31 = 25 |
---|
103 | let r32 = 26 |
---|
104 | let r33 = 27 |
---|
105 | let r34 = 28 |
---|
106 | let r35 = 29 |
---|
107 | let r36 = 30 |
---|
108 | let r37 = 31 |
---|
109 | let a = 224 |
---|
110 | let b = 240 |
---|
111 | let dpl = 130 |
---|
112 | let dph = 131 |
---|
113 | let carry = -1 (* only used for the liveness analysis. *) |
---|
114 | |
---|
115 | let 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 | |
---|
154 | let sst = r03 |
---|
155 | let st0 = r04 |
---|
156 | let st1 = r05 |
---|
157 | let spl = r06 |
---|
158 | let sph = r07 |
---|
159 | |
---|
160 | let set_of_list rl = List.fold_right RegisterSet.add rl RegisterSet.empty |
---|
161 | let list_of_set rs = RegisterSet.fold (fun r l -> r :: l) rs [] |
---|
162 | |
---|
163 | let 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 | |
---|
170 | let forbidden = |
---|
171 | set_of_list [(* a ; b ; dpl ; dph ; *) spl ; sph ; st0 ; st1 ; sst] |
---|
172 | |
---|
173 | let 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 | |
---|
177 | let callee_saved = |
---|
178 | RegisterSet.diff (set_of_list [r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27]) |
---|
179 | forbidden |
---|
180 | let caller_saved = |
---|
181 | RegisterSet.diff (RegisterSet.diff registers callee_saved) forbidden |
---|
182 | let allocatable = RegisterSet.diff registers forbidden |
---|
183 | |
---|
184 | let reg_addr r = `DIRECT (BitVectors.vect_of_int r `Eight) |
---|