sig
  type 'a asm
  type text = [ `text ] X86_64.asm
  type data = [ `data ] X86_64.asm
  type label = string
  val nop : [>  ] X86_64.asm
  val ( ++ ) :
    ([< `data | `text ] as 'a) X86_64.asm -> 'X86_64.asm -> 'X86_64.asm
  val inline : string -> [>  ] X86_64.asm
  type program = { text : X86_64.text; data : X86_64.data; }
  val print_program : Stdlib.Format.formatter -> X86_64.program -> unit
  val print_in_file : file:string -> X86_64.program -> unit
  type size = [ `B | `L | `Q | `W ]
  type 'size register
  val rax : [ `Q ] X86_64.register
  val rbx : [ `Q ] X86_64.register
  val rcx : [ `Q ] X86_64.register
  val rdx : [ `Q ] X86_64.register
  val rsi : [ `Q ] X86_64.register
  val rdi : [ `Q ] X86_64.register
  val rbp : [ `Q ] X86_64.register
  val rsp : [ `Q ] X86_64.register
  val r8 : [ `Q ] X86_64.register
  val r9 : [ `Q ] X86_64.register
  val r10 : [ `Q ] X86_64.register
  val r11 : [ `Q ] X86_64.register
  val r12 : [ `Q ] X86_64.register
  val r13 : [ `Q ] X86_64.register
  val r14 : [ `Q ] X86_64.register
  val r15 : [ `Q ] X86_64.register
  val eax : [ `L ] X86_64.register
  val ebx : [ `L ] X86_64.register
  val ecx : [ `L ] X86_64.register
  val edx : [ `L ] X86_64.register
  val esi : [ `L ] X86_64.register
  val edi : [ `L ] X86_64.register
  val ebp : [ `L ] X86_64.register
  val esp : [ `L ] X86_64.register
  val r8d : [ `L ] X86_64.register
  val r9d : [ `L ] X86_64.register
  val r10d : [ `L ] X86_64.register
  val r11d : [ `L ] X86_64.register
  val r12d : [ `L ] X86_64.register
  val r13d : [ `L ] X86_64.register
  val r14d : [ `L ] X86_64.register
  val r15d : [ `L ] X86_64.register
  val ax : [ `W ] X86_64.register
  val bx : [ `W ] X86_64.register
  val cx : [ `W ] X86_64.register
  val dx : [ `W ] X86_64.register
  val si : [ `W ] X86_64.register
  val di : [ `W ] X86_64.register
  val bp : [ `W ] X86_64.register
  val sp : [ `W ] X86_64.register
  val r8w : [ `W ] X86_64.register
  val r9w : [ `W ] X86_64.register
  val r10w : [ `W ] X86_64.register
  val r11w : [ `W ] X86_64.register
  val r12w : [ `W ] X86_64.register
  val r13w : [ `W ] X86_64.register
  val r14w : [ `W ] X86_64.register
  val r15w : [ `W ] X86_64.register
  val al : [ `B ] X86_64.register
  val bl : [ `B ] X86_64.register
  val cl : [ `B ] X86_64.register
  val dl : [ `B ] X86_64.register
  val ah : [ `B ] X86_64.register
  val bh : [ `B ] X86_64.register
  val ch : [ `B ] X86_64.register
  val dh : [ `B ] X86_64.register
  val sil : [ `B ] X86_64.register
  val dil : [ `B ] X86_64.register
  val bpl : [ `B ] X86_64.register
  val spl : [ `B ] X86_64.register
  val r8b : [ `B ] X86_64.register
  val r9b : [ `B ] X86_64.register
  val r10b : [ `B ] X86_64.register
  val r11b : [ `B ] X86_64.register
  val r12b : [ `B ] X86_64.register
  val r13b : [ `B ] X86_64.register
  val r14b : [ `B ] X86_64.register
  val r15b : [ `B ] X86_64.register
  type 'size operand
  val imm : int -> [>  ] X86_64.operand
  val imm32 : int32 -> [>  ] X86_64.operand
  val imm64 : int64 -> [>  ] X86_64.operand
  val reg : 'size X86_64.register -> 'size X86_64.operand
  val ( !% ) : 'size X86_64.register -> 'size X86_64.operand
  val ind :
    ?ofs:int ->
    ?index:'size1 X86_64.register ->
    ?scale:int -> 'size2 X86_64.register -> [>  ] X86_64.operand
  val lab : X86_64.label -> [>  ] X86_64.operand
  val ilab : X86_64.label -> [ `Q ] X86_64.operand
  val movb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val movw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val movl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val movq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val movsbw : [ `B ] X86_64.operand -> [ `W ] X86_64.register -> X86_64.text
  val movsbl : [ `B ] X86_64.operand -> [ `L ] X86_64.register -> X86_64.text
  val movsbq : [ `B ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val movswl : [ `W ] X86_64.operand -> [ `L ] X86_64.register -> X86_64.text
  val movswq : [ `W ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val movslq : [ `L ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val movzbw : [ `B ] X86_64.operand -> [ `W ] X86_64.register -> X86_64.text
  val movzbl : [ `B ] X86_64.operand -> [ `L ] X86_64.register -> X86_64.text
  val movzbq : [ `B ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val movzwl : [ `W ] X86_64.operand -> [ `L ] X86_64.register -> X86_64.text
  val movzwq : [ `W ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val movabsq :
    [ `Q ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val leab : [ `B ] X86_64.operand -> [ `B ] X86_64.register -> X86_64.text
  val leaw : [ `W ] X86_64.operand -> [ `W ] X86_64.register -> X86_64.text
  val leal : [ `L ] X86_64.operand -> [ `L ] X86_64.register -> X86_64.text
  val leaq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.register -> X86_64.text
  val incb : [ `B ] X86_64.operand -> X86_64.text
  val incw : [ `W ] X86_64.operand -> X86_64.text
  val incl : [ `L ] X86_64.operand -> X86_64.text
  val incq : [ `Q ] X86_64.operand -> X86_64.text
  val decb : [ `B ] X86_64.operand -> X86_64.text
  val decw : [ `W ] X86_64.operand -> X86_64.text
  val decl : [ `L ] X86_64.operand -> X86_64.text
  val decq : [ `Q ] X86_64.operand -> X86_64.text
  val negb : [ `B ] X86_64.operand -> X86_64.text
  val negw : [ `W ] X86_64.operand -> X86_64.text
  val negl : [ `L ] X86_64.operand -> X86_64.text
  val negq : [ `Q ] X86_64.operand -> X86_64.text
  val addb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val addw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val addl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val addq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val subb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val subw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val subl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val subq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val imulw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val imull : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val imulq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val idivq : [ `Q ] X86_64.operand -> X86_64.text
  val cqto : X86_64.text
  val notb : [ `B ] X86_64.operand -> X86_64.text
  val notw : [ `W ] X86_64.operand -> X86_64.text
  val notl : [ `L ] X86_64.operand -> X86_64.text
  val notq : [ `Q ] X86_64.operand -> X86_64.text
  val andb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val andw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val andl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val andq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val orb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val orw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val orl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val orq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val xorb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val xorw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val xorl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val xorq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val shlb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val shlw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val shll : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val shlq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val shrb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val shrw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val shrl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val shrq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val sarb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val sarw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val sarl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val sarq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val call : X86_64.label -> X86_64.text
  val call_star : [ `Q ] X86_64.operand -> X86_64.text
  val leave : X86_64.text
  val ret : X86_64.text
  val jmp : X86_64.label -> X86_64.text
  val jmp_star : [ `Q ] X86_64.operand -> X86_64.text
  val je : X86_64.label -> X86_64.text
  val jz : X86_64.label -> X86_64.text
  val jne : X86_64.label -> X86_64.text
  val jnz : X86_64.label -> X86_64.text
  val js : X86_64.label -> X86_64.text
  val jns : X86_64.label -> X86_64.text
  val jg : X86_64.label -> X86_64.text
  val jge : X86_64.label -> X86_64.text
  val jl : X86_64.label -> X86_64.text
  val jle : X86_64.label -> X86_64.text
  val ja : X86_64.label -> X86_64.text
  val jae : X86_64.label -> X86_64.text
  val jb : X86_64.label -> X86_64.text
  val jbe : X86_64.label -> X86_64.text
  val cmpb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val cmpw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val cmpl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val cmpq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val testb : [ `B ] X86_64.operand -> [ `B ] X86_64.operand -> X86_64.text
  val testw : [ `W ] X86_64.operand -> [ `W ] X86_64.operand -> X86_64.text
  val testl : [ `L ] X86_64.operand -> [ `L ] X86_64.operand -> X86_64.text
  val testq : [ `Q ] X86_64.operand -> [ `Q ] X86_64.operand -> X86_64.text
  val sete : [ `B ] X86_64.operand -> X86_64.text
  val setne : [ `B ] X86_64.operand -> X86_64.text
  val sets : [ `B ] X86_64.operand -> X86_64.text
  val setns : [ `B ] X86_64.operand -> X86_64.text
  val setg : [ `B ] X86_64.operand -> X86_64.text
  val setge : [ `B ] X86_64.operand -> X86_64.text
  val setl : [ `B ] X86_64.operand -> X86_64.text
  val setle : [ `B ] X86_64.operand -> X86_64.text
  val seta : [ `B ] X86_64.operand -> X86_64.text
  val setae : [ `B ] X86_64.operand -> X86_64.text
  val setb : [ `B ] X86_64.operand -> X86_64.text
  val setbe : [ `B ] X86_64.operand -> X86_64.text
  val pushq : [ `Q ] X86_64.operand -> X86_64.text
  val popq : [ `Q ] X86_64.register -> X86_64.text
  val label : X86_64.label -> [>  ] X86_64.asm
  val globl : X86_64.label -> [>  ] X86_64.asm
  val comment : string -> [>  ] X86_64.asm
  val string : string -> X86_64.data
  val dbyte : int list -> X86_64.data
  val dword : int list -> X86_64.data
  val dint : int list -> X86_64.data
  val dquad : int list -> X86_64.data
  val address : X86_64.label list -> X86_64.data
  val space : int -> X86_64.data
end