]> matita.cs.unibo.it Git - pkg-cerco/acc.git/blob - src/ASM/MIPSInterpret.ml
Imported Upstream version 0.2
[pkg-cerco/acc.git] / src / ASM / MIPSInterpret.ml
1
2 let error_prefix = "MIPS interpret"
3 let error s = Error.global_error error_prefix (s ^ "\n")
4
5
6 let unop = function
7   | MIPSOps.UOpAddi i -> Value.add (Value.Val_int i)
8   | MIPSOps.UOpSlti i -> (fun v -> Value.cmp_lt v (Value.Val_int i))
9   | MIPSOps.UOpSltiu i -> (fun v -> Value.cmp_lt_u v (Value.Val_int i))
10   | MIPSOps.UOpAndi i -> Value.and_op (Value.Val_int i)
11   | MIPSOps.UOpOri i -> Value.or_op (Value.Val_int i)
12   | MIPSOps.UOpXori i -> Value.xor (Value.Val_int i)
13   | MIPSOps.UOpNeg -> Value.negint
14   | MIPSOps.UOpNot -> Value.notint
15
16 let binop = function
17   | MIPSOps.OpAdd -> Value.add
18   | MIPSOps.OpSub -> Value.sub
19   | MIPSOps.OpMul -> Value.mul
20   | MIPSOps.OpDiv -> Value.div
21   | MIPSOps.OpDivu -> Value.divu
22   | MIPSOps.OpModu -> Value.modulo
23   | MIPSOps.OpLt -> Value.cmp_lt
24   | MIPSOps.OpLtu -> Value.cmp_lt_u
25   | MIPSOps.OpLe -> Value.cmp_le
26   | MIPSOps.OpLeu -> Value.cmp_le_u
27   | MIPSOps.OpGt -> Value.cmp_gt
28   | MIPSOps.OpGtu -> Value.cmp_gt_u
29   | MIPSOps.OpGe -> Value.cmp_ge
30   | MIPSOps.OpGeu -> Value.cmp_ge_u
31   | MIPSOps.OpEq -> Value.cmp_eq
32   | MIPSOps.OpNe -> Value.cmp_ne
33   | MIPSOps.OpSllv -> Value.shl
34   | MIPSOps.OpSrav -> Value.shr
35   | MIPSOps.OpSrlv -> Value.shru
36   | MIPSOps.OpAnd -> Value.and_op
37   | MIPSOps.OpOr -> Value.or_op
38   | MIPSOps.OpXor -> Value.xor
39
40 let fun_of_uncon = function
41   | MIPSOps.UConGez -> Value.cmp_ge
42   | MIPSOps.UConGtz -> Value.cmp_gt
43   | MIPSOps.UConLez -> Value.cmp_le
44   | MIPSOps.UConLtz -> Value.cmp_lt
45
46 let uncon con = (fun_of_uncon con) (Value.Val_int 0l)
47   
48
49 let bincon = function
50   | MIPSOps.ConEq -> Value.cmp_eq
51   | MIPSOps.ConNe -> Value.cmp_ne