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 |
---|