baselib.ml (2888B)
1 open Ast 2 open Mips 3 4 module Env = Map.Make(String) 5 6 let _types_ = 7 Env.of_seq 8 (List.to_seq 9 [ "_add", Func_t (Int_t, [ Int_t ; Int_t ]) 10 ; "_sub", Func_t (Int_t, [ Int_t ; Int_t ]) 11 ; "_mul", Func_t (Int_t, [ Int_t ; Int_t ]) 12 ; "_div", Func_t (Int_t, [ Int_t ; Int_t ]) 13 ; "_mod", Func_t (Int_t, [ Int_t ; Int_t ]) 14 ; "_puti", Func_t (Void_t, [ Int_t ]) 15 ; "_puts", Func_t (Void_t, [ Str_t ]) 16 ; "_geti", Func_t (Int_t, [ ]) 17 ; "_eq", Func_t (Bool_t, [ Int_t ; Int_t ]) 18 ; "_neq", Func_t (Bool_t, [ Int_t ; Int_t ]) 19 ; "_ge", Func_t (Bool_t, [ Int_t ; Int_t ]) 20 ; "_gt", Func_t (Bool_t, [ Int_t ; Int_t ]) 21 ; "_le", Func_t (Bool_t, [ Int_t ; Int_t ]) 22 ; "_lt", Func_t (Bool_t, [ Int_t ; Int_t ]) 23 ; "_xor", Func_t (Bool_t, [ Int_t ; Int_t ]) 24 ; "_and", Func_t (Bool_t, [ Int_t ; Int_t ]) 25 ; "_or", Func_t (Bool_t, [ Int_t ; Int_t ]) 26 ; "_not", Func_t (Bool_t, [ Int_t ]) 27 ; "_rev", Func_t (Int_t, [ Int_t ]) 28 ]) 29 30 let builtins = 31 [ Label "_add" 32 ; Lw (T0, Mem (SP, 0)) 33 ; Lw (T1, Mem (SP, 4)) 34 ; Add (V0, T0, T1) 35 ; Jr RA 36 37 ; Label "_sub" 38 ; Lw (T0, Mem (SP, 0)) 39 ; Lw (T1, Mem (SP, 4)) 40 ; Sub (V0, T0, T1) 41 ; Jr RA 42 43 ; Label "_mul" 44 ; Lw (T0, Mem (SP, 0)) 45 ; Lw (T1, Mem (SP, 4)) 46 ; Mul (V0, T0, T1) 47 ; Jr RA 48 49 ; Label "_div" 50 ; Lw (T0, Mem (SP, 0)) 51 ; Lw (T1, Mem (SP, 4)) 52 ; Div (V0, T0, T1) 53 ; Jr RA 54 55 ; Label "_mod" 56 ; Lw (T0, Mem (SP, 0)) 57 ; Lw (T1, Mem (SP, 4)) 58 ; Div (V0, T0, T1) 59 ; Mfhi V0 60 ; Jr RA 61 62 ; Label "_puti" 63 ; Lw (A0, Mem (SP, 0)) 64 ; Li (V0, Syscall.print_int) 65 ; Syscall 66 ; Jr RA 67 68 ; Label "_geti" 69 ; Lw (A0, Mem (SP, 0)) 70 ; Li (V0, Syscall.read_int) 71 ; Syscall 72 ; Jr RA 73 74 ; Label "_puts" 75 ; Lw (A0, Mem (SP, 0)) 76 ; Li (V0, Syscall.print_str) 77 ; Syscall 78 ; Jr RA 79 80 ; Label "_eq" 81 ; Lw (T0, Mem (SP, 0)) 82 ; Lw (T1, Mem (SP, 4)) 83 ; Seq (V0, T0, T1) 84 ; Jr RA 85 86 ; Label "_neq" 87 ; Lw (T0, Mem (SP, 0)) 88 ; Lw (T1, Mem (SP, 4)) 89 ; Sne (V0, T0, T1) 90 ; Jr RA 91 92 ; Label "_ge" 93 ; Lw (T0, Mem (SP, 0)) 94 ; Lw (T1, Mem (SP, 4)) 95 ; Sge (V0, T0, T1) 96 ; Jr RA 97 98 ; Label "_gt" 99 ; Lw (T0, Mem (SP, 0)) 100 ; Lw (T1, Mem (SP, 4)) 101 ; Sgt (V0, T0, T1) 102 ; Jr RA 103 104 ; Label "_le" 105 ; Lw (T0, Mem (SP, 0)) 106 ; Lw (T1, Mem (SP, 4)) 107 ; Sle (V0, T0, T1) 108 ; Jr RA 109 110 ; Label "_lt" 111 ; Lw (T0, Mem (SP, 0)) 112 ; Lw (T1, Mem (SP, 4)) 113 ; Slt (V0, T0, T1) 114 ; Jr RA 115 116 ; Label "_xor" 117 ; Lw (T0, Mem (SP, 0)) 118 ; Lw (T1, Mem (SP, 4)) 119 ; Xor (V0, T0, T1) 120 ; Jr RA 121 122 ; Label "_or" 123 ; Lw (T0, Mem (SP, 0)) 124 ; Lw (T1, Mem (SP, 4)) 125 ; Or (V0, T0, T1) 126 ; Jr RA 127 128 ; Label "_and" 129 ; Lw (T0, Mem (SP, 0)) 130 ; Lw (T1, Mem (SP, 4)) 131 ; And (V0, T0, T1) 132 ; Jr RA 133 134 ; Label "_rev" 135 ; Lw (T0, Mem (SP, 0)) 136 ; Sub (V0, T0, Zero) 137 ; Jr RA 138 139 ; Label "_not" 140 ; Lw (T0, Mem (SP, 0)) 141 ; Seq (V0, T0, Zero) 142 ; Jr RA 143 144 ]