22 let print_opaccs = function
26 let print_op1 = function
30 let print_op2 = function
39 module Eval (Val : Value.S) = struct
41 let eval_int_mul size i1 i2 =
42 let module Int = IntValue.Make (struct let size = 2 * size end) in
43 match Int.break (Int.mul i1 i2) 2 with
44 | res1 :: res2 :: _ -> (Val.of_int_repr res1, Val.of_int_repr res2)
45 | _ -> assert false (* should be impossible *)
48 if Val.is_int v1 && Val.is_int v2 then
49 eval_int_mul Val.int_size (Val.to_int_repr v1) (Val.to_int_repr v2)
50 else (Val.undef, Val.undef)
52 let opaccs op v1 v2 = match op with
53 | Mul -> eval_mul v1 v2
54 | DivuModu -> (Val.divu v1 v2, Val.modulou v1 v2)
60 let op2 carry op2 v1 v2 = match op2 with
61 | Add -> Val.add_and_of v1 v2
63 let (res1, of1) = Val.add_and_of v1 v2 in
64 let (res2, of2) = Val.add_and_of res1 carry in
65 (res2, Val.or_op of1 of2)
67 let (res1, uf1) = Val.sub_and_uf v1 v2 in
68 let (res2, uf2) = Val.sub_and_uf res1 carry in
69 (res2, Val.or_op uf1 uf2)
70 | And -> (Val.and_op v1 v2, carry)
71 | Or -> (Val.or_op v1 v2, carry)
72 | Xor -> (Val.xor v1 v2, carry)
78 let compare_reg = Pervasives.compare
79 let eq_reg r1 r2 = r1 = r2
81 module OrdReg = struct type t = register let compare = compare_reg end
82 module RegisterSet = Set.Make (OrdReg)
83 module RegisterMap = Map.Make (OrdReg)
121 let carry = -1 (* only used for the liveness analysis. *)
123 let print_register = function
160 | _ -> assert false (* impossible *)
167 let sts = [st0 ; st1 ; st2 ; st3]
170 let rets = [dpl ; dph ; r00 ; r01]
179 let set_of_list rl = List.fold_right RegisterSet.add rl RegisterSet.empty
180 let list_of_set rs = RegisterSet.fold (fun r l -> r :: l) rs []
183 set_of_list [r00 ; r01 ; r02 ; r03 ; r04 ; r05 ; r06 ; r07 ;
184 r10 ; r11 ; r12 ; r13 ; r14 ; r15 ; r16 ; r17 ;
185 r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27 ;
186 r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37 ;
187 a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; sst]
191 [a ; b ; dpl ; dph ; spl ; sph ; st0 ; st1 ; st2 ; st3 ; sst]
194 let params = set_of_list [r30 ; r31 ; r32 ; r33 ; r34 ; r35 ; r36 ; r37] in
195 list_of_set (RegisterSet.diff params forbidden)
198 RegisterSet.diff (set_of_list [r20 ; r21 ; r22 ; r23 ; r24 ; r25 ; r26 ; r27])
201 RegisterSet.diff (RegisterSet.diff registers callee_saved) forbidden
202 let allocatable = RegisterSet.diff registers forbidden
204 let reg_addr r = `DIRECT (BitVectors.vect_of_int r `Eight)
206 (* External RAM size *)
207 let ext_ram_size = MiscPottier.pow 2 16
208 (* Internal RAM size *)
209 let int_ram_size = MiscPottier.pow 2 8