sig
  type size = W | H | B | DW
  type reg = R0 | R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10
  type int16 = int
  type cond = [ `EQ | `GE | `GT | `NE | `SET | `SGE | `SGT ]
  type +'label insn
  val ldx : EBPF.size -> EBPF.reg -> EBPF.reg * EBPF.int16 -> 'EBPF.insn
  val lddw : EBPF.reg -> int64 -> 'EBPF.insn
  val stx : EBPF.size -> EBPF.reg * EBPF.int16 -> EBPF.reg -> 'EBPF.insn
  val st : EBPF.size -> EBPF.reg * EBPF.int16 -> int -> 'EBPF.insn
  val label : 'label -> 'label EBPF.insn
  val ret : 'EBPF.insn
  val call : int -> 'EBPF.insn
  val jump : 'label -> 'label EBPF.insn
  val jmpi : 'label -> EBPF.reg -> EBPF.cond -> int -> 'label EBPF.insn
  val jmp : 'label -> EBPF.reg -> EBPF.cond -> EBPF.reg -> 'label EBPF.insn
  val jump_ : EBPF.int16 -> 'EBPF.insn
  val jmpi_ : EBPF.int16 -> EBPF.reg -> EBPF.cond -> int -> 'EBPF.insn
  val jmp_ : EBPF.int16 -> EBPF.reg -> EBPF.cond -> EBPF.reg -> 'EBPF.insn
  module type ALU =
    sig
      val add : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val addi : EBPF.reg -> int -> 'EBPF.insn
      val sub : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val subi : EBPF.reg -> int -> 'EBPF.insn
      val mul : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val muli : EBPF.reg -> int -> 'EBPF.insn
      val div : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val divi : EBPF.reg -> int -> 'EBPF.insn
      val or_ : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val ori : EBPF.reg -> int -> 'EBPF.insn
      val and_ : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val andi : EBPF.reg -> int -> 'EBPF.insn
      val lsh : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val lshi : EBPF.reg -> int -> 'EBPF.insn
      val rsh : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val rshi : EBPF.reg -> int -> 'EBPF.insn
      val neg : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val negi : EBPF.reg -> int -> 'EBPF.insn
      val mod_ : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val modi : EBPF.reg -> int -> 'EBPF.insn
      val xor : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val xori : EBPF.reg -> int -> 'EBPF.insn
      val mov : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val movi : EBPF.reg -> int -> 'EBPF.insn
      val arsh : EBPF.reg -> EBPF.reg -> 'EBPF.insn
      val arshi : EBPF.reg -> int -> 'EBPF.insn
    end
  module I32 : ALU
  val add : reg -> reg -> 'a insn
  val addi : reg -> int -> 'a insn
  val sub : reg -> reg -> 'a insn
  val subi : reg -> int -> 'a insn
  val mul : reg -> reg -> 'a insn
  val muli : reg -> int -> 'a insn
  val div : reg -> reg -> 'a insn
  val divi : reg -> int -> 'a insn
  val or_ : reg -> reg -> 'a insn
  val ori : reg -> int -> 'a insn
  val and_ : reg -> reg -> 'a insn
  val andi : reg -> int -> 'a insn
  val lsh : reg -> reg -> 'a insn
  val lshi : reg -> int -> 'a insn
  val rsh : reg -> reg -> 'a insn
  val rshi : reg -> int -> 'a insn
  val neg : reg -> reg -> 'a insn
  val negi : reg -> int -> 'a insn
  val mod_ : reg -> reg -> 'a insn
  val modi : reg -> int -> 'a insn
  val xor : reg -> reg -> 'a insn
  val xori : reg -> int -> 'a insn
  val mov : reg -> reg -> 'a insn
  val movi : reg -> int -> 'a insn
  val arsh : reg -> reg -> 'a insn
  val arshi : reg -> int -> 'a insn
  val le16 : EBPF.reg -> 'EBPF.insn
  val be16 : EBPF.reg -> 'EBPF.insn
  val le32 : EBPF.reg -> 'EBPF.insn
  val be32 : EBPF.reg -> 'EBPF.insn
  val le64 : EBPF.reg -> 'EBPF.insn
  val be64 : EBPF.reg -> 'EBPF.insn
  type options = {
    disable_all_checks : bool;
    jump_back : bool;
    jump_self : bool;
  }
  val default : EBPF.options
  val assemble : ?options:EBPF.options -> 'EBPF.insn list -> string
end