sig
  type 'a asm
  type text = [ `text ] Mips.asm
  type data = [ `data ] Mips.asm
  type program = { text : [ `text ] Mips.asm; data : [ `data ] Mips.asm; }
  val print_program : Format.formatter -> Mips.program -> unit
  type 'a register
  type word = [ `word ]
  type double = [ `double ]
  val v0 : Mips.word Mips.register
  val v1 : Mips.word Mips.register
  val a0 : Mips.word Mips.register
  val a1 : Mips.word Mips.register
  val a2 : Mips.word Mips.register
  val a3 : Mips.word Mips.register
  val t0 : Mips.word Mips.register
  val t1 : Mips.word Mips.register
  val t2 : Mips.word Mips.register
  val t3 : Mips.word Mips.register
  val s0 : Mips.word Mips.register
  val s1 : Mips.word Mips.register
  val ra : Mips.word Mips.register
  val sp : Mips.word Mips.register
  val fp : Mips.word Mips.register
  val gp : Mips.word Mips.register
  val zero : Mips.word Mips.register
  val f0 : Mips.double Mips.register
  val f2 : Mips.double Mips.register
  val f4 : Mips.double Mips.register
  val f6 : Mips.double Mips.register
  val f8 : Mips.double Mips.register
  val f10 : Mips.double Mips.register
  val f12 : Mips.double Mips.register
  type label = string
  type 'a operand
  val oreg : Mips.word Mips.register Mips.operand
  val oi : int Mips.operand
  val oi32 : int32 Mips.operand
  val li : Mips.word Mips.register -> int -> Mips.text
  val li32 : Mips.word Mips.register -> int32 -> Mips.text
  val abs : Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val neg : Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val add :
    Mips.word Mips.register ->
    Mips.word Mips.register -> 'Mips.operand -> '-> Mips.text
  val sub :
    Mips.word Mips.register ->
    Mips.word Mips.register -> 'Mips.operand -> '-> Mips.text
  val mul :
    Mips.word Mips.register ->
    Mips.word Mips.register -> 'Mips.operand -> '-> Mips.text
  val div :
    Mips.word Mips.register ->
    Mips.word Mips.register -> 'Mips.operand -> '-> Mips.text
  val rem :
    Mips.word Mips.register ->
    Mips.word Mips.register -> 'Mips.operand -> '-> Mips.text
  val cvt_d_w :
    Mips.double Mips.register -> Mips.double Mips.register -> 'Mips.asm
  val cvt_w_d :
    Mips.double Mips.register -> Mips.double Mips.register -> 'Mips.asm
  val abs_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val neg_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val add_d :
    Mips.double Mips.register ->
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val sub_d :
    Mips.double Mips.register ->
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val mul_d :
    Mips.double Mips.register ->
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val div_d :
    Mips.double Mips.register ->
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val clz : Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val and_ :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val or_ :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val not_ : Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val seq :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val sge :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val sgt :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val sle :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val slt :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val sne :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val c_eq_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val c_le_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val c_lt_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val b : Mips.label -> Mips.text
  val beq :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val bne :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val bge :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val bgt :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val ble :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val blt :
    Mips.word Mips.register ->
    Mips.word Mips.register -> Mips.label -> Mips.text
  val beqz : Mips.word Mips.register -> Mips.label -> Mips.text
  val bnez : Mips.word Mips.register -> Mips.label -> Mips.text
  val bgez : Mips.word Mips.register -> Mips.label -> Mips.text
  val bgtz : Mips.word Mips.register -> Mips.label -> Mips.text
  val blez : Mips.word Mips.register -> Mips.label -> Mips.text
  val bltz : Mips.word Mips.register -> Mips.label -> Mips.text
  val bc1f : Mips.label -> Mips.text
  val bc1t : Mips.label -> Mips.text
  val jr : Mips.word Mips.register -> Mips.text
  val jal : Mips.label -> Mips.text
  val jalr : Mips.word Mips.register -> Mips.text
  type 'a address
  val alab : Mips.label Mips.address
  val areg : (int * 'Mips.register) Mips.address
  val la : Mips.word Mips.register -> 'Mips.address -> '-> Mips.text
  val lbu : Mips.word Mips.register -> 'Mips.address -> '-> Mips.text
  val lb : Mips.word Mips.register -> 'Mips.address -> '-> 'Mips.asm
  val lw : Mips.word Mips.register -> 'Mips.address -> '-> Mips.text
  val lwc1 : Mips.double Mips.register -> 'Mips.address -> '-> Mips.text
  val ldc1 : Mips.double Mips.register -> 'Mips.address -> '-> Mips.text
  val sb : Mips.word Mips.register -> 'Mips.address -> '-> Mips.text
  val sw : Mips.word Mips.register -> 'Mips.address -> '-> Mips.text
  val swc1 : Mips.double Mips.register -> 'Mips.address -> '-> Mips.text
  val sdc1 : Mips.double Mips.register -> 'Mips.address -> '-> Mips.text
  val move : Mips.word Mips.register -> Mips.word Mips.register -> Mips.text
  val mov_d :
    Mips.double Mips.register -> Mips.double Mips.register -> Mips.text
  val mfc1 :
    Mips.word Mips.register -> Mips.double Mips.register -> Mips.text
  val mtc1 :
    Mips.word Mips.register -> Mips.double Mips.register -> Mips.text
  val nop : [>  ] Mips.asm
  val label : Mips.label -> [>  ] Mips.asm
  val syscall : Mips.text
  val comment : string -> [>  ] Mips.asm
  val align : int -> [>  ] Mips.asm
  val space : int -> Mips.data
  val asciiz : string -> Mips.data
  val word : int list -> Mips.data
  val address : Mips.label list -> Mips.data
  val double : float list -> Mips.data
  val ( @@ ) :
    ([< `data | `text ] as 'a) Mips.asm -> 'Mips.asm -> 'Mips.asm
  val ( ++ ) :
    ([< `data | `text ] as 'a) Mips.asm -> 'Mips.asm -> 'Mips.asm
  val set_stack_alignment : int -> unit
  val get_stack_alignment : unit -> int
  val push : [< `double | `word ] Mips.register -> Mips.text
  val peek : [< `double | `word ] Mips.register -> Mips.text
  val pop : [< `double | `word ] Mips.register -> Mips.text
end