let error_prefix = "MIPS interpret" let error s = Error.global_error error_prefix (s ^ "\n") let unop = function | MIPSOps.UOpAddi i -> Value.add (Value.Val_int i) | MIPSOps.UOpSlti i -> (fun v -> Value.cmp_lt v (Value.Val_int i)) | MIPSOps.UOpSltiu i -> (fun v -> Value.cmp_lt_u v (Value.Val_int i)) | MIPSOps.UOpAndi i -> Value.and_op (Value.Val_int i) | MIPSOps.UOpOri i -> Value.or_op (Value.Val_int i) | MIPSOps.UOpXori i -> Value.xor (Value.Val_int i) | MIPSOps.UOpNeg -> Value.negint | MIPSOps.UOpNot -> Value.notint let binop = function | MIPSOps.OpAdd -> Value.add | MIPSOps.OpSub -> Value.sub | MIPSOps.OpMul -> Value.mul | MIPSOps.OpDiv -> Value.div | MIPSOps.OpDivu -> Value.divu | MIPSOps.OpModu -> Value.modulo | MIPSOps.OpLt -> Value.cmp_lt | MIPSOps.OpLtu -> Value.cmp_lt_u | MIPSOps.OpLe -> Value.cmp_le | MIPSOps.OpLeu -> Value.cmp_le_u | MIPSOps.OpGt -> Value.cmp_gt | MIPSOps.OpGtu -> Value.cmp_gt_u | MIPSOps.OpGe -> Value.cmp_ge | MIPSOps.OpGeu -> Value.cmp_ge_u | MIPSOps.OpEq -> Value.cmp_eq | MIPSOps.OpNe -> Value.cmp_ne | MIPSOps.OpSllv -> Value.shl | MIPSOps.OpSrav -> Value.shr | MIPSOps.OpSrlv -> Value.shru | MIPSOps.OpAnd -> Value.and_op | MIPSOps.OpOr -> Value.or_op | MIPSOps.OpXor -> Value.xor let fun_of_uncon = function | MIPSOps.UConGez -> Value.cmp_ge | MIPSOps.UConGtz -> Value.cmp_gt | MIPSOps.UConLez -> Value.cmp_le | MIPSOps.UConLtz -> Value.cmp_lt let uncon con = (fun_of_uncon con) (Value.Val_int 0l) let bincon = function | MIPSOps.ConEq -> Value.cmp_eq | MIPSOps.ConNe -> Value.cmp_ne