2 let error_prefix = "MIPS interpret"
3 let error s = Error.global_error error_prefix (s ^ "\n")
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
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
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
46 let uncon con = (fun_of_uncon con) (Value.Val_int 0l)
50 | MIPSOps.ConEq -> Value.cmp_eq
51 | MIPSOps.ConNe -> Value.cmp_ne