mips-cc

A little C compiler
git clone git@git.mpah.dev/mips-cc.git
Log | Files | Refs | README

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   ]