"Fossies" - the Fresh Open Source Software Archive

Member "fasm/source/x86_64.inc" (21 Feb 2022, 145483 Bytes) of package /linux/misc/fasm-1.73.30.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) fasm source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. See also the latest Fossies "Diffs" side-by-side code changes report for "x86_64.inc": 1.73.29_vs_1.73.30.

    1 
    2 ; flat assembler core
    3 ; Copyright (c) 1999-2022, Tomasz Grysztar.
    4 ; All rights reserved.
    5 
    6 simple_instruction_except64:
    7     cmp [code_type],64
    8     je  illegal_instruction
    9 simple_instruction:
   10     stos    byte [edi]
   11     jmp instruction_assembled
   12 simple_instruction_only64:
   13     cmp [code_type],64
   14     jne illegal_instruction
   15     jmp simple_instruction
   16 simple_instruction_16bit_except64:
   17     cmp [code_type],64
   18     je  illegal_instruction
   19 simple_instruction_16bit:
   20     cmp [code_type],16
   21     jne size_prefix
   22     stos    byte [edi]
   23     jmp instruction_assembled
   24       size_prefix:
   25     mov ah,al
   26     mov al,66h
   27     stos    word [edi]
   28     jmp instruction_assembled
   29 simple_instruction_32bit_except64:
   30     cmp [code_type],64
   31     je  illegal_instruction
   32 simple_instruction_32bit:
   33     cmp [code_type],16
   34     je  size_prefix
   35     stos    byte [edi]
   36     jmp instruction_assembled
   37 iret_instruction:
   38     cmp [code_type],64
   39     jne simple_instruction
   40 simple_instruction_64bit:
   41     cmp [code_type],64
   42     jne illegal_instruction
   43     mov ah,al
   44     mov al,48h
   45     stos    word [edi]
   46     jmp instruction_assembled
   47 simple_extended_instruction_64bit:
   48     cmp [code_type],64
   49     jne illegal_instruction
   50     mov byte [edi],48h
   51     inc edi
   52 simple_extended_instruction:
   53     mov ah,al
   54     mov al,0Fh
   55     stos    word [edi]
   56     jmp instruction_assembled
   57 simple_extended_instruction_f3:
   58     mov byte [edi],0F3h
   59     inc edi
   60     jmp simple_extended_instruction
   61 prefix_instruction:
   62     stos    byte [edi]
   63     or  [prefix_flags],1
   64     jmp continue_line
   65 segment_prefix:
   66     mov ah,al
   67     shr ah,4
   68     cmp ah,3
   69     jne illegal_instruction
   70     and al,1111b
   71     mov [segment_register],al
   72     call    store_segment_prefix
   73     or  [prefix_flags],1
   74     jmp continue_line
   75 bnd_prefix_instruction:
   76     stos    byte [edi]
   77     or  [prefix_flags],1 + 10h
   78     jmp continue_line
   79 int_instruction:
   80     lods    byte [esi]
   81     call    get_size_operator
   82     cmp ah,1
   83     ja  invalid_operand_size
   84     cmp al,'('
   85     jne invalid_operand
   86     call    get_byte_value
   87     test    eax,eax
   88     jns int_imm_ok
   89     call    recoverable_overflow
   90       int_imm_ok:
   91     mov ah,al
   92     mov al,0CDh
   93     stos    word [edi]
   94     jmp instruction_assembled
   95 aa_instruction:
   96     cmp [code_type],64
   97     je  illegal_instruction
   98     push    eax
   99     mov bl,10
  100     cmp byte [esi],'('
  101     jne aa_store
  102     inc esi
  103     xor al,al
  104     xchg    al,[operand_size]
  105     cmp al,1
  106     ja  invalid_operand_size
  107     call    get_byte_value
  108     mov bl,al
  109       aa_store:
  110     cmp [operand_size],0
  111     jne invalid_operand
  112     pop eax
  113     mov ah,bl
  114     stos    word [edi]
  115     jmp instruction_assembled
  116 
  117 basic_instruction:
  118     mov [base_code],al
  119     lods    byte [esi]
  120     call    get_size_operator
  121     cmp al,10h
  122     je  basic_reg
  123     cmp al,'['
  124     jne invalid_operand
  125       basic_mem:
  126     call    get_address
  127     push    edx ebx ecx
  128     lods    byte [esi]
  129     cmp al,','
  130     jne invalid_operand
  131     lods    byte [esi]
  132     call    get_size_operator
  133     cmp al,'('
  134     je  basic_mem_imm
  135     cmp al,10h
  136     jne invalid_operand
  137       basic_mem_reg:
  138     lods    byte [esi]
  139     call    convert_register
  140     mov [postbyte_register],al
  141     pop ecx ebx edx
  142     mov al,ah
  143     cmp al,1
  144     je  instruction_ready
  145     call    operand_autodetect
  146     inc [base_code]
  147       instruction_ready:
  148     call    store_instruction
  149     jmp instruction_assembled
  150       basic_mem_imm:
  151     mov al,[operand_size]
  152     cmp al,1
  153     jb  basic_mem_imm_nosize
  154     je  basic_mem_imm_8bit
  155     cmp al,2
  156     je  basic_mem_imm_16bit
  157     cmp al,4
  158     je  basic_mem_imm_32bit
  159     cmp al,8
  160     jne invalid_operand_size
  161       basic_mem_imm_64bit:
  162     cmp [size_declared],0
  163     jne long_immediate_not_encodable
  164     call    operand_64bit
  165     call    get_simm32
  166     cmp [value_type],4
  167     jae long_immediate_not_encodable
  168     jmp basic_mem_imm_32bit_ok
  169       basic_mem_imm_nosize:
  170     call    recoverable_unknown_size
  171       basic_mem_imm_8bit:
  172     call    get_byte_value
  173     mov byte [value],al
  174     mov al,[base_code]
  175     shr al,3
  176     mov [postbyte_register],al
  177     pop ecx ebx edx
  178     mov [base_code],80h
  179     call    store_instruction_with_imm8
  180     jmp instruction_assembled
  181       basic_mem_imm_16bit:
  182     call    operand_16bit
  183     call    get_word_value
  184     mov word [value],ax
  185     mov al,[base_code]
  186     shr al,3
  187     mov [postbyte_register],al
  188     pop ecx ebx edx
  189     cmp [value_type],0
  190     jne basic_mem_imm_16bit_store
  191     cmp [size_declared],0
  192     jne basic_mem_imm_16bit_store
  193     cmp word [value],80h
  194     jb  basic_mem_simm_8bit
  195     cmp word [value],-80h
  196     jae basic_mem_simm_8bit
  197       basic_mem_imm_16bit_store:
  198     mov [base_code],81h
  199     call    store_instruction_with_imm16
  200     jmp instruction_assembled
  201       basic_mem_simm_8bit:
  202     mov [base_code],83h
  203     call    store_instruction_with_imm8
  204     jmp instruction_assembled
  205       basic_mem_imm_32bit:
  206     call    operand_32bit
  207     call    get_dword_value
  208       basic_mem_imm_32bit_ok:
  209     mov dword [value],eax
  210     mov al,[base_code]
  211     shr al,3
  212     mov [postbyte_register],al
  213     pop ecx ebx edx
  214     cmp [value_type],0
  215     jne basic_mem_imm_32bit_store
  216     cmp [size_declared],0
  217     jne basic_mem_imm_32bit_store
  218     cmp dword [value],80h
  219     jb  basic_mem_simm_8bit
  220     cmp dword [value],-80h
  221     jae basic_mem_simm_8bit
  222       basic_mem_imm_32bit_store:
  223     mov [base_code],81h
  224     call    store_instruction_with_imm32
  225     jmp instruction_assembled
  226       get_simm32:
  227     call    get_qword_value
  228     mov ecx,edx
  229     cdq
  230     cmp ecx,edx
  231     je  simm32_range_ok
  232     call    recoverable_overflow
  233       simm32_range_ok:
  234     cmp [value_type],4
  235     jne get_simm32_ok
  236     mov [value_type],2
  237       get_simm32_ok:
  238     ret
  239       basic_reg:
  240     lods    byte [esi]
  241     call    convert_register
  242     mov [postbyte_register],al
  243     lods    byte [esi]
  244     cmp al,','
  245     jne invalid_operand
  246     lods    byte [esi]
  247     call    get_size_operator
  248     cmp al,10h
  249     je  basic_reg_reg
  250     cmp al,'('
  251     je  basic_reg_imm
  252     cmp al,'['
  253     jne invalid_operand
  254       basic_reg_mem:
  255     call    get_address
  256     mov al,[operand_size]
  257     cmp al,1
  258     je  basic_reg_mem_8bit
  259     call    operand_autodetect
  260     add [base_code],3
  261     jmp instruction_ready
  262       basic_reg_mem_8bit:
  263     add [base_code],2
  264     jmp instruction_ready
  265       basic_reg_reg:
  266     lods    byte [esi]
  267     call    convert_register
  268     mov bl,[postbyte_register]
  269     mov [postbyte_register],al
  270     mov al,ah
  271     cmp al,1
  272     je  nomem_instruction_ready
  273     call    operand_autodetect
  274     inc [base_code]
  275       nomem_instruction_ready:
  276     call    store_nomem_instruction
  277     jmp instruction_assembled
  278       basic_reg_imm:
  279     mov al,[operand_size]
  280     cmp al,1
  281     je  basic_reg_imm_8bit
  282     cmp al,2
  283     je  basic_reg_imm_16bit
  284     cmp al,4
  285     je  basic_reg_imm_32bit
  286     cmp al,8
  287     jne invalid_operand_size
  288       basic_reg_imm_64bit:
  289     cmp [size_declared],0
  290     jne long_immediate_not_encodable
  291     call    operand_64bit
  292     call    get_simm32
  293     cmp [value_type],4
  294     jae long_immediate_not_encodable
  295     jmp basic_reg_imm_32bit_ok
  296       basic_reg_imm_8bit:
  297     call    get_byte_value
  298     mov dl,al
  299     mov bl,[base_code]
  300     shr bl,3
  301     xchg    bl,[postbyte_register]
  302     or  bl,bl
  303     jz  basic_al_imm
  304     mov [base_code],80h
  305     call    store_nomem_instruction
  306     mov al,dl
  307     stos    byte [edi]
  308     jmp instruction_assembled
  309       basic_al_imm:
  310     mov al,[base_code]
  311     add al,4
  312     stos    byte [edi]
  313     mov al,dl
  314     stos    byte [edi]
  315     jmp instruction_assembled
  316       basic_reg_imm_16bit:
  317     call    operand_16bit
  318     call    get_word_value
  319     mov dx,ax
  320     mov bl,[base_code]
  321     shr bl,3
  322     xchg    bl,[postbyte_register]
  323     cmp [value_type],0
  324     jne basic_reg_imm_16bit_store
  325     cmp [size_declared],0
  326     jne basic_reg_imm_16bit_store
  327     cmp dx,80h
  328     jb  basic_reg_simm_8bit
  329     cmp dx,-80h
  330     jae basic_reg_simm_8bit
  331       basic_reg_imm_16bit_store:
  332     or  bl,bl
  333     jz  basic_ax_imm
  334     mov [base_code],81h
  335     call    store_nomem_instruction
  336       basic_store_imm_16bit:
  337     mov ax,dx
  338     call    mark_relocation
  339     stos    word [edi]
  340     jmp instruction_assembled
  341       basic_reg_simm_8bit:
  342     mov [base_code],83h
  343     call    store_nomem_instruction
  344     mov al,dl
  345     stos    byte [edi]
  346     jmp instruction_assembled
  347       basic_ax_imm:
  348     add [base_code],5
  349     call    store_classic_instruction_code
  350     jmp basic_store_imm_16bit
  351       basic_reg_imm_32bit:
  352     call    operand_32bit
  353     call    get_dword_value
  354       basic_reg_imm_32bit_ok:
  355     mov edx,eax
  356     mov bl,[base_code]
  357     shr bl,3
  358     xchg    bl,[postbyte_register]
  359     cmp [value_type],0
  360     jne basic_reg_imm_32bit_store
  361     cmp [size_declared],0
  362     jne basic_reg_imm_32bit_store
  363     cmp edx,80h
  364     jb  basic_reg_simm_8bit
  365     cmp edx,-80h
  366     jae basic_reg_simm_8bit
  367       basic_reg_imm_32bit_store:
  368     or  bl,bl
  369     jz  basic_eax_imm
  370     mov [base_code],81h
  371     call    store_nomem_instruction
  372       basic_store_imm_32bit:
  373     mov eax,edx
  374     call    mark_relocation
  375     stos    dword [edi]
  376     jmp instruction_assembled
  377       basic_eax_imm:
  378     add [base_code],5
  379     call    store_classic_instruction_code
  380     jmp basic_store_imm_32bit
  381       recoverable_unknown_size:
  382     cmp [error_line],0
  383     jne ignore_unknown_size
  384     push    [current_line]
  385     pop [error_line]
  386     mov [error],operand_size_not_specified
  387       ignore_unknown_size:
  388     ret
  389 single_operand_instruction:
  390     mov [base_code],0F6h
  391     mov [postbyte_register],al
  392     lods    byte [esi]
  393     call    get_size_operator
  394     cmp al,10h
  395     je  single_reg
  396     cmp al,'['
  397     jne invalid_operand
  398       single_mem:
  399     call    get_address
  400     mov al,[operand_size]
  401     cmp al,1
  402     je  single_mem_8bit
  403     jb  single_mem_nosize
  404     call    operand_autodetect
  405     inc [base_code]
  406     jmp instruction_ready
  407       single_mem_nosize:
  408     call    recoverable_unknown_size
  409       single_mem_8bit:
  410     jmp instruction_ready
  411       single_reg:
  412     lods    byte [esi]
  413     call    convert_register
  414     mov bl,al
  415     mov al,ah
  416     cmp al,1
  417     je  single_reg_8bit
  418     call    operand_autodetect
  419     inc [base_code]
  420       single_reg_8bit:
  421     jmp nomem_instruction_ready
  422 mov_instruction:
  423     mov [base_code],88h
  424     lods    byte [esi]
  425     call    get_size_operator
  426     cmp al,10h
  427     je  mov_reg
  428     cmp al,14h
  429     je  mov_creg
  430     cmp al,'['
  431     jne invalid_operand
  432       mov_mem:
  433     call    get_address
  434     push    edx ebx ecx
  435     lods    byte [esi]
  436     cmp al,','
  437     jne invalid_operand
  438     lods    byte [esi]
  439     call    get_size_operator
  440     cmp al,'('
  441     je  mov_mem_imm
  442     cmp al,10h
  443     jne invalid_operand
  444       mov_mem_reg:
  445     lods    byte [esi]
  446     cmp al,30h
  447     jb  mov_mem_general_reg
  448     cmp al,40h
  449     jb  mov_mem_sreg
  450       mov_mem_general_reg:
  451     call    convert_register
  452     mov [postbyte_register],al
  453     pop ecx ebx edx
  454     cmp ah,1
  455     je  mov_mem_reg_8bit
  456     inc [base_code]
  457     mov al,ah
  458     call    operand_autodetect
  459     mov al,[postbyte_register]
  460     or  al,bl
  461     or  al,bh
  462     jz  mov_mem_ax
  463     jmp instruction_ready
  464       mov_mem_reg_8bit:
  465     or  al,bl
  466     or  al,bh
  467     jnz instruction_ready
  468       mov_mem_al:
  469     test    ch,22h
  470     jnz mov_mem_address16_al
  471     test    ch,44h
  472     jnz mov_mem_address32_al
  473     test    ch,not 88h
  474     jnz invalid_address_size
  475     call    check_mov_address64
  476     cmp al,0
  477     jg  mov_mem_address64_al
  478     jl  instruction_ready
  479     cmp [code_type],16
  480     jne mov_mem_address32_al
  481     cmp edx,10000h
  482     jb  mov_mem_address16_al
  483       mov_mem_address32_al:
  484     call    store_segment_prefix_if_necessary
  485     call    address_32bit_prefix
  486     mov [base_code],0A2h
  487       store_mov_address32:
  488     call    store_classic_instruction_code
  489     call    store_address_32bit_value
  490     jmp instruction_assembled
  491       mov_mem_address16_al:
  492     call    store_segment_prefix_if_necessary
  493     call    address_16bit_prefix
  494     mov [base_code],0A2h
  495       store_mov_address16:
  496     cmp [code_type],64
  497     je  invalid_address
  498     call    store_classic_instruction_code
  499     mov eax,edx
  500     stos    word [edi]
  501     cmp edx,10000h
  502     jge value_out_of_range
  503     jmp instruction_assembled
  504       check_mov_address64:
  505     cmp [code_type],64
  506     jne no_address64
  507     test    ch,88h
  508     jnz address64_required
  509     mov eax,[address_high]
  510     or  eax,eax
  511     jz  no_address64
  512     bt  edx,31
  513     adc eax,0
  514     jz  address64_simm32
  515       address64_required:
  516     mov al,1
  517     ret
  518       address64_simm32:
  519     mov al,-1
  520     ret
  521       no_address64:
  522     test    ch,08h
  523     jnz invalid_address_size
  524     xor al,al
  525     ret
  526       mov_mem_address64_al:
  527     call    store_segment_prefix_if_necessary
  528     mov [base_code],0A2h
  529       store_mov_address64:
  530     call    store_classic_instruction_code
  531     call    store_address_64bit_value
  532     jmp instruction_assembled
  533       mov_mem_ax:
  534     test    ch,22h
  535     jnz mov_mem_address16_ax
  536     test    ch,44h
  537     jnz mov_mem_address32_ax
  538     test    ch,not 88h
  539     jnz invalid_address_size
  540     call    check_mov_address64
  541     cmp al,0
  542     jg  mov_mem_address64_ax
  543     jl  instruction_ready
  544     cmp [code_type],16
  545     jne mov_mem_address32_ax
  546     cmp edx,10000h
  547     jb  mov_mem_address16_ax
  548       mov_mem_address32_ax:
  549     call    store_segment_prefix_if_necessary
  550     call    address_32bit_prefix
  551     mov [base_code],0A3h
  552     jmp store_mov_address32
  553       mov_mem_address16_ax:
  554     call    store_segment_prefix_if_necessary
  555     call    address_16bit_prefix
  556     mov [base_code],0A3h
  557     jmp store_mov_address16
  558       mov_mem_address64_ax:
  559     call    store_segment_prefix_if_necessary
  560     mov [base_code],0A3h
  561     jmp store_mov_address64
  562       mov_mem_sreg:
  563     sub al,31h
  564     mov [postbyte_register],al
  565     pop ecx ebx edx
  566     mov ah,[operand_size]
  567     or  ah,ah
  568     jz  mov_mem_sreg_store
  569     cmp ah,2
  570     jne invalid_operand_size
  571       mov_mem_sreg_store:
  572     mov [base_code],8Ch
  573     jmp instruction_ready
  574       mov_mem_imm:
  575     mov al,[operand_size]
  576     cmp al,1
  577     jb  mov_mem_imm_nosize
  578     je  mov_mem_imm_8bit
  579     cmp al,2
  580     je  mov_mem_imm_16bit
  581     cmp al,4
  582     je  mov_mem_imm_32bit
  583     cmp al,8
  584     jne invalid_operand_size
  585       mov_mem_imm_64bit:
  586     cmp [size_declared],0
  587     jne long_immediate_not_encodable
  588     call    operand_64bit
  589     call    get_simm32
  590     cmp [value_type],4
  591     jae long_immediate_not_encodable
  592     jmp mov_mem_imm_32bit_store
  593       mov_mem_imm_nosize:
  594     call    recoverable_unknown_size
  595       mov_mem_imm_8bit:
  596     call    get_byte_value
  597     mov byte [value],al
  598     mov [postbyte_register],0
  599     mov [base_code],0C6h
  600     pop ecx ebx edx
  601     call    store_instruction_with_imm8
  602     jmp instruction_assembled
  603       mov_mem_imm_16bit:
  604     call    operand_16bit
  605     call    get_word_value
  606     mov word [value],ax
  607     mov [postbyte_register],0
  608     mov [base_code],0C7h
  609     pop ecx ebx edx
  610     call    store_instruction_with_imm16
  611     jmp instruction_assembled
  612       mov_mem_imm_32bit:
  613     call    operand_32bit
  614     call    get_dword_value
  615       mov_mem_imm_32bit_store:
  616     mov dword [value],eax
  617     mov [postbyte_register],0
  618     mov [base_code],0C7h
  619     pop ecx ebx edx
  620     call    store_instruction_with_imm32
  621     jmp instruction_assembled
  622       mov_reg:
  623     lods    byte [esi]
  624     mov ah,al
  625     sub ah,10h
  626     and ah,al
  627     test    ah,0F0h
  628     jnz mov_sreg
  629     call    convert_register
  630     mov [postbyte_register],al
  631     lods    byte [esi]
  632     cmp al,','
  633     jne invalid_operand
  634     lods    byte [esi]
  635     call    get_size_operator
  636     cmp al,'['
  637     je  mov_reg_mem
  638     cmp al,'('
  639     je  mov_reg_imm
  640     cmp al,14h
  641     je  mov_reg_creg
  642     cmp al,10h
  643     jne invalid_operand
  644       mov_reg_reg:
  645     lods    byte [esi]
  646     mov ah,al
  647     sub ah,10h
  648     and ah,al
  649     test    ah,0F0h
  650     jnz mov_reg_sreg
  651     call    convert_register
  652     mov bl,[postbyte_register]
  653     mov [postbyte_register],al
  654     mov al,ah
  655     cmp al,1
  656     je  mov_reg_reg_8bit
  657     call    operand_autodetect
  658     inc [base_code]
  659       mov_reg_reg_8bit:
  660     jmp nomem_instruction_ready
  661       mov_reg_sreg:
  662     mov bl,[postbyte_register]
  663     mov ah,al
  664     and al,1111b
  665     mov [postbyte_register],al
  666     shr ah,4
  667     cmp ah,3
  668     jne invalid_operand
  669     dec [postbyte_register]
  670     cmp [operand_size],8
  671     je  mov_reg_sreg64
  672     cmp [operand_size],4
  673     je  mov_reg_sreg32
  674     cmp [operand_size],2
  675     jne invalid_operand_size
  676     call    operand_16bit
  677     jmp mov_reg_sreg_store
  678       mov_reg_sreg64:
  679     call    operand_64bit
  680     jmp mov_reg_sreg_store
  681       mov_reg_sreg32:
  682     call    operand_32bit
  683       mov_reg_sreg_store:
  684     mov [base_code],8Ch
  685     jmp nomem_instruction_ready
  686       mov_reg_creg:
  687     lods    byte [esi]
  688     mov bl,al
  689     shr al,4
  690     cmp al,4
  691     ja  invalid_operand
  692     add al,20h
  693     mov [extended_code],al
  694     and bl,1111b
  695     xchg    bl,[postbyte_register]
  696     mov [base_code],0Fh
  697     cmp [code_type],64
  698     je  mov_reg_creg_64bit
  699     cmp [operand_size],4
  700     jne invalid_operand_size
  701     cmp [postbyte_register],8
  702     jne mov_reg_creg_store
  703     cmp [extended_code],20h
  704     jne mov_reg_creg_store
  705     mov al,0F0h
  706     stos    byte [edi]
  707     mov [postbyte_register],0
  708       mov_reg_creg_store:
  709     jmp nomem_instruction_ready
  710       mov_reg_creg_64bit:
  711     cmp [operand_size],8
  712     jne invalid_operand_size
  713     jmp nomem_instruction_ready
  714       mov_reg_mem:
  715     add [base_code],2
  716     call    get_address
  717     mov al,[operand_size]
  718     cmp al,1
  719     je  mov_reg_mem_8bit
  720     inc [base_code]
  721     call    operand_autodetect
  722     mov al,[postbyte_register]
  723     or  al,bl
  724     or  al,bh
  725     jz  mov_ax_mem
  726     jmp instruction_ready
  727       mov_reg_mem_8bit:
  728     mov al,[postbyte_register]
  729     or  al,bl
  730     or  al,bh
  731     jz  mov_al_mem
  732     jmp instruction_ready
  733       mov_al_mem:
  734     test    ch,22h
  735     jnz mov_al_mem_address16
  736     test    ch,44h
  737     jnz mov_al_mem_address32
  738     test    ch,not 88h
  739     jnz invalid_address_size
  740     call    check_mov_address64
  741     cmp al,0
  742     jg  mov_al_mem_address64
  743     jl  instruction_ready
  744     cmp [code_type],16
  745     jne mov_al_mem_address32
  746     cmp edx,10000h
  747     jb  mov_al_mem_address16
  748       mov_al_mem_address32:
  749     call    store_segment_prefix_if_necessary
  750     call    address_32bit_prefix
  751     mov [base_code],0A0h
  752     jmp store_mov_address32
  753       mov_al_mem_address16:
  754     call    store_segment_prefix_if_necessary
  755     call    address_16bit_prefix
  756     mov [base_code],0A0h
  757     jmp store_mov_address16
  758       mov_al_mem_address64:
  759     call    store_segment_prefix_if_necessary
  760     mov [base_code],0A0h
  761     jmp store_mov_address64
  762       mov_ax_mem:
  763     test    ch,22h
  764     jnz mov_ax_mem_address16
  765     test    ch,44h
  766     jnz mov_ax_mem_address32
  767     test    ch,not 88h
  768     jnz invalid_address_size
  769     call    check_mov_address64
  770     cmp al,0
  771     jg  mov_ax_mem_address64
  772     jl  instruction_ready
  773     cmp [code_type],16
  774     jne mov_ax_mem_address32
  775     cmp edx,10000h
  776     jb  mov_ax_mem_address16
  777       mov_ax_mem_address32:
  778     call    store_segment_prefix_if_necessary
  779     call    address_32bit_prefix
  780     mov [base_code],0A1h
  781     jmp store_mov_address32
  782       mov_ax_mem_address16:
  783     call    store_segment_prefix_if_necessary
  784     call    address_16bit_prefix
  785     mov [base_code],0A1h
  786     jmp store_mov_address16
  787       mov_ax_mem_address64:
  788     call    store_segment_prefix_if_necessary
  789     mov [base_code],0A1h
  790     jmp store_mov_address64
  791       mov_reg_imm:
  792     mov al,[operand_size]
  793     cmp al,1
  794     je  mov_reg_imm_8bit
  795     cmp al,2
  796     je  mov_reg_imm_16bit
  797     cmp al,4
  798     je  mov_reg_imm_32bit
  799     cmp al,8
  800     jne invalid_operand_size
  801       mov_reg_imm_64bit:
  802     call    operand_64bit
  803     call    get_qword_value
  804     mov ecx,edx
  805     cmp [size_declared],0
  806     jne mov_reg_imm_64bit_store
  807     cmp [value_type],4
  808     jae mov_reg_imm_64bit_store
  809     cdq
  810     cmp ecx,edx
  811     je  mov_reg_64bit_imm_32bit
  812       mov_reg_imm_64bit_store:
  813     push    eax ecx
  814     mov al,0B8h
  815     call    store_mov_reg_imm_code
  816     pop edx eax
  817     call    mark_relocation
  818     stos    dword [edi]
  819     mov eax,edx
  820     stos    dword [edi]
  821     jmp instruction_assembled
  822       mov_reg_imm_8bit:
  823     call    get_byte_value
  824     mov dl,al
  825     mov al,0B0h
  826     call    store_mov_reg_imm_code
  827     mov al,dl
  828     stos    byte [edi]
  829     jmp instruction_assembled
  830       mov_reg_imm_16bit:
  831     call    get_word_value
  832     mov dx,ax
  833     call    operand_16bit
  834     mov al,0B8h
  835     call    store_mov_reg_imm_code
  836     mov ax,dx
  837     call    mark_relocation
  838     stos    word [edi]
  839     jmp instruction_assembled
  840       mov_reg_imm_32bit:
  841     call    operand_32bit
  842     call    get_dword_value
  843     mov edx,eax
  844     mov al,0B8h
  845     call    store_mov_reg_imm_code
  846       mov_store_imm_32bit:
  847     mov eax,edx
  848     call    mark_relocation
  849     stos    dword [edi]
  850     jmp instruction_assembled
  851       store_mov_reg_imm_code:
  852     mov ah,[postbyte_register]
  853     test    ah,1000b
  854     jz  mov_reg_imm_prefix_ok
  855     or  [rex_prefix],41h
  856       mov_reg_imm_prefix_ok:
  857     and ah,111b
  858     add al,ah
  859     mov [base_code],al
  860     call    store_classic_instruction_code
  861     ret
  862       mov_reg_64bit_imm_32bit:
  863     mov edx,eax
  864     mov bl,[postbyte_register]
  865     mov [postbyte_register],0
  866     mov [base_code],0C7h
  867     call    store_nomem_instruction
  868     jmp mov_store_imm_32bit
  869       mov_sreg:
  870     mov ah,al
  871     and al,1111b
  872     mov [postbyte_register],al
  873     shr ah,4
  874     cmp ah,3
  875     jne invalid_operand
  876     cmp al,2
  877     je  illegal_instruction
  878     dec [postbyte_register]
  879     lods    byte [esi]
  880     cmp al,','
  881     jne invalid_operand
  882     lods    byte [esi]
  883     call    get_size_operator
  884     cmp al,'['
  885     je  mov_sreg_mem
  886     cmp al,10h
  887     jne invalid_operand
  888       mov_sreg_reg:
  889     lods    byte [esi]
  890     call    convert_register
  891     or  ah,ah
  892     jz  mov_sreg_reg_size_ok
  893     cmp ah,2
  894     jne invalid_operand_size
  895     mov bl,al
  896       mov_sreg_reg_size_ok:
  897     mov [base_code],8Eh
  898     jmp nomem_instruction_ready
  899       mov_sreg_mem:
  900     call    get_address
  901     mov al,[operand_size]
  902     or  al,al
  903     jz  mov_sreg_mem_size_ok
  904     cmp al,2
  905     jne invalid_operand_size
  906       mov_sreg_mem_size_ok:
  907     mov [base_code],8Eh
  908     jmp instruction_ready
  909       mov_creg:
  910     lods    byte [esi]
  911     mov ah,al
  912     shr ah,4
  913     cmp ah,4
  914     ja  invalid_operand
  915     add ah,22h
  916     mov [extended_code],ah
  917     and al,1111b
  918     mov [postbyte_register],al
  919     mov [base_code],0Fh
  920     lods    byte [esi]
  921     cmp al,','
  922     jne invalid_operand
  923     call    take_register
  924     mov bl,al
  925     cmp [code_type],64
  926     je  mov_creg_64bit
  927     cmp ah,4
  928     jne invalid_operand_size
  929     cmp [postbyte_register],8
  930     jne mov_creg_store
  931     cmp [extended_code],22h
  932     jne mov_creg_store
  933     mov al,0F0h
  934     stos    byte [edi]
  935     mov [postbyte_register],0
  936       mov_creg_store:
  937     jmp nomem_instruction_ready
  938       mov_creg_64bit:
  939     cmp ah,8
  940     je  mov_creg_store
  941     jmp invalid_operand_size
  942 test_instruction:
  943     mov [base_code],84h
  944     lods    byte [esi]
  945     call    get_size_operator
  946     cmp al,10h
  947     je  test_reg
  948     cmp al,'['
  949     jne invalid_operand
  950       test_mem:
  951     call    get_address
  952     push    edx ebx ecx
  953     lods    byte [esi]
  954     cmp al,','
  955     jne invalid_operand
  956     lods    byte [esi]
  957     call    get_size_operator
  958     cmp al,'('
  959     je  test_mem_imm
  960     cmp al,10h
  961     jne invalid_operand
  962       test_mem_reg:
  963     lods    byte [esi]
  964     call    convert_register
  965     mov [postbyte_register],al
  966     pop ecx ebx edx
  967     mov al,ah
  968     cmp al,1
  969     je  test_mem_reg_8bit
  970     call    operand_autodetect
  971     inc [base_code]
  972       test_mem_reg_8bit:
  973     jmp instruction_ready
  974       test_mem_imm:
  975     mov al,[operand_size]
  976     cmp al,1
  977     jb  test_mem_imm_nosize
  978     je  test_mem_imm_8bit
  979     cmp al,2
  980     je  test_mem_imm_16bit
  981     cmp al,4
  982     je  test_mem_imm_32bit
  983     cmp al,8
  984     jne invalid_operand_size
  985       test_mem_imm_64bit:
  986     cmp [size_declared],0
  987     jne long_immediate_not_encodable
  988     call    operand_64bit
  989     call    get_simm32
  990     cmp [value_type],4
  991     jae long_immediate_not_encodable
  992     jmp test_mem_imm_32bit_store
  993       test_mem_imm_nosize:
  994     call    recoverable_unknown_size
  995       test_mem_imm_8bit:
  996     call    get_byte_value
  997     mov byte [value],al
  998     mov [postbyte_register],0
  999     mov [base_code],0F6h
 1000     pop ecx ebx edx
 1001     call    store_instruction_with_imm8
 1002     jmp instruction_assembled
 1003       test_mem_imm_16bit:
 1004     call    operand_16bit
 1005     call    get_word_value
 1006     mov word [value],ax
 1007     mov [postbyte_register],0
 1008     mov [base_code],0F7h
 1009     pop ecx ebx edx
 1010     call    store_instruction_with_imm16
 1011     jmp instruction_assembled
 1012       test_mem_imm_32bit:
 1013     call    operand_32bit
 1014     call    get_dword_value
 1015       test_mem_imm_32bit_store:
 1016     mov dword [value],eax
 1017     mov [postbyte_register],0
 1018     mov [base_code],0F7h
 1019     pop ecx ebx edx
 1020     call    store_instruction_with_imm32
 1021     jmp instruction_assembled
 1022       test_reg:
 1023     lods    byte [esi]
 1024     call    convert_register
 1025     mov [postbyte_register],al
 1026     lods    byte [esi]
 1027     cmp al,','
 1028     jne invalid_operand
 1029     lods    byte [esi]
 1030     call    get_size_operator
 1031     cmp al,'['
 1032     je  test_reg_mem
 1033     cmp al,'('
 1034     je  test_reg_imm
 1035     cmp al,10h
 1036     jne invalid_operand
 1037       test_reg_reg:
 1038     lods    byte [esi]
 1039     call    convert_register
 1040     mov bl,[postbyte_register]
 1041     mov [postbyte_register],al
 1042     mov al,ah
 1043     cmp al,1
 1044     je  test_reg_reg_8bit
 1045     call    operand_autodetect
 1046     inc [base_code]
 1047       test_reg_reg_8bit:
 1048     jmp nomem_instruction_ready
 1049       test_reg_imm:
 1050     mov al,[operand_size]
 1051     cmp al,1
 1052     je  test_reg_imm_8bit
 1053     cmp al,2
 1054     je  test_reg_imm_16bit
 1055     cmp al,4
 1056     je  test_reg_imm_32bit
 1057     cmp al,8
 1058     jne invalid_operand_size
 1059       test_reg_imm_64bit:
 1060     cmp [size_declared],0
 1061     jne long_immediate_not_encodable
 1062     call    operand_64bit
 1063     call    get_simm32
 1064     cmp [value_type],4
 1065     jae long_immediate_not_encodable
 1066     jmp test_reg_imm_32bit_store
 1067       test_reg_imm_8bit:
 1068     call    get_byte_value
 1069     mov dl,al
 1070     mov bl,[postbyte_register]
 1071     mov [postbyte_register],0
 1072     mov [base_code],0F6h
 1073     or  bl,bl
 1074     jz  test_al_imm
 1075     call    store_nomem_instruction
 1076     mov al,dl
 1077     stos    byte [edi]
 1078     jmp instruction_assembled
 1079       test_al_imm:
 1080     mov [base_code],0A8h
 1081     call    store_classic_instruction_code
 1082     mov al,dl
 1083     stos    byte [edi]
 1084     jmp instruction_assembled
 1085       test_reg_imm_16bit:
 1086     call    operand_16bit
 1087     call    get_word_value
 1088     mov dx,ax
 1089     mov bl,[postbyte_register]
 1090     mov [postbyte_register],0
 1091     mov [base_code],0F7h
 1092     or  bl,bl
 1093     jz  test_ax_imm
 1094     call    store_nomem_instruction
 1095     mov ax,dx
 1096     call    mark_relocation
 1097     stos    word [edi]
 1098     jmp instruction_assembled
 1099       test_ax_imm:
 1100     mov [base_code],0A9h
 1101     call    store_classic_instruction_code
 1102     mov ax,dx
 1103     stos    word [edi]
 1104     jmp instruction_assembled
 1105       test_reg_imm_32bit:
 1106     call    operand_32bit
 1107     call    get_dword_value
 1108       test_reg_imm_32bit_store:
 1109     mov edx,eax
 1110     mov bl,[postbyte_register]
 1111     mov [postbyte_register],0
 1112     mov [base_code],0F7h
 1113     or  bl,bl
 1114     jz  test_eax_imm
 1115     call    store_nomem_instruction
 1116     mov eax,edx
 1117     call    mark_relocation
 1118     stos    dword [edi]
 1119     jmp instruction_assembled
 1120       test_eax_imm:
 1121     mov [base_code],0A9h
 1122     call    store_classic_instruction_code
 1123     mov eax,edx
 1124     stos    dword [edi]
 1125     jmp instruction_assembled
 1126       test_reg_mem:
 1127     call    get_address
 1128     mov al,[operand_size]
 1129     cmp al,1
 1130     je  test_reg_mem_8bit
 1131     call    operand_autodetect
 1132     inc [base_code]
 1133       test_reg_mem_8bit:
 1134     jmp instruction_ready
 1135 xchg_instruction:
 1136     mov [base_code],86h
 1137     lods    byte [esi]
 1138     call    get_size_operator
 1139     cmp al,10h
 1140     je  xchg_reg
 1141     cmp al,'['
 1142     jne invalid_operand
 1143       xchg_mem:
 1144     call    get_address
 1145     push    edx ebx ecx
 1146     lods    byte [esi]
 1147     cmp al,','
 1148     jne invalid_operand
 1149     lods    byte [esi]
 1150     call    get_size_operator
 1151     cmp al,10h
 1152     je  test_mem_reg
 1153     jmp invalid_operand
 1154       xchg_reg:
 1155     lods    byte [esi]
 1156     call    convert_register
 1157     mov [postbyte_register],al
 1158     lods    byte [esi]
 1159     cmp al,','
 1160     jne invalid_operand
 1161     lods    byte [esi]
 1162     call    get_size_operator
 1163     cmp al,'['
 1164     je  test_reg_mem
 1165     cmp al,10h
 1166     jne invalid_operand
 1167       xchg_reg_reg:
 1168     lods    byte [esi]
 1169     call    convert_register
 1170     mov bl,al
 1171     mov al,ah
 1172     cmp al,1
 1173     je  xchg_reg_reg_8bit
 1174     call    operand_autodetect
 1175     cmp [postbyte_register],0
 1176     je  xchg_ax_reg
 1177     or  bl,bl
 1178     jnz xchg_reg_reg_store
 1179     mov bl,[postbyte_register]
 1180       xchg_ax_reg:
 1181     cmp [code_type],64
 1182     jne xchg_ax_reg_ok
 1183     cmp ah,4
 1184     jne xchg_ax_reg_ok
 1185     or  bl,bl
 1186     jz  xchg_reg_reg_store
 1187       xchg_ax_reg_ok:
 1188     test    bl,1000b
 1189     jz  xchg_ax_reg_store
 1190     or  [rex_prefix],41h
 1191     and bl,111b
 1192       xchg_ax_reg_store:
 1193     add bl,90h
 1194     mov [base_code],bl
 1195     call    store_classic_instruction_code
 1196     jmp instruction_assembled
 1197       xchg_reg_reg_store:
 1198     inc [base_code]
 1199       xchg_reg_reg_8bit:
 1200     jmp nomem_instruction_ready
 1201 push_instruction:
 1202     mov [push_size],al
 1203       push_next:
 1204     lods    byte [esi]
 1205     call    get_size_operator
 1206     cmp al,10h
 1207     je  push_reg
 1208     cmp al,'('
 1209     je  push_imm
 1210     cmp al,'['
 1211     jne invalid_operand
 1212       push_mem:
 1213     call    get_address
 1214     mov al,[operand_size]
 1215     mov ah,[push_size]
 1216     cmp al,2
 1217     je  push_mem_16bit
 1218     cmp al,4
 1219     je  push_mem_32bit
 1220     cmp al,8
 1221     je  push_mem_64bit
 1222     or  al,al
 1223     jnz invalid_operand_size
 1224     cmp ah,2
 1225     je  push_mem_16bit
 1226     cmp ah,4
 1227     je  push_mem_32bit
 1228     cmp ah,8
 1229     je  push_mem_64bit
 1230     call    recoverable_unknown_size
 1231     jmp push_mem_store
 1232       push_mem_16bit:
 1233     test    ah,not 2
 1234     jnz invalid_operand_size
 1235     call    operand_16bit
 1236     jmp push_mem_store
 1237       push_mem_32bit:
 1238     test    ah,not 4
 1239     jnz invalid_operand_size
 1240     cmp [code_type],64
 1241     je  illegal_instruction
 1242     call    operand_32bit
 1243     jmp push_mem_store
 1244       push_mem_64bit:
 1245     test    ah,not 8
 1246     jnz invalid_operand_size
 1247     cmp [code_type],64
 1248     jne illegal_instruction
 1249       push_mem_store:
 1250     mov [base_code],0FFh
 1251     mov [postbyte_register],110b
 1252     call    store_instruction
 1253     jmp push_done
 1254       push_reg:
 1255     lods    byte [esi]
 1256     mov ah,al
 1257     sub ah,10h
 1258     and ah,al
 1259     test    ah,0F0h
 1260     jnz push_sreg
 1261     call    convert_register
 1262     test    al,1000b
 1263     jz  push_reg_ok
 1264     or  [rex_prefix],41h
 1265     and al,111b
 1266       push_reg_ok:
 1267     add al,50h
 1268     mov [base_code],al
 1269     mov al,ah
 1270     mov ah,[push_size]
 1271     cmp al,2
 1272     je  push_reg_16bit
 1273     cmp al,4
 1274     je  push_reg_32bit
 1275     cmp al,8
 1276     jne invalid_operand_size
 1277       push_reg_64bit:
 1278     test    ah,not 8
 1279     jnz invalid_operand_size
 1280     cmp [code_type],64
 1281     jne illegal_instruction
 1282     jmp push_reg_store
 1283       push_reg_32bit:
 1284     test    ah,not 4
 1285     jnz invalid_operand_size
 1286     cmp [code_type],64
 1287     je  illegal_instruction
 1288     call    operand_32bit
 1289     jmp push_reg_store
 1290       push_reg_16bit:
 1291     test    ah,not 2
 1292     jnz invalid_operand_size
 1293     call    operand_16bit
 1294       push_reg_store:
 1295     call    store_classic_instruction_code
 1296     jmp push_done
 1297       push_sreg:
 1298     mov bl,al
 1299     mov dl,[operand_size]
 1300     mov dh,[push_size]
 1301     cmp dl,2
 1302     je  push_sreg16
 1303     cmp dl,4
 1304     je  push_sreg32
 1305     cmp dl,8
 1306     je  push_sreg64
 1307     or  dl,dl
 1308     jnz invalid_operand_size
 1309     cmp dh,2
 1310     je  push_sreg16
 1311     cmp dh,4
 1312     je  push_sreg32
 1313     cmp dh,8
 1314     je  push_sreg64
 1315     jmp push_sreg_store
 1316       push_sreg16:
 1317     test    dh,not 2
 1318     jnz invalid_operand_size
 1319     call    operand_16bit
 1320     jmp push_sreg_store
 1321       push_sreg32:
 1322     test    dh,not 4
 1323     jnz invalid_operand_size
 1324     cmp [code_type],64
 1325     je  illegal_instruction
 1326     call    operand_32bit
 1327     jmp push_sreg_store
 1328       push_sreg64:
 1329     test    dh,not 8
 1330     jnz invalid_operand_size
 1331     cmp [code_type],64
 1332     jne illegal_instruction
 1333       push_sreg_store:
 1334     mov al,bl
 1335     cmp al,40h
 1336     jae invalid_operand
 1337     sub al,31h
 1338     jc  invalid_operand
 1339     cmp al,4
 1340     jae push_sreg_386
 1341     shl al,3
 1342     add al,6
 1343     mov [base_code],al
 1344     cmp [code_type],64
 1345     je  illegal_instruction
 1346     jmp push_reg_store
 1347       push_sreg_386:
 1348     sub al,4
 1349     shl al,3
 1350     add al,0A0h
 1351     mov [extended_code],al
 1352     mov [base_code],0Fh
 1353     jmp push_reg_store
 1354       push_imm:
 1355     mov al,[operand_size]
 1356     mov ah,[push_size]
 1357     or  al,al
 1358     je  push_imm_size_ok
 1359     or  ah,ah
 1360     je  push_imm_size_ok
 1361     cmp al,ah
 1362     jne invalid_operand_size
 1363       push_imm_size_ok:
 1364     cmp al,2
 1365     je  push_imm_16bit
 1366     cmp al,4
 1367     je  push_imm_32bit
 1368     cmp al,8
 1369     je  push_imm_64bit
 1370     cmp ah,2
 1371     je  push_imm_optimized_16bit
 1372     cmp ah,4
 1373     je  push_imm_optimized_32bit
 1374     cmp ah,8
 1375     je  push_imm_optimized_64bit
 1376     or  al,al
 1377     jnz invalid_operand_size
 1378     cmp [code_type],16
 1379     je  push_imm_optimized_16bit
 1380     cmp [code_type],32
 1381     je  push_imm_optimized_32bit
 1382       push_imm_optimized_64bit:
 1383     cmp [code_type],64
 1384     jne illegal_instruction
 1385     call    get_simm32
 1386     mov edx,eax
 1387     cmp [value_type],0
 1388     jne push_imm_32bit_store
 1389     cmp eax,-80h
 1390     jl  push_imm_32bit_store
 1391     cmp eax,80h
 1392     jge push_imm_32bit_store
 1393     jmp push_imm_8bit
 1394       push_imm_optimized_32bit:
 1395     cmp [code_type],64
 1396     je  illegal_instruction
 1397     call    get_dword_value
 1398     mov edx,eax
 1399     call    operand_32bit
 1400     cmp [value_type],0
 1401     jne push_imm_32bit_store
 1402     cmp eax,-80h
 1403     jl  push_imm_32bit_store
 1404     cmp eax,80h
 1405     jge push_imm_32bit_store
 1406     jmp push_imm_8bit
 1407       push_imm_optimized_16bit:
 1408     call    get_word_value
 1409     mov dx,ax
 1410     call    operand_16bit
 1411     cmp [value_type],0
 1412     jne push_imm_16bit_store
 1413     cmp ax,-80h
 1414     jl  push_imm_16bit_store
 1415     cmp ax,80h
 1416     jge push_imm_16bit_store
 1417       push_imm_8bit:
 1418     mov ah,al
 1419     mov [base_code],6Ah
 1420     call    store_classic_instruction_code
 1421     mov al,ah
 1422     stos    byte [edi]
 1423     jmp push_done
 1424       push_imm_16bit:
 1425     call    get_word_value
 1426     mov dx,ax
 1427     call    operand_16bit
 1428       push_imm_16bit_store:
 1429     mov [base_code],68h
 1430     call    store_classic_instruction_code
 1431     mov ax,dx
 1432     call    mark_relocation
 1433     stos    word [edi]
 1434     jmp push_done
 1435       push_imm_64bit:
 1436     cmp [code_type],64
 1437     jne illegal_instruction
 1438     call    get_simm32
 1439     mov edx,eax
 1440     jmp push_imm_32bit_store
 1441       push_imm_32bit:
 1442     cmp [code_type],64
 1443     je  illegal_instruction
 1444     call    get_dword_value
 1445     mov edx,eax
 1446     call    operand_32bit
 1447       push_imm_32bit_store:
 1448     mov [base_code],68h
 1449     call    store_classic_instruction_code
 1450     mov eax,edx
 1451     call    mark_relocation
 1452     stos    dword [edi]
 1453       push_done:
 1454     lods    byte [esi]
 1455     dec esi
 1456     cmp al,0Fh
 1457     je  instruction_assembled
 1458     or  al,al
 1459     jz  instruction_assembled
 1460 ;    mov     [operand_size],0
 1461 ;    mov     [operand_flags],0
 1462 ;    mov     [operand_prefix],0
 1463 ;    mov     [rex_prefix],0
 1464     and dword [operand_size],0
 1465     jmp push_next
 1466 pop_instruction:
 1467     mov [push_size],al
 1468       pop_next:
 1469     lods    byte [esi]
 1470     call    get_size_operator
 1471     cmp al,10h
 1472     je  pop_reg
 1473     cmp al,'['
 1474     jne invalid_operand
 1475       pop_mem:
 1476     call    get_address
 1477     mov al,[operand_size]
 1478     mov ah,[push_size]
 1479     cmp al,2
 1480     je  pop_mem_16bit
 1481     cmp al,4
 1482     je  pop_mem_32bit
 1483     cmp al,8
 1484     je  pop_mem_64bit
 1485     or  al,al
 1486     jnz invalid_operand_size
 1487     cmp ah,2
 1488     je  pop_mem_16bit
 1489     cmp ah,4
 1490     je  pop_mem_32bit
 1491     cmp ah,8
 1492     je  pop_mem_64bit
 1493     call    recoverable_unknown_size
 1494     jmp pop_mem_store
 1495       pop_mem_16bit:
 1496     test    ah,not 2
 1497     jnz invalid_operand_size
 1498     call    operand_16bit
 1499     jmp pop_mem_store
 1500       pop_mem_32bit:
 1501     test    ah,not 4
 1502     jnz invalid_operand_size
 1503     cmp [code_type],64
 1504     je  illegal_instruction
 1505     call    operand_32bit
 1506     jmp pop_mem_store
 1507       pop_mem_64bit:
 1508     test    ah,not 8
 1509     jnz invalid_operand_size
 1510     cmp [code_type],64
 1511     jne illegal_instruction
 1512       pop_mem_store:
 1513     mov [base_code],08Fh
 1514     mov [postbyte_register],0
 1515     call    store_instruction
 1516     jmp pop_done
 1517       pop_reg:
 1518     lods    byte [esi]
 1519     mov ah,al
 1520     sub ah,10h
 1521     and ah,al
 1522     test    ah,0F0h
 1523     jnz pop_sreg
 1524     call    convert_register
 1525     test    al,1000b
 1526     jz  pop_reg_ok
 1527     or  [rex_prefix],41h
 1528     and al,111b
 1529       pop_reg_ok:
 1530     add al,58h
 1531     mov [base_code],al
 1532     mov al,ah
 1533     mov ah,[push_size]
 1534     cmp al,2
 1535     je  pop_reg_16bit
 1536     cmp al,4
 1537     je  pop_reg_32bit
 1538     cmp al,8
 1539     je  pop_reg_64bit
 1540     jmp invalid_operand_size
 1541       pop_reg_64bit:
 1542     test    ah,not 8
 1543     jnz invalid_operand_size
 1544     cmp [code_type],64
 1545     jne illegal_instruction
 1546     jmp pop_reg_store
 1547       pop_reg_32bit:
 1548     test    ah,not 4
 1549     jnz invalid_operand_size
 1550     cmp [code_type],64
 1551     je  illegal_instruction
 1552     call    operand_32bit
 1553     jmp pop_reg_store
 1554       pop_reg_16bit:
 1555     test    ah,not 2
 1556     jnz invalid_operand_size
 1557     call    operand_16bit
 1558       pop_reg_store:
 1559     call    store_classic_instruction_code
 1560       pop_done:
 1561     lods    byte [esi]
 1562     dec esi
 1563     cmp al,0Fh
 1564     je  instruction_assembled
 1565     or  al,al
 1566     jz  instruction_assembled
 1567 ;    mov     [operand_size],0
 1568 ;    mov     [operand_flags],0
 1569 ;    mov     [operand_prefix],0
 1570 ;    mov     [rex_prefix],0
 1571     and dword [operand_size],0
 1572     jmp pop_next
 1573       pop_sreg:
 1574     mov dl,[operand_size]
 1575     mov dh,[push_size]
 1576     cmp al,32h
 1577     je  pop_cs
 1578     mov bl,al
 1579     cmp dl,2
 1580     je  pop_sreg16
 1581     cmp dl,4
 1582     je  pop_sreg32
 1583     cmp dl,8
 1584     je  pop_sreg64
 1585     or  dl,dl
 1586     jnz invalid_operand_size
 1587     cmp dh,2
 1588     je  pop_sreg16
 1589     cmp dh,4
 1590     je  pop_sreg32
 1591     cmp dh,8
 1592     je  pop_sreg64
 1593     jmp pop_sreg_store
 1594       pop_sreg16:
 1595     test    dh,not 2
 1596     jnz invalid_operand_size
 1597     call    operand_16bit
 1598     jmp pop_sreg_store
 1599       pop_sreg32:
 1600     test    dh,not 4
 1601     jnz invalid_operand_size
 1602     cmp [code_type],64
 1603     je  illegal_instruction
 1604     call    operand_32bit
 1605     jmp pop_sreg_store
 1606       pop_sreg64:
 1607     test    dh,not 8
 1608     jnz invalid_operand_size
 1609     cmp [code_type],64
 1610     jne illegal_instruction
 1611       pop_sreg_store:
 1612     mov al,bl
 1613     cmp al,40h
 1614     jae invalid_operand
 1615     sub al,31h
 1616     jc  invalid_operand
 1617     cmp al,4
 1618     jae pop_sreg_386
 1619     shl al,3
 1620     add al,7
 1621     mov [base_code],al
 1622     cmp [code_type],64
 1623     je  illegal_instruction
 1624     jmp pop_reg_store
 1625       pop_cs:
 1626     cmp [code_type],16
 1627     jne illegal_instruction
 1628     cmp dl,2
 1629     je  pop_cs_store
 1630     or  dl,dl
 1631     jnz invalid_operand_size
 1632     cmp dh,2
 1633     je  pop_cs_store
 1634     or  dh,dh
 1635     jnz illegal_instruction
 1636       pop_cs_store:
 1637     test    dh,not 2
 1638     jnz invalid_operand_size
 1639     mov al,0Fh
 1640     stos    byte [edi]
 1641     jmp pop_done
 1642       pop_sreg_386:
 1643     sub al,4
 1644     shl al,3
 1645     add al,0A1h
 1646     mov [extended_code],al
 1647     mov [base_code],0Fh
 1648     jmp pop_reg_store
 1649 inc_instruction:
 1650     mov [base_code],al
 1651     lods    byte [esi]
 1652     call    get_size_operator
 1653     cmp al,10h
 1654     je  inc_reg
 1655     cmp al,'['
 1656     je  inc_mem
 1657     jne invalid_operand
 1658       inc_mem:
 1659     call    get_address
 1660     mov al,[operand_size]
 1661     cmp al,1
 1662     je  inc_mem_8bit
 1663     jb  inc_mem_nosize
 1664     call    operand_autodetect
 1665     mov al,0FFh
 1666     xchg    al,[base_code]
 1667     mov [postbyte_register],al
 1668     jmp instruction_ready
 1669       inc_mem_nosize:
 1670     call    recoverable_unknown_size
 1671       inc_mem_8bit:
 1672     mov al,0FEh
 1673     xchg    al,[base_code]
 1674     mov [postbyte_register],al
 1675     jmp instruction_ready
 1676       inc_reg:
 1677     lods    byte [esi]
 1678     call    convert_register
 1679     mov bl,al
 1680     mov al,0FEh
 1681     xchg    al,[base_code]
 1682     mov [postbyte_register],al
 1683     mov al,ah
 1684     cmp al,1
 1685     je  inc_reg_8bit
 1686     call    operand_autodetect
 1687     cmp [code_type],64
 1688     je  inc_reg_long_form
 1689     mov al,[postbyte_register]
 1690     shl al,3
 1691     add al,bl
 1692     add al,40h
 1693     mov [base_code],al
 1694     call    store_classic_instruction_code
 1695     jmp instruction_assembled
 1696       inc_reg_long_form:
 1697     inc [base_code]
 1698       inc_reg_8bit:
 1699     jmp nomem_instruction_ready
 1700 set_instruction:
 1701     mov [base_code],0Fh
 1702     mov [extended_code],al
 1703     lods    byte [esi]
 1704     call    get_size_operator
 1705     cmp al,10h
 1706     je  set_reg
 1707     cmp al,'['
 1708     jne invalid_operand
 1709       set_mem:
 1710     call    get_address
 1711     cmp [operand_size],1
 1712     ja  invalid_operand_size
 1713     mov [postbyte_register],0
 1714     jmp instruction_ready
 1715       set_reg:
 1716     lods    byte [esi]
 1717     call    convert_register
 1718     cmp ah,1
 1719     jne invalid_operand_size
 1720     mov bl,al
 1721     mov [postbyte_register],0
 1722     jmp nomem_instruction_ready
 1723 arpl_instruction:
 1724     cmp [code_type],64
 1725     je  illegal_instruction
 1726     mov [base_code],63h
 1727     lods    byte [esi]
 1728     call    get_size_operator
 1729     cmp al,10h
 1730     je  arpl_reg
 1731     cmp al,'['
 1732     jne invalid_operand
 1733     call    get_address
 1734     lods    byte [esi]
 1735     cmp al,','
 1736     jne invalid_operand
 1737     call    take_register
 1738     mov [postbyte_register],al
 1739     cmp ah,2
 1740     jne invalid_operand_size
 1741     jmp instruction_ready
 1742       arpl_reg:
 1743     lods    byte [esi]
 1744     call    convert_register
 1745     cmp ah,2
 1746     jne invalid_operand_size
 1747     mov bl,al
 1748     lods    byte [esi]
 1749     cmp al,','
 1750     jne invalid_operand
 1751     call    take_register
 1752     mov [postbyte_register],al
 1753     jmp nomem_instruction_ready
 1754 bound_instruction:
 1755     cmp [code_type],64
 1756     je  illegal_instruction
 1757     call    take_register
 1758     mov [postbyte_register],al
 1759     lods    byte [esi]
 1760     cmp al,','
 1761     jne invalid_operand
 1762     lods    byte [esi]
 1763     call    get_size_operator
 1764     cmp al,'['
 1765     jne invalid_operand
 1766     call    get_address
 1767     mov al,[operand_size]
 1768     cmp al,2
 1769     je  bound_store
 1770     cmp al,4
 1771     jne invalid_operand_size
 1772       bound_store:
 1773     call    operand_autodetect
 1774     mov [base_code],62h
 1775     jmp instruction_ready
 1776 enter_instruction:
 1777     lods    byte [esi]
 1778     call    get_size_operator
 1779     cmp ah,2
 1780     je  enter_imm16_size_ok
 1781     or  ah,ah
 1782     jnz invalid_operand_size
 1783       enter_imm16_size_ok:
 1784     cmp al,'('
 1785     jne invalid_operand
 1786     call    get_word_value
 1787     cmp [next_pass_needed],0
 1788     jne enter_imm16_ok
 1789     cmp [value_type],0
 1790     jne invalid_use_of_symbol
 1791     test    eax,eax
 1792     js  value_out_of_range
 1793       enter_imm16_ok:
 1794     push    eax
 1795     mov [operand_size],0
 1796     lods    byte [esi]
 1797     cmp al,','
 1798     jne invalid_operand
 1799     lods    byte [esi]
 1800     call    get_size_operator
 1801     cmp ah,1
 1802     je  enter_imm8_size_ok
 1803     or  ah,ah
 1804     jnz invalid_operand_size
 1805       enter_imm8_size_ok:
 1806     cmp al,'('
 1807     jne invalid_operand
 1808     call    get_byte_value
 1809     cmp [next_pass_needed],0
 1810     jne enter_imm8_ok
 1811     test    eax,eax
 1812     js  value_out_of_range
 1813       enter_imm8_ok:
 1814     mov dl,al
 1815     pop ebx
 1816     mov al,0C8h
 1817     stos    byte [edi]
 1818     mov ax,bx
 1819     stos    word [edi]
 1820     mov al,dl
 1821     stos    byte [edi]
 1822     jmp instruction_assembled
 1823 ret_instruction_only64:
 1824     cmp [code_type],64
 1825     jne illegal_instruction
 1826     jmp ret_instruction
 1827 ret_instruction_32bit_except64:
 1828     cmp [code_type],64
 1829     je  illegal_instruction
 1830 ret_instruction_32bit:
 1831     call    operand_32bit
 1832     jmp ret_instruction
 1833 ret_instruction_16bit:
 1834     call    operand_16bit
 1835     jmp ret_instruction
 1836 ret_instruction_64bit:
 1837     call    operand_64bit
 1838 ret_instruction:
 1839     and [prefix_flags],not 10h
 1840       ret_common:
 1841     mov [base_code],al
 1842     lods    byte [esi]
 1843     dec esi
 1844     or  al,al
 1845     jz  simple_ret
 1846     cmp al,0Fh
 1847     je  simple_ret
 1848     lods    byte [esi]
 1849     call    get_size_operator
 1850     or  ah,ah
 1851     jz  ret_imm
 1852     cmp ah,2
 1853     je  ret_imm
 1854     jmp invalid_operand_size
 1855       ret_imm:
 1856     cmp al,'('
 1857     jne invalid_operand
 1858     call    get_word_value
 1859     cmp [next_pass_needed],0
 1860     jne ret_imm_ok
 1861     cmp [value_type],0
 1862     jne invalid_use_of_symbol
 1863     test    eax,eax
 1864     js  value_out_of_range
 1865       ret_imm_ok:
 1866     cmp [size_declared],0
 1867     jne ret_imm_store
 1868     or  ax,ax
 1869     jz  simple_ret
 1870       ret_imm_store:
 1871     mov dx,ax
 1872     call    store_classic_instruction_code
 1873     mov ax,dx
 1874     stos    word [edi]
 1875     jmp instruction_assembled
 1876       simple_ret:
 1877     inc [base_code]
 1878     call    store_classic_instruction_code
 1879     jmp instruction_assembled
 1880 retf_instruction:
 1881     cmp [code_type],64
 1882     jne ret_common
 1883 retf_instruction_64bit:
 1884     call    operand_64bit
 1885     jmp ret_common
 1886 retf_instruction_32bit:
 1887     call    operand_32bit
 1888     jmp ret_common
 1889 retf_instruction_16bit:
 1890     call    operand_16bit
 1891     jmp ret_common
 1892 lea_instruction:
 1893     mov [base_code],8Dh
 1894     call    take_register
 1895     mov [postbyte_register],al
 1896     lods    byte [esi]
 1897     cmp al,','
 1898     jne invalid_operand
 1899     xor al,al
 1900     xchg    al,[operand_size]
 1901     push    eax
 1902     lods    byte [esi]
 1903     call    get_size_operator
 1904     cmp al,'['
 1905     jne invalid_operand
 1906     or  [operand_flags],1
 1907     call    get_address
 1908     pop eax
 1909     mov [operand_size],al
 1910     call    operand_autodetect
 1911     jmp instruction_ready
 1912 ls_instruction:
 1913     or  al,al
 1914     jz  les_instruction
 1915     cmp al,3
 1916     jz  lds_instruction
 1917     add al,0B0h
 1918     mov [extended_code],al
 1919     mov [base_code],0Fh
 1920     jmp ls_code_ok
 1921       les_instruction:
 1922     mov [base_code],0C4h
 1923     jmp ls_short_code
 1924       lds_instruction:
 1925     mov [base_code],0C5h
 1926       ls_short_code:
 1927     cmp [code_type],64
 1928     je  illegal_instruction
 1929       ls_code_ok:
 1930     call    take_register
 1931     mov [postbyte_register],al
 1932     lods    byte [esi]
 1933     cmp al,','
 1934     jne invalid_operand
 1935     add [operand_size],2
 1936     lods    byte [esi]
 1937     call    get_size_operator
 1938     cmp al,'['
 1939     jne invalid_operand
 1940     call    get_address
 1941     mov al,[operand_size]
 1942     cmp al,4
 1943     je  ls_16bit
 1944     cmp al,6
 1945     je  ls_32bit
 1946     cmp al,10
 1947     je  ls_64bit
 1948     jmp invalid_operand_size
 1949       ls_16bit:
 1950     call    operand_16bit
 1951     jmp instruction_ready
 1952       ls_32bit:
 1953     call    operand_32bit
 1954     jmp instruction_ready
 1955       ls_64bit:
 1956     call    operand_64bit
 1957     jmp instruction_ready
 1958 sh_instruction:
 1959     mov [postbyte_register],al
 1960     lods    byte [esi]
 1961     call    get_size_operator
 1962     cmp al,10h
 1963     je  sh_reg
 1964     cmp al,'['
 1965     jne invalid_operand
 1966       sh_mem:
 1967     call    get_address
 1968     push    edx ebx ecx
 1969     mov al,[operand_size]
 1970     push    eax
 1971     mov [operand_size],0
 1972     lods    byte [esi]
 1973     cmp al,','
 1974     jne invalid_operand
 1975     lods    byte [esi]
 1976     call    get_size_operator
 1977     cmp al,'('
 1978     je  sh_mem_imm
 1979     cmp al,10h
 1980     jne invalid_operand
 1981       sh_mem_reg:
 1982     lods    byte [esi]
 1983     cmp al,11h
 1984     jne invalid_operand
 1985     pop eax ecx ebx edx
 1986     cmp al,1
 1987     je  sh_mem_cl_8bit
 1988     jb  sh_mem_cl_nosize
 1989     call    operand_autodetect
 1990     mov [base_code],0D3h
 1991     jmp instruction_ready
 1992       sh_mem_cl_nosize:
 1993     call    recoverable_unknown_size
 1994       sh_mem_cl_8bit:
 1995     mov [base_code],0D2h
 1996     jmp instruction_ready
 1997       sh_mem_imm:
 1998     mov al,[operand_size]
 1999     or  al,al
 2000     jz  sh_mem_imm_size_ok
 2001     cmp al,1
 2002     jne invalid_operand_size
 2003       sh_mem_imm_size_ok:
 2004     call    get_byte_value
 2005     mov byte [value],al
 2006     pop eax ecx ebx edx
 2007     cmp al,1
 2008     je  sh_mem_imm_8bit
 2009     jb  sh_mem_imm_nosize
 2010     call    operand_autodetect
 2011     cmp byte [value],1
 2012     je  sh_mem_1
 2013     mov [base_code],0C1h
 2014     call    store_instruction_with_imm8
 2015     jmp instruction_assembled
 2016       sh_mem_1:
 2017     mov [base_code],0D1h
 2018     jmp instruction_ready
 2019       sh_mem_imm_nosize:
 2020     call    recoverable_unknown_size
 2021       sh_mem_imm_8bit:
 2022     cmp byte [value],1
 2023     je  sh_mem_1_8bit
 2024     mov [base_code],0C0h
 2025     call    store_instruction_with_imm8
 2026     jmp instruction_assembled
 2027       sh_mem_1_8bit:
 2028     mov [base_code],0D0h
 2029     jmp instruction_ready
 2030       sh_reg:
 2031     lods    byte [esi]
 2032     call    convert_register
 2033     mov bx,ax
 2034     mov [operand_size],0
 2035     lods    byte [esi]
 2036     cmp al,','
 2037     jne invalid_operand
 2038     lods    byte [esi]
 2039     call    get_size_operator
 2040     cmp al,'('
 2041     je  sh_reg_imm
 2042     cmp al,10h
 2043     jne invalid_operand
 2044       sh_reg_reg:
 2045     lods    byte [esi]
 2046     cmp al,11h
 2047     jne invalid_operand
 2048     mov al,bh
 2049     cmp al,1
 2050     je  sh_reg_cl_8bit
 2051     call    operand_autodetect
 2052     mov [base_code],0D3h
 2053     jmp nomem_instruction_ready
 2054       sh_reg_cl_8bit:
 2055     mov [base_code],0D2h
 2056     jmp nomem_instruction_ready
 2057       sh_reg_imm:
 2058     mov al,[operand_size]
 2059     or  al,al
 2060     jz  sh_reg_imm_size_ok
 2061     cmp al,1
 2062     jne invalid_operand_size
 2063       sh_reg_imm_size_ok:
 2064     push    ebx
 2065     call    get_byte_value
 2066     mov dl,al
 2067     pop ebx
 2068     mov al,bh
 2069     cmp al,1
 2070     je  sh_reg_imm_8bit
 2071     call    operand_autodetect
 2072     cmp dl,1
 2073     je  sh_reg_1
 2074     mov [base_code],0C1h
 2075     call    store_nomem_instruction
 2076     mov al,dl
 2077     stos    byte [edi]
 2078     jmp instruction_assembled
 2079       sh_reg_1:
 2080     mov [base_code],0D1h
 2081     jmp nomem_instruction_ready
 2082       sh_reg_imm_8bit:
 2083     cmp dl,1
 2084     je  sh_reg_1_8bit
 2085     mov [base_code],0C0h
 2086     call    store_nomem_instruction
 2087     mov al,dl
 2088     stos    byte [edi]
 2089     jmp instruction_assembled
 2090       sh_reg_1_8bit:
 2091     mov [base_code],0D0h
 2092     jmp nomem_instruction_ready
 2093 shd_instruction:
 2094     mov [base_code],0Fh
 2095     mov [extended_code],al
 2096     lods    byte [esi]
 2097     call    get_size_operator
 2098     cmp al,10h
 2099     je  shd_reg
 2100     cmp al,'['
 2101     jne invalid_operand
 2102       shd_mem:
 2103     call    get_address
 2104     push    edx ebx ecx
 2105     lods    byte [esi]
 2106     cmp al,','
 2107     jne invalid_operand
 2108     call    take_register
 2109     mov [postbyte_register],al
 2110     lods    byte [esi]
 2111     cmp al,','
 2112     jne invalid_operand
 2113     mov al,ah
 2114     mov [operand_size],0
 2115     push    eax
 2116     lods    byte [esi]
 2117     call    get_size_operator
 2118     cmp al,'('
 2119     je  shd_mem_reg_imm
 2120     cmp al,10h
 2121     jne invalid_operand
 2122     lods    byte [esi]
 2123     cmp al,11h
 2124     jne invalid_operand
 2125     pop eax ecx ebx edx
 2126     call    operand_autodetect
 2127     inc [extended_code]
 2128     jmp instruction_ready
 2129       shd_mem_reg_imm:
 2130     mov al,[operand_size]
 2131     or  al,al
 2132     jz  shd_mem_reg_imm_size_ok
 2133     cmp al,1
 2134     jne invalid_operand_size
 2135       shd_mem_reg_imm_size_ok:
 2136     call    get_byte_value
 2137     mov byte [value],al
 2138     pop eax ecx ebx edx
 2139     call    operand_autodetect
 2140     call    store_instruction_with_imm8
 2141     jmp instruction_assembled
 2142       shd_reg:
 2143     lods    byte [esi]
 2144     call    convert_register
 2145     mov [postbyte_register],al
 2146     lods    byte [esi]
 2147     cmp al,','
 2148     jne invalid_operand
 2149     call    take_register
 2150     mov bl,[postbyte_register]
 2151     mov [postbyte_register],al
 2152     mov al,ah
 2153     push    eax ebx
 2154     lods    byte [esi]
 2155     cmp al,','
 2156     jne invalid_operand
 2157     mov [operand_size],0
 2158     lods    byte [esi]
 2159     call    get_size_operator
 2160     cmp al,'('
 2161     je  shd_reg_reg_imm
 2162     cmp al,10h
 2163     jne invalid_operand
 2164     lods    byte [esi]
 2165     cmp al,11h
 2166     jne invalid_operand
 2167     pop ebx eax
 2168     call    operand_autodetect
 2169     inc [extended_code]
 2170     jmp nomem_instruction_ready
 2171       shd_reg_reg_imm:
 2172     mov al,[operand_size]
 2173     or  al,al
 2174     jz  shd_reg_reg_imm_size_ok
 2175     cmp al,1
 2176     jne invalid_operand_size
 2177       shd_reg_reg_imm_size_ok:
 2178     call    get_byte_value
 2179     mov dl,al
 2180     pop ebx eax
 2181     call    operand_autodetect
 2182     call    store_nomem_instruction
 2183     mov al,dl
 2184     stos    byte [edi]
 2185     jmp instruction_assembled
 2186 movx_instruction:
 2187     mov [base_code],0Fh
 2188     mov [extended_code],al
 2189     call    take_register
 2190     mov [postbyte_register],al
 2191     mov al,ah
 2192     push    eax
 2193     lods    byte [esi]
 2194     cmp al,','
 2195     jne invalid_operand
 2196     mov [operand_size],0
 2197     lods    byte [esi]
 2198     call    get_size_operator
 2199     cmp al,10h
 2200     je  movx_reg
 2201     cmp al,'['
 2202     jne invalid_operand
 2203     call    get_address
 2204     pop eax
 2205     mov ah,[operand_size]
 2206     or  ah,ah
 2207     jz  movx_unknown_size
 2208     cmp ah,al
 2209     jae invalid_operand_size
 2210     cmp ah,1
 2211     je  movx_mem_store
 2212     cmp ah,2
 2213     jne invalid_operand_size
 2214     inc [extended_code]
 2215       movx_mem_store:
 2216     call    operand_autodetect
 2217     jmp instruction_ready
 2218       movx_unknown_size:
 2219     cmp al,2
 2220     je  movx_mem_store
 2221     call    recoverable_unknown_size
 2222     jmp movx_mem_store
 2223       movx_reg:
 2224     lods    byte [esi]
 2225     call    convert_register
 2226     pop ebx
 2227     xchg    bl,al
 2228     cmp ah,al
 2229     jae invalid_operand_size
 2230     cmp ah,1
 2231     je  movx_reg_8bit
 2232     cmp ah,2
 2233     je  movx_reg_16bit
 2234     jmp invalid_operand_size
 2235       movx_reg_8bit:
 2236     call    operand_autodetect
 2237     jmp nomem_instruction_ready
 2238       movx_reg_16bit:
 2239     call    operand_autodetect
 2240     inc [extended_code]
 2241     jmp nomem_instruction_ready
 2242 movsxd_instruction:
 2243     mov [base_code],al
 2244     call    take_register
 2245     mov [postbyte_register],al
 2246     cmp ah,8
 2247     jne invalid_operand_size
 2248     lods    byte [esi]
 2249     cmp al,','
 2250     jne invalid_operand
 2251     mov [operand_size],0
 2252     lods    byte [esi]
 2253     call    get_size_operator
 2254     cmp al,10h
 2255     je  movsxd_reg
 2256     cmp al,'['
 2257     jne invalid_operand
 2258     call    get_address
 2259     cmp [operand_size],4
 2260     je  movsxd_mem_store
 2261     cmp [operand_size],0
 2262     jne invalid_operand_size
 2263       movsxd_mem_store:
 2264     call    operand_64bit
 2265     jmp instruction_ready
 2266       movsxd_reg:
 2267     lods    byte [esi]
 2268     call    convert_register
 2269     cmp ah,4
 2270     jne invalid_operand_size
 2271     mov bl,al
 2272     call    operand_64bit
 2273     jmp nomem_instruction_ready
 2274 bt_instruction:
 2275     mov [postbyte_register],al
 2276     shl al,3
 2277     add al,83h
 2278     mov [extended_code],al
 2279     mov [base_code],0Fh
 2280     lods    byte [esi]
 2281     call    get_size_operator
 2282     cmp al,10h
 2283     je  bt_reg
 2284     cmp al,'['
 2285     jne invalid_operand
 2286     call    get_address
 2287     push    eax ebx ecx
 2288     lods    byte [esi]
 2289     cmp al,','
 2290     jne invalid_operand
 2291     cmp byte [esi],'('
 2292     je  bt_mem_imm
 2293     cmp byte [esi],11h
 2294     jne bt_mem_reg
 2295     cmp byte [esi+2],'('
 2296     je  bt_mem_imm
 2297       bt_mem_reg:
 2298     call    take_register
 2299     mov [postbyte_register],al
 2300     pop ecx ebx edx
 2301     mov al,ah
 2302     call    operand_autodetect
 2303     jmp instruction_ready
 2304       bt_mem_imm:
 2305     xor al,al
 2306     xchg    al,[operand_size]
 2307     push    eax
 2308     lods    byte [esi]
 2309     call    get_size_operator
 2310     cmp al,'('
 2311     jne invalid_operand
 2312     mov al,[operand_size]
 2313     or  al,al
 2314     jz  bt_mem_imm_size_ok
 2315     cmp al,1
 2316     jne invalid_operand_size
 2317       bt_mem_imm_size_ok:
 2318     call    get_byte_value
 2319     mov byte [value],al
 2320     pop eax
 2321     or  al,al
 2322     jz  bt_mem_imm_nosize
 2323     call    operand_autodetect
 2324       bt_mem_imm_store:
 2325     pop ecx ebx edx
 2326     mov [extended_code],0BAh
 2327     call    store_instruction_with_imm8
 2328     jmp instruction_assembled
 2329       bt_mem_imm_nosize:
 2330     call    recoverable_unknown_size
 2331     jmp bt_mem_imm_store
 2332       bt_reg:
 2333     lods    byte [esi]
 2334     call    convert_register
 2335     mov bl,al
 2336     lods    byte [esi]
 2337     cmp al,','
 2338     jne invalid_operand
 2339     cmp byte [esi],'('
 2340     je  bt_reg_imm
 2341     cmp byte [esi],11h
 2342     jne bt_reg_reg
 2343     cmp byte [esi+2],'('
 2344     je  bt_reg_imm
 2345       bt_reg_reg:
 2346     call    take_register
 2347     mov [postbyte_register],al
 2348     mov al,ah
 2349     call    operand_autodetect
 2350     jmp nomem_instruction_ready
 2351       bt_reg_imm:
 2352     xor al,al
 2353     xchg    al,[operand_size]
 2354     push    eax ebx
 2355     lods    byte [esi]
 2356     call    get_size_operator
 2357     cmp al,'('
 2358     jne invalid_operand
 2359     mov al,[operand_size]
 2360     or  al,al
 2361     jz  bt_reg_imm_size_ok
 2362     cmp al,1
 2363     jne invalid_operand_size
 2364       bt_reg_imm_size_ok:
 2365     call    get_byte_value
 2366     mov byte [value],al
 2367     pop ebx eax
 2368     call    operand_autodetect
 2369       bt_reg_imm_store:
 2370     mov [extended_code],0BAh
 2371     call    store_nomem_instruction
 2372     mov al,byte [value]
 2373     stos    byte [edi]
 2374     jmp instruction_assembled
 2375 bs_instruction:
 2376     mov [extended_code],al
 2377     mov [base_code],0Fh
 2378     call    get_reg_mem
 2379     jc  bs_reg_reg
 2380     mov al,[operand_size]
 2381     call    operand_autodetect
 2382     jmp instruction_ready
 2383       bs_reg_reg:
 2384     mov al,ah
 2385     call    operand_autodetect
 2386     jmp nomem_instruction_ready
 2387       get_reg_mem:
 2388     call    take_register
 2389     mov [postbyte_register],al
 2390     lods    byte [esi]
 2391     cmp al,','
 2392     jne invalid_operand
 2393     lods    byte [esi]
 2394     call    get_size_operator
 2395     cmp al,10h
 2396     je  get_reg_reg
 2397     cmp al,'['
 2398     jne invalid_argument
 2399     call    get_address
 2400     clc
 2401     ret
 2402       get_reg_reg:
 2403     lods    byte [esi]
 2404     call    convert_register
 2405     mov bl,al
 2406     stc
 2407     ret
 2408 ud_instruction:
 2409     mov [extended_code],al
 2410     mov [base_code],0Fh
 2411     call    get_reg_mem
 2412     jc  ud_reg_reg
 2413     cmp [operand_size],4
 2414     jne invalid_operand_size
 2415     jmp instruction_ready
 2416       ud_reg_reg:
 2417     cmp ah,4
 2418     jne invalid_operand_size
 2419     jmp nomem_instruction_ready
 2420 
 2421 imul_instruction:
 2422     mov [base_code],0F6h
 2423     mov [postbyte_register],5
 2424     lods    byte [esi]
 2425     call    get_size_operator
 2426     cmp al,10h
 2427     je  imul_reg
 2428     cmp al,'['
 2429     jne invalid_operand
 2430       imul_mem:
 2431     call    get_address
 2432     mov al,[operand_size]
 2433     cmp al,1
 2434     je  imul_mem_8bit
 2435     jb  imul_mem_nosize
 2436     call    operand_autodetect
 2437     inc [base_code]
 2438     jmp instruction_ready
 2439       imul_mem_nosize:
 2440     call    recoverable_unknown_size
 2441       imul_mem_8bit:
 2442     jmp instruction_ready
 2443       imul_reg:
 2444     lods    byte [esi]
 2445     call    convert_register
 2446     cmp byte [esi],','
 2447     je  imul_reg_
 2448     mov bl,al
 2449     mov al,ah
 2450     cmp al,1
 2451     je  imul_reg_8bit
 2452     call    operand_autodetect
 2453     inc [base_code]
 2454       imul_reg_8bit:
 2455     jmp nomem_instruction_ready
 2456       imul_reg_:
 2457     mov [postbyte_register],al
 2458     inc esi
 2459     cmp byte [esi],'('
 2460     je  imul_reg_imm
 2461     cmp byte [esi],11h
 2462     jne imul_reg_noimm
 2463     cmp byte [esi+2],'('
 2464     je  imul_reg_imm
 2465       imul_reg_noimm:
 2466     lods    byte [esi]
 2467     call    get_size_operator
 2468     cmp al,10h
 2469     je  imul_reg_reg
 2470     cmp al,'['
 2471     jne invalid_operand
 2472       imul_reg_mem:
 2473     call    get_address
 2474     push    edx ebx ecx
 2475     cmp byte [esi],','
 2476     je  imul_reg_mem_imm
 2477     mov al,[operand_size]
 2478     call    operand_autodetect
 2479     pop ecx ebx edx
 2480     mov [base_code],0Fh
 2481     mov [extended_code],0AFh
 2482     jmp instruction_ready
 2483       imul_reg_mem_imm:
 2484     inc esi
 2485     lods    byte [esi]
 2486     call    get_size_operator
 2487     cmp al,'('
 2488     jne invalid_operand
 2489     mov al,[operand_size]
 2490     cmp al,2
 2491     je  imul_reg_mem_imm_16bit
 2492     cmp al,4
 2493     je  imul_reg_mem_imm_32bit
 2494     cmp al,8
 2495     jne invalid_operand_size
 2496       imul_reg_mem_imm_64bit:
 2497     cmp [size_declared],0
 2498     jne long_immediate_not_encodable
 2499     call    operand_64bit
 2500     call    get_simm32
 2501     cmp [value_type],4
 2502     jae long_immediate_not_encodable
 2503     jmp imul_reg_mem_imm_32bit_ok
 2504       imul_reg_mem_imm_16bit:
 2505     call    operand_16bit
 2506     call    get_word_value
 2507     mov word [value],ax
 2508     cmp [value_type],0
 2509     jne imul_reg_mem_imm_16bit_store
 2510     cmp [size_declared],0
 2511     jne imul_reg_mem_imm_16bit_store
 2512     cmp ax,-80h
 2513     jl  imul_reg_mem_imm_16bit_store
 2514     cmp ax,80h
 2515     jl  imul_reg_mem_imm_8bit_store
 2516       imul_reg_mem_imm_16bit_store:
 2517     pop ecx ebx edx
 2518     mov [base_code],69h
 2519     call    store_instruction_with_imm16
 2520     jmp instruction_assembled
 2521       imul_reg_mem_imm_32bit:
 2522     call    operand_32bit
 2523     call    get_dword_value
 2524       imul_reg_mem_imm_32bit_ok:
 2525     mov dword [value],eax
 2526     cmp [value_type],0
 2527     jne imul_reg_mem_imm_32bit_store
 2528     cmp [size_declared],0
 2529     jne imul_reg_mem_imm_32bit_store
 2530     cmp eax,-80h
 2531     jl  imul_reg_mem_imm_32bit_store
 2532     cmp eax,80h
 2533     jl  imul_reg_mem_imm_8bit_store
 2534       imul_reg_mem_imm_32bit_store:
 2535     pop ecx ebx edx
 2536     mov [base_code],69h
 2537     call    store_instruction_with_imm32
 2538     jmp instruction_assembled
 2539       imul_reg_mem_imm_8bit_store:
 2540     pop ecx ebx edx
 2541     mov [base_code],6Bh
 2542     call    store_instruction_with_imm8
 2543     jmp instruction_assembled
 2544       imul_reg_imm:
 2545     mov bl,[postbyte_register]
 2546     dec esi
 2547     jmp imul_reg_reg_imm
 2548       imul_reg_reg:
 2549     lods    byte [esi]
 2550     call    convert_register
 2551     mov bl,al
 2552     cmp byte [esi],','
 2553     je  imul_reg_reg_imm
 2554     mov al,ah
 2555     call    operand_autodetect
 2556     mov [base_code],0Fh
 2557     mov [extended_code],0AFh
 2558     jmp nomem_instruction_ready
 2559       imul_reg_reg_imm:
 2560     inc esi
 2561     lods    byte [esi]
 2562     call    get_size_operator
 2563     cmp al,'('
 2564     jne invalid_operand
 2565     mov al,[operand_size]
 2566     cmp al,2
 2567     je  imul_reg_reg_imm_16bit
 2568     cmp al,4
 2569     je  imul_reg_reg_imm_32bit
 2570     cmp al,8
 2571     jne invalid_operand_size
 2572       imul_reg_reg_imm_64bit:
 2573     cmp [size_declared],0
 2574     jne long_immediate_not_encodable
 2575     call    operand_64bit
 2576     push    ebx
 2577     call    get_simm32
 2578     cmp [value_type],4
 2579     jae long_immediate_not_encodable
 2580     jmp imul_reg_reg_imm_32bit_ok
 2581       imul_reg_reg_imm_16bit:
 2582     call    operand_16bit
 2583     push    ebx
 2584     call    get_word_value
 2585     pop ebx
 2586     mov dx,ax
 2587     cmp [value_type],0
 2588     jne imul_reg_reg_imm_16bit_store
 2589     cmp [size_declared],0
 2590     jne imul_reg_reg_imm_16bit_store
 2591     cmp ax,-80h
 2592     jl  imul_reg_reg_imm_16bit_store
 2593     cmp ax,80h
 2594     jl  imul_reg_reg_imm_8bit_store
 2595       imul_reg_reg_imm_16bit_store:
 2596     mov [base_code],69h
 2597     call    store_nomem_instruction
 2598     mov ax,dx
 2599     call    mark_relocation
 2600     stos    word [edi]
 2601     jmp instruction_assembled
 2602       imul_reg_reg_imm_32bit:
 2603     call    operand_32bit
 2604     push    ebx
 2605     call    get_dword_value
 2606       imul_reg_reg_imm_32bit_ok:
 2607     pop ebx
 2608     mov edx,eax
 2609     cmp [value_type],0
 2610     jne imul_reg_reg_imm_32bit_store
 2611     cmp [size_declared],0
 2612     jne imul_reg_reg_imm_32bit_store
 2613     cmp eax,-80h
 2614     jl  imul_reg_reg_imm_32bit_store
 2615     cmp eax,80h
 2616     jl  imul_reg_reg_imm_8bit_store
 2617       imul_reg_reg_imm_32bit_store:
 2618     mov [base_code],69h
 2619     call    store_nomem_instruction
 2620     mov eax,edx
 2621     call    mark_relocation
 2622     stos    dword [edi]
 2623     jmp instruction_assembled
 2624       imul_reg_reg_imm_8bit_store:
 2625     mov [base_code],6Bh
 2626     call    store_nomem_instruction
 2627     mov al,dl
 2628     stos    byte [edi]
 2629     jmp instruction_assembled
 2630 in_instruction:
 2631     call    take_register
 2632     or  al,al
 2633     jnz invalid_operand
 2634     lods    byte [esi]
 2635     cmp al,','
 2636     jne invalid_operand
 2637     mov al,ah
 2638     push    eax
 2639     mov [operand_size],0
 2640     lods    byte [esi]
 2641     call    get_size_operator
 2642     cmp al,'('
 2643     je  in_imm
 2644     cmp al,10h
 2645     je  in_reg
 2646     jmp invalid_operand
 2647       in_reg:
 2648     lods    byte [esi]
 2649     cmp al,22h
 2650     jne invalid_operand
 2651     pop eax
 2652     cmp al,1
 2653     je  in_al_dx
 2654     cmp al,2
 2655     je  in_ax_dx
 2656     cmp al,4
 2657     jne invalid_operand_size
 2658       in_ax_dx:
 2659     call    operand_autodetect
 2660     mov [base_code],0EDh
 2661     call    store_classic_instruction_code
 2662     jmp instruction_assembled
 2663       in_al_dx:
 2664     mov al,0ECh
 2665     stos    byte [edi]
 2666     jmp instruction_assembled
 2667       in_imm:
 2668     mov al,[operand_size]
 2669     or  al,al
 2670     jz  in_imm_size_ok
 2671     cmp al,1
 2672     jne invalid_operand_size
 2673       in_imm_size_ok:
 2674     call    get_byte_value
 2675     mov dl,al
 2676     pop eax
 2677     cmp al,1
 2678     je  in_al_imm
 2679     cmp al,2
 2680     je  in_ax_imm
 2681     cmp al,4
 2682     jne invalid_operand_size
 2683       in_ax_imm:
 2684     call    operand_autodetect
 2685     mov [base_code],0E5h
 2686     call    store_classic_instruction_code
 2687     mov al,dl
 2688     stos    byte [edi]
 2689     jmp instruction_assembled
 2690       in_al_imm:
 2691     mov al,0E4h
 2692     stos    byte [edi]
 2693     mov al,dl
 2694     stos    byte [edi]
 2695     jmp instruction_assembled
 2696 out_instruction:
 2697     lods    byte [esi]
 2698     call    get_size_operator
 2699     cmp al,'('
 2700     je  out_imm
 2701     cmp al,10h
 2702     jne invalid_operand
 2703     lods    byte [esi]
 2704     cmp al,22h
 2705     jne invalid_operand
 2706     lods    byte [esi]
 2707     cmp al,','
 2708     jne invalid_operand
 2709     mov [operand_size],0
 2710     call    take_register
 2711     or  al,al
 2712     jnz invalid_operand
 2713     mov al,ah
 2714     cmp al,1
 2715     je  out_dx_al
 2716     cmp al,2
 2717     je  out_dx_ax
 2718     cmp al,4
 2719     jne invalid_operand_size
 2720       out_dx_ax:
 2721     call    operand_autodetect
 2722     mov [base_code],0EFh
 2723     call    store_classic_instruction_code
 2724     jmp instruction_assembled
 2725       out_dx_al:
 2726     mov al,0EEh
 2727     stos    byte [edi]
 2728     jmp instruction_assembled
 2729       out_imm:
 2730     mov al,[operand_size]
 2731     or  al,al
 2732     jz  out_imm_size_ok
 2733     cmp al,1
 2734     jne invalid_operand_size
 2735       out_imm_size_ok:
 2736     call    get_byte_value
 2737     mov dl,al
 2738     lods    byte [esi]
 2739     cmp al,','
 2740     jne invalid_operand
 2741     mov [operand_size],0
 2742     call    take_register
 2743     or  al,al
 2744     jnz invalid_operand
 2745     mov al,ah
 2746     cmp al,1
 2747     je  out_imm_al
 2748     cmp al,2
 2749     je  out_imm_ax
 2750     cmp al,4
 2751     jne invalid_operand_size
 2752       out_imm_ax:
 2753     call    operand_autodetect
 2754     mov [base_code],0E7h
 2755     call    store_classic_instruction_code
 2756     mov al,dl
 2757     stos    byte [edi]
 2758     jmp instruction_assembled
 2759       out_imm_al:
 2760     mov al,0E6h
 2761     stos    byte [edi]
 2762     mov al,dl
 2763     stos    byte [edi]
 2764     jmp instruction_assembled
 2765 
 2766 call_instruction:
 2767     mov [postbyte_register],10b
 2768     mov [base_code],0E8h
 2769     mov [extended_code],9Ah
 2770     jmp process_jmp
 2771 jmp_instruction:
 2772     mov [postbyte_register],100b
 2773     mov [base_code],0E9h
 2774     mov [extended_code],0EAh
 2775       process_jmp:
 2776     lods    byte [esi]
 2777     call    get_jump_operator
 2778     test    [prefix_flags],10h
 2779     jz  jmp_type_ok
 2780     test    [jump_type],not 2
 2781     jnz illegal_instruction
 2782     mov [jump_type],2
 2783     and [prefix_flags],not 10h
 2784       jmp_type_ok:
 2785     call    get_size_operator
 2786     cmp al,'('
 2787     je  jmp_imm
 2788     mov [base_code],0FFh
 2789     cmp al,10h
 2790     je  jmp_reg
 2791     cmp al,'['
 2792     jne invalid_operand
 2793       jmp_mem:
 2794     cmp [jump_type],1
 2795     je  illegal_instruction
 2796     call    get_address
 2797     mov edx,eax
 2798     mov al,[operand_size]
 2799     or  al,al
 2800     jz  jmp_mem_size_not_specified
 2801     cmp al,2
 2802     je  jmp_mem_16bit
 2803     cmp al,4
 2804     je  jmp_mem_32bit
 2805     cmp al,6
 2806     je  jmp_mem_48bit
 2807     cmp al,8
 2808     je  jmp_mem_64bit
 2809     cmp al,10
 2810     je  jmp_mem_80bit
 2811     jmp invalid_operand_size
 2812       jmp_mem_size_not_specified:
 2813     cmp [jump_type],3
 2814     je  jmp_mem_far
 2815     cmp [jump_type],2
 2816     je  jmp_mem_near
 2817     call    recoverable_unknown_size
 2818       jmp_mem_near:
 2819     cmp [code_type],16
 2820     je  jmp_mem_16bit
 2821     cmp [code_type],32
 2822     je  jmp_mem_near_32bit
 2823       jmp_mem_64bit:
 2824     cmp [jump_type],3
 2825     je  invalid_operand_size
 2826     cmp [code_type],64
 2827     jne illegal_instruction
 2828     jmp instruction_ready
 2829       jmp_mem_far:
 2830     cmp [code_type],16
 2831     je  jmp_mem_far_32bit
 2832       jmp_mem_48bit:
 2833     call    operand_32bit
 2834       jmp_mem_far_store:
 2835     cmp [jump_type],2
 2836     je  invalid_operand_size
 2837     inc [postbyte_register]
 2838     jmp instruction_ready
 2839       jmp_mem_80bit:
 2840     call    operand_64bit
 2841     jmp jmp_mem_far_store
 2842       jmp_mem_far_32bit:
 2843     call    operand_16bit
 2844     jmp jmp_mem_far_store
 2845       jmp_mem_32bit:
 2846     cmp [jump_type],3
 2847     je  jmp_mem_far_32bit
 2848     cmp [jump_type],2
 2849     je  jmp_mem_near_32bit
 2850     cmp [code_type],16
 2851     je  jmp_mem_far_32bit
 2852       jmp_mem_near_32bit:
 2853     cmp [code_type],64
 2854     je  illegal_instruction
 2855     call    operand_32bit
 2856     jmp instruction_ready
 2857       jmp_mem_16bit:
 2858     cmp [jump_type],3
 2859     je  invalid_operand_size
 2860     call    operand_16bit
 2861     jmp instruction_ready
 2862       jmp_reg:
 2863     test    [jump_type],1
 2864     jnz invalid_operand
 2865     lods    byte [esi]
 2866     call    convert_register
 2867     mov bl,al
 2868     mov al,ah
 2869     cmp al,2
 2870     je  jmp_reg_16bit
 2871     cmp al,4
 2872     je  jmp_reg_32bit
 2873     cmp al,8
 2874     jne invalid_operand_size
 2875       jmp_reg_64bit:
 2876     cmp [code_type],64
 2877     jne illegal_instruction
 2878     jmp nomem_instruction_ready
 2879       jmp_reg_32bit:
 2880     cmp [code_type],64
 2881     je  illegal_instruction
 2882     call    operand_32bit
 2883     jmp nomem_instruction_ready
 2884       jmp_reg_16bit:
 2885     call    operand_16bit
 2886     jmp nomem_instruction_ready
 2887       jmp_imm:
 2888     cmp byte [esi],'.'
 2889     je  invalid_value
 2890     mov ebx,esi
 2891     dec esi
 2892     call    skip_symbol
 2893     xchg    esi,ebx
 2894     cmp byte [ebx],':'
 2895     je  jmp_far
 2896     cmp [jump_type],3
 2897     je  invalid_operand
 2898       jmp_near:
 2899     mov al,[operand_size]
 2900     cmp al,2
 2901     je  jmp_imm_16bit
 2902     cmp al,4
 2903     je  jmp_imm_32bit
 2904     cmp al,8
 2905     je  jmp_imm_64bit
 2906     or  al,al
 2907     jnz invalid_operand_size
 2908     cmp [code_type],16
 2909     je  jmp_imm_16bit
 2910     cmp [code_type],64
 2911     je  jmp_imm_64bit
 2912       jmp_imm_32bit:
 2913     cmp [code_type],64
 2914     je  invalid_operand_size
 2915     call    get_address_dword_value
 2916     cmp [code_type],16
 2917     jne jmp_imm_32bit_prefix_ok
 2918     mov byte [edi],66h
 2919     inc edi
 2920       jmp_imm_32bit_prefix_ok:
 2921     call    calculate_jump_offset
 2922     cdq
 2923     call    check_for_short_jump
 2924     jc  jmp_short
 2925       jmp_imm_32bit_store:
 2926     mov edx,eax
 2927     sub edx,3
 2928     jno jmp_imm_32bit_ok
 2929     cmp [code_type],64
 2930     je  jump_out_of_range
 2931       jmp_imm_32bit_ok:
 2932     mov al,[base_code]
 2933     stos    byte [edi]
 2934     mov eax,edx
 2935     call    mark_relocation
 2936     stos    dword [edi]
 2937     jmp instruction_assembled
 2938       jmp_imm_64bit:
 2939     cmp [code_type],64
 2940     jne invalid_operand_size
 2941     call    get_address_qword_value
 2942     call    calculate_jump_offset
 2943     mov ecx,edx
 2944     cdq
 2945     cmp edx,ecx
 2946     jne jump_out_of_range
 2947     call    check_for_short_jump
 2948     jnc jmp_imm_32bit_store
 2949       jmp_short:
 2950     mov ah,al
 2951     mov al,0EBh
 2952     stos    word [edi]
 2953     jmp instruction_assembled
 2954       jmp_imm_16bit:
 2955     call    get_address_word_value
 2956     cmp [code_type],16
 2957     je  jmp_imm_16bit_prefix_ok
 2958     mov byte [edi],66h
 2959     inc edi
 2960       jmp_imm_16bit_prefix_ok:
 2961     call    calculate_jump_offset
 2962     cwde
 2963     cdq
 2964     call    check_for_short_jump
 2965     jc  jmp_short
 2966     cmp [value_type],0
 2967     jne invalid_use_of_symbol
 2968     mov edx,eax
 2969     dec edx
 2970     mov al,[base_code]
 2971     stos    byte [edi]
 2972     mov eax,edx
 2973     stos    word [edi]
 2974     jmp instruction_assembled
 2975       calculate_jump_offset:
 2976     add edi,2
 2977     mov ebp,[addressing_space]
 2978     call    calculate_relative_offset
 2979     sub edi,2
 2980     ret
 2981       check_for_short_jump:
 2982     cmp [jump_type],1
 2983     je  forced_short
 2984     ja  no_short_jump
 2985     cmp [base_code],0E8h
 2986     je  no_short_jump
 2987     cmp [value_type],0
 2988     jne no_short_jump
 2989     cmp eax,80h
 2990     jb  short_jump
 2991     cmp eax,-80h
 2992     jae short_jump
 2993       no_short_jump:
 2994     clc
 2995     ret
 2996       forced_short:
 2997     cmp [base_code],0E8h
 2998     je  illegal_instruction
 2999     cmp [next_pass_needed],0
 3000     jne jmp_short_value_type_ok
 3001     cmp [value_type],0
 3002     jne invalid_use_of_symbol
 3003       jmp_short_value_type_ok:
 3004     cmp eax,-80h
 3005     jae short_jump
 3006     cmp eax,80h
 3007     jae jump_out_of_range
 3008       short_jump:
 3009     stc
 3010     ret
 3011       jump_out_of_range:
 3012     cmp [error_line],0
 3013     jne instruction_assembled
 3014     mov eax,[current_line]
 3015     mov [error_line],eax
 3016     mov [error],relative_jump_out_of_range
 3017     jmp instruction_assembled
 3018       jmp_far:
 3019     cmp [jump_type],2
 3020     je  invalid_operand
 3021     cmp [code_type],64
 3022     je  illegal_instruction
 3023     mov al,[extended_code]
 3024     mov [base_code],al
 3025     call    get_word_value
 3026     push    eax
 3027     inc esi
 3028     lods    byte [esi]
 3029     cmp al,'('
 3030     jne invalid_operand
 3031     mov al,[value_type]
 3032     push    eax
 3033     push    [symbol_identifier]
 3034     cmp byte [esi],'.'
 3035     je  invalid_value
 3036     mov al,[operand_size]
 3037     cmp al,4
 3038     je  jmp_far_16bit
 3039     cmp al,6
 3040     je  jmp_far_32bit
 3041     or  al,al
 3042     jnz invalid_operand_size
 3043     cmp [code_type],16
 3044     jne jmp_far_32bit
 3045       jmp_far_16bit:
 3046     call    get_word_value
 3047     mov ebx,eax
 3048     call    operand_16bit
 3049     call    store_classic_instruction_code
 3050     mov ax,bx
 3051     call    mark_relocation
 3052     stos    word [edi]
 3053       jmp_far_segment:
 3054     pop [symbol_identifier]
 3055     pop eax
 3056     mov [value_type],al
 3057     pop eax
 3058     call    mark_relocation
 3059     stos    word [edi]
 3060     jmp instruction_assembled
 3061       jmp_far_32bit:
 3062     call    get_dword_value
 3063     mov ebx,eax
 3064     call    operand_32bit
 3065     call    store_classic_instruction_code
 3066     mov eax,ebx
 3067     call    mark_relocation
 3068     stos    dword [edi]
 3069     jmp jmp_far_segment
 3070 conditional_jump:
 3071     mov [base_code],al
 3072     and [prefix_flags],not 10h
 3073     lods    byte [esi]
 3074     call    get_jump_operator
 3075     cmp [jump_type],3
 3076     je  invalid_operand
 3077     call    get_size_operator
 3078     cmp al,'('
 3079     jne invalid_operand
 3080     cmp byte [esi],'.'
 3081     je  invalid_value
 3082     mov al,[operand_size]
 3083     cmp al,2
 3084     je  conditional_jump_16bit
 3085     cmp al,4
 3086     je  conditional_jump_32bit
 3087     cmp al,8
 3088     je  conditional_jump_64bit
 3089     or  al,al
 3090     jnz invalid_operand_size
 3091     cmp [code_type],16
 3092     je  conditional_jump_16bit
 3093     cmp [code_type],64
 3094     je  conditional_jump_64bit
 3095       conditional_jump_32bit:
 3096     cmp [code_type],64
 3097     je  invalid_operand_size
 3098     call    get_address_dword_value
 3099     cmp [code_type],16
 3100     jne conditional_jump_32bit_prefix_ok
 3101     mov byte [edi],66h
 3102     inc edi
 3103       conditional_jump_32bit_prefix_ok:
 3104     call    calculate_jump_offset
 3105     cdq
 3106     call    check_for_short_jump
 3107     jc  conditional_jump_short
 3108       conditional_jump_32bit_store:
 3109     mov edx,eax
 3110     sub edx,4
 3111     jno conditional_jump_32bit_range_ok
 3112     cmp [code_type],64
 3113     je  jump_out_of_range
 3114       conditional_jump_32bit_range_ok:
 3115     mov ah,[base_code]
 3116     add ah,10h
 3117     mov al,0Fh
 3118     stos    word [edi]
 3119     mov eax,edx
 3120     call    mark_relocation
 3121     stos    dword [edi]
 3122     jmp instruction_assembled
 3123       conditional_jump_64bit:
 3124     cmp [code_type],64
 3125     jne invalid_operand_size
 3126     call    get_address_qword_value
 3127     call    calculate_jump_offset
 3128     mov ecx,edx
 3129     cdq
 3130     cmp edx,ecx
 3131     jne jump_out_of_range
 3132     call    check_for_short_jump
 3133     jnc conditional_jump_32bit_store
 3134       conditional_jump_short:
 3135     mov ah,al
 3136     mov al,[base_code]
 3137     stos    word [edi]
 3138     jmp instruction_assembled
 3139       conditional_jump_16bit:
 3140     call    get_address_word_value
 3141     cmp [code_type],16
 3142     je  conditional_jump_16bit_prefix_ok
 3143     mov byte [edi],66h
 3144     inc edi
 3145       conditional_jump_16bit_prefix_ok:
 3146     call    calculate_jump_offset
 3147     cwde
 3148     cdq
 3149     call    check_for_short_jump
 3150     jc  conditional_jump_short
 3151     cmp [value_type],0
 3152     jne invalid_use_of_symbol
 3153     mov edx,eax
 3154     sub dx,2
 3155     mov ah,[base_code]
 3156     add ah,10h
 3157     mov al,0Fh
 3158     stos    word [edi]
 3159     mov eax,edx
 3160     stos    word [edi]
 3161     jmp instruction_assembled
 3162 loop_instruction_16bit:
 3163     cmp [code_type],64
 3164     je  illegal_instruction
 3165     cmp [code_type],16
 3166     je  loop_instruction
 3167     mov [operand_prefix],67h
 3168     jmp loop_instruction
 3169 loop_instruction_32bit:
 3170     cmp [code_type],32
 3171     je  loop_instruction
 3172     mov [operand_prefix],67h
 3173       jmp     loop_instruction
 3174 loop_instruction_64bit:
 3175     cmp [code_type],64
 3176     jne illegal_instruction
 3177 loop_instruction:
 3178     mov [base_code],al
 3179     lods    byte [esi]
 3180     call    get_jump_operator
 3181     cmp [jump_type],1
 3182     ja  invalid_operand
 3183     call    get_size_operator
 3184     cmp al,'('
 3185     jne invalid_operand
 3186     cmp byte [esi],'.'
 3187     je  invalid_value
 3188     mov al,[operand_size]
 3189     cmp al,2
 3190     je  loop_jump_16bit
 3191     cmp al,4
 3192     je  loop_jump_32bit
 3193     cmp al,8
 3194     je  loop_jump_64bit
 3195     or  al,al
 3196     jnz invalid_operand_size
 3197     cmp [code_type],16
 3198     je  loop_jump_16bit
 3199     cmp [code_type],64
 3200     je  loop_jump_64bit
 3201       loop_jump_32bit:
 3202     cmp [code_type],64
 3203     je  invalid_operand_size
 3204     call    get_address_dword_value
 3205     cmp [code_type],16
 3206     jne loop_jump_32bit_prefix_ok
 3207     mov byte [edi],66h
 3208     inc edi
 3209       loop_jump_32bit_prefix_ok:
 3210     call    loop_counter_size
 3211     call    calculate_jump_offset
 3212     cdq
 3213       make_loop_jump:
 3214     call    check_for_short_jump
 3215     jc  conditional_jump_short
 3216     scas    word [edi]
 3217     jmp jump_out_of_range
 3218       loop_counter_size:
 3219     cmp [operand_prefix],0
 3220     je  loop_counter_size_ok
 3221     push    eax
 3222     mov al,[operand_prefix]
 3223     stos    byte [edi]
 3224     pop eax
 3225       loop_counter_size_ok:
 3226     ret
 3227       loop_jump_64bit:
 3228     cmp [code_type],64
 3229     jne invalid_operand_size
 3230     call    get_address_qword_value
 3231     call    loop_counter_size
 3232     call    calculate_jump_offset
 3233     mov ecx,edx
 3234     cdq
 3235     cmp edx,ecx
 3236     jne jump_out_of_range
 3237     jmp make_loop_jump
 3238       loop_jump_16bit:
 3239     call    get_address_word_value
 3240     cmp [code_type],16
 3241     je  loop_jump_16bit_prefix_ok
 3242     mov byte [edi],66h
 3243     inc edi
 3244       loop_jump_16bit_prefix_ok:
 3245     call    loop_counter_size
 3246     call    calculate_jump_offset
 3247     cwde
 3248     cdq
 3249     jmp make_loop_jump
 3250 
 3251 movs_instruction:
 3252     lods    byte [esi]
 3253     call    get_size_operator
 3254     cmp al,'['
 3255     jne invalid_operand
 3256     call    get_address
 3257     or  eax,eax
 3258     jnz invalid_address
 3259     or  bl,ch
 3260     jnz invalid_address
 3261     cmp [segment_register],1
 3262     ja  invalid_address
 3263     push    ebx
 3264     lods    byte [esi]
 3265     cmp al,','
 3266     jne invalid_operand
 3267     lods    byte [esi]
 3268     call    get_size_operator
 3269     cmp al,'['
 3270     jne invalid_operand
 3271     call    get_address
 3272     pop edx
 3273     or  eax,eax
 3274     jnz invalid_address
 3275     or  bl,ch
 3276     jnz invalid_address
 3277     mov al,dh
 3278     mov ah,bh
 3279     shr al,4
 3280     shr ah,4
 3281     cmp al,ah
 3282     jne address_sizes_do_not_agree
 3283     and bh,111b
 3284     and dh,111b
 3285     cmp bh,6
 3286     jne invalid_address
 3287     cmp dh,7
 3288     jne invalid_address
 3289     cmp al,2
 3290     je  movs_address_16bit
 3291     cmp al,4
 3292     je  movs_address_32bit
 3293     cmp [code_type],64
 3294     jne invalid_address_size
 3295     jmp movs_store
 3296       movs_address_32bit:
 3297     call    address_32bit_prefix
 3298     jmp movs_store
 3299       movs_address_16bit:
 3300     cmp [code_type],64
 3301     je  invalid_address_size
 3302     call    address_16bit_prefix
 3303       movs_store:
 3304     xor ebx,ebx
 3305     call    store_segment_prefix_if_necessary
 3306     mov al,0A4h
 3307       movs_check_size:
 3308     mov bl,[operand_size]
 3309     cmp bl,1
 3310     je  simple_instruction
 3311     inc al
 3312     cmp bl,2
 3313     je  simple_instruction_16bit
 3314     cmp bl,4
 3315     je  simple_instruction_32bit
 3316     cmp bl,8
 3317     je  simple_instruction_64bit
 3318     or  bl,bl
 3319     jnz invalid_operand_size
 3320     call    recoverable_unknown_size
 3321     jmp simple_instruction
 3322 lods_instruction:
 3323     lods    byte [esi]
 3324     call    get_size_operator
 3325     cmp al,'['
 3326     jne invalid_operand
 3327     call    get_address
 3328     or  eax,eax
 3329     jnz invalid_address
 3330     or  bl,ch
 3331     jnz invalid_address
 3332     cmp bh,26h
 3333     je  lods_address_16bit
 3334     cmp bh,46h
 3335     je  lods_address_32bit
 3336     cmp bh,86h
 3337     jne invalid_address
 3338     cmp [code_type],64
 3339     jne invalid_address_size
 3340     jmp lods_store
 3341       lods_address_32bit:
 3342     call    address_32bit_prefix
 3343     jmp lods_store
 3344       lods_address_16bit:
 3345     cmp [code_type],64
 3346     je  invalid_address_size
 3347     call    address_16bit_prefix
 3348       lods_store:
 3349     xor ebx,ebx
 3350     call    store_segment_prefix_if_necessary
 3351     mov al,0ACh
 3352     jmp movs_check_size
 3353 stos_instruction:
 3354     mov [base_code],al
 3355     lods    byte [esi]
 3356     call    get_size_operator
 3357     cmp al,'['
 3358     jne invalid_operand
 3359     call    get_address
 3360     or  eax,eax
 3361     jnz invalid_address
 3362     or  bl,ch
 3363     jnz invalid_address
 3364     cmp bh,27h
 3365     je  stos_address_16bit
 3366     cmp bh,47h
 3367     je  stos_address_32bit
 3368     cmp bh,87h
 3369     jne invalid_address
 3370     cmp [code_type],64
 3371     jne invalid_address_size
 3372     jmp stos_store
 3373       stos_address_32bit:
 3374     call    address_32bit_prefix
 3375     jmp stos_store
 3376       stos_address_16bit:
 3377     cmp [code_type],64
 3378     je  invalid_address_size
 3379     call    address_16bit_prefix
 3380       stos_store:
 3381     cmp [segment_register],1
 3382     ja  invalid_address
 3383     mov al,[base_code]
 3384     jmp movs_check_size
 3385 cmps_instruction:
 3386     lods    byte [esi]
 3387     call    get_size_operator
 3388     cmp al,'['
 3389     jne invalid_operand
 3390     call    get_address
 3391     or  eax,eax
 3392     jnz invalid_address
 3393     or  bl,ch
 3394     jnz invalid_address
 3395     mov al,[segment_register]
 3396     push    eax ebx
 3397     lods    byte [esi]
 3398     cmp al,','
 3399     jne invalid_operand
 3400     lods    byte [esi]
 3401     call    get_size_operator
 3402     cmp al,'['
 3403     jne invalid_operand
 3404     call    get_address
 3405     or  eax,eax
 3406     jnz invalid_address
 3407     or  bl,ch
 3408     jnz invalid_address
 3409     pop edx eax
 3410     cmp [segment_register],1
 3411     ja  invalid_address
 3412     mov [segment_register],al
 3413     mov al,dh
 3414     mov ah,bh
 3415     shr al,4
 3416     shr ah,4
 3417     cmp al,ah
 3418     jne address_sizes_do_not_agree
 3419     and bh,111b
 3420     and dh,111b
 3421     cmp bh,7
 3422     jne invalid_address
 3423     cmp dh,6
 3424     jne invalid_address
 3425     cmp al,2
 3426     je  cmps_address_16bit
 3427     cmp al,4
 3428     je  cmps_address_32bit
 3429     cmp [code_type],64
 3430     jne invalid_address_size
 3431     jmp cmps_store
 3432       cmps_address_32bit:
 3433     call    address_32bit_prefix
 3434     jmp cmps_store
 3435       cmps_address_16bit:
 3436     cmp [code_type],64
 3437     je  invalid_address_size
 3438     call    address_16bit_prefix
 3439       cmps_store:
 3440     xor ebx,ebx
 3441     call    store_segment_prefix_if_necessary
 3442     mov al,0A6h
 3443     jmp movs_check_size
 3444 ins_instruction:
 3445     lods    byte [esi]
 3446     call    get_size_operator
 3447     cmp al,'['
 3448     jne invalid_operand
 3449     call    get_address
 3450     or  eax,eax
 3451     jnz invalid_address
 3452     or  bl,ch
 3453     jnz invalid_address
 3454     cmp bh,27h
 3455     je  ins_address_16bit
 3456     cmp bh,47h
 3457     je  ins_address_32bit
 3458     cmp bh,87h
 3459     jne invalid_address
 3460     cmp [code_type],64
 3461     jne invalid_address_size
 3462     jmp ins_store
 3463       ins_address_32bit:
 3464     call    address_32bit_prefix
 3465     jmp ins_store
 3466       ins_address_16bit:
 3467     cmp [code_type],64
 3468     je  invalid_address_size
 3469     call    address_16bit_prefix
 3470       ins_store:
 3471     cmp [segment_register],1
 3472     ja  invalid_address
 3473     lods    byte [esi]
 3474     cmp al,','
 3475     jne invalid_operand
 3476     lods    byte [esi]
 3477     cmp al,10h
 3478     jne invalid_operand
 3479     lods    byte [esi]
 3480     cmp al,22h
 3481     jne invalid_operand
 3482     mov al,6Ch
 3483       ins_check_size:
 3484     cmp [operand_size],8
 3485     jne movs_check_size
 3486     jmp invalid_operand_size
 3487 outs_instruction:
 3488     lods    byte [esi]
 3489     cmp al,10h
 3490     jne invalid_operand
 3491     lods    byte [esi]
 3492     cmp al,22h
 3493     jne invalid_operand
 3494     lods    byte [esi]
 3495     cmp al,','
 3496     jne invalid_operand
 3497     lods    byte [esi]
 3498     call    get_size_operator
 3499     cmp al,'['
 3500     jne invalid_operand
 3501     call    get_address
 3502     or  eax,eax
 3503     jnz invalid_address
 3504     or  bl,ch
 3505     jnz invalid_address
 3506     cmp bh,26h
 3507     je  outs_address_16bit
 3508     cmp bh,46h
 3509     je  outs_address_32bit
 3510     cmp bh,86h
 3511     jne invalid_address
 3512     cmp [code_type],64
 3513     jne invalid_address_size
 3514     jmp outs_store
 3515       outs_address_32bit:
 3516     call    address_32bit_prefix
 3517     jmp outs_store
 3518       outs_address_16bit:
 3519     cmp [code_type],64
 3520     je  invalid_address_size
 3521     call    address_16bit_prefix
 3522       outs_store:
 3523     xor ebx,ebx
 3524     call    store_segment_prefix_if_necessary
 3525     mov al,6Eh
 3526     jmp ins_check_size
 3527 xlat_instruction:
 3528     lods    byte [esi]
 3529     call    get_size_operator
 3530     cmp al,'['
 3531     jne invalid_operand
 3532     call    get_address
 3533     or  eax,eax
 3534     jnz invalid_address
 3535     or  bl,ch
 3536     jnz invalid_address
 3537     cmp bh,23h
 3538     je  xlat_address_16bit
 3539     cmp bh,43h
 3540     je  xlat_address_32bit
 3541     cmp bh,83h
 3542     jne invalid_address
 3543     cmp [code_type],64
 3544     jne invalid_address_size
 3545     jmp xlat_store
 3546       xlat_address_32bit:
 3547     call    address_32bit_prefix
 3548     jmp xlat_store
 3549       xlat_address_16bit:
 3550     cmp [code_type],64
 3551     je  invalid_address_size
 3552     call    address_16bit_prefix
 3553       xlat_store:
 3554     call    store_segment_prefix_if_necessary
 3555     mov al,0D7h
 3556     cmp [operand_size],1
 3557     jbe simple_instruction
 3558     jmp invalid_operand_size
 3559 
 3560 pm_word_instruction:
 3561     mov ah,al
 3562     shr ah,4
 3563     and al,111b
 3564     mov [base_code],0Fh
 3565     mov [extended_code],ah
 3566     mov [postbyte_register],al
 3567     lods    byte [esi]
 3568     call    get_size_operator
 3569     cmp al,10h
 3570     je  pm_reg
 3571       pm_mem:
 3572     cmp al,'['
 3573     jne invalid_operand
 3574     call    get_address
 3575     mov al,[operand_size]
 3576     cmp al,2
 3577     je  pm_mem_store
 3578     or  al,al
 3579     jnz invalid_operand_size
 3580       pm_mem_store:
 3581     jmp instruction_ready
 3582       pm_reg:
 3583     lods    byte [esi]
 3584     call    convert_register
 3585     mov bl,al
 3586     cmp ah,2
 3587     jne invalid_operand_size
 3588     jmp nomem_instruction_ready
 3589 pm_store_word_instruction:
 3590     mov ah,al
 3591     shr ah,4
 3592     and al,111b
 3593     mov [base_code],0Fh
 3594     mov [extended_code],ah
 3595     mov [postbyte_register],al
 3596     lods    byte [esi]
 3597     call    get_size_operator
 3598     cmp al,10h
 3599     jne pm_mem
 3600     lods    byte [esi]
 3601     call    convert_register
 3602     mov bl,al
 3603     mov al,ah
 3604     call    operand_autodetect
 3605     jmp nomem_instruction_ready
 3606 lgdt_instruction:
 3607     mov [base_code],0Fh
 3608     mov [extended_code],1
 3609     mov [postbyte_register],al
 3610     lods    byte [esi]
 3611     call    get_size_operator
 3612     cmp al,'['
 3613     jne invalid_operand
 3614     call    get_address
 3615     mov al,[operand_size]
 3616     cmp al,6
 3617     je  lgdt_mem_48bit
 3618     cmp al,10
 3619     je  lgdt_mem_80bit
 3620     or  al,al
 3621     jnz invalid_operand_size
 3622     jmp lgdt_mem_store
 3623       lgdt_mem_80bit:
 3624     cmp [code_type],64
 3625     jne illegal_instruction
 3626     jmp lgdt_mem_store
 3627       lgdt_mem_48bit:
 3628     cmp [code_type],64
 3629     je  illegal_instruction
 3630     cmp [postbyte_register],2
 3631     jb  lgdt_mem_store
 3632     call    operand_32bit
 3633       lgdt_mem_store:
 3634     jmp instruction_ready
 3635 lar_instruction:
 3636     mov [extended_code],al
 3637     mov [base_code],0Fh
 3638     call    take_register
 3639     mov [postbyte_register],al
 3640     lods    byte [esi]
 3641     cmp al,','
 3642     jne invalid_operand
 3643     xor al,al
 3644     xchg    al,[operand_size]
 3645     call    operand_autodetect
 3646     lods    byte [esi]
 3647     call    get_size_operator
 3648     cmp al,10h
 3649     je  lar_reg_reg
 3650     cmp al,'['
 3651     jne invalid_operand
 3652     call    get_address
 3653     mov al,[operand_size]
 3654     or  al,al
 3655     jz  lar_reg_mem
 3656     cmp al,2
 3657     jne invalid_operand_size
 3658       lar_reg_mem:
 3659     jmp instruction_ready
 3660       lar_reg_reg:
 3661     lods    byte [esi]
 3662     call    convert_register
 3663     cmp ah,2
 3664     jne invalid_operand_size
 3665     mov bl,al
 3666     jmp nomem_instruction_ready
 3667 invlpg_instruction:
 3668     mov [base_code],0Fh
 3669     mov [extended_code],1
 3670     mov [postbyte_register],7
 3671     lods    byte [esi]
 3672     call    get_size_operator
 3673     cmp al,'['
 3674     jne invalid_operand
 3675     call    get_address
 3676     jmp instruction_ready
 3677 simple_instruction_f2_0f_01:
 3678     mov byte [edi],0F2h
 3679     inc edi
 3680     jmp simple_instruction_0f_01
 3681 simple_instruction_f3_0f_01:
 3682     mov byte [edi],0F3h
 3683     inc edi
 3684     jmp simple_instruction_0f_01
 3685 swapgs_instruction:
 3686     cmp [code_type],64
 3687     jne illegal_instruction
 3688 simple_instruction_0f_01:
 3689     mov ah,al
 3690     mov al,0Fh
 3691     stos    byte [edi]
 3692     mov al,1
 3693     stos    word [edi]
 3694     jmp instruction_assembled
 3695 
 3696 basic_486_instruction:
 3697     mov [base_code],0Fh
 3698     mov [extended_code],al
 3699     lods    byte [esi]
 3700     call    get_size_operator
 3701     cmp al,10h
 3702     je  basic_486_reg
 3703     cmp al,'['
 3704     jne invalid_operand
 3705     call    get_address
 3706     push    edx ebx ecx
 3707     lods    byte [esi]
 3708     cmp al,','
 3709     jne invalid_operand
 3710     call    take_register
 3711     mov [postbyte_register],al
 3712     pop ecx ebx edx
 3713     mov al,ah
 3714     cmp al,1
 3715     je  basic_486_mem_reg_8bit
 3716     call    operand_autodetect
 3717     inc [extended_code]
 3718       basic_486_mem_reg_8bit:
 3719     jmp instruction_ready
 3720       basic_486_reg:
 3721     lods    byte [esi]
 3722     call    convert_register
 3723     mov [postbyte_register],al
 3724     lods    byte [esi]
 3725     cmp al,','
 3726     jne invalid_operand
 3727     call    take_register
 3728     mov bl,al
 3729     xchg    bl,[postbyte_register]
 3730     mov al,ah
 3731     cmp al,1
 3732     je  basic_486_reg_reg_8bit
 3733     call    operand_autodetect
 3734     inc [extended_code]
 3735       basic_486_reg_reg_8bit:
 3736     jmp nomem_instruction_ready
 3737 bswap_instruction:
 3738     call    take_register
 3739     test    al,1000b
 3740     jz  bswap_reg_code_ok
 3741     or  [rex_prefix],41h
 3742     and al,111b
 3743       bswap_reg_code_ok:
 3744     add al,0C8h
 3745     mov [extended_code],al
 3746     mov [base_code],0Fh
 3747     cmp ah,8
 3748     je  bswap_reg64
 3749     cmp ah,4
 3750     jne invalid_operand_size
 3751     call    operand_32bit
 3752     call    store_classic_instruction_code
 3753     jmp instruction_assembled
 3754       bswap_reg64:
 3755     call    operand_64bit
 3756     call    store_classic_instruction_code
 3757     jmp instruction_assembled
 3758 cmpxchgx_instruction:
 3759     mov [base_code],0Fh
 3760     mov [extended_code],0C7h
 3761     mov [postbyte_register],al
 3762     lods    byte [esi]
 3763     call    get_size_operator
 3764     cmp al,'['
 3765     jne invalid_operand
 3766     call    get_address
 3767     mov ah,1
 3768     xchg    [postbyte_register],ah
 3769     mov al,[operand_size]
 3770     or  al,al
 3771     jz  cmpxchgx_size_ok
 3772     cmp al,ah
 3773     jne invalid_operand_size
 3774       cmpxchgx_size_ok:
 3775     cmp ah,16
 3776     jne cmpxchgx_store
 3777     call    operand_64bit
 3778       cmpxchgx_store:
 3779     jmp instruction_ready
 3780 nop_instruction:
 3781     mov ah,[esi]
 3782     cmp ah,10h
 3783     je  extended_nop
 3784     cmp ah,11h
 3785     je  extended_nop
 3786     cmp ah,'['
 3787     je  extended_nop
 3788     stos    byte [edi]
 3789     jmp instruction_assembled
 3790       extended_nop:
 3791     mov [base_code],0Fh
 3792     mov [extended_code],1Fh
 3793     mov [postbyte_register],0
 3794     lods    byte [esi]
 3795     call    get_size_operator
 3796     cmp al,10h
 3797     je  extended_nop_reg
 3798     cmp al,'['
 3799     jne invalid_operand
 3800     call    get_address
 3801     mov al,[operand_size]
 3802     or  al,al
 3803     jz  extended_nop_store
 3804     call    operand_autodetect
 3805       extended_nop_store:
 3806     jmp instruction_ready
 3807       extended_nop_reg:
 3808     lods    byte [esi]
 3809     call    convert_register
 3810     mov bl,al
 3811     mov al,ah
 3812     call    operand_autodetect
 3813     jmp nomem_instruction_ready
 3814 
 3815 basic_fpu_instruction:
 3816     mov [postbyte_register],al
 3817     mov [base_code],0D8h
 3818     lods    byte [esi]
 3819     call    get_size_operator
 3820     cmp al,10h
 3821     je  basic_fpu_streg
 3822     cmp al,'['
 3823     je  basic_fpu_mem
 3824     dec esi
 3825     mov ah,[postbyte_register]
 3826     cmp ah,2
 3827     jb  invalid_operand
 3828     cmp ah,3
 3829     ja  invalid_operand
 3830     mov bl,1
 3831     jmp nomem_instruction_ready
 3832       basic_fpu_mem:
 3833     call    get_address
 3834     mov al,[operand_size]
 3835     cmp al,4
 3836     je  basic_fpu_mem_32bit
 3837     cmp al,8
 3838     je  basic_fpu_mem_64bit
 3839     or  al,al
 3840     jnz invalid_operand_size
 3841     call    recoverable_unknown_size
 3842       basic_fpu_mem_32bit:
 3843     jmp instruction_ready
 3844       basic_fpu_mem_64bit:
 3845     mov [base_code],0DCh
 3846     jmp instruction_ready
 3847       basic_fpu_streg:
 3848     lods    byte [esi]
 3849     call    convert_fpu_register
 3850     mov bl,al
 3851     mov ah,[postbyte_register]
 3852     cmp ah,2
 3853     je  basic_fpu_single_streg
 3854     cmp ah,3
 3855     je  basic_fpu_single_streg
 3856     or  al,al
 3857     jz  basic_fpu_st0
 3858     test    ah,110b
 3859     jz  basic_fpu_streg_st0
 3860     xor [postbyte_register],1
 3861       basic_fpu_streg_st0:
 3862     lods    byte [esi]
 3863     cmp al,','
 3864     jne invalid_operand
 3865     lods    byte [esi]
 3866     call    get_size_operator
 3867     cmp al,10h
 3868     jne invalid_operand
 3869     lods    byte [esi]
 3870     call    convert_fpu_register
 3871     or  al,al
 3872     jnz invalid_operand
 3873     mov [base_code],0DCh
 3874     jmp nomem_instruction_ready
 3875       basic_fpu_st0:
 3876     lods    byte [esi]
 3877     cmp al,','
 3878     jne invalid_operand
 3879     lods    byte [esi]
 3880     call    get_size_operator
 3881     cmp al,10h
 3882     jne invalid_operand
 3883     lods    byte [esi]
 3884     call    convert_fpu_register
 3885     mov bl,al
 3886       basic_fpu_single_streg:
 3887     mov [base_code],0D8h
 3888     jmp nomem_instruction_ready
 3889 simple_fpu_instruction:
 3890     mov ah,al
 3891     or  ah,11000000b
 3892     mov al,0D9h
 3893     stos    word [edi]
 3894     jmp instruction_assembled
 3895 fi_instruction:
 3896     mov [postbyte_register],al
 3897     lods    byte [esi]
 3898     call    get_size_operator
 3899     cmp al,'['
 3900     jne invalid_operand
 3901     call    get_address
 3902     mov al,[operand_size]
 3903     cmp al,2
 3904     je  fi_mem_16bit
 3905     cmp al,4
 3906     je  fi_mem_32bit
 3907     or  al,al
 3908     jnz invalid_operand_size
 3909     call    recoverable_unknown_size
 3910       fi_mem_32bit:
 3911     mov [base_code],0DAh
 3912     jmp instruction_ready
 3913       fi_mem_16bit:
 3914     mov [base_code],0DEh
 3915     jmp instruction_ready
 3916 fld_instruction:
 3917     mov [postbyte_register],al
 3918     lods    byte [esi]
 3919     call    get_size_operator
 3920     cmp al,10h
 3921     je  fld_streg
 3922     cmp al,'['
 3923     jne invalid_operand
 3924     call    get_address
 3925     mov al,[operand_size]
 3926     cmp al,4
 3927     je  fld_mem_32bit
 3928     cmp al,8
 3929     je  fld_mem_64bit
 3930     cmp al,10
 3931     je  fld_mem_80bit
 3932     or  al,al
 3933     jnz invalid_operand_size
 3934     call    recoverable_unknown_size
 3935       fld_mem_32bit:
 3936     mov [base_code],0D9h
 3937     jmp instruction_ready
 3938       fld_mem_64bit:
 3939     mov [base_code],0DDh
 3940     jmp instruction_ready
 3941       fld_mem_80bit:
 3942     mov al,[postbyte_register]
 3943     cmp al,0
 3944     je  fld_mem_80bit_store
 3945     dec [postbyte_register]
 3946     cmp al,3
 3947     je  fld_mem_80bit_store
 3948     jmp invalid_operand_size
 3949       fld_mem_80bit_store:
 3950     add [postbyte_register],5
 3951     mov [base_code],0DBh
 3952     jmp instruction_ready
 3953       fld_streg:
 3954     lods    byte [esi]
 3955     call    convert_fpu_register
 3956     mov bl,al
 3957     cmp [postbyte_register],2
 3958     jae fst_streg
 3959     mov [base_code],0D9h
 3960     jmp nomem_instruction_ready
 3961       fst_streg:
 3962     mov [base_code],0DDh
 3963     jmp nomem_instruction_ready
 3964 fild_instruction:
 3965     mov [postbyte_register],al
 3966     lods    byte [esi]
 3967     call    get_size_operator
 3968     cmp al,'['
 3969     jne invalid_operand
 3970     call    get_address
 3971     mov al,[operand_size]
 3972     cmp al,2
 3973     je  fild_mem_16bit
 3974     cmp al,4
 3975     je  fild_mem_32bit
 3976     cmp al,8
 3977     je  fild_mem_64bit
 3978     or  al,al
 3979     jnz invalid_operand_size
 3980     call    recoverable_unknown_size
 3981       fild_mem_32bit:
 3982     mov [base_code],0DBh
 3983     jmp instruction_ready
 3984       fild_mem_16bit:
 3985     mov [base_code],0DFh
 3986     jmp instruction_ready
 3987       fild_mem_64bit:
 3988     mov al,[postbyte_register]
 3989     cmp al,1
 3990     je  fisttp_64bit_store
 3991     jb  fild_mem_64bit_store
 3992     dec [postbyte_register]
 3993     cmp al,3
 3994     je  fild_mem_64bit_store
 3995     jmp invalid_operand_size
 3996       fild_mem_64bit_store:
 3997     add [postbyte_register],5
 3998     mov [base_code],0DFh
 3999     jmp instruction_ready
 4000       fisttp_64bit_store:
 4001     mov [base_code],0DDh
 4002     jmp instruction_ready
 4003 fbld_instruction:
 4004     mov [postbyte_register],al
 4005     lods    byte [esi]
 4006     call    get_size_operator
 4007     cmp al,'['
 4008     jne invalid_operand
 4009     call    get_address
 4010     mov al,[operand_size]
 4011     or  al,al
 4012     jz  fbld_mem_80bit
 4013     cmp al,10
 4014     je  fbld_mem_80bit
 4015     jmp invalid_operand_size
 4016       fbld_mem_80bit:
 4017     mov [base_code],0DFh
 4018     jmp instruction_ready
 4019 faddp_instruction:
 4020     mov [postbyte_register],al
 4021     mov [base_code],0DEh
 4022     mov edx,esi
 4023     lods    byte [esi]
 4024     call    get_size_operator
 4025     cmp al,10h
 4026     je  faddp_streg
 4027     mov esi,edx
 4028     mov bl,1
 4029     jmp nomem_instruction_ready
 4030       faddp_streg:
 4031     lods    byte [esi]
 4032     call    convert_fpu_register
 4033     mov bl,al
 4034     lods    byte [esi]
 4035     cmp al,','
 4036     jne invalid_operand
 4037     lods    byte [esi]
 4038     call    get_size_operator
 4039     cmp al,10h
 4040     jne invalid_operand
 4041     lods    byte [esi]
 4042     call    convert_fpu_register
 4043     or  al,al
 4044     jnz invalid_operand
 4045     jmp nomem_instruction_ready
 4046 fcompp_instruction:
 4047     mov ax,0D9DEh
 4048     stos    word [edi]
 4049     jmp instruction_assembled
 4050 fucompp_instruction:
 4051     mov ax,0E9DAh
 4052     stos    word [edi]
 4053     jmp instruction_assembled
 4054 fxch_instruction:
 4055     mov dx,01D9h
 4056     jmp fpu_single_operand
 4057 ffreep_instruction:
 4058     mov dx,00DFh
 4059     jmp fpu_single_operand
 4060 ffree_instruction:
 4061     mov dl,0DDh
 4062     mov dh,al
 4063       fpu_single_operand:
 4064     mov ebx,esi
 4065     lods    byte [esi]
 4066     call    get_size_operator
 4067     cmp al,10h
 4068     je  fpu_streg
 4069     or  dh,dh
 4070     jz  invalid_operand
 4071     mov esi,ebx
 4072     shl dh,3
 4073     or  dh,11000001b
 4074     mov ax,dx
 4075     stos    word [edi]
 4076     jmp instruction_assembled
 4077       fpu_streg:
 4078     lods    byte [esi]
 4079     call    convert_fpu_register
 4080     shl dh,3
 4081     or  dh,al
 4082     or  dh,11000000b
 4083     mov ax,dx
 4084     stos    word [edi]
 4085     jmp instruction_assembled
 4086 
 4087 fstenv_instruction:
 4088     mov byte [edi],9Bh
 4089     inc edi
 4090 fldenv_instruction:
 4091     mov [base_code],0D9h
 4092     jmp fpu_mem
 4093 fstenv_instruction_16bit:
 4094     mov byte [edi],9Bh
 4095     inc edi
 4096 fldenv_instruction_16bit:
 4097     call    operand_16bit
 4098     jmp fldenv_instruction
 4099 fstenv_instruction_32bit:
 4100     mov byte [edi],9Bh
 4101     inc edi
 4102 fldenv_instruction_32bit:
 4103     call    operand_32bit
 4104     jmp fldenv_instruction
 4105 fsave_instruction_32bit:
 4106     mov byte [edi],9Bh
 4107     inc edi
 4108 fnsave_instruction_32bit:
 4109     call    operand_32bit
 4110     jmp fnsave_instruction
 4111 fsave_instruction_16bit:
 4112     mov byte [edi],9Bh
 4113     inc edi
 4114 fnsave_instruction_16bit:
 4115     call    operand_16bit
 4116     jmp fnsave_instruction
 4117 fsave_instruction:
 4118     mov byte [edi],9Bh
 4119     inc edi
 4120 fnsave_instruction:
 4121     mov [base_code],0DDh
 4122       fpu_mem:
 4123     mov [postbyte_register],al
 4124     lods    byte [esi]
 4125     call    get_size_operator
 4126     cmp al,'['
 4127     jne invalid_operand
 4128     call    get_address
 4129     cmp [operand_size],0
 4130     jne invalid_operand_size
 4131     jmp instruction_ready
 4132 fstcw_instruction:
 4133     mov byte [edi],9Bh
 4134     inc edi
 4135 fldcw_instruction:
 4136     mov [postbyte_register],al
 4137     mov [base_code],0D9h
 4138     lods    byte [esi]
 4139     call    get_size_operator
 4140     cmp al,'['
 4141     jne invalid_operand
 4142     call    get_address
 4143     mov al,[operand_size]
 4144     or  al,al
 4145     jz  fldcw_mem_16bit
 4146     cmp al,2
 4147     je  fldcw_mem_16bit
 4148     jmp invalid_operand_size
 4149       fldcw_mem_16bit:
 4150     jmp instruction_ready
 4151 fstsw_instruction:
 4152     mov al,9Bh
 4153     stos    byte [edi]
 4154 fnstsw_instruction:
 4155     mov [base_code],0DDh
 4156     mov [postbyte_register],7
 4157     lods    byte [esi]
 4158     call    get_size_operator
 4159     cmp al,10h
 4160     je  fstsw_reg
 4161     cmp al,'['
 4162     jne invalid_operand
 4163     call    get_address
 4164     mov al,[operand_size]
 4165     or  al,al
 4166     jz  fstsw_mem_16bit
 4167     cmp al,2
 4168     je  fstsw_mem_16bit
 4169     jmp invalid_operand_size
 4170       fstsw_mem_16bit:
 4171     jmp instruction_ready
 4172       fstsw_reg:
 4173     lods    byte [esi]
 4174     call    convert_register
 4175     cmp ax,0200h
 4176     jne invalid_operand
 4177     mov ax,0E0DFh
 4178     stos    word [edi]
 4179     jmp instruction_assembled
 4180 finit_instruction:
 4181     mov byte [edi],9Bh
 4182     inc edi
 4183 fninit_instruction:
 4184     mov ah,al
 4185     mov al,0DBh
 4186     stos    word [edi]
 4187     jmp instruction_assembled
 4188 fcmov_instruction:
 4189     mov dh,0DAh
 4190     jmp fcomi_streg
 4191 fcomi_instruction:
 4192     mov dh,0DBh
 4193     jmp fcomi_streg
 4194 fcomip_instruction:
 4195     mov dh,0DFh
 4196       fcomi_streg:
 4197     mov dl,al
 4198     lods    byte [esi]
 4199     call    get_size_operator
 4200     cmp al,10h
 4201     jne invalid_operand
 4202     lods    byte [esi]
 4203     call    convert_fpu_register
 4204     mov ah,al
 4205     cmp byte [esi],','
 4206     je  fcomi_st0_streg
 4207     add ah,dl
 4208     mov al,dh
 4209     stos    word [edi]
 4210     jmp instruction_assembled
 4211       fcomi_st0_streg:
 4212     or  ah,ah
 4213     jnz invalid_operand
 4214     inc esi
 4215     lods    byte [esi]
 4216     call    get_size_operator
 4217     cmp al,10h
 4218     jne invalid_operand
 4219     lods    byte [esi]
 4220     call    convert_fpu_register
 4221     mov ah,al
 4222     add ah,dl
 4223     mov al,dh
 4224     stos    word [edi]
 4225     jmp instruction_assembled
 4226 
 4227 basic_mmx_instruction:
 4228     mov [base_code],0Fh
 4229     mov [extended_code],al
 4230       mmx_instruction:
 4231     lods    byte [esi]
 4232     call    get_size_operator
 4233     cmp al,10h
 4234     jne invalid_operand
 4235     lods    byte [esi]
 4236     call    convert_mmx_register
 4237     call    make_mmx_prefix
 4238     mov [postbyte_register],al
 4239     lods    byte [esi]
 4240     cmp al,','
 4241     jne invalid_operand
 4242     lods    byte [esi]
 4243     call    get_size_operator
 4244     cmp al,10h
 4245     je  mmx_mmreg_mmreg
 4246     cmp al,'['
 4247     jne invalid_operand
 4248       mmx_mmreg_mem:
 4249     call    get_address
 4250     jmp instruction_ready
 4251       mmx_mmreg_mmreg:
 4252     lods    byte [esi]
 4253     call    convert_mmx_register
 4254     mov bl,al
 4255     jmp nomem_instruction_ready
 4256 mmx_bit_shift_instruction:
 4257     mov [base_code],0Fh
 4258     mov [extended_code],al
 4259     lods    byte [esi]
 4260     call    get_size_operator
 4261     cmp al,10h
 4262     jne invalid_operand
 4263     lods    byte [esi]
 4264     call    convert_mmx_register
 4265     call    make_mmx_prefix
 4266     mov [postbyte_register],al
 4267     lods    byte [esi]
 4268     cmp al,','
 4269     jne invalid_operand
 4270     mov [operand_size],0
 4271     lods    byte [esi]
 4272     call    get_size_operator
 4273     cmp al,10h
 4274     je  mmx_mmreg_mmreg
 4275     cmp al,'('
 4276     je  mmx_ps_mmreg_imm8
 4277     cmp al,'['
 4278     je  mmx_mmreg_mem
 4279     jmp invalid_operand
 4280       mmx_ps_mmreg_imm8:
 4281     call    get_byte_value
 4282     mov byte [value],al
 4283     test    [operand_size],not 1
 4284     jnz invalid_value
 4285     mov bl,[extended_code]
 4286     mov al,bl
 4287     shr bl,4
 4288     and al,1111b
 4289     add al,70h
 4290     mov [extended_code],al
 4291     sub bl,0Ch
 4292     shl bl,1
 4293     xchg    bl,[postbyte_register]
 4294     call    store_nomem_instruction
 4295     mov al,byte [value]
 4296     stos    byte [edi]
 4297     jmp instruction_assembled
 4298 pmovmskb_instruction:
 4299     mov [base_code],0Fh
 4300     mov [extended_code],al
 4301     call    take_register
 4302     cmp ah,4
 4303     je  pmovmskb_reg_size_ok
 4304     cmp [code_type],64
 4305     jne invalid_operand_size
 4306     cmp ah,8
 4307     jnz invalid_operand_size
 4308       pmovmskb_reg_size_ok:
 4309     mov [postbyte_register],al
 4310     mov [operand_size],0
 4311     lods    byte [esi]
 4312     cmp al,','
 4313     jne invalid_operand
 4314     lods    byte [esi]
 4315     call    get_size_operator
 4316     cmp al,10h
 4317     jne invalid_operand
 4318     lods    byte [esi]
 4319     call    convert_mmx_register
 4320     mov bl,al
 4321     call    make_mmx_prefix
 4322     cmp [extended_code],0C5h
 4323     je  mmx_nomem_imm8
 4324     jmp nomem_instruction_ready
 4325       mmx_imm8:
 4326     push    ebx ecx edx
 4327     xor cl,cl
 4328     xchg    cl,[operand_size]
 4329     lods    byte [esi]
 4330     cmp al,','
 4331     jne invalid_operand
 4332     lods    byte [esi]
 4333     call    get_size_operator
 4334     test    ah,not 1
 4335     jnz invalid_operand_size
 4336     mov [operand_size],cl
 4337     cmp al,'('
 4338     jne invalid_operand
 4339     call    get_byte_value
 4340     mov byte [value],al
 4341     pop edx ecx ebx
 4342     call    store_instruction_with_imm8
 4343     jmp instruction_assembled
 4344       mmx_nomem_imm8:
 4345     call    store_nomem_instruction
 4346     call    append_imm8
 4347     jmp instruction_assembled
 4348       append_imm8:
 4349     mov [operand_size],0
 4350     lods    byte [esi]
 4351     cmp al,','
 4352     jne invalid_operand
 4353     lods    byte [esi]
 4354     call    get_size_operator
 4355     test    ah,not 1
 4356     jnz invalid_operand_size
 4357     cmp al,'('
 4358     jne invalid_operand
 4359     call    get_byte_value
 4360     stosb
 4361     ret
 4362 pinsrw_instruction:
 4363     mov [extended_code],al
 4364     mov [base_code],0Fh
 4365     lods    byte [esi]
 4366     call    get_size_operator
 4367     cmp al,10h
 4368     jne invalid_operand
 4369     lods    byte [esi]
 4370     call    convert_mmx_register
 4371     call    make_mmx_prefix
 4372     mov [postbyte_register],al
 4373     mov [operand_size],0
 4374     lods    byte [esi]
 4375     cmp al,','
 4376     jne invalid_operand
 4377     lods    byte [esi]
 4378     call    get_size_operator
 4379     cmp al,10h
 4380     je  pinsrw_mmreg_reg
 4381     cmp al,'['
 4382     jne invalid_operand
 4383     call    get_address
 4384     cmp [operand_size],0
 4385     je  mmx_imm8
 4386     cmp [operand_size],2
 4387     jne invalid_operand_size
 4388     jmp mmx_imm8
 4389       pinsrw_mmreg_reg:
 4390     lods    byte [esi]
 4391     call    convert_register
 4392     cmp ah,4
 4393     jne invalid_operand_size
 4394     mov bl,al
 4395     jmp mmx_nomem_imm8
 4396 pshufw_instruction:
 4397     mov [mmx_size],8
 4398     mov [opcode_prefix],al
 4399     jmp pshuf_instruction
 4400 pshufd_instruction:
 4401     mov [mmx_size],16
 4402     mov [opcode_prefix],al
 4403       pshuf_instruction:
 4404     mov [base_code],0Fh
 4405     mov [extended_code],70h
 4406     lods    byte [esi]
 4407     call    get_size_operator
 4408     cmp al,10h
 4409     jne invalid_operand
 4410     lods    byte [esi]
 4411     call    convert_mmx_register
 4412     cmp ah,[mmx_size]
 4413     jne invalid_operand_size
 4414     mov [postbyte_register],al
 4415     lods    byte [esi]
 4416     cmp al,','
 4417     jne invalid_operand
 4418     lods    byte [esi]
 4419     call    get_size_operator
 4420     cmp al,10h
 4421     je  pshuf_mmreg_mmreg
 4422     cmp al,'['
 4423     jne invalid_operand
 4424     call    get_address
 4425     jmp mmx_imm8
 4426       pshuf_mmreg_mmreg:
 4427     lods    byte [esi]
 4428     call    convert_mmx_register
 4429     mov bl,al
 4430     jmp mmx_nomem_imm8
 4431 movd_instruction:
 4432     mov [base_code],0Fh
 4433     mov [extended_code],7Eh
 4434     lods    byte [esi]
 4435     call    get_size_operator
 4436     cmp al,10h
 4437     je  movd_reg
 4438     cmp al,'['
 4439     jne invalid_operand
 4440     call    get_address
 4441     test    [operand_size],not 4
 4442     jnz invalid_operand_size
 4443     call    get_mmx_source_register
 4444     jmp instruction_ready
 4445       movd_reg:
 4446     lods    byte [esi]
 4447     cmp al,0B0h
 4448     jae movd_mmreg
 4449     call    convert_register
 4450     cmp ah,4
 4451     jne invalid_operand_size
 4452     mov bl,al
 4453     call    get_mmx_source_register
 4454     jmp nomem_instruction_ready
 4455       movd_mmreg:
 4456     mov [extended_code],6Eh
 4457     call    convert_mmx_register
 4458     mov [postbyte_register],al
 4459     call    make_mmx_prefix
 4460     mov [operand_size],0
 4461     lods    byte [esi]
 4462     cmp al,','
 4463     jne invalid_operand
 4464     lods    byte [esi]
 4465     call    get_size_operator
 4466     cmp al,10h
 4467     je  movd_mmreg_reg
 4468     cmp al,'['
 4469     jne invalid_operand
 4470     call    get_address
 4471     test    [operand_size],not 4
 4472     jnz invalid_operand_size
 4473     jmp instruction_ready
 4474       movd_mmreg_reg:
 4475     lods    byte [esi]
 4476     call    convert_register
 4477     cmp ah,4
 4478     jne invalid_operand_size
 4479     mov bl,al
 4480     jmp nomem_instruction_ready
 4481       get_mmx_source_register:
 4482     mov [operand_size],0
 4483     lods    byte [esi]
 4484     cmp al,','
 4485     jne invalid_operand
 4486     lods    byte [esi]
 4487     call    get_size_operator
 4488     cmp al,10h
 4489     jne invalid_operand
 4490     lods    byte [esi]
 4491     call    convert_mmx_register
 4492     mov [postbyte_register],al
 4493       make_mmx_prefix:
 4494     cmp [operand_size],16
 4495     jne no_mmx_prefix
 4496     mov [operand_prefix],66h
 4497       no_mmx_prefix:
 4498     ret
 4499 movq_instruction:
 4500     mov [base_code],0Fh
 4501     lods    byte [esi]
 4502     call    get_size_operator
 4503     cmp al,10h
 4504     je  movq_reg
 4505     cmp al,'['
 4506     jne invalid_operand
 4507     call    get_address
 4508     test    [operand_size],not 8
 4509     jnz invalid_operand_size
 4510     call    get_mmx_source_register
 4511     mov al,7Fh
 4512     cmp ah,8
 4513     je  movq_mem_ready
 4514     mov al,0D6h
 4515      movq_mem_ready:
 4516     mov [extended_code],al
 4517     jmp instruction_ready
 4518      movq_reg:
 4519     lods    byte [esi]
 4520     cmp al,0B0h
 4521     jae movq_mmreg
 4522     call    convert_register
 4523     cmp ah,8
 4524     jne invalid_operand_size
 4525     mov bl,al
 4526     mov [extended_code],7Eh
 4527     call    operand_64bit
 4528     call    get_mmx_source_register
 4529     jmp nomem_instruction_ready
 4530      movq_mmreg:
 4531     call    convert_mmx_register
 4532     mov [postbyte_register],al
 4533     mov [extended_code],6Fh
 4534     mov [mmx_size],ah
 4535     cmp ah,16
 4536     jne movq_mmreg_
 4537     mov [extended_code],7Eh
 4538     mov [opcode_prefix],0F3h
 4539       movq_mmreg_:
 4540     lods    byte [esi]
 4541     cmp al,','
 4542     jne invalid_operand
 4543     mov [operand_size],0
 4544     lods    byte [esi]
 4545     call    get_size_operator
 4546     cmp al,10h
 4547     je  movq_mmreg_reg
 4548     cmp al,'['
 4549     jne invalid_operand
 4550     call    get_address
 4551     test    [operand_size],not 8
 4552     jnz invalid_operand_size
 4553     jmp instruction_ready
 4554       movq_mmreg_reg:
 4555     lods    byte [esi]
 4556     cmp al,0B0h
 4557     jae movq_mmreg_mmreg
 4558     mov [operand_size],0
 4559     call    convert_register
 4560     cmp ah,8
 4561     jne invalid_operand_size
 4562     mov [extended_code],6Eh
 4563     mov [opcode_prefix],0
 4564     mov bl,al
 4565     cmp [mmx_size],16
 4566     jne movq_mmreg_reg_store
 4567     mov [opcode_prefix],66h
 4568       movq_mmreg_reg_store:
 4569     call    operand_64bit
 4570     jmp nomem_instruction_ready
 4571       movq_mmreg_mmreg:
 4572     call    convert_mmx_register
 4573     cmp ah,[mmx_size]
 4574     jne invalid_operand_size
 4575     mov bl,al
 4576     jmp nomem_instruction_ready
 4577 movdq_instruction:
 4578     mov [opcode_prefix],al
 4579     mov [base_code],0Fh
 4580     mov [extended_code],6Fh
 4581     lods    byte [esi]
 4582     call    get_size_operator
 4583     cmp al,10h
 4584     je  movdq_mmreg
 4585     cmp al,'['
 4586     jne invalid_operand
 4587     call    get_address
 4588     lods    byte [esi]
 4589     cmp al,','
 4590     jne invalid_operand
 4591     lods    byte [esi]
 4592     call    get_size_operator
 4593     cmp al,10h
 4594     jne invalid_operand
 4595     lods    byte [esi]
 4596     call    convert_xmm_register
 4597     mov [postbyte_register],al
 4598     mov [extended_code],7Fh
 4599     jmp instruction_ready
 4600       movdq_mmreg:
 4601     lods    byte [esi]
 4602     call    convert_xmm_register
 4603     mov [postbyte_register],al
 4604     lods    byte [esi]
 4605     cmp al,','
 4606     jne invalid_operand
 4607     lods    byte [esi]
 4608     call    get_size_operator
 4609     cmp al,10h
 4610     je  movdq_mmreg_mmreg
 4611     cmp al,'['
 4612     jne invalid_operand
 4613     call    get_address
 4614     jmp instruction_ready
 4615       movdq_mmreg_mmreg:
 4616     lods    byte [esi]
 4617     call    convert_xmm_register
 4618     mov bl,al
 4619     jmp nomem_instruction_ready
 4620 lddqu_instruction:
 4621     lods    byte [esi]
 4622     call    get_size_operator
 4623     cmp al,10h
 4624     jne invalid_operand
 4625     lods    byte [esi]
 4626     call    convert_xmm_register
 4627     push    eax
 4628     lods    byte [esi]
 4629     cmp al,','
 4630     jne invalid_operand
 4631     lods    byte [esi]
 4632     call    get_size_operator
 4633     cmp al,'['
 4634     jne invalid_operand
 4635     call    get_address
 4636     pop eax
 4637     mov [postbyte_register],al
 4638     mov [opcode_prefix],0F2h
 4639     mov [base_code],0Fh
 4640     mov [extended_code],0F0h
 4641     jmp instruction_ready
 4642 
 4643 movdq2q_instruction:
 4644     mov [opcode_prefix],0F2h
 4645     mov [mmx_size],8
 4646     jmp movq2dq_
 4647 movq2dq_instruction:
 4648     mov [opcode_prefix],0F3h
 4649     mov [mmx_size],16
 4650       movq2dq_:
 4651     lods    byte [esi]
 4652     call    get_size_operator
 4653     cmp al,10h
 4654     jne invalid_operand
 4655     lods    byte [esi]
 4656     call    convert_mmx_register
 4657     cmp ah,[mmx_size]
 4658     jne invalid_operand_size
 4659     mov [postbyte_register],al
 4660     mov [operand_size],0
 4661     lods    byte [esi]
 4662     cmp al,','
 4663     jne invalid_operand
 4664     lods    byte [esi]
 4665     call    get_size_operator
 4666     cmp al,10h
 4667     jne invalid_operand
 4668     lods    byte [esi]
 4669     call    convert_mmx_register
 4670     xor [mmx_size],8+16
 4671     cmp ah,[mmx_size]
 4672     jne invalid_operand_size
 4673     mov bl,al
 4674     mov [base_code],0Fh
 4675     mov [extended_code],0D6h
 4676     jmp nomem_instruction_ready
 4677 
 4678 sse_ps_instruction_imm8:
 4679     mov [immediate_size],1
 4680 sse_ps_instruction:
 4681     mov [mmx_size],16
 4682     jmp sse_instruction
 4683 sse_pd_instruction_imm8:
 4684     mov [immediate_size],1
 4685 sse_pd_instruction:
 4686     mov [mmx_size],16
 4687     mov [opcode_prefix],66h
 4688     jmp sse_instruction
 4689 sse_ss_instruction:
 4690     mov [mmx_size],4
 4691     mov [opcode_prefix],0F3h
 4692     jmp sse_instruction
 4693 sse_sd_instruction:
 4694     mov [mmx_size],8
 4695     mov [opcode_prefix],0F2h
 4696     jmp sse_instruction
 4697 cmp_pd_instruction:
 4698     mov [opcode_prefix],66h
 4699 cmp_ps_instruction:
 4700     mov [mmx_size],16
 4701     mov byte [value],al
 4702     mov al,0C2h
 4703     jmp sse_instruction
 4704 cmp_ss_instruction:
 4705     mov [mmx_size],4
 4706     mov [opcode_prefix],0F3h
 4707     jmp cmp_sx_instruction
 4708 cmpsd_instruction:
 4709     mov al,0A7h
 4710     mov ah,[esi]
 4711     or  ah,ah
 4712     jz  simple_instruction_32bit
 4713     cmp ah,0Fh
 4714     je  simple_instruction_32bit
 4715     mov al,-1
 4716 cmp_sd_instruction:
 4717     mov [mmx_size],8
 4718     mov [opcode_prefix],0F2h
 4719       cmp_sx_instruction:
 4720     mov byte [value],al
 4721     mov al,0C2h
 4722     jmp sse_instruction
 4723 comiss_instruction:
 4724     mov [mmx_size],4
 4725     jmp sse_instruction
 4726 comisd_instruction:
 4727     mov [mmx_size],8
 4728     mov [opcode_prefix],66h
 4729     jmp sse_instruction
 4730 cvtdq2pd_instruction:
 4731     mov [opcode_prefix],0F3h
 4732 cvtps2pd_instruction:
 4733     mov [mmx_size],8
 4734     jmp sse_instruction
 4735 cvtpd2dq_instruction:
 4736     mov [mmx_size],16
 4737     mov [opcode_prefix],0F2h
 4738     jmp sse_instruction
 4739 movshdup_instruction:
 4740     mov [mmx_size],16
 4741     mov [opcode_prefix],0F3h
 4742 sse_instruction:
 4743     mov [base_code],0Fh
 4744     mov [extended_code],al
 4745     lods    byte [esi]
 4746     call    get_size_operator
 4747     cmp al,10h
 4748     jne invalid_operand
 4749       sse_xmmreg:
 4750     lods    byte [esi]
 4751     call    convert_xmm_register
 4752       sse_reg:
 4753     mov [postbyte_register],al
 4754     mov [operand_size],0
 4755     lods    byte [esi]
 4756     cmp al,','
 4757     jne invalid_operand
 4758     lods    byte [esi]
 4759     call    get_size_operator
 4760     cmp al,10h
 4761     je  sse_xmmreg_xmmreg
 4762       sse_reg_mem:
 4763     cmp al,'['
 4764     jne invalid_operand
 4765     call    get_address
 4766     cmp [operand_size],0
 4767     je  sse_mem_size_ok
 4768     mov al,[mmx_size]
 4769     cmp [operand_size],al
 4770     jne invalid_operand_size
 4771       sse_mem_size_ok:
 4772     mov al,[extended_code]
 4773     mov ah,[supplemental_code]
 4774     cmp al,0C2h
 4775     je  sse_cmp_mem_ok
 4776     cmp ax,443Ah
 4777     je  sse_cmp_mem_ok
 4778     cmp [immediate_size],1
 4779     je  mmx_imm8
 4780     cmp [immediate_size],-1
 4781     jne sse_ok
 4782     call    take_additional_xmm0
 4783     mov [immediate_size],0
 4784       sse_ok:
 4785     jmp instruction_ready
 4786       sse_cmp_mem_ok:
 4787     cmp byte [value],-1
 4788     je  mmx_imm8
 4789     call    store_instruction_with_imm8
 4790     jmp instruction_assembled
 4791       sse_xmmreg_xmmreg:
 4792     cmp [operand_prefix],66h
 4793     jne sse_xmmreg_xmmreg_ok
 4794     cmp [extended_code],12h
 4795     je  invalid_operand
 4796     cmp [extended_code],16h
 4797     je  invalid_operand
 4798       sse_xmmreg_xmmreg_ok:
 4799     lods    byte [esi]
 4800     call    convert_xmm_register
 4801     mov bl,al
 4802     mov al,[extended_code]
 4803     mov ah,[supplemental_code]
 4804     cmp al,0C2h
 4805     je  sse_cmp_nomem_ok
 4806     cmp ax,443Ah
 4807     je  sse_cmp_nomem_ok
 4808     cmp [immediate_size],1
 4809     je  mmx_nomem_imm8
 4810     cmp [immediate_size],-1
 4811     jne sse_nomem_ok
 4812     call    take_additional_xmm0
 4813     mov [immediate_size],0
 4814       sse_nomem_ok:
 4815     jmp nomem_instruction_ready
 4816       sse_cmp_nomem_ok:
 4817     cmp byte [value],-1
 4818     je  mmx_nomem_imm8
 4819     call    store_nomem_instruction
 4820     mov al,byte [value]
 4821     stosb
 4822     jmp instruction_assembled
 4823       take_additional_xmm0:
 4824     cmp byte [esi],','
 4825     jne additional_xmm0_ok
 4826     inc esi
 4827     lods    byte [esi]
 4828     cmp al,10h
 4829     jne invalid_operand
 4830     lods    byte [esi]
 4831     call    convert_xmm_register
 4832     test    al,al
 4833     jnz invalid_operand
 4834       additional_xmm0_ok:
 4835     ret
 4836 
 4837 pslldq_instruction:
 4838     mov [postbyte_register],al
 4839     mov [opcode_prefix],66h
 4840     mov [base_code],0Fh
 4841     mov [extended_code],73h
 4842     lods    byte [esi]
 4843     call    get_size_operator
 4844     cmp al,10h
 4845     jne invalid_operand
 4846     lods    byte [esi]
 4847     call    convert_xmm_register
 4848     mov bl,al
 4849     jmp mmx_nomem_imm8
 4850 movpd_instruction:
 4851     mov [opcode_prefix],66h
 4852 movps_instruction:
 4853     mov [base_code],0Fh
 4854     mov [extended_code],al
 4855     mov [mmx_size],16
 4856     jmp sse_mov_instruction
 4857 movss_instruction:
 4858     mov [mmx_size],4
 4859     mov [opcode_prefix],0F3h
 4860     jmp sse_movs
 4861 movsd_instruction:
 4862     mov al,0A5h
 4863     mov ah,[esi]
 4864     or  ah,ah
 4865     jz  simple_instruction_32bit
 4866     cmp ah,0Fh
 4867     je  simple_instruction_32bit
 4868     mov [mmx_size],8
 4869     mov [opcode_prefix],0F2h
 4870       sse_movs:
 4871     mov [base_code],0Fh
 4872     mov [extended_code],10h
 4873     jmp sse_mov_instruction
 4874 sse_mov_instruction:
 4875     lods    byte [esi]
 4876     call    get_size_operator
 4877     cmp al,10h
 4878     je  sse_xmmreg
 4879       sse_mem:
 4880     cmp al,'['
 4881     jne invalid_operand
 4882     inc [extended_code]
 4883     call    get_address
 4884     cmp [operand_size],0
 4885     je  sse_mem_xmmreg
 4886     mov al,[mmx_size]
 4887     cmp [operand_size],al
 4888     jne invalid_operand_size
 4889     mov [operand_size],0
 4890       sse_mem_xmmreg:
 4891     lods    byte [esi]
 4892     cmp al,','
 4893     jne invalid_operand
 4894     lods    byte [esi]
 4895     call    get_size_operator
 4896     cmp al,10h
 4897     jne invalid_operand
 4898     lods    byte [esi]
 4899     call    convert_xmm_register
 4900     mov [postbyte_register],al
 4901     jmp instruction_ready
 4902 movlpd_instruction:
 4903     mov [opcode_prefix],66h
 4904 movlps_instruction:
 4905     mov [base_code],0Fh
 4906     mov [extended_code],al
 4907     mov [mmx_size],8
 4908     lods    byte [esi]
 4909     call    get_size_operator
 4910     cmp al,10h
 4911     jne sse_mem
 4912     lods    byte [esi]
 4913     call    convert_xmm_register
 4914     mov [postbyte_register],al
 4915     mov [operand_size],0
 4916     lods    byte [esi]
 4917     cmp al,','
 4918     jne invalid_operand
 4919     lods    byte [esi]
 4920     call    get_size_operator
 4921     jmp sse_reg_mem
 4922 movhlps_instruction:
 4923     mov [base_code],0Fh
 4924     mov [extended_code],al
 4925     mov [mmx_size],0
 4926     lods    byte [esi]
 4927     call    get_size_operator
 4928     cmp al,10h
 4929     jne invalid_operand
 4930     lods    byte [esi]
 4931     call    convert_xmm_register
 4932     mov [postbyte_register],al
 4933     lods    byte [esi]
 4934     cmp al,','
 4935     jne invalid_operand
 4936     lods    byte [esi]
 4937     call    get_size_operator
 4938     cmp al,10h
 4939     je  sse_xmmreg_xmmreg_ok
 4940     jmp invalid_operand
 4941 maskmovq_instruction:
 4942     mov cl,8
 4943     jmp maskmov_instruction
 4944 maskmovdqu_instruction:
 4945     mov cl,16
 4946     mov [opcode_prefix],66h
 4947       maskmov_instruction:
 4948     mov [base_code],0Fh
 4949     mov [extended_code],0F7h
 4950     lods    byte [esi]
 4951     call    get_size_operator
 4952     cmp al,10h
 4953     jne invalid_operand
 4954     lods    byte [esi]
 4955     call    convert_mmx_register
 4956     cmp ah,cl
 4957     jne invalid_operand_size
 4958     mov [postbyte_register],al
 4959     lods    byte [esi]
 4960     cmp al,','
 4961     jne invalid_operand
 4962     lods    byte [esi]
 4963     call    get_size_operator
 4964     cmp al,10h
 4965     jne invalid_operand
 4966     lods    byte [esi]
 4967     call    convert_mmx_register
 4968     mov bl,al
 4969     jmp nomem_instruction_ready
 4970 movmskpd_instruction:
 4971     mov [opcode_prefix],66h
 4972 movmskps_instruction:
 4973     mov [base_code],0Fh
 4974     mov [extended_code],50h
 4975     call    take_register
 4976     mov [postbyte_register],al
 4977     cmp ah,4
 4978     je  movmskps_reg_ok
 4979     cmp ah,8
 4980     jne invalid_operand_size
 4981     cmp [code_type],64
 4982     jne invalid_operand
 4983       movmskps_reg_ok:
 4984     mov [operand_size],0
 4985     lods    byte [esi]
 4986     cmp al,','
 4987     jne invalid_operand
 4988     lods    byte [esi]
 4989     call    get_size_operator
 4990     cmp al,10h
 4991     je  sse_xmmreg_xmmreg_ok
 4992     jmp invalid_operand
 4993 
 4994 cvtpi2pd_instruction:
 4995     mov [opcode_prefix],66h
 4996 cvtpi2ps_instruction:
 4997     mov [base_code],0Fh
 4998     mov [extended_code],al
 4999     lods    byte [esi]
 5000     call    get_size_operator
 5001     cmp al,10h
 5002     jne invalid_operand
 5003     lods    byte [esi]
 5004     call    convert_xmm_register
 5005     mov [postbyte_register],al
 5006     mov [operand_size],0
 5007     lods    byte [esi]
 5008     cmp al,','
 5009     jne invalid_operand
 5010     lods    byte [esi]
 5011     call    get_size_operator
 5012     cmp al,10h
 5013     je  cvtpi_xmmreg_xmmreg
 5014     cmp al,'['
 5015     jne invalid_operand
 5016     call    get_address
 5017     cmp [operand_size],0
 5018     je  cvtpi_size_ok
 5019     cmp [operand_size],8
 5020     jne invalid_operand_size
 5021       cvtpi_size_ok:
 5022     jmp instruction_ready
 5023       cvtpi_xmmreg_xmmreg:
 5024     lods    byte [esi]
 5025     call    convert_mmx_register
 5026     cmp ah,8
 5027     jne invalid_operand_size
 5028     mov bl,al
 5029     jmp nomem_instruction_ready
 5030 cvtsi2ss_instruction:
 5031     mov [opcode_prefix],0F3h
 5032     jmp cvtsi_instruction
 5033 cvtsi2sd_instruction:
 5034     mov [opcode_prefix],0F2h
 5035       cvtsi_instruction:
 5036     mov [base_code],0Fh
 5037     mov [extended_code],al
 5038     lods    byte [esi]
 5039     call    get_size_operator
 5040     cmp al,10h
 5041     jne invalid_operand
 5042     lods    byte [esi]
 5043     call    convert_xmm_register
 5044     mov [postbyte_register],al
 5045       cvtsi_xmmreg:
 5046     mov [operand_size],0
 5047     lods    byte [esi]
 5048     cmp al,','
 5049     jne invalid_operand
 5050     lods    byte [esi]
 5051     call    get_size_operator
 5052     cmp al,10h
 5053     je  cvtsi_xmmreg_reg
 5054     cmp al,'['
 5055     jne invalid_operand
 5056     call    get_address
 5057     cmp [operand_size],0
 5058     je  cvtsi_size_ok
 5059     cmp [operand_size],4
 5060     je  cvtsi_size_ok
 5061     cmp [operand_size],8
 5062     jne invalid_operand_size
 5063     call    operand_64bit
 5064       cvtsi_size_ok:
 5065     jmp instruction_ready
 5066       cvtsi_xmmreg_reg:
 5067     lods    byte [esi]
 5068     call    convert_register
 5069     cmp ah,4
 5070     je  cvtsi_xmmreg_reg_store
 5071     cmp ah,8
 5072     jne invalid_operand_size
 5073     call    operand_64bit
 5074       cvtsi_xmmreg_reg_store:
 5075     mov bl,al
 5076     jmp nomem_instruction_ready
 5077 cvtps2pi_instruction:
 5078     mov [mmx_size],8
 5079     jmp cvtpd_instruction
 5080 cvtpd2pi_instruction:
 5081     mov [opcode_prefix],66h
 5082     mov [mmx_size],16
 5083       cvtpd_instruction:
 5084     mov [base_code],0Fh
 5085     mov [extended_code],al
 5086     lods    byte [esi]
 5087     call    get_size_operator
 5088     cmp al,10h
 5089     jne invalid_operand
 5090     lods    byte [esi]
 5091     call    convert_mmx_register
 5092     cmp ah,8
 5093     jne invalid_operand_size
 5094     mov [operand_size],0
 5095     jmp sse_reg
 5096 cvtss2si_instruction:
 5097     mov [opcode_prefix],0F3h
 5098     mov [mmx_size],4
 5099     jmp cvt2si_instruction
 5100 cvtsd2si_instruction:
 5101     mov [opcode_prefix],0F2h
 5102     mov [mmx_size],8
 5103       cvt2si_instruction:
 5104     mov [extended_code],al
 5105     mov [base_code],0Fh
 5106     call    take_register
 5107     mov [operand_size],0
 5108     cmp ah,4
 5109     je  sse_reg
 5110     cmp ah,8
 5111     jne invalid_operand_size
 5112     call    operand_64bit
 5113     jmp sse_reg
 5114 
 5115 ssse3_instruction:
 5116     mov [base_code],0Fh
 5117     mov [extended_code],38h
 5118     mov [supplemental_code],al
 5119     jmp mmx_instruction
 5120 palignr_instruction:
 5121     mov [base_code],0Fh
 5122     mov [extended_code],3Ah
 5123     mov [supplemental_code],0Fh
 5124     lods    byte [esi]
 5125     call    get_size_operator
 5126     cmp al,10h
 5127     jne invalid_operand
 5128     lods    byte [esi]
 5129     call    convert_mmx_register
 5130     call    make_mmx_prefix
 5131     mov [postbyte_register],al
 5132     lods    byte [esi]
 5133     cmp al,','
 5134     jne invalid_operand
 5135     lods    byte [esi]
 5136     call    get_size_operator
 5137     cmp al,10h
 5138     je  palignr_mmreg_mmreg
 5139     cmp al,'['
 5140     jne invalid_operand
 5141     call    get_address
 5142     jmp mmx_imm8
 5143       palignr_mmreg_mmreg:
 5144     lods    byte [esi]
 5145     call    convert_mmx_register
 5146     mov bl,al
 5147     jmp mmx_nomem_imm8
 5148 amd3dnow_instruction:
 5149     mov [base_code],0Fh
 5150     mov [extended_code],0Fh
 5151     mov byte [value],al
 5152     lods    byte [esi]
 5153     call    get_size_operator
 5154     cmp al,10h
 5155     jne invalid_operand
 5156     lods    byte [esi]
 5157     call    convert_mmx_register
 5158     cmp ah,8
 5159     jne invalid_operand_size
 5160     mov [postbyte_register],al
 5161     lods    byte [esi]
 5162     cmp al,','
 5163     jne invalid_operand
 5164     lods    byte [esi]
 5165     call    get_size_operator
 5166     cmp al,10h
 5167     je  amd3dnow_mmreg_mmreg
 5168     cmp al,'['
 5169     jne invalid_operand
 5170     call    get_address
 5171     call    store_instruction_with_imm8
 5172     jmp instruction_assembled
 5173       amd3dnow_mmreg_mmreg:
 5174     lods    byte [esi]
 5175     call    convert_mmx_register
 5176     cmp ah,8
 5177     jne invalid_operand_size
 5178     mov bl,al
 5179     call    store_nomem_instruction
 5180     mov al,byte [value]
 5181     stos    byte [edi]
 5182     jmp instruction_assembled
 5183 
 5184 sse4_instruction_38_xmm0:
 5185     mov [immediate_size],-1
 5186     jmp sse4_instruction_38
 5187 sse4_instruction_66_38_xmm0:
 5188     mov [immediate_size],-1
 5189 sse4_instruction_66_38:
 5190     mov [opcode_prefix],66h
 5191 sse4_instruction_38:
 5192     mov [mmx_size],16
 5193     mov [supplemental_code],al
 5194     mov al,38h
 5195     jmp sse_instruction
 5196 sse4_ss_instruction_66_3a_imm8:
 5197     mov [immediate_size],1
 5198     mov cl,4
 5199     jmp sse4_instruction_66_3a_setup
 5200 sse4_sd_instruction_66_3a_imm8:
 5201     mov [immediate_size],1
 5202     mov cl,8
 5203     jmp sse4_instruction_66_3a_setup
 5204 sse4_instruction_66_3a_imm8:
 5205     mov [immediate_size],1
 5206     mov cl,16
 5207       sse4_instruction_66_3a_setup:
 5208     mov [opcode_prefix],66h
 5209       sse4_instruction_3a_setup:
 5210     mov [supplemental_code],al
 5211     mov al,3Ah
 5212     mov [mmx_size],cl
 5213     jmp sse_instruction
 5214 sse4_instruction_3a_imm8:
 5215     mov [immediate_size],1
 5216     mov cl,16
 5217     jmp sse4_instruction_3a_setup
 5218 pclmulqdq_instruction:
 5219     mov byte [value],al
 5220     mov al,44h
 5221     mov cl,16
 5222     jmp sse4_instruction_66_3a_setup
 5223 extractps_instruction:
 5224     call    setup_66_0f_3a
 5225     lods    byte [esi]
 5226     call    get_size_operator
 5227     cmp al,10h
 5228     je  extractps_reg
 5229     cmp al,'['
 5230     jne invalid_operand
 5231     call    get_address
 5232     cmp [operand_size],4
 5233     je  extractps_size_ok
 5234     cmp [operand_size],0
 5235     jne invalid_operand_size
 5236       extractps_size_ok:
 5237     push    edx ebx ecx
 5238     mov [operand_size],0
 5239     lods    byte [esi]
 5240     cmp al,','
 5241     jne invalid_operand
 5242     lods    byte [esi]
 5243     call    get_size_operator
 5244     cmp al,10h
 5245     jne invalid_operand
 5246     lods    byte [esi]
 5247     call    convert_xmm_register
 5248     mov [postbyte_register],al
 5249     pop ecx ebx edx
 5250     jmp mmx_imm8
 5251       extractps_reg:
 5252     lods    byte [esi]
 5253     call    convert_register
 5254     push    eax
 5255     mov [operand_size],0
 5256     lods    byte [esi]
 5257     cmp al,','
 5258     jne invalid_operand
 5259     lods    byte [esi]
 5260     call    get_size_operator
 5261     cmp al,10h
 5262     jne invalid_operand
 5263     lods    byte [esi]
 5264     call    convert_xmm_register
 5265     mov [postbyte_register],al
 5266     pop ebx
 5267     mov al,bh
 5268     cmp al,4
 5269     je  mmx_nomem_imm8
 5270     cmp al,8
 5271     jne invalid_operand_size
 5272     cmp [code_type],64
 5273     jne illegal_instruction
 5274     jmp mmx_nomem_imm8
 5275       setup_66_0f_3a:
 5276     mov [extended_code],3Ah
 5277     mov [supplemental_code],al
 5278     mov [base_code],0Fh
 5279     mov [opcode_prefix],66h
 5280     ret
 5281 insertps_instruction:
 5282     call    setup_66_0f_3a
 5283     lods    byte [esi]
 5284     call    get_size_operator
 5285     cmp al,10h
 5286     jne invalid_operand
 5287     lods    byte [esi]
 5288     call    convert_xmm_register
 5289     mov [postbyte_register],al
 5290     mov [operand_size],0
 5291     lods    byte [esi]
 5292     cmp al,','
 5293     jne invalid_operand
 5294     lods    byte [esi]
 5295     call    get_size_operator
 5296     cmp al,10h
 5297     je  insertps_xmmreg_reg
 5298     cmp al,'['
 5299     jne invalid_operand
 5300     call    get_address
 5301     cmp [operand_size],4
 5302     je  insertps_size_ok
 5303     cmp [operand_size],0
 5304     jne invalid_operand_size
 5305       insertps_size_ok:
 5306     jmp mmx_imm8
 5307       insertps_xmmreg_reg:
 5308     lods    byte [esi]
 5309     call    convert_mmx_register
 5310     mov bl,al
 5311     jmp mmx_nomem_imm8
 5312 pextrq_instruction:
 5313     mov [mmx_size],8
 5314     jmp pextr_instruction
 5315 pextrd_instruction:
 5316     mov [mmx_size],4
 5317     jmp pextr_instruction
 5318 pextrw_instruction:
 5319     mov [mmx_size],2
 5320     jmp pextr_instruction
 5321 pextrb_instruction:
 5322     mov [mmx_size],1
 5323       pextr_instruction:
 5324     call    setup_66_0f_3a
 5325     lods    byte [esi]
 5326     call    get_size_operator
 5327     cmp al,10h
 5328     je  pextr_reg
 5329     cmp al,'['
 5330     jne invalid_operand
 5331     call    get_address
 5332     mov al,[mmx_size]
 5333     cmp al,[operand_size]
 5334     je  pextr_size_ok
 5335     cmp [operand_size],0
 5336     jne invalid_operand_size
 5337       pextr_size_ok:
 5338     cmp al,8
 5339     jne pextr_prefix_ok
 5340     call    operand_64bit
 5341       pextr_prefix_ok:
 5342     push    edx ebx ecx
 5343     mov [operand_size],0
 5344     lods    byte [esi]
 5345     cmp al,','
 5346     jne invalid_operand
 5347     lods    byte [esi]
 5348     call    get_size_operator
 5349     cmp al,10h
 5350     jne invalid_operand
 5351     lods    byte [esi]
 5352     call    convert_xmm_register
 5353     mov [postbyte_register],al
 5354     pop ecx ebx edx
 5355     jmp mmx_imm8
 5356       pextr_reg:
 5357     lods    byte [esi]
 5358     call    convert_register
 5359     cmp [mmx_size],4
 5360     ja  pextrq_reg
 5361     cmp ah,4
 5362     je  pextr_reg_size_ok
 5363     cmp [code_type],64
 5364     jne pextr_invalid_size
 5365     cmp ah,8
 5366     je  pextr_reg_size_ok
 5367       pextr_invalid_size:
 5368     jmp invalid_operand_size
 5369       pextrq_reg:
 5370     cmp ah,8
 5371     jne pextr_invalid_size
 5372     call    operand_64bit
 5373       pextr_reg_size_ok:
 5374     mov [operand_size],0
 5375     push    eax
 5376     lods    byte [esi]
 5377     cmp al,','
 5378     jne invalid_operand
 5379     lods    byte [esi]
 5380     call    get_size_operator
 5381     cmp al,10h
 5382     jne invalid_operand
 5383     lods    byte [esi]
 5384     call    convert_mmx_register
 5385     mov ebx,eax
 5386     pop eax
 5387     mov [postbyte_register],al
 5388     mov al,ah
 5389     cmp [mmx_size],2
 5390     jne pextr_reg_store
 5391     mov [opcode_prefix],0
 5392     mov [extended_code],0C5h
 5393     call    make_mmx_prefix
 5394     jmp mmx_nomem_imm8
 5395       pextr_reg_store:
 5396     cmp bh,16
 5397     jne invalid_operand_size
 5398     xchg    bl,[postbyte_register]
 5399     jmp mmx_nomem_imm8
 5400 pinsrb_instruction:
 5401     mov [mmx_size],1
 5402     jmp pinsr_instruction
 5403 pinsrd_instruction:
 5404     mov [mmx_size],4
 5405     jmp pinsr_instruction
 5406 pinsrq_instruction:
 5407     mov [mmx_size],8
 5408     call    operand_64bit
 5409       pinsr_instruction:
 5410     call    setup_66_0f_3a
 5411     lods    byte [esi]
 5412     call    get_size_operator
 5413     cmp al,10h
 5414     jne invalid_operand
 5415     lods    byte [esi]
 5416     call    convert_xmm_register
 5417     mov [postbyte_register],al
 5418       pinsr_xmmreg:
 5419     mov [operand_size],0
 5420     lods    byte [esi]
 5421     cmp al,','
 5422     jne invalid_operand
 5423     lods    byte [esi]
 5424     call    get_size_operator
 5425     cmp al,10h
 5426     je  pinsr_xmmreg_reg
 5427     cmp al,'['
 5428     jne invalid_operand
 5429     call    get_address
 5430     cmp [operand_size],0
 5431     je  mmx_imm8
 5432     mov al,[mmx_size]
 5433     cmp al,[operand_size]
 5434     je  mmx_imm8
 5435     jmp invalid_operand_size
 5436       pinsr_xmmreg_reg:
 5437     lods    byte [esi]
 5438     call    convert_register
 5439     mov bl,al
 5440     cmp [mmx_size],8
 5441     je  pinsrq_xmmreg_reg
 5442     cmp ah,4
 5443     je  mmx_nomem_imm8
 5444     jmp invalid_operand_size
 5445       pinsrq_xmmreg_reg:
 5446     cmp ah,8
 5447     je  mmx_nomem_imm8
 5448     jmp invalid_operand_size
 5449 pmovsxbw_instruction:
 5450     mov [mmx_size],8
 5451     jmp pmovsx_instruction
 5452 pmovsxbd_instruction:
 5453     mov [mmx_size],4
 5454     jmp pmovsx_instruction
 5455 pmovsxbq_instruction:
 5456     mov [mmx_size],2
 5457     jmp pmovsx_instruction
 5458 pmovsxwd_instruction:
 5459     mov [mmx_size],8
 5460     jmp pmovsx_instruction
 5461 pmovsxwq_instruction:
 5462     mov [mmx_size],4
 5463     jmp pmovsx_instruction
 5464 pmovsxdq_instruction:
 5465     mov [mmx_size],8
 5466       pmovsx_instruction:
 5467     call    setup_66_0f_38
 5468     lods    byte [esi]
 5469     call    get_size_operator
 5470     cmp al,10h
 5471     jne invalid_operand
 5472     lods    byte [esi]
 5473     call    convert_xmm_register
 5474     mov [postbyte_register],al
 5475     lods    byte [esi]
 5476     cmp al,','
 5477     jne invalid_operand
 5478     mov [operand_size],0
 5479     lods    byte [esi]
 5480     call    get_size_operator
 5481     cmp al,10h
 5482     je  pmovsx_xmmreg_reg
 5483     cmp al,'['
 5484     jne invalid_operand
 5485     call    get_address
 5486     cmp [operand_size],0
 5487     je  instruction_ready
 5488     mov al,[mmx_size]
 5489     cmp al,[operand_size]
 5490     jne invalid_operand_size
 5491     jmp instruction_ready
 5492       pmovsx_xmmreg_reg:
 5493     lods    byte [esi]
 5494     call    convert_xmm_register
 5495     mov bl,al
 5496     jmp nomem_instruction_ready
 5497       setup_66_0f_38:
 5498     mov [extended_code],38h
 5499     mov [supplemental_code],al
 5500     mov [base_code],0Fh
 5501     mov [opcode_prefix],66h
 5502     ret
 5503 
 5504 xsaves_instruction_64bit:
 5505     call    operand_64bit
 5506 xsaves_instruction:
 5507     mov ah,0C7h
 5508     jmp xsave_common
 5509 fxsave_instruction_64bit:
 5510     call    operand_64bit
 5511 fxsave_instruction:
 5512     mov ah,0AEh
 5513     xor cl,cl
 5514       xsave_common:
 5515     mov [base_code],0Fh
 5516     mov [extended_code],ah
 5517     mov [postbyte_register],al
 5518     mov [mmx_size],cl
 5519     lods    byte [esi]
 5520     call    get_size_operator
 5521     cmp al,'['
 5522     jne invalid_operand
 5523     call    get_address
 5524     mov ah,[operand_size]
 5525     or  ah,ah
 5526     jz  xsave_size_ok
 5527     cmp ah,[mmx_size]
 5528     jne invalid_operand_size
 5529       xsave_size_ok:
 5530     jmp instruction_ready
 5531 clflush_instruction:
 5532     mov ah,0AEh
 5533     mov cl,1
 5534     jmp xsave_common
 5535 cldemote_instruction:
 5536     mov ah,1Ch
 5537     mov cl,1
 5538     jmp xsave_common
 5539 stmxcsr_instruction:
 5540     mov ah,0AEh
 5541     mov cl,4
 5542     jmp xsave_common
 5543 prefetch_instruction:
 5544     mov [extended_code],18h
 5545       prefetch_mem_8bit:
 5546     mov [base_code],0Fh
 5547     mov [postbyte_register],al
 5548     lods    byte [esi]
 5549     call    get_size_operator
 5550     cmp al,'['
 5551     jne invalid_operand
 5552     or  ah,ah
 5553     jz  prefetch_size_ok
 5554     cmp ah,1
 5555     jne invalid_operand_size
 5556       prefetch_size_ok:
 5557     call    get_address
 5558     jmp instruction_ready
 5559 amd_prefetch_instruction:
 5560     mov [extended_code],0Dh
 5561     jmp prefetch_mem_8bit
 5562 clflushopt_instruction:
 5563     mov [extended_code],0AEh
 5564     mov [opcode_prefix],66h
 5565     jmp prefetch_mem_8bit
 5566 pcommit_instruction:
 5567     mov byte [edi],66h
 5568     inc edi
 5569 fence_instruction:
 5570     mov bl,al
 5571     mov ax,0AE0Fh
 5572     stos    word [edi]
 5573     mov al,bl
 5574     stos    byte [edi]
 5575     jmp instruction_assembled
 5576 pause_instruction:
 5577     mov ax,90F3h
 5578     stos    word [edi]
 5579     jmp instruction_assembled
 5580 movntq_instruction:
 5581     mov [mmx_size],8
 5582     jmp movnt_instruction
 5583 movntpd_instruction:
 5584     mov [opcode_prefix],66h
 5585 movntps_instruction:
 5586     mov [mmx_size],16
 5587       movnt_instruction:
 5588     mov [extended_code],al
 5589     mov [base_code],0Fh
 5590     lods    byte [esi]
 5591     call    get_size_operator
 5592     cmp al,'['
 5593     jne invalid_operand
 5594     call    get_address
 5595     lods    byte [esi]
 5596     cmp al,','
 5597     jne invalid_operand
 5598     lods    byte [esi]
 5599     call    get_size_operator
 5600     cmp al,10h
 5601     jne invalid_operand
 5602     lods    byte [esi]
 5603     call    convert_mmx_register
 5604     cmp ah,[mmx_size]
 5605     jne invalid_operand_size
 5606     mov [postbyte_register],al
 5607     jmp instruction_ready
 5608 
 5609 movntsd_instruction:
 5610     mov [opcode_prefix],0F2h
 5611     mov [mmx_size],8
 5612     jmp movnts_instruction
 5613 movntss_instruction:
 5614     mov [opcode_prefix],0F3h
 5615     mov [mmx_size],4
 5616       movnts_instruction:
 5617     mov [extended_code],al
 5618     mov [base_code],0Fh
 5619     lods    byte [esi]
 5620     call    get_size_operator
 5621     cmp al,'['
 5622     jne invalid_operand
 5623     call    get_address
 5624     mov al,[operand_size]
 5625     cmp al,[mmx_size]
 5626     je  movnts_size_ok
 5627     test    al,al
 5628     jnz invalid_operand_size
 5629       movnts_size_ok:
 5630     lods    byte [esi]
 5631     cmp al,','
 5632     jne invalid_operand
 5633     mov [operand_size],0
 5634     lods    byte [esi]
 5635     call    get_size_operator
 5636     cmp al,10h
 5637     jne invalid_operand
 5638     lods    byte [esi]
 5639     call    convert_xmm_register
 5640     mov [postbyte_register],al
 5641     jmp instruction_ready
 5642 
 5643 movdiri_instruction:
 5644     mov [supplemental_code],al
 5645     mov al,38h
 5646 movnti_instruction:
 5647     mov [base_code],0Fh
 5648     mov [extended_code],al
 5649     lods    byte [esi]
 5650     call    get_size_operator
 5651     cmp al,'['
 5652     jne invalid_operand
 5653     call    get_address
 5654     lods    byte [esi]
 5655     cmp al,','
 5656     jne invalid_operand
 5657     call    take_register
 5658     cmp ah,4
 5659     je  movnti_store
 5660     cmp ah,8
 5661     jne invalid_operand_size
 5662     call    operand_64bit
 5663       movnti_store:
 5664     mov [postbyte_register],al
 5665     jmp instruction_ready
 5666 monitor_instruction:
 5667     mov [postbyte_register],al
 5668     cmp byte [esi],0
 5669     je  monitor_instruction_store
 5670     cmp byte [esi],0Fh
 5671     je  monitor_instruction_store
 5672     call    take_register
 5673     cmp ax,0400h
 5674     jne invalid_operand
 5675     lods    byte [esi]
 5676     cmp al,','
 5677     jne invalid_operand
 5678     call    take_register
 5679     cmp ax,0401h
 5680     jne invalid_operand
 5681     cmp [postbyte_register],0C8h
 5682     jne monitor_instruction_store
 5683     lods    byte [esi]
 5684     cmp al,','
 5685     jne invalid_operand
 5686     call    take_register
 5687     cmp ax,0402h
 5688     jne invalid_operand
 5689       monitor_instruction_store:
 5690     mov ax,010Fh
 5691     stos    word [edi]
 5692     mov al,[postbyte_register]
 5693     stos    byte [edi]
 5694     jmp instruction_assembled
 5695 pconfig_instruction:
 5696     mov [postbyte_register],al
 5697     jmp monitor_instruction_store
 5698 movntdqa_instruction:
 5699     call    setup_66_0f_38
 5700     lods    byte [esi]
 5701     call    get_size_operator
 5702     cmp al,10h
 5703     jne invalid_operand
 5704     lods    byte [esi]
 5705     call    convert_xmm_register
 5706     mov [postbyte_register],al
 5707     lods    byte [esi]
 5708     cmp al,','
 5709     jne invalid_operand
 5710     lods    byte [esi]
 5711     call    get_size_operator
 5712     cmp al,'['
 5713     jne invalid_operand
 5714     call    get_address
 5715     jmp instruction_ready
 5716 
 5717 extrq_instruction:
 5718     mov [opcode_prefix],66h
 5719     mov [base_code],0Fh
 5720     mov [extended_code],78h
 5721     lods    byte [esi]
 5722     call    get_size_operator
 5723     cmp al,10h
 5724     jne invalid_operand
 5725     lods    byte [esi]
 5726     call    convert_xmm_register
 5727     mov [postbyte_register],al
 5728     mov [operand_size],0
 5729     lods    byte [esi]
 5730     cmp al,','
 5731     jne invalid_operand
 5732     lods    byte [esi]
 5733     call    get_size_operator
 5734     cmp al,10h
 5735     je  extrq_xmmreg_xmmreg
 5736     test    ah,not 1
 5737     jnz invalid_operand_size
 5738     cmp al,'('
 5739     jne invalid_operand
 5740     xor bl,bl
 5741     xchg    bl,[postbyte_register]
 5742     call    store_nomem_instruction
 5743     call    get_byte_value
 5744     stosb
 5745     call    append_imm8
 5746     jmp instruction_assembled
 5747       extrq_xmmreg_xmmreg:
 5748     inc [extended_code]
 5749     lods    byte [esi]
 5750     call    convert_xmm_register
 5751     mov bl,al
 5752     jmp nomem_instruction_ready
 5753 insertq_instruction:
 5754     mov [opcode_prefix],0F2h
 5755     mov [base_code],0Fh
 5756     mov [extended_code],78h
 5757     lods    byte [esi]
 5758     call    get_size_operator
 5759     cmp al,10h
 5760     jne invalid_operand
 5761     lods    byte [esi]
 5762     call    convert_xmm_register
 5763     mov [postbyte_register],al
 5764     mov [operand_size],0
 5765     lods    byte [esi]
 5766     cmp al,','
 5767     jne invalid_operand
 5768     lods    byte [esi]
 5769     call    get_size_operator
 5770     cmp al,10h
 5771     jne invalid_operand
 5772     lods    byte [esi]
 5773     call    convert_xmm_register
 5774     mov bl,al
 5775     cmp byte [esi],','
 5776     je  insertq_with_imm
 5777     inc [extended_code]
 5778     jmp nomem_instruction_ready
 5779       insertq_with_imm:
 5780     call    store_nomem_instruction
 5781     call    append_imm8
 5782     call    append_imm8
 5783     jmp instruction_assembled
 5784 
 5785 crc32_instruction:
 5786     mov [opcode_prefix],0F2h
 5787     mov [base_code],0Fh
 5788     mov [extended_code],38h
 5789     mov [supplemental_code],0F0h
 5790     call    take_register
 5791     mov [postbyte_register],al
 5792     cmp ah,4
 5793     je  crc32_reg_size_ok
 5794     cmp ah,8
 5795     jne invalid_operand
 5796     cmp [code_type],64
 5797     jne illegal_instruction
 5798       crc32_reg_size_ok:
 5799     lods    byte [esi]
 5800     cmp al,','
 5801     jne invalid_operand
 5802     mov [operand_size],0
 5803     lods    byte [esi]
 5804     call    get_size_operator
 5805     cmp al,10h
 5806     je  crc32_reg_reg
 5807     cmp al,'['
 5808     jne invalid_operand
 5809     call    get_address
 5810     mov al,[operand_size]
 5811     test    al,al
 5812     jz  crc32_unknown_size
 5813     cmp al,1
 5814     je  crc32_reg_mem_store
 5815     inc [supplemental_code]
 5816     call    operand_autodetect
 5817       crc32_reg_mem_store:
 5818     jmp instruction_ready
 5819       crc32_unknown_size:
 5820     call    recoverable_unknown_size
 5821     jmp crc32_reg_mem_store
 5822       crc32_reg_reg:
 5823     lods    byte [esi]
 5824     call    convert_register
 5825     mov bl,al
 5826     mov al,ah
 5827     cmp al,1
 5828     je  crc32_reg_reg_store
 5829     inc [supplemental_code]
 5830     call    operand_autodetect
 5831       crc32_reg_reg_store:
 5832     jmp nomem_instruction_ready
 5833 popcnt_instruction:
 5834     mov [opcode_prefix],0F3h
 5835     jmp bs_instruction
 5836 movbe_instruction:
 5837     mov [supplemental_code],al
 5838     mov [extended_code],38h
 5839     mov [base_code],0Fh
 5840     lods    byte [esi]
 5841     call    get_size_operator
 5842     cmp al,'['
 5843     je  movbe_mem
 5844     cmp al,10h
 5845     jne invalid_operand
 5846     lods    byte [esi]
 5847     call    convert_register
 5848     mov [postbyte_register],al
 5849     lods    byte [esi]
 5850     cmp al,','
 5851     jne invalid_operand
 5852     lods    byte [esi]
 5853     call    get_size_operator
 5854     cmp al,'['
 5855     jne invalid_argument
 5856     call    get_address
 5857     mov al,[operand_size]
 5858     call    operand_autodetect
 5859     jmp instruction_ready
 5860       movbe_mem:
 5861     inc [supplemental_code]
 5862     call    get_address
 5863     push    edx ebx ecx
 5864     lods    byte [esi]
 5865     cmp al,','
 5866     jne invalid_operand
 5867     call    take_register
 5868     mov [postbyte_register],al
 5869     pop ecx ebx edx
 5870     mov al,[operand_size]
 5871     call    operand_autodetect
 5872     jmp instruction_ready
 5873 adx_instruction:
 5874     mov [base_code],0Fh
 5875     mov [extended_code],38h
 5876     mov [supplemental_code],0F6h
 5877     mov [operand_prefix],al
 5878     call    get_reg_mem
 5879     jc  adx_reg_reg
 5880     mov al,[operand_size]
 5881     cmp al,4
 5882     je  instruction_ready
 5883     cmp al,8
 5884     jne invalid_operand_size
 5885     call    operand_64bit
 5886     jmp instruction_ready
 5887       adx_reg_reg:
 5888     cmp ah,4
 5889     je  nomem_instruction_ready
 5890     cmp ah,8
 5891     jne invalid_operand_size
 5892     call    operand_64bit
 5893     jmp nomem_instruction_ready
 5894 rdpid_instruction:
 5895     mov [postbyte_register],al
 5896     mov [extended_code],0C7h
 5897     mov [base_code],0Fh
 5898     mov [opcode_prefix],0F3h
 5899     call    take_register
 5900     cmp [code_type],64
 5901     je  rdpid_64bit
 5902     cmp ah,4
 5903     jne invalid_operand_size
 5904     jmp nomem_instruction_ready
 5905       rdpid_64bit:
 5906     cmp ah,8
 5907     jne invalid_operand_size
 5908     jmp nomem_instruction_ready
 5909 ptwrite_instruction:
 5910     mov [base_code],0Fh
 5911     mov [extended_code],0AEh
 5912     mov [postbyte_register],al
 5913     mov [opcode_prefix],0F3h
 5914     lods    byte [esi]
 5915     call    get_size_operator
 5916     cmp al,10h
 5917     je  ptwrite_reg
 5918       ptwrite_mem:
 5919     cmp al,'['
 5920     jne invalid_operand
 5921     call    get_address
 5922     mov al,[operand_size]
 5923     cmp al,4
 5924     je  ptwrite_mem_store
 5925     cmp al,8
 5926     je  ptwrite_mem_64bit
 5927     or  al,al
 5928     jnz invalid_operand_size
 5929     call    recoverable_unknown_size
 5930     jmp ptwrite_mem_store
 5931       ptwrite_mem_64bit:
 5932     call    operand_64bit
 5933       ptwrite_mem_store:
 5934     mov al,[operand_size]
 5935     call    operand_autodetect
 5936     jmp instruction_ready
 5937       ptwrite_reg:
 5938     lods    byte [esi]
 5939     call    convert_register
 5940     mov bl,al
 5941     mov al,ah
 5942     cmp al,4
 5943     je  nomem_instruction_ready
 5944     cmp al,8
 5945     jne invalid_operand_size
 5946     call    operand_64bit
 5947     jmp nomem_instruction_ready
 5948 
 5949 vmclear_instruction:
 5950     mov [opcode_prefix],66h
 5951     jmp vmx_instruction
 5952 vmxon_instruction:
 5953     mov [opcode_prefix],0F3h
 5954 vmx_instruction:
 5955     mov [postbyte_register],al
 5956     mov [extended_code],0C7h
 5957     lods    byte [esi]
 5958     call    get_size_operator
 5959     cmp al,'['
 5960     jne invalid_operand
 5961     call    get_address
 5962     mov al,[operand_size]
 5963     or  al,al
 5964     jz  vmx_size_ok
 5965     cmp al,8
 5966     jne invalid_operand_size
 5967       vmx_size_ok:
 5968     mov [base_code],0Fh
 5969     jmp instruction_ready
 5970 vmread_instruction:
 5971     mov [extended_code],78h
 5972     lods    byte [esi]
 5973     call    get_size_operator
 5974     cmp al,10h
 5975     je  vmread_nomem
 5976     cmp al,'['
 5977     jne invalid_operand
 5978     call    get_address
 5979     lods    byte [esi]
 5980     cmp al,','
 5981     jne invalid_operand
 5982     call    take_register
 5983     mov [postbyte_register],al
 5984     call    vmread_check_size
 5985     jmp vmx_size_ok
 5986       vmread_nomem:
 5987     lods    byte [esi]
 5988     call    convert_register
 5989     push    eax
 5990     call    vmread_check_size
 5991     lods    byte [esi]
 5992     cmp al,','
 5993     jne invalid_operand
 5994     call    take_register
 5995     mov [postbyte_register],al
 5996     call    vmread_check_size
 5997     pop ebx
 5998     mov [base_code],0Fh
 5999     jmp nomem_instruction_ready
 6000       vmread_check_size:
 6001     cmp [code_type],64
 6002     je  vmread_long
 6003     cmp [operand_size],4
 6004     jne invalid_operand_size
 6005     ret
 6006       vmread_long:
 6007     cmp [operand_size],8
 6008     jne invalid_operand_size
 6009     ret
 6010 vmwrite_instruction:
 6011     mov [extended_code],79h
 6012     call    take_register
 6013     mov [postbyte_register],al
 6014     lods    byte [esi]
 6015     cmp al,','
 6016     jne invalid_operand
 6017     lods    byte [esi]
 6018     call    get_size_operator
 6019     cmp al,10h
 6020     je  vmwrite_nomem
 6021     cmp al,'['
 6022     jne invalid_operand
 6023     call    get_address
 6024     call    vmread_check_size
 6025     jmp vmx_size_ok
 6026       vmwrite_nomem:
 6027     lods    byte [esi]
 6028     call    convert_register
 6029     mov bl,al
 6030     mov [base_code],0Fh
 6031     jmp nomem_instruction_ready
 6032 vmx_inv_instruction:
 6033     call    setup_66_0f_38
 6034     call    take_register
 6035     mov [postbyte_register],al
 6036     call    vmread_check_size
 6037     mov [operand_size],0
 6038     lods    byte [esi]
 6039     cmp al,','
 6040     jne invalid_operand
 6041     lods    byte [esi]
 6042     call    get_size_operator
 6043     cmp al,'['
 6044     jne invalid_operand
 6045     call    get_address
 6046     mov al,[operand_size]
 6047     or  al,al
 6048     jz  vmx_size_ok
 6049     cmp al,16
 6050     jne invalid_operand_size
 6051     jmp vmx_size_ok
 6052 simple_svm_instruction:
 6053     push    eax
 6054     mov [base_code],0Fh
 6055     mov [extended_code],1
 6056     call    take_register
 6057     or  al,al
 6058     jnz invalid_operand
 6059       simple_svm_detect_size:
 6060     cmp ah,2
 6061     je  simple_svm_16bit
 6062     cmp ah,4
 6063     je  simple_svm_32bit
 6064     cmp [code_type],64
 6065     jne invalid_operand_size
 6066     jmp simple_svm_store
 6067       simple_svm_16bit:
 6068     cmp [code_type],16
 6069     je  simple_svm_store
 6070     cmp [code_type],64
 6071     je  invalid_operand_size
 6072     jmp prefixed_svm_store
 6073       simple_svm_32bit:
 6074     cmp [code_type],32
 6075     je  simple_svm_store
 6076       prefixed_svm_store:
 6077     mov al,67h
 6078     stos    byte [edi]
 6079       simple_svm_store:
 6080     call    store_classic_instruction_code
 6081     pop eax
 6082     stos    byte [edi]
 6083     jmp instruction_assembled
 6084 skinit_instruction:
 6085     call    take_register
 6086     cmp ax,0400h
 6087     jne invalid_operand
 6088     mov al,0DEh
 6089     jmp simple_instruction_0f_01
 6090 clzero_instruction:
 6091     call    take_register
 6092     or  al,al
 6093     jnz invalid_operand
 6094     mov al,0FCh
 6095     cmp [code_type],64
 6096     je  clzero_64bit
 6097     cmp ah,4
 6098     jne invalid_operand
 6099     jmp simple_instruction_0f_01
 6100       clzero_64bit:
 6101     cmp ah,8
 6102     jne invalid_operand
 6103     jmp simple_instruction_0f_01
 6104 invlpga_instruction:
 6105     push    eax
 6106     mov [base_code],0Fh
 6107     mov [extended_code],1
 6108     call    take_register
 6109     or  al,al
 6110     jnz invalid_operand
 6111     mov bl,ah
 6112     mov [operand_size],0
 6113     lods    byte [esi]
 6114     cmp al,','
 6115     jne invalid_operand
 6116     call    take_register
 6117     cmp ax,0401h
 6118     jne invalid_operand
 6119     mov ah,bl
 6120     jmp simple_svm_detect_size
 6121 
 6122 rdrand_instruction:
 6123     mov [base_code],0Fh
 6124     mov [extended_code],0C7h
 6125     mov [postbyte_register],al
 6126     call    take_register
 6127     mov bl,al
 6128     mov al,ah
 6129     call    operand_autodetect
 6130     jmp nomem_instruction_ready
 6131 rdfsbase_instruction:
 6132     cmp [code_type],64
 6133     jne illegal_instruction
 6134     mov [opcode_prefix],0F3h
 6135     mov [base_code],0Fh
 6136     mov [extended_code],0AEh
 6137     mov [postbyte_register],al
 6138     call    take_register
 6139     mov bl,al
 6140     mov al,ah
 6141     cmp ah,2
 6142     je  invalid_operand_size
 6143     call    operand_autodetect
 6144     jmp nomem_instruction_ready
 6145 
 6146 xabort_instruction:
 6147     lods    byte [esi]
 6148     call    get_size_operator
 6149     cmp ah,1
 6150     ja  invalid_operand_size
 6151     cmp al,'('
 6152     jne invalid_operand
 6153     call    get_byte_value
 6154     mov dl,al
 6155     mov ax,0F8C6h
 6156     stos    word [edi]
 6157     mov al,dl
 6158     stos    byte [edi]
 6159     jmp instruction_assembled
 6160 xbegin_instruction:
 6161     lods    byte [esi]
 6162     cmp al,'('
 6163     jne invalid_operand
 6164     mov al,[code_type]
 6165     cmp al,64
 6166     je  xbegin_64bit
 6167     cmp al,32
 6168     je  xbegin_32bit
 6169       xbegin_16bit:
 6170     call    get_address_word_value
 6171     add edi,4
 6172     mov ebp,[addressing_space]
 6173     call    calculate_relative_offset
 6174     sub edi,4
 6175     shl eax,16
 6176     mov ax,0F8C7h
 6177     stos    dword [edi]
 6178     jmp instruction_assembled
 6179       xbegin_32bit:
 6180     call    get_address_dword_value
 6181     jmp xbegin_address_ok
 6182       xbegin_64bit:
 6183     call    get_address_qword_value
 6184       xbegin_address_ok:
 6185     add edi,5
 6186     mov ebp,[addressing_space]
 6187     call    calculate_relative_offset
 6188     sub edi,5
 6189     mov edx,eax
 6190     cwde
 6191     cmp eax,edx
 6192     jne xbegin_rel32
 6193     mov al,66h
 6194     stos    byte [edi]
 6195     mov eax,edx
 6196     shl eax,16
 6197     mov ax,0F8C7h
 6198     stos    dword [edi]
 6199     jmp instruction_assembled
 6200       xbegin_rel32:
 6201     sub edx,1
 6202     jno xbegin_rel32_ok
 6203     cmp [code_type],64
 6204     je  jump_out_of_range
 6205       xbegin_rel32_ok:
 6206     mov ax,0F8C7h
 6207     stos    word [edi]
 6208     mov eax,