fasm includes added for building
authorRalph Ronnquist <rrq@rrq.au>
Mon, 13 Jan 2025 00:08:27 +0000 (11:08 +1100)
committerRalph Ronnquist <rrq@rrq.au>
Mon, 13 Jan 2025 00:08:27 +0000 (11:08 +1100)
16 files changed:
source/assemble.inc [new file with mode: 0644]
source/avx.inc [new file with mode: 0644]
source/errors.inc [new file with mode: 0644]
source/exprcalc.inc [new file with mode: 0644]
source/exprpars.inc [new file with mode: 0644]
source/formats.inc [new file with mode: 0644]
source/linux/x64/modes.inc [new file with mode: 0644]
source/linux/x64/system.inc [new file with mode: 0644]
source/messages.inc [new file with mode: 0644]
source/parser.inc [new file with mode: 0644]
source/preproce.inc [new file with mode: 0644]
source/symbdump.inc [new file with mode: 0644]
source/tables.inc [new file with mode: 0644]
source/variable.inc [new file with mode: 0644]
source/version.inc [new file with mode: 0644]
source/x86_64.inc [new file with mode: 0644]

diff --git a/source/assemble.inc b/source/assemble.inc
new file mode 100644 (file)
index 0000000..4ed969b
--- /dev/null
@@ -0,0 +1,2235 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+assembler:
+       xor     eax,eax
+       mov     [stub_size],eax
+       mov     [current_pass],ax
+       mov     [resolver_flags],eax
+       mov     [number_of_sections],eax
+       mov     [actual_fixups_size],eax
+      assembler_loop:
+       mov     eax,[labels_list]
+       mov     [tagged_blocks],eax
+       mov     eax,[additional_memory]
+       mov     [free_additional_memory],eax
+       mov     eax,[additional_memory_end]
+       mov     [structures_buffer],eax
+       mov     esi,[source_start]
+       mov     edi,[code_start]
+       xor     eax,eax
+       mov     dword [adjustment],eax
+       mov     dword [adjustment+4],eax
+       mov     [addressing_space],eax
+       mov     [error_line],eax
+       mov     [counter],eax
+       mov     [format_flags],eax
+       mov     [number_of_relocations],eax
+       mov     [undefined_data_end],eax
+       mov     [file_extension],eax
+       mov     [next_pass_needed],al
+       mov     [output_format],al
+       mov     [adjustment_sign],al
+       mov     [evex_mode],al
+       mov     [code_type],16
+       call    init_addressing_space
+      pass_loop:
+       call    assemble_line
+       jnc     pass_loop
+       mov     eax,[additional_memory_end]
+       cmp     eax,[structures_buffer]
+       je      pass_done
+       sub     eax,18h
+       mov     eax,[eax+4]
+       mov     [current_line],eax
+       jmp     missing_end_directive
+      pass_done:
+       call    close_pass
+       mov     eax,[labels_list]
+      check_symbols:
+       cmp     eax,[memory_end]
+       jae     symbols_checked
+       test    byte [eax+8],8
+       jz      symbol_defined_ok
+       mov     cx,[current_pass]
+       cmp     cx,[eax+18]
+       jne     symbol_defined_ok
+       test    byte [eax+8],1
+       jz      symbol_defined_ok
+       sub     cx,[eax+16]
+       cmp     cx,1
+       jne     symbol_defined_ok
+       and     byte [eax+8],not 1
+       or      [next_pass_needed],-1
+      symbol_defined_ok:
+       test    byte [eax+8],10h
+       jz      use_prediction_ok
+       mov     cx,[current_pass]
+       and     byte [eax+8],not 10h
+       test    byte [eax+8],20h
+       jnz     check_use_prediction
+       cmp     cx,[eax+18]
+       jne     use_prediction_ok
+       test    byte [eax+8],8
+       jz      use_prediction_ok
+       jmp     use_misprediction
+      check_use_prediction:
+       test    byte [eax+8],8
+       jz      use_misprediction
+       cmp     cx,[eax+18]
+       je      use_prediction_ok
+      use_misprediction:
+       or      [next_pass_needed],-1
+      use_prediction_ok:
+       test    byte [eax+8],40h
+       jz      check_next_symbol
+       and     byte [eax+8],not 40h
+       test    byte [eax+8],4
+       jnz     define_misprediction
+       mov     cx,[current_pass]
+       test    byte [eax+8],80h
+       jnz     check_define_prediction
+       cmp     cx,[eax+16]
+       jne     check_next_symbol
+       test    byte [eax+8],1
+       jz      check_next_symbol
+       jmp     define_misprediction
+      check_define_prediction:
+       test    byte [eax+8],1
+       jz      define_misprediction
+       cmp     cx,[eax+16]
+       je      check_next_symbol
+      define_misprediction:
+       or      [next_pass_needed],-1
+      check_next_symbol:
+       add     eax,LABEL_STRUCTURE_SIZE
+       jmp     check_symbols
+      symbols_checked:
+       cmp     [next_pass_needed],0
+       jne     next_pass
+       mov     eax,[error_line]
+       or      eax,eax
+       jz      assemble_ok
+       mov     [current_line],eax
+       cmp     [error],undefined_symbol
+       jne     error_confirmed
+       mov     eax,[error_info]
+       or      eax,eax
+       jz      error_confirmed
+       test    byte [eax+8],1
+       jnz     next_pass
+      error_confirmed:
+       call    error_handler
+      error_handler:
+       mov     eax,[error]
+       sub     eax,error_handler
+       add     [esp],eax
+       ret
+      next_pass:
+       inc     [current_pass]
+       mov     ax,[current_pass]
+       cmp     ax,[passes_limit]
+       je      code_cannot_be_generated
+       jmp     assembler_loop
+      assemble_ok:
+       ret
+
+create_addressing_space:
+       mov     ebx,[addressing_space]
+       test    ebx,ebx
+       jz      init_addressing_space
+       test    byte [ebx+0Ah],1
+       jnz     illegal_instruction
+       mov     eax,edi
+       sub     eax,[ebx+18h]
+       mov     [ebx+1Ch],eax
+      init_addressing_space:
+       mov     ebx,[tagged_blocks]
+       mov     dword [ebx-4],10h
+       mov     dword [ebx-8],24h
+       sub     ebx,8+24h
+       cmp     ebx,edi
+       jbe     out_of_memory
+       mov     [tagged_blocks],ebx
+       mov     [addressing_space],ebx
+       xor     eax,eax
+       mov     [ebx],edi
+       mov     [ebx+4],eax
+       mov     [ebx+8],eax
+       mov     [ebx+10h],eax
+       mov     [ebx+14h],eax
+       mov     [ebx+18h],edi
+       mov     [ebx+1Ch],eax
+       mov     [ebx+20h],eax
+       ret
+
+assemble_line:
+       mov     eax,[tagged_blocks]
+       sub     eax,100h
+       cmp     edi,eax
+       ja      out_of_memory
+       lods    byte [esi]
+       cmp     al,1
+       je      assemble_instruction
+       jb      source_end
+       cmp     al,3
+       jb      define_label
+       je      define_constant
+       cmp     al,4
+       je      label_addressing_space
+       cmp     al,0Fh
+       je      new_line
+       cmp     al,13h
+       je      code_type_setting
+       cmp     al,10h
+       jne     illegal_instruction
+       lods    byte [esi]
+       jmp     segment_prefix
+      code_type_setting:
+       lods    byte [esi]
+       mov     [code_type],al
+       jmp     instruction_assembled
+      new_line:
+       lods    dword [esi]
+       mov     [current_line],eax
+       and     [prefix_flags],0
+       cmp     [symbols_file],0
+       je      continue_line
+       cmp     [next_pass_needed],0
+       jne     continue_line
+       mov     ebx,[tagged_blocks]
+       mov     dword [ebx-4],1
+       mov     dword [ebx-8],14h
+       sub     ebx,8+14h
+       cmp     ebx,edi
+       jbe     out_of_memory
+       mov     [tagged_blocks],ebx
+       mov     [ebx],eax
+       mov     [ebx+4],edi
+       mov     eax,[addressing_space]
+       mov     [ebx+8],eax
+       mov     al,[code_type]
+       mov     [ebx+10h],al
+      continue_line:
+       cmp     byte [esi],0Fh
+       je      line_assembled
+       jmp     assemble_line
+      define_label:
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       mov     ebx,eax
+       lods    byte [esi]
+       mov     [label_size],al
+       call    make_label
+       jmp     continue_line
+      make_label:
+       mov     eax,edi
+       xor     edx,edx
+       xor     cl,cl
+       mov     ebp,[addressing_space]
+       sub     eax,[ds:ebp]
+       sbb     edx,[ds:ebp+4]
+       sbb     cl,[ds:ebp+8]
+       jp      label_value_ok
+       call    recoverable_overflow
+      label_value_ok:
+       mov     [address_sign],cl
+       test    byte [ds:ebp+0Ah],1
+       jnz     make_virtual_label
+       or      byte [ebx+9],1
+       xchg    eax,[ebx]
+       xchg    edx,[ebx+4]
+       mov     ch,[ebx+9]
+       shr     ch,1
+       and     ch,1
+       neg     ch
+       sub     eax,[ebx]
+       sbb     edx,[ebx+4]
+       sbb     ch,cl
+       mov     dword [adjustment],eax
+       mov     dword [adjustment+4],edx
+       mov     [adjustment_sign],ch
+       or      al,ch
+       or      eax,edx
+       setnz   ah
+       jmp     finish_label
+      make_virtual_label:
+       and     byte [ebx+9],not 1
+       cmp     eax,[ebx]
+       mov     [ebx],eax
+       setne   ah
+       cmp     edx,[ebx+4]
+       mov     [ebx+4],edx
+       setne   al
+       or      ah,al
+      finish_label:
+       mov     ebp,[addressing_space]
+       mov     ch,[ds:ebp+9]
+       mov     cl,[label_size]
+       mov     edx,[ds:ebp+14h]
+       mov     ebp,[ds:ebp+10h]
+      finish_label_symbol:
+       mov     al,[address_sign]
+       xor     al,[ebx+9]
+       and     al,10b
+       or      ah,al
+       xor     [ebx+9],al
+       cmp     cl,[ebx+10]
+       mov     [ebx+10],cl
+       setne   al
+       or      ah,al
+       cmp     ch,[ebx+11]
+       mov     [ebx+11],ch
+       setne   al
+       or      ah,al
+       cmp     ebp,[ebx+12]
+       mov     [ebx+12],ebp
+       setne   al
+       or      ah,al
+       or      ch,ch
+       jz      label_symbol_ok
+       cmp     edx,[ebx+20]
+       mov     [ebx+20],edx
+       setne   al
+       or      ah,al
+      label_symbol_ok:
+       mov     cx,[current_pass]
+       xchg    [ebx+16],cx
+       mov     edx,[current_line]
+       mov     [ebx+28],edx
+       and     byte [ebx+8],not 2
+       test    byte [ebx+8],1
+       jz      new_label
+       cmp     cx,[ebx+16]
+       je      symbol_already_defined
+       btr     dword [ebx+8],10
+       jc      requalified_label
+       inc     cx
+       sub     cx,[ebx+16]
+       setnz   al
+       or      ah,al
+       jz      label_made
+       test    byte [ebx+8],8
+       jz      label_made
+       mov     cx,[current_pass]
+       cmp     cx,[ebx+18]
+       jne     label_made
+      requalified_label:
+       or      [next_pass_needed],-1
+      label_made:
+       ret
+      new_label:
+       or      byte [ebx+8],1
+       ret
+      define_constant:
+       lods    dword [esi]
+       inc     esi
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       push    eax
+       or      [operand_flags],1
+       call    get_value
+       pop     ebx
+       xor     cl,cl
+       mov     ch,[value_type]
+       cmp     ch,3
+       je      invalid_use_of_symbol
+      make_constant:
+       and     byte [ebx+9],not 1
+       cmp     eax,[ebx]
+       mov     [ebx],eax
+       setne   ah
+       cmp     edx,[ebx+4]
+       mov     [ebx+4],edx
+       setne   al
+       or      ah,al
+       mov     al,[value_sign]
+       xor     al,[ebx+9]
+       and     al,10b
+       or      ah,al
+       xor     [ebx+9],al
+       cmp     cl,[ebx+10]
+       mov     [ebx+10],cl
+       setne   al
+       or      ah,al
+       cmp     ch,[ebx+11]
+       mov     [ebx+11],ch
+       setne   al
+       or      ah,al
+       xor     edx,edx
+       cmp     edx,[ebx+12]
+       mov     [ebx+12],edx
+       setne   al
+       or      ah,al
+       or      ch,ch
+       jz      constant_symbol_ok
+       mov     edx,[symbol_identifier]
+       cmp     edx,[ebx+20]
+       mov     [ebx+20],edx
+       setne   al
+       or      ah,al
+      constant_symbol_ok:
+       mov     cx,[current_pass]
+       xchg    [ebx+16],cx
+       mov     edx,[current_line]
+       mov     [ebx+28],edx
+       test    byte [ebx+8],1
+       jz      new_constant
+       cmp     cx,[ebx+16]
+       jne     redeclare_constant
+       test    byte [ebx+8],2
+       jz      symbol_already_defined
+       or      byte [ebx+8],4
+       and     byte [ebx+9],not 4
+       jmp     instruction_assembled
+      redeclare_constant:
+       btr     dword [ebx+8],10
+       jc      requalified_constant
+       inc     cx
+       sub     cx,[ebx+16]
+       setnz   al
+       or      ah,al
+       jz      instruction_assembled
+       test    byte [ebx+8],4
+       jnz     instruction_assembled
+       test    byte [ebx+8],8
+       jz      instruction_assembled
+       mov     cx,[current_pass]
+       cmp     cx,[ebx+18]
+       jne     instruction_assembled
+      requalified_constant:
+       or      [next_pass_needed],-1
+       jmp     instruction_assembled
+      new_constant:
+       or      byte [ebx+8],1+2
+       jmp     instruction_assembled
+      label_addressing_space:
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       mov     cx,[current_pass]
+       test    byte [eax+8],1
+       jz      make_addressing_space_label
+       cmp     cx,[eax+16]
+       je      symbol_already_defined
+       test    byte [eax+9],4
+       jnz     make_addressing_space_label
+       or      [next_pass_needed],-1
+      make_addressing_space_label:
+       mov     dx,[eax+8]
+       and     dx,not (2 or 100h)
+       or      dx,1 or 4 or 400h
+       mov     [eax+8],dx
+       mov     [eax+16],cx
+       mov     edx,[current_line]
+       mov     [eax+28],edx
+       mov     ebx,[addressing_space]
+       mov     [eax],ebx
+       or      byte [ebx+0Ah],2
+       jmp     continue_line
+      assemble_instruction:
+;       mov     [operand_size],0
+;       mov     [operand_flags],0
+;       mov     [operand_prefix],0
+;       mov     [rex_prefix],0
+       and     dword [operand_size],0
+;       mov     [opcode_prefix],0
+;       mov     [vex_required],0
+;       mov     [vex_register],0
+;       mov     [immediate_size],0
+       and     dword [opcode_prefix],0
+       call    instruction_handler
+      instruction_handler:
+       movzx   ebx,word [esi]
+       mov     al,[esi+2]
+       add     esi,3
+       add     [esp],ebx
+       ret
+      instruction_assembled:
+       test    [prefix_flags],not 1
+       jnz     illegal_instruction
+       mov     al,[esi]
+       cmp     al,0Fh
+       je      line_assembled
+       or      al,al
+       jnz     extra_characters_on_line
+      line_assembled:
+       clc
+       ret
+      source_end:
+       dec     esi
+       stc
+       ret
+
+org_directive:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_qword_value
+       mov     cl,[value_type]
+       test    cl,1
+       jnz     invalid_use_of_symbol
+       push    eax
+       mov     ebx,[addressing_space]
+       mov     eax,edi
+       sub     eax,[ebx+18h]
+       mov     [ebx+1Ch],eax
+       test    byte [ebx+0Ah],1
+       jnz     in_virtual
+       call    init_addressing_space
+       jmp     org_space_ok
+      in_virtual:
+       call    close_virtual_addressing_space
+       call    init_addressing_space
+       or      byte [ebx+0Ah],1
+      org_space_ok:
+       pop     eax
+       mov     [ebx+9],cl
+       mov     cl,[value_sign]
+       sub     [ebx],eax
+       sbb     [ebx+4],edx
+       sbb     byte [ebx+8],cl
+       jp      org_value_ok
+       call    recoverable_overflow
+      org_value_ok:
+       mov     edx,[symbol_identifier]
+       mov     [ebx+14h],edx
+       cmp     [output_format],1
+       ja      instruction_assembled
+       cmp     edi,[code_start]
+       jne     instruction_assembled
+       cmp     eax,100h
+       jne     instruction_assembled
+       bts     [format_flags],0
+       jmp     instruction_assembled
+label_directive:
+       lods    byte [esi]
+       cmp     al,2
+       jne     invalid_argument
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       mov     ebx,eax
+       mov     [label_size],0
+       lods    byte [esi]
+       cmp     al,':'
+       je      get_label_size
+       dec     esi
+       cmp     al,11h
+       jne     label_size_ok
+      get_label_size:
+       lods    word [esi]
+       cmp     al,11h
+       jne     invalid_argument
+       mov     [label_size],ah
+      label_size_ok:
+       cmp     byte [esi],80h
+       je      get_free_label_value
+       call    make_label
+       jmp     instruction_assembled
+      get_free_label_value:
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       push    ebx ecx
+       or      byte [ebx+8],4
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_address_value
+       or      bh,bh
+       setnz   ch
+       xchg    ch,cl
+       mov     bp,cx
+       shl     ebp,16
+       xchg    bl,bh
+       mov     bp,bx
+       pop     ecx ebx
+       and     byte [ebx+8],not 4
+       mov     ch,[value_type]
+       test    ch,1
+       jnz     invalid_use_of_symbol
+      make_free_label:
+       and     byte [ebx+9],not 1
+       cmp     eax,[ebx]
+       mov     [ebx],eax
+       setne   ah
+       cmp     edx,[ebx+4]
+       mov     [ebx+4],edx
+       setne   al
+       or      ah,al
+       mov     edx,[address_symbol]
+       mov     cl,[label_size]
+       call    finish_label_symbol
+       jmp     instruction_assembled
+load_directive:
+       lods    byte [esi]
+       cmp     al,2
+       jne     invalid_argument
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       push    eax
+       mov     al,1
+       cmp     byte [esi],11h
+       jne     load_size_ok
+       lods    byte [esi]
+       lods    byte [esi]
+      load_size_ok:
+       cmp     al,8
+       ja      invalid_value
+       mov     [operand_size],al
+       and     dword [value],0
+       and     dword [value+4],0
+       lods    byte [esi]
+       cmp     al,82h
+       jne     invalid_argument
+       call    get_data_point
+       jc      value_loaded
+       push    esi edi
+       mov     esi,ebx
+       mov     edi,value
+       rep     movs byte [edi],[esi]
+       pop     edi esi
+      value_loaded:
+       mov     [value_sign],0
+       mov     eax,dword [value]
+       mov     edx,dword [value+4]
+       pop     ebx
+       xor     cx,cx
+       jmp     make_constant
+      get_data_point:
+       lods    byte [esi]
+       cmp     al,':'
+       je      get_data_offset
+       cmp     al,'('
+       jne     invalid_argument
+       mov     ebx,[addressing_space]
+       mov     ecx,edi
+       sub     ecx,[ebx+18h]
+       mov     [ebx+1Ch],ecx
+       cmp     byte [esi],11h
+       jne     get_data_address
+       cmp     word [esi+1+4],'):'
+       jne     get_data_address
+       inc     esi
+       lods    dword [esi]
+       add     esi,2
+       cmp     byte [esi],'('
+       jne     invalid_argument
+       inc     esi
+       cmp     eax,0Fh
+       jbe     reserved_word_used_as_symbol
+       mov     edx,undefined_symbol
+       test    byte [eax+8],1
+       jz      addressing_space_unavailable
+       mov     edx,symbol_out_of_scope
+       mov     cx,[eax+16]
+       cmp     cx,[current_pass]
+       jne     addressing_space_unavailable
+       test    byte [eax+9],4
+       jz      invalid_use_of_symbol
+       mov     ebx,eax
+       mov     ax,[current_pass]
+       mov     [ebx+18],ax
+       or      byte [ebx+8],8
+       call    store_label_reference
+      get_addressing_space:
+       mov     ebx,[ebx]
+      get_data_address:
+       push    ebx
+       cmp     byte [esi],'.'
+       je      invalid_value
+       or      [operand_flags],1
+       call    get_address_value
+       pop     ebp
+       call    calculate_relative_offset
+       cmp     [next_pass_needed],0
+       jne     data_address_type_ok
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+      data_address_type_ok:
+       mov     ebx,edi
+       xor     ecx,ecx
+       add     ebx,eax
+       adc     edx,ecx
+       mov     eax,ebx
+       sub     eax,[ds:ebp+18h]
+       sbb     edx,ecx
+       jnz     bad_data_address
+       mov     cl,[operand_size]
+       add     eax,ecx
+       cmp     eax,[ds:ebp+1Ch]
+       ja      bad_data_address
+       clc
+       ret
+      addressing_space_unavailable:
+       cmp     [error_line],0
+       jne     get_data_address
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],edx
+       mov     [error_info],eax
+       jmp     get_data_address
+      bad_data_address:
+       call    recoverable_overflow
+       stc
+       ret
+      get_data_offset:
+       cmp     [output_format],2
+       jae     invalid_operand
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_dword_value
+       cmp     [value_type],0
+       je      data_offset_ok
+       call    recoverable_invalid_address
+      data_offset_ok:
+       add     eax,[code_start]
+       jc      bad_data_address
+       mov     ebx,eax
+       movzx   ecx,[operand_size]
+       add     eax,ecx
+       jc      bad_data_address
+       mov     edx,[addressing_space]
+       test    byte [edx+0Ah],1
+       jnz     data_offset_from_virtual
+       cmp     eax,edi
+       ja      bad_data_address
+       clc
+       ret
+      data_offset_from_virtual:
+       cmp     eax,[undefined_data_end]
+       ja      bad_data_address
+       clc
+       ret
+
+store_directive:
+       cmp     byte [esi],11h
+       je      sized_store
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_byte_value
+       xor     edx,edx
+       movzx   eax,al
+       mov     [operand_size],1
+       jmp     store_value_ok
+      sized_store:
+       or      [operand_flags],1
+       call    get_value
+      store_value_ok:
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     dword [value],eax
+       mov     dword [value+4],edx
+       lods    byte [esi]
+       cmp     al,80h
+       jne     invalid_argument
+       call    get_data_point
+       jc      instruction_assembled
+       push    esi edi
+       mov     esi,value
+       mov     edi,ebx
+       rep     movs byte [edi],[esi]
+       mov     eax,edi
+       pop     edi esi
+       cmp     ebx,[undefined_data_end]
+       jae     instruction_assembled
+       cmp     eax,[undefined_data_start]
+       jbe     instruction_assembled
+       mov     [undefined_data_start],eax
+       jmp     instruction_assembled
+
+display_directive:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],0
+       jne     display_byte
+       inc     esi
+       lods    dword [esi]
+       mov     ecx,eax
+       push    edi
+       mov     edi,[tagged_blocks]
+       sub     edi,8
+       sub     edi,eax
+       cmp     edi,[esp]
+       jbe     out_of_memory
+       mov     [tagged_blocks],edi
+       rep     movs byte [edi],[esi]
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       pop     edi
+       inc     esi
+       jmp     display_next
+      display_byte:
+       call    get_byte_value
+       push    edi
+       mov     edi,[tagged_blocks]
+       sub     edi,8+1
+       mov     [tagged_blocks],edi
+       stos    byte [edi]
+       mov     eax,1
+       stos    dword [edi]
+       dec     eax
+       stos    dword [edi]
+       pop     edi
+      display_next:
+       cmp     edi,[tagged_blocks]
+       ja      out_of_memory
+       lods    byte [esi]
+       cmp     al,','
+       je      display_directive
+       dec     esi
+       jmp     instruction_assembled
+show_display_buffer:
+       mov     eax,[tagged_blocks]
+       or      eax,eax
+       jz      display_done
+       mov     esi,[labels_list]
+       cmp     esi,eax
+       je      display_done
+      display_messages:
+       sub     esi,8
+       mov     eax,[esi+4]
+       mov     ecx,[esi]
+       sub     esi,ecx
+       cmp     eax,10h
+       je      write_addressing_space
+       test    eax,eax
+       jnz     skip_block
+       push    esi
+       call    display_block
+       pop     esi
+      skip_block:
+       cmp     esi,[tagged_blocks]
+       jne     display_messages
+      display_done:
+       ret
+      write_addressing_space:
+       mov     ecx,[esi+20h]
+       jecxz   skip_block
+       push    esi
+       mov     edi,[free_additional_memory]
+       mov     esi,[output_file]
+       test    esi,esi
+       jz      addressing_space_written
+       xor     ebx,ebx
+      copy_output_path:
+       lodsb
+       cmp     edi,[structures_buffer]
+       jae     out_of_memory
+       stosb
+       test    al,al
+       jz      output_path_copied
+       cmp     al,'/'
+       je      new_path_segment
+       cmp     al,'\'
+       je      new_path_segment
+       cmp     al,'.'
+       jne     copy_output_path
+       mov     ebx,edi
+       jmp     copy_output_path
+      new_path_segment:
+       xor     ebx,ebx
+       jmp     copy_output_path
+      output_path_copied:
+       test    ebx,ebx
+       jnz     append_extension
+       mov     byte [edi-1],'.'
+       mov     ebx,edi
+      append_extension:
+       mov     edi,ebx
+       add     ebx,ecx
+       inc     ebx
+       cmp     ebx,[structures_buffer]
+       jae     out_of_memory
+       mov     esi,[esp]
+       mov     esi,[esi+18h]
+       sub     esi,ecx
+       rep     movs byte [edi],[esi]
+       xor     al,al
+       stos    byte [edi]
+       mov     edx,[free_additional_memory]
+       call    create
+       jc      write_failed
+       mov     esi,[esp]
+       mov     edx,[esi+18h]
+       mov     ecx,[esi+1Ch]
+       call    write
+       jc      write_failed
+       call    close
+      addressing_space_written:
+       pop     esi
+       jmp     skip_block
+
+times_directive:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       cmp     eax,0
+       je      zero_times
+       cmp     byte [esi],':'
+       jne     times_argument_ok
+       inc     esi
+      times_argument_ok:
+       push    [counter]
+       push    [counter_limit]
+       mov     [counter_limit],eax
+       mov     [counter],1
+      times_loop:
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       push    esi
+       or      [prefix_flags],1
+       call    continue_line
+       mov     eax,[counter_limit]
+       cmp     [counter],eax
+       je      times_done
+       inc     [counter]
+       pop     esi
+       jmp     times_loop
+      times_done:
+       pop     eax
+       pop     [counter_limit]
+       pop     [counter]
+       jmp     instruction_assembled
+      zero_times:
+       call    skip_symbol
+       jnc     zero_times
+       jmp     instruction_assembled
+
+virtual_directive:
+       lods    byte [esi]
+       cmp     al,'('
+       je      continue_virtual_area
+       cmp     al,80h
+       jne     virtual_at_current
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_address_value
+       mov     ebp,[address_symbol]
+       or      bh,bh
+       setnz   ch
+       jmp     set_virtual
+      virtual_at_current:
+       dec     esi
+      virtual_fallback:
+       mov     ebp,[addressing_space]
+       mov     al,[ds:ebp+9]
+       mov     [value_type],al
+       mov     eax,edi
+       xor     edx,edx
+       xor     cl,cl
+       sub     eax,[ds:ebp]
+       sbb     edx,[ds:ebp+4]
+       sbb     cl,[ds:ebp+8]
+       mov     [address_sign],cl
+       mov     bx,[ds:ebp+10h]
+       mov     cx,[ds:ebp+10h+2]
+       xchg    bh,bl
+       xchg    ch,cl
+       mov     ebp,[ds:ebp+14h]
+      set_virtual:
+       xchg    bl,bh
+       xchg    cl,ch
+       shl     ecx,16
+       mov     cx,bx
+       push    ecx eax
+       mov     ebx,[addressing_space]
+       test    byte [ebx+0Ah],1
+       jnz     non_virtual_end_ok
+       mov     eax,edi
+       xchg    eax,[undefined_data_end]
+       cmp     eax,edi
+       je      non_virtual_end_ok
+       mov     [undefined_data_start],edi
+      non_virtual_end_ok:
+       call    allocate_virtual_structure_data
+       call    init_addressing_space
+       or      byte [ebx+0Ah],1
+       cmp     byte [esi],86h
+       jne     addressing_space_extension_ok
+       cmp     word [esi+1],'('
+       jne     invalid_argument
+       mov     ecx,[esi+3]
+       add     esi,3+4
+       add     [ebx+18h],ecx
+       mov     [ebx+20h],ecx
+       or      byte [ebx+0Ah],2
+       push    ebx
+       mov     ebx,characters
+      get_extension:
+       lods    byte [esi]
+       stos    byte [edi]
+       xlat    byte [ebx]
+       test    al,al
+       jz      invalid_argument
+       loop    get_extension
+       inc     esi
+       pop     ebx
+      addressing_space_extension_ok:
+       pop     eax
+       mov     cl,[address_sign]
+       not     eax
+       not     edx
+       not     cl
+       add     eax,1
+       adc     edx,0
+       adc     cl,0
+       add     eax,edi
+       adc     edx,0
+       adc     cl,0
+       mov     [ebx],eax
+       mov     [ebx+4],edx
+       mov     [ebx+8],cl
+       pop     dword [ebx+10h]
+       mov     [ebx+14h],ebp
+       mov     al,[value_type]
+       test    al,1
+       jnz     invalid_use_of_symbol
+       mov     [ebx+9],al
+       jmp     instruction_assembled
+      allocate_structure_data:
+       mov     ebx,[structures_buffer]
+       sub     ebx,18h
+       cmp     ebx,[free_additional_memory]
+       jb      out_of_memory
+       mov     [structures_buffer],ebx
+       ret
+      find_structure_data:
+       mov     ebx,[structures_buffer]
+      scan_structures:
+       cmp     ebx,[additional_memory_end]
+       je      no_such_structure
+       cmp     ax,[ebx]
+       je      structure_data_found
+       add     ebx,18h
+       jmp     scan_structures
+      structure_data_found:
+       ret
+      no_such_structure:
+       stc
+       ret
+      allocate_virtual_structure_data:
+       call    allocate_structure_data
+       mov     word [ebx],virtual_directive-instruction_handler
+       mov     ecx,[addressing_space]
+       mov     [ebx+12],ecx
+       mov     [ebx+8],edi
+       mov     ecx,[current_line]
+       mov     [ebx+4],ecx
+       mov     ebx,[addressing_space]
+       mov     eax,edi
+       sub     eax,[ebx+18h]
+       mov     [ebx+1Ch],eax
+       ret
+      continue_virtual_area:
+       cmp     byte [esi],11h
+       jne     invalid_argument
+       cmp     byte [esi+1+4],')'
+       jne     invalid_argument
+       inc     esi
+       lods    dword [esi]
+       inc     esi
+       cmp     eax,0Fh
+       jbe     reserved_word_used_as_symbol
+       mov     edx,undefined_symbol
+       test    byte [eax+8],1
+       jz      virtual_area_unavailable
+       mov     edx,symbol_out_of_scope
+       mov     cx,[eax+16]
+       cmp     cx,[current_pass]
+       jne     virtual_area_unavailable
+       mov     edx,invalid_use_of_symbol
+       test    byte [eax+9],4
+       jz      virtual_area_unavailable
+       mov     ebx,eax
+       mov     ax,[current_pass]
+       mov     [ebx+18],ax
+       or      byte [ebx+8],8
+       call    store_label_reference
+       mov     ebx,[ebx]
+       test    byte [ebx+0Ah],4
+       jz      virtual_area_unavailable
+       and     byte [ebx+0Ah],not 4
+       mov     edx,ebx
+       call    allocate_virtual_structure_data
+       mov     [addressing_space],edx
+       push    esi
+       mov     esi,[edx+18h]
+       mov     ecx,[edx+1Ch]
+       mov     eax,[edx+20h]
+       sub     esi,eax
+       add     ecx,eax
+       lea     eax,[edi+ecx]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,esi
+       sub     eax,edi
+       sub     [edx+18h],eax
+       sub     [edx],eax
+       sbb     dword [edx+4],0
+       sbb     byte [edx+8],0
+       mov     al,cl
+       shr     ecx,2
+       rep     movs dword [edi],[esi]
+       mov     cl,al
+       and     cl,11b
+       rep     movs byte [edi],[esi]
+       pop     esi
+       jmp     instruction_assembled
+      virtual_area_unavailable:
+       cmp     [error_line],0
+       jne     virtual_fallback
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],edx
+       mov     [error_info],eax
+       jmp     virtual_fallback
+      end_virtual:
+       call    find_structure_data
+       jc      unexpected_instruction
+       push    ebx
+       call    close_virtual_addressing_space
+       pop     ebx
+       mov     eax,[ebx+12]
+       mov     [addressing_space],eax
+       mov     edi,[ebx+8]
+      remove_structure_data:
+       push    esi edi
+       mov     ecx,ebx
+       sub     ecx,[structures_buffer]
+       shr     ecx,2
+       lea     esi,[ebx-4]
+       lea     edi,[esi+18h]
+       std
+       rep     movs dword [edi],[esi]
+       cld
+       add     [structures_buffer],18h
+       pop     edi esi
+       ret
+      close_virtual_addressing_space:
+       mov     ebx,[addressing_space]
+       mov     eax,edi
+       sub     eax,[ebx+18h]
+       mov     [ebx+1Ch],eax
+       add     eax,[ebx+20h]
+       test    byte [ebx+0Ah],2
+       jz      addressing_space_closed
+       or      byte [ebx+0Ah],4
+       push    esi edi ecx edx
+       mov     ecx,eax
+       mov     eax,[tagged_blocks]
+       mov     dword [eax-4],11h
+       mov     dword [eax-8],ecx
+       sub     eax,8
+       sub     eax,ecx
+       mov     [tagged_blocks],eax
+       lea     edi,[eax+ecx-1]
+       add     eax,[ebx+20h]
+       xchg    eax,[ebx+18h]
+       sub     eax,[ebx+20h]
+       lea     esi,[eax+ecx-1]
+       mov     eax,edi
+       sub     eax,esi
+       std
+       shr     ecx,1
+       jnc     virtual_byte_ok
+       movs    byte [edi],[esi]
+      virtual_byte_ok:
+       dec     esi
+       dec     edi
+       shr     ecx,1
+       jnc     virtual_word_ok
+       movs    word [edi],[esi]
+      virtual_word_ok:
+       sub     esi,2
+       sub     edi,2
+       rep     movs dword [edi],[esi]
+       cld
+       xor     edx,edx
+       add     [ebx],eax
+       adc     dword [ebx+4],edx
+       adc     byte [ebx+8],dl
+       pop     edx ecx edi esi
+      addressing_space_closed:
+       ret
+repeat_directive:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       cmp     eax,0
+       je      zero_repeat
+       call    allocate_structure_data
+       mov     word [ebx],repeat_directive-instruction_handler
+       xchg    eax,[counter_limit]
+       mov     [ebx+10h],eax
+       mov     eax,1
+       xchg    eax,[counter]
+       mov     [ebx+14h],eax
+       mov     [ebx+8],esi
+       mov     eax,[current_line]
+       mov     [ebx+4],eax
+       jmp     instruction_assembled
+      end_repeat:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       call    find_structure_data
+       jc      unexpected_instruction
+       mov     eax,[counter_limit]
+       inc     [counter]
+       cmp     [counter],eax
+       jbe     continue_repeating
+      stop_repeat:
+       mov     eax,[ebx+10h]
+       mov     [counter_limit],eax
+       mov     eax,[ebx+14h]
+       mov     [counter],eax
+       call    remove_structure_data
+       jmp     instruction_assembled
+      continue_repeating:
+       mov     esi,[ebx+8]
+       jmp     instruction_assembled
+      zero_repeat:
+       mov     al,[esi]
+       or      al,al
+       jz      missing_end_directive
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+       call    find_end_repeat
+       jmp     instruction_assembled
+      find_end_repeat:
+       call    find_structure_end
+       cmp     ax,repeat_directive-instruction_handler
+       jne     unexpected_instruction
+       ret
+while_directive:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       call    allocate_structure_data
+       mov     word [ebx],while_directive-instruction_handler
+       mov     eax,1
+       xchg    eax,[counter]
+       mov     [ebx+10h],eax
+       mov     [ebx+8],esi
+       mov     eax,[current_line]
+       mov     [ebx+4],eax
+      do_while:
+       push    ebx
+       call    calculate_logical_expression
+       or      al,al
+       jnz     while_true
+       mov     al,[esi]
+       or      al,al
+       jz      missing_end_directive
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+      stop_while:
+       call    find_end_while
+       pop     ebx
+       mov     eax,[ebx+10h]
+       mov     [counter],eax
+       call    remove_structure_data
+       jmp     instruction_assembled
+      while_true:
+       pop     ebx
+       jmp     instruction_assembled
+      end_while:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       call    find_structure_data
+       jc      unexpected_instruction
+       mov     eax,[ebx+4]
+       mov     [current_line],eax
+       inc     [counter]
+       jz      too_many_repeats
+       mov     esi,[ebx+8]
+       jmp     do_while
+      find_end_while:
+       call    find_structure_end
+       cmp     ax,while_directive-instruction_handler
+       jne     unexpected_instruction
+       ret
+if_directive:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       call    calculate_logical_expression
+       mov     dl,al
+       mov     al,[esi]
+       or      al,al
+       jz      missing_end_directive
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+       or      dl,dl
+       jnz     if_true
+       call    find_else
+       jc      instruction_assembled
+       mov     al,[esi]
+       cmp     al,1
+       jne     else_true
+       cmp     word [esi+1],if_directive-instruction_handler
+       jne     else_true
+       add     esi,4
+       jmp     if_directive
+      if_true:
+       xor     al,al
+      make_if_structure:
+       call    allocate_structure_data
+       mov     word [ebx],if_directive-instruction_handler
+       mov     byte [ebx+2],al
+       mov     eax,[current_line]
+       mov     [ebx+4],eax
+       jmp     instruction_assembled
+      else_true:
+       or      al,al
+       jz      missing_end_directive
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+       or      al,-1
+       jmp     make_if_structure
+      else_directive:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       mov     ax,if_directive-instruction_handler
+       call    find_structure_data
+       jc      unexpected_instruction
+       cmp     byte [ebx+2],0
+       jne     unexpected_instruction
+      found_else:
+       mov     al,[esi]
+       cmp     al,1
+       jne     skip_else
+       cmp     word [esi+1],if_directive-instruction_handler
+       jne     skip_else
+       add     esi,4
+       call    find_else
+       jnc     found_else
+       call    remove_structure_data
+       jmp     instruction_assembled
+      skip_else:
+       or      al,al
+       jz      missing_end_directive
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+       call    find_end_if
+       call    remove_structure_data
+       jmp     instruction_assembled
+      end_if:
+       test    [prefix_flags],1
+       jnz     unexpected_instruction
+       call    find_structure_data
+       jc      unexpected_instruction
+       call    remove_structure_data
+       jmp     instruction_assembled
+      find_else:
+       call    find_structure_end
+       cmp     ax,else_directive-instruction_handler
+       je      else_found
+       cmp     ax,if_directive-instruction_handler
+       jne     unexpected_instruction
+       stc
+       ret
+      else_found:
+       clc
+       ret
+      find_end_if:
+       call    find_structure_end
+       cmp     ax,if_directive-instruction_handler
+       jne     unexpected_instruction
+       ret
+      find_structure_end:
+       push    [error_line]
+       mov     eax,[current_line]
+       mov     [error_line],eax
+      find_end_directive:
+       call    skip_symbol
+       jnc     find_end_directive
+       lods    byte [esi]
+       cmp     al,0Fh
+       jne     no_end_directive
+       lods    dword [esi]
+       mov     [current_line],eax
+      skip_labels:
+       cmp     byte [esi],2
+       jne     labels_ok
+       add     esi,6
+       jmp     skip_labels
+      labels_ok:
+       cmp     byte [esi],1
+       jne     find_end_directive
+       mov     ax,[esi+1]
+       cmp     ax,prefix_instruction-instruction_handler
+       je      find_end_directive
+       add     esi,4
+       cmp     ax,repeat_directive-instruction_handler
+       je      skip_repeat
+       cmp     ax,while_directive-instruction_handler
+       je      skip_while
+       cmp     ax,if_directive-instruction_handler
+       je      skip_if
+       cmp     ax,else_directive-instruction_handler
+       je      structure_end
+       cmp     ax,end_directive-instruction_handler
+       jne     find_end_directive
+       cmp     byte [esi],1
+       jne     find_end_directive
+       mov     ax,[esi+1]
+       add     esi,4
+       cmp     ax,repeat_directive-instruction_handler
+       je      structure_end
+       cmp     ax,while_directive-instruction_handler
+       je      structure_end
+       cmp     ax,if_directive-instruction_handler
+       jne     find_end_directive
+      structure_end:
+       pop     [error_line]
+       ret
+      no_end_directive:
+       mov     eax,[error_line]
+       mov     [current_line],eax
+       jmp     missing_end_directive
+      skip_repeat:
+       call    find_end_repeat
+       jmp     find_end_directive
+      skip_while:
+       call    find_end_while
+       jmp     find_end_directive
+      skip_if:
+       call    skip_if_block
+       jmp     find_end_directive
+      skip_if_block:
+       call    find_else
+       jc      if_block_skipped
+       cmp     byte [esi],1
+       jne     skip_after_else
+       cmp     word [esi+1],if_directive-instruction_handler
+       jne     skip_after_else
+       add     esi,4
+       jmp     skip_if_block
+      skip_after_else:
+       call    find_end_if
+      if_block_skipped:
+       ret
+end_directive:
+       lods    byte [esi]
+       cmp     al,1
+       jne     invalid_argument
+       lods    word [esi]
+       inc     esi
+       cmp     ax,virtual_directive-instruction_handler
+       je      end_virtual
+       cmp     ax,repeat_directive-instruction_handler
+       je      end_repeat
+       cmp     ax,while_directive-instruction_handler
+       je      end_while
+       cmp     ax,if_directive-instruction_handler
+       je      end_if
+       cmp     ax,data_directive-instruction_handler
+       je      end_data
+       jmp     invalid_argument
+break_directive:
+       mov     ebx,[structures_buffer]
+       mov     al,[esi]
+       or      al,al
+       jz      find_breakable_structure
+       cmp     al,0Fh
+       jne     extra_characters_on_line
+      find_breakable_structure:
+       cmp     ebx,[additional_memory_end]
+       je      unexpected_instruction
+       mov     ax,[ebx]
+       cmp     ax,repeat_directive-instruction_handler
+       je      break_repeat
+       cmp     ax,while_directive-instruction_handler
+       je      break_while
+       cmp     ax,if_directive-instruction_handler
+       je      break_if
+       add     ebx,18h
+       jmp     find_breakable_structure
+      break_if:
+       push    [current_line]
+       mov     eax,[ebx+4]
+       mov     [current_line],eax
+       call    remove_structure_data
+       call    skip_if_block
+       pop     [current_line]
+       mov     ebx,[structures_buffer]
+       jmp     find_breakable_structure
+      break_repeat:
+       push    ebx
+       call    find_end_repeat
+       pop     ebx
+       jmp     stop_repeat
+      break_while:
+       push    ebx
+       jmp     stop_while
+
+define_data:
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       cmp     byte [esi],'('
+       jne     simple_data_value
+       mov     ebx,esi
+       inc     esi
+       call    skip_expression
+       xchg    esi,ebx
+       cmp     byte [ebx],81h
+       jne     simple_data_value
+       inc     esi
+       call    get_count_value
+       inc     esi
+       or      eax,eax
+       jz      duplicate_zero_times
+       cmp     byte [esi],91h
+       jne     duplicate_single_data_value
+       inc     esi
+      duplicate_data:
+       push    eax esi
+      duplicated_values:
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       clc
+       call    near dword [esp+8]
+       lods    byte [esi]
+       cmp     al,','
+       je      duplicated_values
+       cmp     al,92h
+       jne     invalid_argument
+       pop     ebx eax
+       dec     eax
+       jz      data_defined
+       mov     esi,ebx
+       jmp     duplicate_data
+      duplicate_single_data_value:
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       push    eax esi
+       clc
+       call    near dword [esp+8]
+       pop     ebx eax
+       dec     eax
+       jz      data_defined
+       mov     esi,ebx
+       jmp     duplicate_single_data_value
+      duplicate_zero_times:
+       cmp     byte [esi],91h
+       jne     skip_single_data_value
+       inc     esi
+      skip_data_value:
+       call    skip_symbol
+       jc      invalid_argument
+       cmp     byte [esi],92h
+       jne     skip_data_value
+       inc     esi
+       jmp     data_defined
+      skip_single_data_value:
+       call    skip_symbol
+       jmp     data_defined
+      simple_data_value:
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       clc
+       call    near dword [esp]
+      data_defined:
+       lods    byte [esi]
+       cmp     al,','
+       je      define_data
+       dec     esi
+       stc
+       ret
+data_bytes:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_byte
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       mov     byte [edi],0
+       inc     edi
+       jmp     undefined_data
+      get_byte:
+       cmp     byte [esi],0
+       je      get_string
+       call    get_byte_value
+       stos    byte [edi]
+       ret
+      get_string:
+       inc     esi
+       lods    dword [esi]
+       mov     ecx,eax
+       lea     eax,[edi+ecx]
+       cmp     eax,[tagged_blocks]
+       ja      out_of_memory
+       rep     movs byte [edi],[esi]
+       inc     esi
+       ret
+      undefined_data:
+       mov     ebp,[addressing_space]
+       test    byte [ds:ebp+0Ah],1
+       jz      mark_undefined_data
+       ret
+      mark_undefined_data:
+       cmp     eax,[undefined_data_end]
+       je      undefined_data_ok
+       mov     [undefined_data_start],eax
+      undefined_data_ok:
+       mov     [undefined_data_end],edi
+       ret
+data_unicode:
+       or      [base_code],-1
+       jmp     define_words
+data_words:
+       mov     [base_code],0
+    define_words:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_word
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       and     word [edi],0
+       scas    word [edi]
+       jmp     undefined_data
+       ret
+      get_word:
+       cmp     [base_code],0
+       je      word_data_value
+       cmp     byte [esi],0
+       je      word_string
+      word_data_value:
+       call    get_word_value
+       call    mark_relocation
+       stos    word [edi]
+       ret
+      word_string:
+       inc     esi
+       lods    dword [esi]
+       mov     ecx,eax
+       jecxz   word_string_ok
+       lea     eax,[edi+ecx*2]
+       cmp     eax,[tagged_blocks]
+       ja      out_of_memory
+       xor     ah,ah
+      copy_word_string:
+       lods    byte [esi]
+       stos    word [edi]
+       loop    copy_word_string
+      word_string_ok:
+       inc     esi
+       ret
+data_dwords:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_dword
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       and     dword [edi],0
+       scas    dword [edi]
+       jmp     undefined_data
+      get_dword:
+       push    esi
+       call    get_dword_value
+       pop     ebx
+       cmp     byte [esi],':'
+       je      complex_dword
+       call    mark_relocation
+       stos    dword [edi]
+       ret
+      complex_dword:
+       mov     esi,ebx
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_word_value
+       push    eax
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[value_type]
+       push    eax
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_word_value
+       call    mark_relocation
+       stos    word [edi]
+       pop     eax
+       mov     [value_type],al
+       pop     eax
+       call    mark_relocation
+       stos    word [edi]
+       ret
+data_pwords:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_pword
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       and     dword [edi],0
+       scas    dword [edi]
+       and     word [edi],0
+       scas    word [edi]
+       jmp     undefined_data
+      get_pword:
+       push    esi
+       call    get_pword_value
+       pop     ebx
+       cmp     byte [esi],':'
+       je      complex_pword
+       call    mark_relocation
+       stos    dword [edi]
+       mov     ax,dx
+       stos    word [edi]
+       ret
+      complex_pword:
+       mov     esi,ebx
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_word_value
+       push    eax
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[value_type]
+       push    eax
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_dword_value
+       call    mark_relocation
+       stos    dword [edi]
+       pop     eax
+       mov     [value_type],al
+       pop     eax
+       call    mark_relocation
+       stos    word [edi]
+       ret
+data_qwords:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_qword
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       and     dword [edi],0
+       scas    dword [edi]
+       and     dword [edi],0
+       scas    dword [edi]
+       jmp     undefined_data
+      get_qword:
+       call    get_qword_value
+       call    mark_relocation
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       ret
+data_twords:
+       call    define_data
+       jc      instruction_assembled
+       lods    byte [esi]
+       cmp     al,'('
+       je      get_tword
+       cmp     al,'?'
+       jne     invalid_argument
+       mov     eax,edi
+       and     dword [edi],0
+       scas    dword [edi]
+       and     dword [edi],0
+       scas    dword [edi]
+       and     word [edi],0
+       scas    word [edi]
+       jmp     undefined_data
+      get_tword:
+       cmp     byte [esi],'.'
+       jne     complex_tword
+       inc     esi
+       cmp     word [esi+8],8000h
+       je      fp_zero_tword
+       mov     eax,[esi]
+       stos    dword [edi]
+       mov     eax,[esi+4]
+       stos    dword [edi]
+       mov     ax,[esi+8]
+       add     ax,3FFFh
+       jo      value_out_of_range
+       cmp     ax,7FFFh
+       jge     value_out_of_range
+       cmp     ax,0
+       jg      tword_exp_ok
+       mov     cx,ax
+       neg     cx
+       inc     cx
+       cmp     cx,64
+       jae     value_out_of_range
+       cmp     cx,32
+       ja      large_shift
+       mov     eax,[esi]
+       mov     edx,[esi+4]
+       mov     ebx,edx
+       shr     edx,cl
+       shrd    eax,ebx,cl
+       jmp     tword_mantissa_shift_done
+      large_shift:
+       sub     cx,32
+       xor     edx,edx
+       mov     eax,[esi+4]
+       shr     eax,cl
+      tword_mantissa_shift_done:
+       jnc     store_shifted_mantissa
+       add     eax,1
+       adc     edx,0
+      store_shifted_mantissa:
+       mov     [edi-8],eax
+       mov     [edi-4],edx
+       xor     ax,ax
+       test    edx,1 shl 31
+       jz      tword_exp_ok
+       inc     ax
+      tword_exp_ok:
+       mov     bl,[esi+11]
+       shl     bx,15
+       or      ax,bx
+       stos    word [edi]
+       add     esi,13
+       ret
+      fp_zero_tword:
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     al,[esi+11]
+       shl     ax,15
+       stos    word [edi]
+       add     esi,13
+       ret
+      complex_tword:
+       call    get_word_value
+       push    eax
+       cmp     byte [esi],':'
+       jne     invalid_operand
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[value_type]
+       push    eax
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_qword_value
+       call    mark_relocation
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       pop     eax
+       mov     [value_type],al
+       pop     eax
+       call    mark_relocation
+       stos    word [edi]
+       ret
+data_file:
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       add     esi,4
+       call    open_binary_file
+       mov     eax,[esi-4]
+       lea     esi,[esi+eax+1]
+       mov     al,2
+       xor     edx,edx
+       call    lseek
+       push    eax
+       xor     edx,edx
+       cmp     byte [esi],':'
+       jne     position_ok
+       inc     esi
+       cmp     byte [esi],'('
+       jne     invalid_argument
+       inc     esi
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    ebx
+       call    get_count_value
+       pop     ebx
+       mov     edx,eax
+       sub     [esp],edx
+       jc      value_out_of_range
+      position_ok:
+       cmp     byte [esi],','
+       jne     size_ok
+       inc     esi
+       cmp     byte [esi],'('
+       jne     invalid_argument
+       inc     esi
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    ebx edx
+       call    get_count_value
+       pop     edx ebx
+       cmp     eax,[esp]
+       ja      value_out_of_range
+       mov     [esp],eax
+      size_ok:
+       xor     al,al
+       call    lseek
+       pop     ecx
+       mov     edx,edi
+       add     edi,ecx
+       jc      out_of_memory
+       cmp     edi,[tagged_blocks]
+       ja      out_of_memory
+       call    read
+       jc      error_reading_file
+       call    close
+       lods    byte [esi]
+       cmp     al,','
+       je      data_file
+       dec     esi
+       jmp     instruction_assembled
+      open_binary_file:
+       push    esi
+       push    edi
+       mov     eax,[current_line]
+      find_current_source_path: 
+       mov     esi,[eax] 
+       test    byte [eax+7],80h 
+       jz      get_current_path 
+       mov     eax,[eax+8]
+       jmp     find_current_source_path
+      get_current_path:
+       lodsb
+       stosb
+       or      al,al
+       jnz     get_current_path
+      cut_current_path:
+       cmp     edi,[esp]
+       je      current_path_ok
+       cmp     byte [edi-1],'\'
+       je      current_path_ok
+       cmp     byte [edi-1],'/'
+       je      current_path_ok
+       dec     edi
+       jmp     cut_current_path
+      current_path_ok:
+       mov     esi,[esp+4]
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       jnc     file_opened
+       mov     edx,[include_paths]
+      search_in_include_paths:
+       push    edx esi
+       mov     edi,esi
+       mov     esi,[esp+4]
+       call    get_include_directory
+       mov     [esp+4],esi
+       mov     esi,[esp+8]
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       pop     edx
+       jnc     file_opened
+       cmp     byte [edx],0
+       jne     search_in_include_paths
+       mov     edi,esi
+       mov     esi,[esp]
+       push    edi
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       jc      file_not_found
+      file_opened:
+       mov     edi,esi
+       pop     esi
+       ret
+reserve_bytes:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       mov     edx,ecx
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_bytes
+       add     edi,ecx
+       jmp     reserved_data
+      zero_bytes:
+       xor     eax,eax
+       shr     ecx,1
+       jnc     bytes_stosb_ok
+       stos    byte [edi]
+      bytes_stosb_ok:
+       shr     ecx,1
+       jnc     bytes_stosw_ok
+       stos    word [edi]
+      bytes_stosw_ok:
+       rep     stos dword [edi]
+      reserved_data:
+       pop     eax
+       call    undefined_data
+       jmp     instruction_assembled
+reserve_words:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       mov     edx,ecx
+       shl     edx,1
+       jc      out_of_memory
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_words
+       lea     edi,[edi+ecx*2]
+       jmp     reserved_data
+      zero_words:
+       xor     eax,eax
+       shr     ecx,1
+       jnc     words_stosw_ok
+       stos    word [edi]
+      words_stosw_ok:
+       rep     stos dword [edi]
+       jmp     reserved_data
+reserve_dwords:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       mov     edx,ecx
+       shl     edx,1
+       jc      out_of_memory
+       shl     edx,1
+       jc      out_of_memory
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_dwords
+       lea     edi,[edi+ecx*4]
+       jmp     reserved_data
+      zero_dwords:
+       xor     eax,eax
+       rep     stos dword [edi]
+       jmp     reserved_data
+reserve_pwords:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       shl     ecx,1
+       jc      out_of_memory
+       add     ecx,eax
+       mov     edx,ecx
+       shl     edx,1
+       jc      out_of_memory
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_words
+       lea     edi,[edi+ecx*2]
+       jmp     reserved_data
+reserve_qwords:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       shl     ecx,1
+       jc      out_of_memory
+       mov     edx,ecx
+       shl     edx,1
+       jc      out_of_memory
+       shl     edx,1
+       jc      out_of_memory
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_dwords
+       lea     edi,[edi+ecx*4]
+       jmp     reserved_data
+reserve_twords:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     ecx,eax
+       shl     ecx,2
+       jc      out_of_memory
+       add     ecx,eax
+       mov     edx,ecx
+       shl     edx,1
+       jc      out_of_memory
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      zero_words
+       lea     edi,[edi+ecx*2]
+       jmp     reserved_data
+align_directive:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     edx,eax
+       dec     edx
+       test    eax,edx
+       jnz     invalid_align_value
+       or      eax,eax
+       jz      invalid_align_value
+       cmp     eax,1
+       je      instruction_assembled
+       mov     ecx,edi
+       mov     ebp,[addressing_space]
+       sub     ecx,[ds:ebp]
+       cmp     dword [ds:ebp+10h],0
+       jne     section_not_aligned_enough
+       cmp     byte [ds:ebp+9],0
+       je      make_alignment
+       cmp     [output_format],3
+       je      pe_alignment
+       cmp     [output_format],5
+       jne     object_alignment
+       test    [format_flags],1
+       jnz     pe_alignment
+      object_alignment:
+       mov     ebx,[ds:ebp+14h]
+       cmp     byte [ebx],0
+       jne     section_not_aligned_enough
+       cmp     eax,[ebx+10h]
+       jbe     make_alignment
+       jmp     section_not_aligned_enough
+      pe_alignment:
+       cmp     eax,1000h
+       ja      section_not_aligned_enough
+      make_alignment:
+       dec     eax
+       and     ecx,eax
+       jz      instruction_assembled
+       neg     ecx
+       add     ecx,eax
+       inc     ecx
+       mov     edx,ecx
+       add     edx,edi
+       jc      out_of_memory
+       cmp     edx,[tagged_blocks]
+       ja      out_of_memory
+       push    edi
+       cmp     [next_pass_needed],0
+       je      nops
+       add     edi,ecx
+       jmp     reserved_data
+      invalid_align_value:
+       cmp     [error_line],0
+       jne     instruction_assembled
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [error],invalid_value
+       jmp     instruction_assembled
+      nops:
+       mov     eax,90909090h
+       shr     ecx,1
+       jnc     nops_stosb_ok
+       stos    byte [edi]
+      nops_stosb_ok:
+       shr     ecx,1
+       jnc     nops_stosw_ok
+       stos    word [edi]
+      nops_stosw_ok:
+       rep     stos dword [edi]
+       jmp     reserved_data
+err_directive:
+       mov     al,[esi]
+       cmp     al,0Fh
+       je      invoked_error
+       or      al,al
+       jz      invoked_error
+       jmp     extra_characters_on_line
+assert_directive:
+       call    calculate_logical_expression
+       or      al,al
+       jnz     instruction_assembled
+       cmp     [error_line],0
+       jne     instruction_assembled
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [error],assertion_failed
+       jmp     instruction_assembled
diff --git a/source/avx.inc b/source/avx.inc
new file mode 100644 (file)
index 0000000..073fc73
--- /dev/null
@@ -0,0 +1,3425 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+avx_single_source_pd_instruction_er_evex:
+       or      [vex_required],8
+avx_single_source_pd_instruction_er:
+       or      [operand_flags],2+4+8
+       jmp     avx_pd_instruction
+avx_single_source_pd_instruction_sae_evex:
+       or      [vex_required],8
+       or      [operand_flags],2+4
+       jmp     avx_pd_instruction
+avx_pd_instruction_imm8:
+       mov     [immediate_size],1
+       jmp     avx_pd_instruction
+avx_pd_instruction_er:
+       or      [operand_flags],8
+avx_pd_instruction_sae:
+       or      [operand_flags],4
+avx_pd_instruction:
+       mov     [opcode_prefix],66h
+       or      [rex_prefix],80h
+       mov     cx,0800h
+       jmp     avx_instruction_with_broadcast
+avx_pd_instruction_38_evex:
+       or      [vex_required],8
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_pd_instruction
+avx_cvtps2dq_instruction:
+       mov     [opcode_prefix],66h
+       jmp     avx_single_source_ps_instruction_er
+avx_cvtudq2ps_instruction:
+       mov     [opcode_prefix],0F2h
+avx_single_source_ps_instruction_er_evex:
+       or      [vex_required],8
+avx_single_source_ps_instruction_er:
+       or      [operand_flags],2+4+8
+       jmp     avx_ps_instruction
+avx_single_source_ps_instruction_noevex:
+       or      [operand_flags],2
+       or      [vex_required],2
+       jmp     avx_ps_instruction
+avx_ps_instruction_imm8:
+       mov     [immediate_size],1
+       jmp     avx_ps_instruction
+avx_ps_instruction_er:
+       or      [operand_flags],8
+avx_ps_instruction_sae:
+       or      [operand_flags],4
+avx_ps_instruction:
+       mov     cx,0400h
+       jmp     avx_instruction_with_broadcast
+avx_ps_instruction_66_38_evex:
+       or      [vex_required],8
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_ps_instruction
+avx_sd_instruction_er:
+       or      [operand_flags],8
+avx_sd_instruction_sae:
+       or      [operand_flags],4
+avx_sd_instruction:
+       mov     [opcode_prefix],0F2h
+       or      [rex_prefix],80h
+       mov     cl,8
+       jmp     avx_instruction
+avx_ss_instruction_er:
+       or      [operand_flags],8
+avx_ss_instruction_sae:
+       or      [operand_flags],4
+avx_ss_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     cl,4
+       jmp     avx_instruction
+avx_ss_instruction_noevex:
+       or      [vex_required],2
+       jmp     avx_ss_instruction
+avx_single_source_q_instruction_38_evex:
+       or      [operand_flags],2
+avx_q_instruction_38_evex:
+       or      [vex_required],8
+avx_q_instruction_38:
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_q_instruction
+avx_q_instruction_38_w1_evex:
+       or      [vex_required],8
+avx_q_instruction_38_w1:
+       or      [rex_prefix],8
+       jmp     avx_q_instruction_38
+avx_q_instruction_3a_imm8_w1:
+       or      [rex_prefix],8
+       jmp     avx_q_instruction_3a_imm8
+avx_q_instruction_3a_imm8_evex:
+       or      [vex_required],8
+avx_q_instruction_3a_imm8:
+       mov     [immediate_size],1
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     avx_q_instruction
+avx_q_instruction_evex:
+       or      [vex_required],8
+avx_q_instruction:
+       or      [rex_prefix],80h
+       mov     ch,8
+       jmp     avx_pi_instruction
+avx_single_source_d_instruction_38_evex_w1:
+       or      [rex_prefix],8
+avx_single_source_d_instruction_38_evex:
+       or      [vex_required],8
+avx_single_source_d_instruction_38:
+       or      [operand_flags],2
+       jmp     avx_d_instruction_38
+avx_d_instruction_38_evex:
+       or      [vex_required],8
+avx_d_instruction_38:
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_d_instruction
+avx_d_instruction_3a_imm8_evex:
+       mov     [immediate_size],1
+       or      [vex_required],8
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     avx_d_instruction
+avx_single_source_d_instruction_imm8:
+       or      [operand_flags],2
+       mov     [immediate_size],1
+       jmp     avx_d_instruction
+avx_d_instruction_evex:
+       or      [vex_required],8
+avx_d_instruction:
+       mov     ch,4
+       jmp     avx_pi_instruction
+avx_bw_instruction_3a_imm8_w1_evex:
+       or      [rex_prefix],8
+avx_bw_instruction_3a_imm8_evex:
+       mov     [immediate_size],1
+       or      [vex_required],8
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     avx_bw_instruction
+avx_single_source_bw_instruction_38:
+       or      [operand_flags],2
+avx_bw_instruction_38:
+       mov     [supplemental_code],al
+       mov     al,38h
+avx_bw_instruction:
+       xor     ch,ch
+      avx_pi_instruction:
+       mov     [opcode_prefix],66h
+       xor     cl,cl
+       jmp     avx_instruction_with_broadcast
+avx_bw_instruction_38_w1_evex:
+       or      [rex_prefix],8
+avx_bw_instruction_38_evex:
+       or      [vex_required],8
+       jmp     avx_bw_instruction_38
+avx_pd_instruction_noevex:
+       xor     cl,cl
+       or      [vex_required],2
+       mov     [opcode_prefix],66h
+       jmp     avx_instruction
+avx_ps_instruction_noevex:
+       or      [vex_required],2
+       mov     [opcode_prefix],0F2h
+       xor     cl,cl
+       jmp     avx_instruction
+avx_instruction:
+       xor     ch,ch
+      avx_instruction_with_broadcast:
+       mov     [mmx_size],cl
+       mov     [broadcast_size],ch
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+      avx_xop_common:
+       or      [vex_required],1
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+      avx_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+      avx_vex_reg:
+       test    [operand_flags],2
+       jnz     avx_vex_reg_ok
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+      avx_vex_reg_ok:
+       mov     al,[mmx_size]
+       or      al,al
+       jz      avx_regs_size_ok
+       mov     ah,[operand_size]
+       or      ah,ah
+       jz      avx_regs_size_ok
+       cmp     al,ah
+       je      avx_regs_size_ok
+       ja      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      avx_regs_size_ok:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+      avx_regs_rm:
+       call    take_avx_rm
+       jc      avx_regs_reg
+       mov     al,[immediate_size]
+       cmp     al,1
+       je      mmx_imm8
+       jb      instruction_ready
+       cmp     al,-4
+       je      sse_cmp_mem_ok
+       cmp     byte [esi],','
+       jne     invalid_operand
+       inc     esi
+       call    take_avx_register
+       shl     al,4
+       jc      invalid_operand
+       or      byte [value],al
+       test    al,80h
+       jz      avx_regs_mem_reg_store
+       cmp     [code_type],64
+       jne     invalid_operand
+      avx_regs_mem_reg_store:
+       call    take_imm4_if_needed
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      avx_regs_reg:
+       mov     bl,al
+       call    take_avx512_rounding
+       mov     al,[immediate_size]
+       cmp     al,1
+       je      mmx_nomem_imm8
+       jb      nomem_instruction_ready
+       cmp     al,-4
+       je      sse_cmp_nomem_ok
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     al,bl
+       shl     al,4
+       jc      invalid_operand
+       or      byte [value],al
+       test    al,80h
+       jz      avx_regs_reg_
+       cmp     [code_type],64
+       jne     invalid_operand
+      avx_regs_reg_:
+       call    take_avx_rm
+       jc      avx_regs_reg_reg
+       cmp     [immediate_size],-2
+       jg      invalid_operand
+       or      [rex_prefix],8
+       call    take_imm4_if_needed
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      avx_regs_reg_reg:
+       shl     al,4
+       jc      invalid_operand
+       and     byte [value],1111b
+       or      byte [value],al
+       call    take_imm4_if_needed
+       call    store_nomem_instruction
+       mov     al,byte [value]
+       stos    byte [edi]
+       jmp     instruction_assembled
+      take_avx_rm:
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      take_avx_mem
+       cmp     al,10h
+       jne     invalid_operand
+       mov     [operand_size],cl
+       lods    byte [esi]
+       call    convert_avx_register
+       or      cl,cl
+       jnz     avx_reg_ok
+       or      cl,[mmx_size]
+       jz      avx_reg_ok
+       cmp     ah,cl
+       je      avx_reg_ok
+       jb      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      avx_reg_ok:
+       stc
+       ret
+      take_avx_mem:
+       push    ecx
+       call    get_address
+       cmp     byte [esi],'{'
+       jne     avx_mem_ok
+       inc     esi
+       lods    byte [esi]
+       cmp     al,1Fh
+       jne     invalid_operand
+       mov     al,[esi]
+       shr     al,4
+       cmp     al,1
+       jne     invalid_operand
+       mov     al,[mmx_size]
+       or      al,al
+       jnz     avx_mem_broadcast_check
+       mov     eax,[esp]
+       or      al,al
+       jnz     avx_mem_broadcast_check
+       mov     al,[broadcast_size]
+       mov     [mmx_size],al
+       mov     ah,cl
+       lods    byte [esi]
+       and     al,1111b
+       mov     cl,al
+       mov     al,[broadcast_size]
+       shl     al,cl
+       mov     [esp],al
+       mov     cl,ah
+       jmp     avx_mem_broadcast_ok
+      avx_mem_broadcast_check:
+       bsf     eax,eax
+       xchg    al,[broadcast_size]
+       mov     [mmx_size],al
+       bsf     eax,eax
+       jz      invalid_operand
+       mov     ah,[broadcast_size]
+       sub     ah,al
+       lods    byte [esi]
+       and     al,1111b
+       cmp     al,ah
+       jne     invalid_operand_size
+      avx_mem_broadcast_ok:
+       or      [vex_required],40h
+       lods    byte [esi]
+       cmp     al,'}'
+       jne     invalid_operand
+      avx_mem_ok:
+       pop     eax
+       or      al,al
+       jz      avx_mem_size_deciding
+       xchg    al,[operand_size]
+       cmp     [mmx_size],0
+       jne     avx_mem_size_enforced
+       or      al,al
+       jz      avx_mem_size_ok
+       cmp     al,[operand_size]
+       jne     operand_sizes_do_not_match
+      avx_mem_size_ok:
+       clc
+       ret
+      avx_mem_size_deciding:
+       mov     al,[operand_size]
+       cmp     [mmx_size],0
+       jne     avx_mem_size_enforced
+       cmp     al,16
+       je      avx_mem_size_ok
+       cmp     al,32
+       je      avx_mem_size_ok
+       cmp     al,64
+       je      avx_mem_size_ok
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+      avx_mem_size_enforced:
+       or      al,al
+       jz      avx_mem_size_ok
+       cmp     al,[mmx_size]
+       je      avx_mem_size_ok
+       jmp     invalid_operand_size
+      take_imm4_if_needed:
+       cmp     [immediate_size],-3
+       jne     imm4_ok
+       push    ebx ecx edx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       test    al,11110000b
+       jnz     value_out_of_range
+       or      byte [value],al
+       pop     edx ecx ebx
+      imm4_ok:
+       ret
+      take_avx512_mask:
+       cmp     byte [esi],'{'
+       jne     avx512_masking_ok
+       test    [operand_flags],10h
+       jnz     invalid_operand
+       inc     esi
+       lods    byte [esi]
+       cmp     al,14h
+       jne     invalid_operand
+       lods    byte [esi]
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,5
+       jne     invalid_operand
+       and     al,111b
+       or      al,al
+       jz      invalid_operand
+       mov     [mask_register],al
+       or      [vex_required],20h
+       lods    byte [esi]
+       cmp     al,'}'
+       jne     invalid_operand
+       cmp     byte [esi],'{'
+       jne     avx512_masking_ok
+       test    [operand_flags],20h
+       jnz     invalid_operand
+       inc     esi
+       lods    byte [esi]
+       cmp     al,1Fh
+       jne     invalid_operand
+       lods    byte [esi]
+       or      al,al
+       jnz     invalid_operand
+       or      [mask_register],80h
+       lods    byte [esi]
+       cmp     al,'}'
+       jne     invalid_operand
+      avx512_masking_ok:
+       retn
+      take_avx512_rounding:
+       test    [operand_flags],4+8
+       jz      avx512_rounding_done
+       test    [operand_flags],8
+       jz      avx512_rounding_allowed
+       cmp     [mmx_size],0
+       jne     avx512_rounding_allowed
+       cmp     [operand_size],64
+       jne     avx512_rounding_done
+      avx512_rounding_allowed:
+       cmp     byte [esi],','
+       jne     avx512_rounding_done
+       cmp     byte [esi+1],'{'
+       jne     avx512_rounding_done
+       add     esi,2
+       mov     [rounding_mode],0
+       or      [vex_required],40h
+       test    [operand_flags],8
+       jz      take_sae
+       or      [vex_required],80h
+       lods    byte [esi]
+       cmp     al,1Fh
+       jne     invalid_operand
+       lods    byte [esi]
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,2
+       jne     invalid_operand
+       and     al,11b
+       mov     [rounding_mode],al
+       lods    byte [esi]
+       cmp     al,'-'
+       jne     invalid_operand
+      take_sae:
+       lods    byte [esi]
+       cmp     al,1Fh
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,30h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,'}'
+       jne     invalid_operand
+      avx512_rounding_done:
+       retn
+
+avx_movdqu_instruction:
+       mov     ah,0F3h
+       jmp     avx_movdq_instruction
+avx_movdqa_instruction:
+       mov     ah,66h
+      avx_movdq_instruction:
+       mov     [opcode_prefix],ah
+       or      [vex_required],2
+       jmp     avx_movps_instruction
+avx512_movdqu16_instruction:
+       or      [rex_prefix],8
+avx512_movdqu8_instruction:
+       mov     ah,0F2h
+       jmp     avx_movdq_instruction_evex
+avx512_movdqu64_instruction:
+       or      [rex_prefix],8
+avx512_movdqu32_instruction:
+       mov     ah,0F3h
+       jmp     avx_movdq_instruction_evex
+avx512_movdqa64_instruction:
+       or      [rex_prefix],8
+avx512_movdqa32_instruction:
+       mov     ah,66h
+      avx_movdq_instruction_evex:
+       mov     [opcode_prefix],ah
+       or      [vex_required],8
+       jmp     avx_movps_instruction
+avx_movpd_instruction:
+       mov     [opcode_prefix],66h
+       or      [rex_prefix],80h
+avx_movps_instruction:
+       or      [operand_flags],2
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       xor     al,al
+       mov     [mmx_size],al
+       mov     [broadcast_size],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_reg
+       inc     [extended_code]
+       test    [extended_code],1
+       jnz     avx_mem
+       add     [extended_code],-1+10h
+      avx_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      [operand_flags],20h
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+avx_movntpd_instruction:
+       or      [rex_prefix],80h
+avx_movntdq_instruction:
+       mov     [opcode_prefix],66h
+avx_movntps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       or      [operand_flags],10h
+       mov     [mmx_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       jmp     avx_mem
+avx_compress_q_instruction:
+       or      [rex_prefix],8
+avx_compress_d_instruction:
+       or      [vex_required],8
+       mov     [mmx_size],0
+       call    setup_66_0f_38
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     avx_mem
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [postbyte_register],al
+       jmp     nomem_instruction_ready
+avx_lddqu_instruction:
+       mov     ah,0F2h
+       or      [vex_required],2
+      avx_load_instruction:
+       mov     [opcode_prefix],ah
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],0
+       or      [vex_required],1
+       call    take_avx_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     instruction_ready
+avx_movntdqa_instruction:
+       mov     [supplemental_code],al
+       mov     al,38h
+       mov     ah,66h
+       jmp     avx_load_instruction
+avx_movq_instruction:
+       or      [rex_prefix],8
+       mov     [mmx_size],8
+       jmp     avx_mov_instruction
+avx_movd_instruction:
+       mov     [mmx_size],4
+      avx_mov_instruction:
+       or      [vex_required],1
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],7Eh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_movd_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[mmx_size]
+       not     al
+       and     [operand_size],al
+       jnz     invalid_operand_size
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       cmp     [mmx_size],8
+       jne     instruction_ready
+       and     [rex_prefix],not 8
+       or      [rex_prefix],80h
+       mov     [extended_code],0D6h
+       jmp     instruction_ready
+      avx_movd_reg:
+       lods    byte [esi]
+       cmp     al,0C0h
+       jae     avx_movd_xmmreg
+       call    convert_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     [operand_size],0
+       mov     bl,al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+      avx_movd_reg_ready:
+       test    [rex_prefix],8
+       jz      nomem_instruction_ready
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     nomem_instruction_ready
+      avx_movd_xmmreg:
+       sub     [extended_code],10h
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_movd_xmmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[mmx_size]
+       cmp     al,8
+       jne     avx_movd_xmmreg_mem_ready
+       call    avx_movq_xmmreg_xmmreg_opcode
+      avx_movd_xmmreg_mem_ready:
+       not     al
+       test    [operand_size],al
+       jnz     invalid_operand_size
+       jmp     instruction_ready
+      avx_movd_xmmreg_reg:
+       lods    byte [esi]
+       cmp     al,0C0h
+       jae     avx_movq_xmmreg_xmmreg
+       call    convert_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     avx_movd_reg_ready
+      avx_movq_xmmreg_xmmreg:
+       cmp     [mmx_size],8
+       jne     invalid_operand
+       call    avx_movq_xmmreg_xmmreg_opcode
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      avx_movq_xmmreg_xmmreg_opcode:
+       and     [rex_prefix],not 8
+       or      [rex_prefix],80h
+       add     [extended_code],10h
+       mov     [opcode_prefix],0F3h
+       ret
+avx_movddup_instruction:
+       or      [vex_required],1
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [rex_prefix],80h
+       xor     al,al
+       mov     [mmx_size],al
+       mov     [broadcast_size],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [postbyte_register],al
+       cmp     ah,16
+       ja      avx_movddup_size_ok
+       mov     [mmx_size],8
+      avx_movddup_size_ok:
+       call    take_avx512_mask
+       jmp     avx_vex_reg_ok
+avx_movlpd_instruction:
+       mov     [opcode_prefix],66h
+       or      [rex_prefix],80h
+avx_movlps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],8
+       mov     [broadcast_size],0
+       or      [vex_required],1
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     avx_movlps_mem
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       cmp     [operand_size],16
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_rm
+       jc      invalid_operand
+       jmp     instruction_ready
+      avx_movlps_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+      avx_movlps_mem_:
+       mov     al,[operand_size]
+       or      al,al
+       jz      avx_movlps_mem_size_ok
+       cmp     al,[mmx_size]
+       jne     invalid_operand_size
+       mov     [operand_size],0
+      avx_movlps_mem_size_ok:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       cmp     ah,16
+       jne     invalid_operand
+       mov     [postbyte_register],al
+       inc     [extended_code]
+       jmp     instruction_ready
+avx_movhlps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       call    take_avx_register
+       cmp     ah,16
+       jne     invalid_operand
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+avx_movsd_instruction:
+       mov     al,0F2h
+       mov     cl,8
+       or      [rex_prefix],80h
+       jmp     avx_movs_instruction
+avx_movss_instruction:
+       mov     al,0F3h
+       mov     cl,4
+      avx_movs_instruction:
+       mov     [opcode_prefix],al
+       mov     [mmx_size],cl
+       or      [vex_required],1
+       mov     [base_code],0Fh
+       mov     [extended_code],10h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     avx_movs_mem
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     avx_movs_reg_mem
+       mov     [operand_size],cl
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     bl,al
+       cmp     bl,8
+       jb      nomem_instruction_ready
+       inc     [extended_code]
+       xchg    bl,[postbyte_register]
+       jmp     nomem_instruction_ready
+      avx_movs_reg_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      avx_movs_reg_mem_ok
+       cmp     al,[mmx_size]
+       jne     invalid_operand_size
+      avx_movs_reg_mem_ok:
+       jmp     instruction_ready
+      avx_movs_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      [operand_flags],20h
+       call    take_avx512_mask
+       jmp     avx_movlps_mem_
+
+avx_comiss_instruction:
+       or      [operand_flags],2+4+10h
+       mov     cl,4
+       jmp     avx_instruction
+avx_comisd_instruction:
+       or      [operand_flags],2+4+10h
+       mov     [opcode_prefix],66h
+       or      [rex_prefix],80h
+       mov     cl,8
+       jmp     avx_instruction
+avx_movshdup_instruction:
+       or      [operand_flags],2
+       mov     [opcode_prefix],0F3h
+       xor     cl,cl
+       jmp     avx_instruction
+avx_cvtqq2pd_instruction:
+       mov     [opcode_prefix],0F3h
+       or      [vex_required],8
+       or      [operand_flags],2+4+8
+       or      [rex_prefix],8
+       mov     cx,0800h
+       jmp     avx_instruction_with_broadcast
+avx_pshuf_w_instruction:
+       mov     [opcode_prefix],al
+       or      [operand_flags],2
+       mov     [immediate_size],1
+       mov     al,70h
+       xor     cl,cl
+       jmp     avx_instruction
+avx_single_source_128bit_instruction_38_noevex:
+       or      [operand_flags],2
+avx_128bit_instruction_38_noevex:
+       mov     cl,16
+       jmp     avx_instruction_38_noevex
+avx_single_source_instruction_38_noevex:
+       or      [operand_flags],2
+       jmp     avx_pi_instruction_38_noevex
+avx_pi_instruction_38_noevex:
+       xor     cl,cl
+      avx_instruction_38_noevex:
+       or      [vex_required],2
+      avx_instruction_38:
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_instruction
+avx_ss_instruction_3a_imm8_noevex:
+       mov     cl,4
+       jmp     avx_instruction_3a_imm8_noevex
+avx_sd_instruction_3a_imm8_noevex:
+       mov     cl,8
+       jmp     avx_instruction_3a_imm8_noevex
+avx_single_source_128bit_instruction_3a_imm8_noevex:
+       or      [operand_flags],2
+avx_128bit_instruction_3a_imm8_noevex:
+       mov     cl,16
+       jmp     avx_instruction_3a_imm8_noevex
+avx_triple_source_instruction_3a_noevex:
+       xor     cl,cl
+       mov     [immediate_size],-1
+       mov     byte [value],0
+       jmp     avx_instruction_3a_noevex
+avx_single_source_instruction_3a_imm8_noevex:
+       or      [operand_flags],2
+avx_pi_instruction_3a_imm8_noevex:
+       xor     cl,cl
+      avx_instruction_3a_imm8_noevex:
+       mov     [immediate_size],1
+      avx_instruction_3a_noevex:
+       or      [vex_required],2
+      avx_instruction_3a:
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     avx_instruction
+avx_pi_instruction_3a_imm8:
+       xor     cl,cl
+       mov     [immediate_size],1
+       jmp     avx_instruction_3a
+avx_pclmulqdq_instruction:
+       mov     byte [value],al
+       mov     [immediate_size],-4
+       xor     cl,cl
+       mov     al,44h
+       or      [operand_flags],10h
+       jmp     avx_instruction_3a
+avx_instruction_38_nomask:
+       or      [operand_flags],10h
+       xor     cl,cl
+       jmp     avx_instruction_38
+
+avx512_single_source_pd_instruction_sae_imm8:
+       or      [operand_flags],2
+avx512_pd_instruction_sae_imm8:
+       or      [rex_prefix],8
+       mov     cx,0800h
+       jmp     avx512_instruction_sae_imm8
+avx512_single_source_ps_instruction_sae_imm8:
+       or      [operand_flags],2
+avx512_ps_instruction_sae_imm8:
+       mov     cx,0400h
+       jmp     avx512_instruction_sae_imm8
+avx512_sd_instruction_sae_imm8:
+       or      [rex_prefix],8
+       mov     cx,0008h
+       jmp     avx512_instruction_sae_imm8
+avx512_ss_instruction_sae_imm8:
+       mov     cx,0004h
+      avx512_instruction_sae_imm8:
+       or      [operand_flags],4
+      avx512_instruction_imm8:
+       or      [vex_required],8
+       mov     [opcode_prefix],66h
+       mov     [immediate_size],1
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     avx_instruction_with_broadcast
+avx512_pd_instruction_er:
+       or      [operand_flags],4+8
+       jmp     avx512_pd_instruction
+avx512_single_source_pd_instruction_sae:
+       or      [operand_flags],4
+avx512_single_source_pd_instruction:
+       or      [operand_flags],2
+avx512_pd_instruction:
+       or      [rex_prefix],8
+       mov     cx,0800h
+       jmp     avx512_instruction
+avx512_ps_instruction_er:
+       or      [operand_flags],4+8
+       jmp     avx512_ps_instruction
+avx512_single_source_ps_instruction_sae:
+       or      [operand_flags],4
+avx512_single_source_ps_instruction:
+       or      [operand_flags],2
+avx512_ps_instruction:
+       mov     cx,0400h
+       jmp     avx512_instruction
+avx512_sd_instruction_er:
+       or      [operand_flags],8
+avx512_sd_instruction_sae:
+       or      [operand_flags],4
+avx512_sd_instruction:
+       or      [rex_prefix],8
+       mov     cx,0008h
+       jmp     avx512_instruction
+avx512_ss_instruction_er:
+       or      [operand_flags],8
+avx512_ss_instruction_sae:
+       or      [operand_flags],4
+avx512_ss_instruction:
+       mov     cx,0004h
+      avx512_instruction:
+       or      [vex_required],8
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_instruction_with_broadcast
+avx512_exp2pd_instruction:
+       or      [rex_prefix],8
+       or      [operand_flags],2+4
+       mov     cx,0840h
+       jmp     avx512_instruction
+avx512_exp2ps_instruction:
+       or      [operand_flags],2+4
+       mov     cx,0440h
+       jmp     avx512_instruction
+
+fma_instruction_pd:
+       or      [rex_prefix],8
+       mov     cx,0800h
+       jmp     fma_instruction
+fma_instruction_ps:
+       mov     cx,0400h
+       jmp     fma_instruction
+fma_instruction_sd:
+       or      [rex_prefix],8
+       mov     cx,0008h
+       jmp     fma_instruction
+fma_instruction_ss:
+       mov     cx,0004h
+      fma_instruction:
+       or      [operand_flags],4+8
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_instruction_with_broadcast
+
+fma4_instruction_p:
+       xor     cl,cl
+       jmp     fma4_instruction
+fma4_instruction_sd:
+       mov     cl,8
+       jmp     fma4_instruction
+fma4_instruction_ss:
+       mov     cl,4
+      fma4_instruction:
+       mov     [immediate_size],-2
+       mov     byte [value],0
+       jmp     avx_instruction_3a_noevex
+
+avx_cmp_pd_instruction:
+       mov     [opcode_prefix],66h
+       or      [rex_prefix],80h
+       mov     cx,0800h
+       jmp     avx_cmp_instruction
+avx_cmp_ps_instruction:
+       mov     cx,0400h
+       jmp     avx_cmp_instruction
+avx_cmp_sd_instruction:
+       mov     [opcode_prefix],0F2h
+       or      [rex_prefix],80h
+       mov     cx,0008h
+       jmp     avx_cmp_instruction
+avx_cmp_ss_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     cx,0004h
+      avx_cmp_instruction:
+       mov     byte [value],al
+       mov     [immediate_size],-4
+       or      [operand_flags],4+20h
+       mov     al,0C2h
+       jmp     avx_cmp_common
+avx_cmpeqq_instruction:
+       or      [rex_prefix],80h
+       mov     ch,8
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     avx_cmp_pi_instruction
+avx_cmpeqd_instruction:
+       mov     ch,4
+       jmp     avx_cmp_pi_instruction
+avx_cmpeqb_instruction:
+       xor     ch,ch
+       jmp     avx_cmp_pi_instruction
+avx512_cmp_uq_instruction:
+       or      [rex_prefix],8
+       mov     ch,8
+       mov     ah,1Eh
+       jmp     avx_cmp_pi_instruction_evex
+avx512_cmp_ud_instruction:
+       mov     ch,4
+       mov     ah,1Eh
+       jmp     avx_cmp_pi_instruction_evex
+avx512_cmp_q_instruction:
+       or      [rex_prefix],8
+       mov     ch,8
+       mov     ah,1Fh
+       jmp     avx_cmp_pi_instruction_evex
+avx512_cmp_d_instruction:
+       mov     ch,4
+       mov     ah,1Fh
+       jmp     avx_cmp_pi_instruction_evex
+avx512_cmp_uw_instruction:
+       or      [rex_prefix],8
+avx512_cmp_ub_instruction:
+       xor     ch,ch
+       mov     ah,3Eh
+       jmp     avx_cmp_pi_instruction_evex
+avx512_cmp_w_instruction:
+       or      [rex_prefix],8
+avx512_cmp_b_instruction:
+       xor     ch,ch
+       mov     ah,3Fh
+      avx_cmp_pi_instruction_evex:
+       mov     byte [value],al
+       mov     [immediate_size],-4
+       mov     [supplemental_code],ah
+       mov     al,3Ah
+       or      [vex_required],8
+      avx_cmp_pi_instruction:
+       xor     cl,cl
+       or      [operand_flags],20h
+       mov     [opcode_prefix],66h
+      avx_cmp_common:
+       mov     [mmx_size],cl
+       mov     [broadcast_size],ch
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,14h
+       je      avx_maskreg
+       cmp     al,10h
+       jne     invalid_operand
+       or      [vex_required],2
+       jmp     avx_reg
+      avx_maskreg:
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+       or      [vex_required],8
+       lods    byte [esi]
+       call    convert_mask_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       jmp     avx_vex_reg
+avx512_fpclasspd_instruction:
+       or      [rex_prefix],8
+       mov     cx,0800h
+       jmp     avx_fpclass_instruction
+avx512_fpclassps_instruction:
+       mov     cx,0400h
+       jmp     avx_fpclass_instruction
+avx512_fpclasssd_instruction:
+       or      [rex_prefix],8
+       mov     cx,0008h
+       jmp     avx_fpclass_instruction
+avx512_fpclassss_instruction:
+       mov     cx,0004h
+      avx_fpclass_instruction:
+       mov     [broadcast_size],ch
+       mov     [mmx_size],cl
+       or      [operand_flags],2
+       call    setup_66_0f_3a
+       mov     [immediate_size],1
+       lods    byte [esi]
+       cmp     al,14h
+       je      avx_maskreg
+       jmp     invalid_operand
+avx512_ptestnmd_instruction:
+       mov     ch,4
+       jmp     avx512_ptestnm_instruction
+avx512_ptestnmq_instruction:
+       or      [rex_prefix],8
+       mov     ch,8
+       jmp     avx512_ptestnm_instruction
+avx512_ptestnmw_instruction:
+       or      [rex_prefix],8
+avx512_ptestnmb_instruction:
+       xor     ch,ch
+      avx512_ptestnm_instruction:
+       mov     ah,0F3h
+       jmp     avx512_ptest_instruction
+avx512_ptestmd_instruction:
+       mov     ch,4
+       jmp     avx512_ptestm_instruction
+avx512_ptestmq_instruction:
+       or      [rex_prefix],8
+       mov     ch,8
+       jmp     avx512_ptestm_instruction
+avx512_ptestmw_instruction:
+       or      [rex_prefix],8
+avx512_ptestmb_instruction:
+       xor     ch,ch
+      avx512_ptestm_instruction:
+       mov     ah,66h
+      avx512_ptest_instruction:
+       xor     cl,cl
+       mov     [opcode_prefix],ah
+       mov     [supplemental_code],al
+       mov     al,38h
+       or      [vex_required],8
+       jmp     avx_cmp_common
+
+mask_shift_instruction_q:
+       or      [rex_prefix],8
+mask_shift_instruction_d:
+       or      [operand_flags],2
+       or      [immediate_size],1
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       jmp     mask_instruction
+mask_instruction_single_source_b:
+       mov     [opcode_prefix],66h
+       jmp     mask_instruction_single_source_w
+mask_instruction_single_source_d:
+       mov     [opcode_prefix],66h
+mask_instruction_single_source_q:
+       or      [rex_prefix],8
+mask_instruction_single_source_w:
+       or      [operand_flags],2
+       jmp     mask_instruction
+mask_instruction_b:
+       mov     [opcode_prefix],66h
+       jmp     mask_instruction_w
+mask_instruction_d:
+       mov     [opcode_prefix],66h
+mask_instruction_q:
+       or      [rex_prefix],8
+mask_instruction_w:
+       mov     [operand_size],32
+mask_instruction:
+       or      [vex_required],1
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_mask_register
+       mov     [postbyte_register],al
+       test    [operand_flags],2
+       jnz     mask_instruction_nds_ok
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_mask_register
+       mov     [vex_register],al
+      mask_instruction_nds_ok:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_mask_register
+       mov     bl,al
+       cmp     [immediate_size],0
+       jne     mmx_nomem_imm8
+       jmp     nomem_instruction_ready
+take_mask_register:
+       lods    byte [esi]
+       cmp     al,14h
+       jne     invalid_operand
+       lods    byte [esi]
+convert_mask_register:
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,5
+       jne     invalid_operand
+       and     al,1111b
+       ret
+kmov_instruction:
+       mov     [mmx_size],al
+       or      [vex_required],1
+       mov     [base_code],0Fh
+       mov     [extended_code],90h
+       lods    byte [esi]
+       cmp     al,14h
+       je      kmov_maskreg
+       cmp     al,10h
+       je      kmov_reg
+       call    get_size_operator
+       inc     [extended_code]
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_mask_register
+       mov     [postbyte_register],al
+      kmov_with_mem:
+       mov     ah,[mmx_size]
+       mov     al,[operand_size]
+       or      al,al
+       jz      kmov_mem_size_ok
+       cmp     al,ah
+       jne     invalid_operand_size
+      kmov_mem_size_ok:
+       call    setup_kmov_prefix
+       jmp     instruction_ready
+      setup_kmov_prefix:
+       cmp     ah,4
+       jb      kmov_w_ok
+       or      [rex_prefix],8
+      kmov_w_ok:
+       test    ah,1 or 4
+       jz      kmov_prefix_ok
+       mov     [opcode_prefix],66h
+      kmov_prefix_ok:
+       ret
+      kmov_maskreg:
+       lods    byte [esi]
+       call    convert_mask_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,14h
+       je      kmov_maskreg_maskreg
+       cmp     al,10h
+       je      kmov_maskreg_reg
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       jmp     kmov_with_mem
+      kmov_maskreg_maskreg:
+       lods    byte [esi]
+       call    convert_mask_register
+       mov     bl,al
+       mov     ah,[mmx_size]
+       call    setup_kmov_prefix
+       jmp     nomem_instruction_ready
+      kmov_maskreg_reg:
+       add     [extended_code],2
+       lods    byte [esi]
+       call    convert_register
+      kmov_with_reg:
+       mov     bl,al
+       mov     al,[mmx_size]
+       mov     ah,4
+       cmp     al,ah
+       jbe     kmov_reg_size_check
+       mov     ah,al
+      kmov_reg_size_check:
+       cmp     ah,[operand_size]
+       jne     invalid_operand_size
+       cmp     al,8
+       je      kmov_f2_w1
+       cmp     al,2
+       ja      kmov_f2
+       je      nomem_instruction_ready
+       mov     [opcode_prefix],66h
+       jmp     nomem_instruction_ready
+      kmov_f2_w1:
+       or      [rex_prefix],8
+       cmp     [code_type],64
+       jne     illegal_instruction
+      kmov_f2:
+       mov     [opcode_prefix],0F2h
+       jmp     nomem_instruction_ready
+      kmov_reg:
+       add     [extended_code],3
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_mask_register
+       jmp     kmov_with_reg
+avx512_pmov_m2_instruction_w1:
+       or      [rex_prefix],8
+avx512_pmov_m2_instruction:
+       or      [vex_required],8
+       call    setup_f3_0f_38
+       call    take_avx_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_mask_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+avx512_pmov_2m_instruction_w1:
+       or      [rex_prefix],8
+avx512_pmov_2m_instruction:
+       or      [vex_required],8
+       call    setup_f3_0f_38
+       call    take_mask_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      setup_f3_0f_38:
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],0F3h
+       ret
+
+vzeroall_instruction:
+       mov     [operand_size],32
+vzeroupper_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       and     [displacement_compression],0
+       call    store_vex_instruction_code
+       jmp     instruction_assembled
+vstmxcsr_instruction:
+       or      [vex_required],2
+       jmp     stmxcsr_instruction
+
+avx_perm2f128_instruction:
+       or      [vex_required],2
+       xor     ch,ch
+      avx_instruction_imm8_without_128bit:
+       mov     [immediate_size],1
+       mov     ah,3Ah
+       jmp     avx_instruction_without_128bit
+avx512_shuf_q_instruction:
+       or      [rex_prefix],8
+       or      [vex_required],8
+       mov     ch,8
+       jmp     avx_instruction_imm8_without_128bit
+avx512_shuf_d_instruction:
+       or      [vex_required],8
+       mov     ch,4
+       jmp     avx_instruction_imm8_without_128bit
+avx_permd_instruction:
+       mov     ah,38h
+       mov     ch,4
+      avx_instruction_without_128bit:
+       xor     cl,cl
+       call    setup_avx_66_supplemental
+       call    take_avx_register
+       cmp     ah,32
+       jb      invalid_operand_size
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       jmp     avx_vex_reg
+      setup_avx_66_supplemental:
+       mov     [opcode_prefix],66h
+       mov     [broadcast_size],ch
+       mov     [mmx_size],cl
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [supplemental_code],al
+       or      [vex_required],1
+       ret
+avx_permq_instruction:
+       or      [rex_prefix],8
+       mov     ch,8
+       jmp     avx_permil_instruction
+avx_permilpd_instruction:
+       or      [rex_prefix],80h
+       mov     ch,8
+       jmp     avx_permil_instruction
+avx_permilps_instruction:
+       mov     ch,4
+      avx_permil_instruction:
+       or      [operand_flags],2
+       xor     cl,cl
+       mov     ah,3Ah
+       call    setup_avx_66_supplemental
+       call    take_avx_register
+       cmp     [supplemental_code],4
+       jae     avx_permil_size_ok
+       cmp     ah,32
+       jb      invalid_operand_size
+      avx_permil_size_ok:
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_rm
+       jnc     mmx_imm8
+       mov     bl,al
+       cmp     byte [esi],','
+       jne     invalid_operand
+       mov     al,[esi+1]
+       cmp     al,11h
+       jne     avx_permil_rm_or_imm8
+       mov     al,[esi+3]
+      avx_permil_rm_or_imm8:
+       cmp     al,'('
+       je      mmx_nomem_imm8
+       mov     [vex_register],bl
+       inc     esi
+       mov     [extended_code],38h
+       mov     al,[supplemental_code]
+       cmp     al,4
+       jb      avx_permq_rm
+       add     [supplemental_code],8
+       jmp     avx_regs_rm
+      avx_permq_rm:
+       or      [vex_required],8
+       shl     al,5
+       neg     al
+       add     al,36h
+       mov     [supplemental_code],al
+       jmp     avx_regs_rm
+vpermil_2pd_instruction:
+       mov     [immediate_size],-2
+       mov     byte [value],al
+       mov     al,49h
+       jmp     vpermil2_instruction_setup
+vpermil_2ps_instruction:
+       mov     [immediate_size],-2
+       mov     byte [value],al
+       mov     al,48h
+       jmp     vpermil2_instruction_setup
+vpermil2_instruction:
+       mov     [immediate_size],-3
+       mov     byte [value],0
+      vpermil2_instruction_setup:
+       or      [vex_required],2
+       mov     [base_code],0Fh
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       xor     cl,cl
+       jmp     avx_instruction
+
+avx_shift_q_instruction_evex:
+       or      [vex_required],8
+avx_shift_q_instruction:
+       or      [rex_prefix],80h
+       mov     cl,8
+       jmp     avx_shift_instruction
+avx_shift_d_instruction:
+       mov     cl,4
+       jmp     avx_shift_instruction
+avx_shift_bw_instruction:
+       xor     cl,cl
+       avx_shift_instruction:
+       mov     [broadcast_size],cl
+       mov     [mmx_size],0
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       call    take_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      avx_shift_reg_mem
+       mov     [operand_size],cl
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       push    esi
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_shift_reg_reg_reg
+       pop     esi
+       cmp     al,'['
+       je      avx_shift_reg_reg_mem
+       xchg    cl,[operand_size]
+       test    cl,not 1
+       jnz     invalid_operand_size
+       dec     esi
+       call    convert_avx_shift_opcode
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+      convert_avx_shift_opcode:
+       mov     al,[extended_code]
+       mov     ah,al
+       and     ah,1111b
+       add     ah,70h
+       mov     [extended_code],ah
+       shr     al,4
+       sub     al,0Ch
+       shl     al,1
+       xchg    al,[postbyte_register]
+       xchg    al,[vex_register]
+       ret
+      avx_shift_reg_reg_reg:
+       pop     eax
+       lods    byte [esi]
+       call    convert_xmm_register
+       xchg    cl,[operand_size]
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      avx_shift_reg_reg_mem:
+       mov     [mmx_size],16
+       push    ecx
+       lods    byte [esi]
+       call    get_size_operator
+       call    get_address
+       pop     eax
+       xchg    al,[operand_size]
+       test    al,al
+       jz      instruction_ready
+       cmp     al,16
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      avx_shift_reg_mem:
+       or      [vex_required],8
+       call    take_avx_mem
+       call    convert_avx_shift_opcode
+       jmp     mmx_imm8
+avx_shift_dq_instruction:
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],73h
+       or      [vex_required],1
+       mov     [mmx_size],0
+       call    take_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      avx_shift_dq_reg_mem
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+      avx_shift_dq_reg_mem:
+       or      [vex_required],8
+       call    get_address
+       jmp     mmx_imm8
+avx512_rotate_q_instruction:
+       mov     cl,8
+       or      [rex_prefix],cl
+       jmp     avx512_rotate_instruction
+avx512_rotate_d_instruction:
+       mov     cl,4
+      avx512_rotate_instruction:
+       mov     [broadcast_size],cl
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],72h
+       or      [vex_required],8
+       mov     [mmx_size],0
+       mov     [immediate_size],1
+       call    take_avx_register
+       mov     [vex_register],al
+       call    take_avx512_mask
+       jmp     avx_vex_reg_ok
+
+avx_pmovsxbq_instruction:
+       mov     cl,2
+       jmp     avx_pmovsx_instruction
+avx_pmovsxbd_instruction:
+       mov     cl,4
+       jmp     avx_pmovsx_instruction
+avx_pmovsxbw_instruction:
+       mov     cl,8
+      avx_pmovsx_instruction:
+       mov     [mmx_size],cl
+       or      [vex_required],1
+       call    setup_66_0f_38
+       call    take_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     al,al
+       xchg    al,[operand_size]
+       bsf     ecx,eax
+       sub     cl,4
+       shl     [mmx_size],cl
+       push    eax
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_pmovsx_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     eax
+       xchg    al,[operand_size]
+       or      al,al
+       jz      instruction_ready
+       cmp     al,[mmx_size]
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      avx_pmovsx_reg_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       cmp     ah,[mmx_size]
+       je      avx_pmovsx_xmmreg_reg_size_ok
+       jb      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      avx_pmovsx_xmmreg_reg_size_ok:
+       pop     eax
+       mov     [operand_size],al
+       jmp     nomem_instruction_ready
+avx512_pmovqb_instruction:
+       mov     cl,2
+       jmp     avx512_pmov_instruction
+avx512_pmovdb_instruction:
+       mov     cl,4
+       jmp     avx512_pmov_instruction
+avx512_pmovwb_instruction:
+       mov     cl,8
+      avx512_pmov_instruction:
+       mov     [mmx_size],cl
+       or      [vex_required],8
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],0F3h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx512_pmov_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      [operand_flags],20h
+       call    avx512_pmov_common
+       or      al,al
+       jz      instruction_ready
+       cmp     al,[mmx_size]
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      avx512_pmov_common:
+       call    take_avx512_mask
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [postbyte_register],al
+       mov     al,ah
+       mov     ah,cl
+       bsf     ecx,eax
+       sub     cl,4
+       shl     [mmx_size],cl
+       mov     cl,ah
+       pop     eax
+       ret
+      avx512_pmov_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       call    avx512_pmov_common
+       cmp     al,[mmx_size]
+       je      nomem_instruction_ready
+       jb      invalid_operand_size
+       cmp     al,16
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+
+avx_broadcast_128_instruction_noevex:
+       or      [vex_required],2
+       mov     cl,10h
+       jmp     avx_broadcast_instruction
+avx512_broadcast_32x2_instruction:
+       mov     cl,08h
+       jmp     avx_broadcast_instruction_evex
+avx512_broadcast_32x4_instruction:
+       mov     cl,10h
+       jmp     avx_broadcast_instruction_evex
+avx512_broadcast_32x8_instruction:
+       mov     cl,20h
+       jmp     avx_broadcast_instruction_evex
+avx512_broadcast_64x2_instruction:
+       mov     cl,10h
+       jmp     avx_broadcast_instruction_w1_evex
+avx512_broadcast_64x4_instruction:
+       mov     cl,20h
+      avx_broadcast_instruction_w1_evex:
+       or      [rex_prefix],8
+      avx_broadcast_instruction_evex:
+       or      [vex_required],8
+       jmp     avx_broadcast_instruction
+avx_broadcastss_instruction:
+       mov     cl,4
+       jmp     avx_broadcast_instruction
+avx_broadcastsd_instruction:
+       or      [rex_prefix],80h
+       mov     cl,8
+       jmp     avx_broadcast_instruction
+avx_pbroadcastb_instruction:
+       mov     cl,1
+       jmp     avx_broadcast_pi_instruction
+avx_pbroadcastw_instruction:
+       mov     cl,2
+       jmp     avx_broadcast_pi_instruction
+avx_pbroadcastd_instruction:
+       mov     cl,4
+       jmp     avx_broadcast_pi_instruction
+avx_pbroadcastq_instruction:
+       mov     cl,8
+       or      [rex_prefix],80h
+      avx_broadcast_pi_instruction:
+       or      [operand_flags],40h
+      avx_broadcast_instruction:
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,38h
+       mov     [mmx_size],cl
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       call    take_avx_register
+       cmp     ah,[mmx_size]
+       je      invalid_operand_size
+       test    [operand_flags],40h
+       jnz     avx_broadcast_destination_size_ok
+       cmp     [mmx_size],4
+       je      avx_broadcast_destination_size_ok
+       cmp     [supplemental_code],59h
+       je      avx_broadcast_destination_size_ok
+       cmp     ah,16
+       je      invalid_operand_size
+      avx_broadcast_destination_size_ok:
+       xor     ah,ah
+       xchg    ah,[operand_size]
+       push    eax
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_broadcast_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     eax
+       xchg    ah,[operand_size]
+       mov     [postbyte_register],al
+       mov     al,[broadcast_size]
+       mov     al,[mmx_size]
+       cmp     al,ah
+       je      instruction_ready
+       or      al,al
+       jz      instruction_ready
+       or      ah,ah
+       jz      instruction_ready
+       jmp     invalid_operand_size
+      avx_broadcast_reg_reg:
+       lods    byte [esi]
+       test    [operand_flags],40h
+       jz      avx_broadcast_reg_avx_reg
+       cmp     al,60h
+       jb      avx_broadcast_reg_general_reg
+       cmp     al,80h
+       jb      avx_broadcast_reg_avx_reg
+       cmp     al,0C0h
+       jb      avx_broadcast_reg_general_reg
+      avx_broadcast_reg_avx_reg:
+       call    convert_avx_register
+       mov     bl,al
+       mov     al,[mmx_size]
+       or      al,al
+       jz      avx_broadcast_reg_avx_reg_size_ok
+       cmp     ah,16
+       jne     invalid_operand_size
+       cmp     al,ah
+       jae     invalid_operand
+      avx_broadcast_reg_avx_reg_size_ok:
+       pop     eax
+       xchg    ah,[operand_size]
+       mov     [postbyte_register],al
+       test    [vex_required],2
+       jnz     invalid_operand
+       jmp     nomem_instruction_ready
+      avx_broadcast_reg_general_reg:
+       call    convert_register
+       mov     bl,al
+       mov     al,[mmx_size]
+       or      al,al
+       jz      avx_broadcast_reg_general_reg_size_ok
+       cmp     al,ah
+       je      avx_broadcast_reg_general_reg_size_ok
+       ja      invalid_operand_size
+       cmp     ah,4
+       jne     invalid_operand_size
+      avx_broadcast_reg_general_reg_size_ok:
+       cmp     al,4
+       jb      avx_broadcast_reg_general_reg_ready
+       cmp     al,8
+       mov     al,3
+       jne     avx_broadcast_reg_general_reg_ready
+       or      [rex_prefix],8
+      avx_broadcast_reg_general_reg_ready:
+       add     al,7Ah-1
+       mov     [supplemental_code],al
+       or      [vex_required],8
+       pop     eax
+       xchg    ah,[operand_size]
+       mov     [postbyte_register],al
+       jmp     nomem_instruction_ready
+
+avx512_extract_64x4_instruction:
+       or      [rex_prefix],8
+avx512_extract_32x8_instruction:
+       or      [vex_required],8
+       mov     cl,32
+       jmp     avx_extractf_instruction
+avx512_extract_64x2_instruction:
+       or      [rex_prefix],8
+avx512_extract_32x4_instruction:
+       or      [vex_required],8
+       mov     cl,16
+       jmp     avx_extractf_instruction
+avx_extractf128_instruction:
+       or      [vex_required],2
+       mov     cl,16
+      avx_extractf_instruction:
+       mov     [mmx_size],cl
+       call    setup_66_0f_3a
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_extractf_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       xor     al,al
+       xchg    al,[operand_size]
+       or      al,al
+       jz      avx_extractf_mem_size_ok
+       cmp     al,[mmx_size]
+       jne     invalid_operand_size
+      avx_extractf_mem_size_ok:
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       cmp     ah,[mmx_size]
+       jbe     invalid_operand_size
+       mov     [postbyte_register],al
+       jmp     mmx_imm8
+      avx_extractf_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       push    eax
+       call    take_avx512_mask
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       cmp     ah,[mmx_size]
+       jbe     invalid_operand_size
+       mov     [postbyte_register],al
+       pop     ebx
+       jmp     mmx_nomem_imm8
+avx512_insert_64x4_instruction:
+       or      [rex_prefix],8
+avx512_insert_32x8_instruction:
+       or      [vex_required],8
+       mov     cl,32
+       jmp     avx_insertf_instruction
+avx512_insert_64x2_instruction:
+       or      [rex_prefix],8
+avx512_insert_32x4_instruction:
+       or      [vex_required],8
+       mov     cl,16
+       jmp     avx_insertf_instruction
+avx_insertf128_instruction:
+       or      [vex_required],2
+       mov     cl,16
+      avx_insertf_instruction:
+       mov     [mmx_size],cl
+       mov     [broadcast_size],0
+       call    setup_66_0f_3a
+       call    take_avx_register
+       cmp     ah,[mmx_size]
+       jbe     invalid_operand
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       mov     al,[mmx_size]
+       xchg    al,[operand_size]
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_insertf_reg_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     eax
+       mov     [operand_size],al
+       jmp     mmx_imm8
+      avx_insertf_reg_reg_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       pop     eax
+       mov     [operand_size],al
+       jmp     mmx_nomem_imm8
+avx_extract_b_instruction:
+       mov     cl,1
+       jmp     avx_extract_instruction
+avx_extract_w_instruction:
+       mov     cl,2
+       jmp     avx_extract_instruction
+avx_extract_q_instruction:
+       or      [rex_prefix],8
+       mov     cl,8
+       jmp     avx_extract_instruction
+avx_extract_d_instruction:
+       mov     cl,4
+      avx_extract_instruction:
+       mov     [mmx_size],cl
+       call    setup_66_0f_3a
+       or      [vex_required],1
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      avx_extractps_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[mmx_size]
+       not     al
+       and     [operand_size],al
+       jnz     invalid_operand_size
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       jmp     mmx_imm8
+      avx_extractps_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,[mmx_size]
+       cmp     ah,al
+       jb      invalid_operand_size
+       cmp     ah,4
+       je      avx_extractps_reg_size_ok
+       cmp     ah,8
+       jne     invalid_operand_size
+       cmp     [code_type],64
+       jne     invalid_operand
+       cmp     al,4
+       jae     avx_extractps_reg_size_ok
+       or      [rex_prefix],8
+      avx_extractps_reg_size_ok:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       cmp     [supplemental_code],15h
+       jne     mmx_nomem_imm8
+       mov     [extended_code],0C5h
+       xchg    bl,[postbyte_register]
+       jmp     mmx_nomem_imm8
+avx_insertps_instruction:
+       mov     [immediate_size],1
+       or      [operand_flags],10h
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       mov     cl,4
+       jmp     avx_instruction
+avx_pinsrb_instruction:
+       mov     cl,1
+       jmp     avx_pinsr_instruction_3a
+avx_pinsrw_instruction:
+       mov     cl,2
+       jmp     avx_pinsr_instruction
+avx_pinsrd_instruction:
+       mov     cl,4
+       jmp     avx_pinsr_instruction_3a
+avx_pinsrq_instruction:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       mov     cl,8
+       or      [rex_prefix],8
+      avx_pinsr_instruction_3a:
+       mov     [supplemental_code],al
+       mov     al,3Ah
+      avx_pinsr_instruction:
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],cl
+       or      [vex_required],1
+       call    take_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       jmp     pinsr_xmmreg
+
+avx_cvtudq2pd_instruction:
+       or      [vex_required],8
+avx_cvtdq2pd_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     cl,4
+       jmp     avx_cvt_d_instruction
+avx_cvtps2qq_instruction:
+       or      [operand_flags],8
+avx_cvttps2qq_instruction:
+       or      [operand_flags],4
+       or      [vex_required],8
+       mov     [opcode_prefix],66h
+       mov     cl,4
+       jmp     avx_cvt_d_instruction
+avx_cvtps2pd_instruction:
+       or      [operand_flags],4
+       mov     cl,4
+      avx_cvt_d_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       mov     [broadcast_size],cl
+       call    take_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     ecx,ecx
+       xchg    cl,[operand_size]
+       mov     al,cl
+       shr     al,1
+       mov     [mmx_size],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      avx_cvt_d_reg_mem
+       cmp     al,10h
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    convert_avx_register
+       cmp     ah,[mmx_size]
+       je      avx_cvt_d_reg_reg_size_ok
+       jb      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      avx_cvt_d_reg_reg_size_ok:
+       mov     bl,al
+       mov     [operand_size],cl
+       call    take_avx512_rounding
+       jmp     nomem_instruction_ready
+      avx_cvt_d_reg_mem:
+       call    take_avx_mem
+       jmp     instruction_ready
+avx_cvtpd2dq_instruction:
+       or      [operand_flags],4+8
+       mov     [opcode_prefix],0F2h
+       jmp     avx_cvt_q_instruction
+avx_cvtuqq2ps_instruction:
+       mov     [opcode_prefix],0F2h
+avx_cvtpd2udq_instruction:
+       or      [operand_flags],8
+avx_cvttpd2udq_instruction:
+       or      [operand_flags],4
+       or      [vex_required],8
+       jmp     avx_cvt_q_instruction
+avx_cvtpd2ps_instruction:
+       or      [operand_flags],8
+avx_cvttpd2dq_instruction:
+       or      [operand_flags],4
+       mov     [opcode_prefix],66h
+      avx_cvt_q_instruction:
+       mov     [broadcast_size],8
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       or      [rex_prefix],80h
+       call    take_avx_register
+       mov     [postbyte_register],al
+       push    eax
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     al,al
+       mov     [operand_size],al
+       mov     [mmx_size],al
+       call    take_avx_rm
+       jnc     avx_cvt_q_reg_mem
+       mov     bl,al
+       pop     eax
+       call    avx_cvt_q_check_size
+       call    take_avx512_rounding
+       jmp     nomem_instruction_ready
+      avx_cvt_q_reg_mem:
+       pop     eax
+       call    avx_cvt_q_check_size
+       jmp     instruction_ready
+      avx_cvt_q_check_size:
+       mov     al,[operand_size]
+       or      al,al
+       jz      avx_cvt_q_size_not_specified
+       cmp     al,64
+       ja      invalid_operand_size
+       shr     al,1
+       cmp     al,ah
+       je      avx_cvt_q_size_ok
+       ja      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      avx_cvt_q_size_ok:
+       ret
+      avx_cvt_q_size_not_specified:
+       cmp     ah,64 shr 1
+       jne     recoverable_unknown_size
+       mov     [operand_size],64
+       ret
+avx_cvttps2udq_instruction:
+       or      [vex_required],8
+       or      [operand_flags],2+4
+       mov     cx,0400h
+       jmp     avx_instruction_with_broadcast
+avx_cvttps2dq_instruction:
+       mov     [opcode_prefix],0F3h
+       or      [operand_flags],2+4
+       mov     cx,0400h
+       jmp     avx_instruction_with_broadcast
+avx_cvtph2ps_instruction:
+       mov     [opcode_prefix],66h
+       mov     [supplemental_code],al
+       or      [operand_flags],4
+       mov     al,38h
+       xor     cl,cl
+       jmp     avx_cvt_d_instruction
+avx_cvtps2ph_instruction:
+       call    setup_66_0f_3a
+       or      [vex_required],1
+       or      [operand_flags],4
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      vcvtps2ph_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       shl     [operand_size],1
+       call    take_avx_register
+       mov     [postbyte_register],al
+       shr     ah,1
+       mov     [mmx_size],ah
+       jmp     mmx_imm8
+      vcvtps2ph_reg:
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     bl,al
+       call    take_avx512_mask
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       shl     cl,1
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [postbyte_register],al
+       or      cl,cl
+       jz      vcvtps2ph_reg_size_ok
+       cmp     cl,ah
+       je      vcvtps2ph_reg_size_ok
+       jb      invalid_operand_size
+       cmp     ah,16
+       jne     invalid_operand_size
+      vcvtps2ph_reg_size_ok:
+       call    take_avx512_rounding
+       jmp     mmx_nomem_imm8
+
+avx_cvtsd2usi_instruction:
+       or      [operand_flags],8
+avx_cvttsd2usi_instruction:
+       or      [vex_required],8
+       jmp     avx_cvttsd2si_instruction
+avx_cvtsd2si_instruction:
+       or      [operand_flags],8
+avx_cvttsd2si_instruction:
+       mov     ah,0F2h
+       mov     cl,8
+       jmp     avx_cvt_2si_instruction
+avx_cvtss2usi_instruction:
+       or      [operand_flags],8
+avx_cvttss2usi_instruction:
+       or      [vex_required],8
+       jmp     avx_cvttss2si_instruction
+avx_cvtss2si_instruction:
+       or      [operand_flags],8
+avx_cvttss2si_instruction:
+       mov     ah,0F3h
+       mov     cl,4
+      avx_cvt_2si_instruction:
+       or      [operand_flags],2+4
+       mov     [mmx_size],cl
+       mov     [broadcast_size],0
+       mov     [opcode_prefix],ah
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       cmp     ah,4
+       je      avx_cvt_2si_reg
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+      avx_cvt_2si_reg:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_rm
+       jnc     instruction_ready
+       mov     bl,al
+       call    take_avx512_rounding
+       jmp     nomem_instruction_ready
+avx_cvtusi2sd_instruction:
+       or      [vex_required],8
+avx_cvtsi2sd_instruction:
+       mov     ah,0F2h
+       mov     cl,8
+       jmp     avx_cvtsi_instruction
+avx_cvtusi2ss_instruction:
+       or      [vex_required],8
+avx_cvtsi2ss_instruction:
+       mov     ah,0F3h
+       mov     cl,4
+      avx_cvtsi_instruction:
+       or      [operand_flags],2+4+8
+       mov     [mmx_size],cl
+       mov     [opcode_prefix],ah
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       or      [vex_required],1
+       call    take_avx_register
+       cmp     ah,16
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      avx_cvtsi_reg_reg_mem
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       cmp     ah,4
+       je      avx_cvtsi_reg_reg_reg32
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+      avx_cvtsi_rounding:
+       call    take_avx512_rounding
+       jmp     nomem_instruction_ready
+      avx_cvtsi_reg_reg_reg32:
+       cmp     [mmx_size],8
+       jne     avx_cvtsi_rounding
+       jmp     nomem_instruction_ready
+      avx_cvtsi_reg_reg_mem:
+       call    get_address
+       mov     al,[operand_size]
+       mov     [mmx_size],al
+       or      al,al
+       jz      single_mem_nosize
+       cmp     al,4
+       je      instruction_ready
+       cmp     al,8
+       jne     invalid_operand_size
+       call    operand_64bit
+       jmp     instruction_ready
+
+avx_maskmov_w1_instruction:
+       or      [rex_prefix],8
+avx_maskmov_instruction:
+       call    setup_66_0f_38
+       mov     [mmx_size],0
+       or      [vex_required],2
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     avx_maskmov_mem
+       lods    byte [esi]
+       call    convert_avx_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     instruction_ready
+      avx_maskmov_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [postbyte_register],al
+       add     [supplemental_code],2
+       jmp     instruction_ready
+avx_movmskpd_instruction:
+       mov     [opcode_prefix],66h
+avx_movmskps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],50h
+       or      [vex_required],2
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       cmp     ah,4
+       je      avx_movmskps_reg_ok
+       cmp     ah,8
+       jne     invalid_operand_size
+       cmp     [code_type],64
+       jne     invalid_operand
+      avx_movmskps_reg_ok:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+avx_maskmovdqu_instruction:
+       or      [vex_required],2
+       jmp     maskmovdqu_instruction
+avx_pmovmskb_instruction:
+       or      [vex_required],2
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       je      avx_pmovmskb_reg_size_ok
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       cmp     ah,8
+       jnz     invalid_operand_size
+      avx_pmovmskb_reg_size_ok:
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+
+gather_pd_instruction:
+       or      [rex_prefix],8
+gather_ps_instruction:
+       call    setup_66_0f_38
+       or      [vex_required],4
+       or      [operand_flags],20h
+       call    take_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       push    ecx
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       pop     eax
+       xchg    al,[operand_size]
+      gather_mem_size_check:
+       mov     ah,4
+       test    [rex_prefix],8
+       jz      gather_elements_size_ok
+       add     ah,ah
+      gather_elements_size_ok:
+       mov     [mmx_size],ah
+       test    al,al
+       jz      gather_mem_size_ok
+       cmp     al,ah
+       jne     invalid_operand_size
+      gather_mem_size_ok:
+       cmp     byte [esi],','
+       je      gather_reg_mem_reg
+       test    [vex_required],20h
+       jz      invalid_operand
+       mov     ah,[operand_size]
+       mov     al,80h
+       jmp     gather_arguments_ok
+      gather_reg_mem_reg:
+       or      [vex_required],2
+       inc     esi
+       call    take_avx_register
+      gather_arguments_ok:
+       mov     [vex_register],al
+       cmp     al,[postbyte_register]
+       je      disallowed_combination_of_registers
+       mov     al,bl
+       and     al,11111b
+       cmp     al,[postbyte_register]
+       je      disallowed_combination_of_registers
+       cmp     al,[vex_register]
+       je      disallowed_combination_of_registers
+       mov     al,bl
+       shr     al,5
+       cmp     al,0Ch shr 1
+       je      gather_vr128
+       mov     ah,32
+       cmp     al,6 shr 1
+       jne     gather_regular
+       add     ah,ah
+      gather_regular:
+       mov     al,[rex_prefix]
+       shr     al,3
+       xor     al,[supplemental_code]
+       test    al,1
+       jz      gather_uniform
+       test    [supplemental_code],1
+       jz      gather_double
+       mov     al,ah
+       xchg    al,[operand_size]
+       add     al,al
+       cmp     al,ah
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      gather_double:
+       add     ah,ah
+      gather_uniform:
+       cmp     ah,[operand_size]
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      gather_vr128:
+       cmp     ah,16
+       je      instruction_ready
+       cmp     ah,32
+       jne     invalid_operand_size
+       test    [supplemental_code],1
+       jnz     invalid_operand_size
+       test    [rex_prefix],8
+       jz      invalid_operand_size
+       jmp     instruction_ready
+scatter_pd_instruction:
+       or      [rex_prefix],8
+scatter_ps_instruction:
+       call    setup_66_0f_38
+       or      [vex_required],4+8
+       or      [operand_flags],20h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax
+       call    take_avx_register
+       mov     [postbyte_register],al
+       pop     eax
+       jmp     gather_mem_size_check
+gatherpf_qpd_instruction:
+       mov     ah,0C7h
+       jmp     gatherpf_pd_instruction
+gatherpf_dpd_instruction:
+       mov     ah,0C6h
+      gatherpf_pd_instruction:
+       or      [rex_prefix],8
+       mov     cl,8
+       jmp     gatherpf_instruction
+gatherpf_qps_instruction:
+       mov     ah,0C7h
+       jmp     gatherpf_ps_instruction
+gatherpf_dps_instruction:
+       mov     ah,0C6h
+      gatherpf_ps_instruction:
+       mov     cl,4
+      gatherpf_instruction:
+       mov     [mmx_size],cl
+       mov     [postbyte_register],al
+       mov     al,ah
+       call    setup_66_0f_38
+       or      [vex_required],4+8
+       or      [operand_flags],20h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       call    take_avx512_mask
+       mov     ah,[mmx_size]
+       mov     al,[operand_size]
+       or      al,al
+       jz      gatherpf_mem_size_ok
+       cmp     al,ah
+       jne     invalid_operand_size
+      gatherpf_mem_size_ok:
+       mov     [operand_size],64
+       mov     al,6 shr 1
+       cmp     ah,4
+       je      gatherpf_check_vsib
+       cmp     [supplemental_code],0C6h
+       jne     gatherpf_check_vsib
+       mov     al,0Eh shr 1
+      gatherpf_check_vsib:
+       mov     ah,bl
+       shr     ah,5
+       cmp     al,ah
+       jne     invalid_operand
+       jmp     instruction_ready
+
+bmi_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],0F3h
+       mov     [postbyte_register],al
+      bmi_reg:
+       or      [vex_required],2
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      bmi_reg_reg
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       call    operand_32or64
+       jmp     instruction_ready
+      bmi_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       call    operand_32or64
+       jmp     nomem_instruction_ready
+      operand_32or64:
+       mov     al,[operand_size]
+       cmp     al,4
+       je      operand_32or64_ok
+       cmp     al,8
+       jne     invalid_operand_size
+       cmp     [code_type],64
+       jne     invalid_operand
+       or      [rex_prefix],8
+      operand_32or64_ok:
+       ret
+pdep_instruction:
+       mov     [opcode_prefix],0F2h
+       jmp     andn_instruction
+pext_instruction:
+       mov     [opcode_prefix],0F3h
+andn_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       or      [vex_required],2
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       jmp     bmi_reg
+sarx_instruction:
+       mov     [opcode_prefix],0F3h
+       jmp     bzhi_instruction
+shrx_instruction:
+       mov     [opcode_prefix],0F2h
+       jmp     bzhi_instruction
+shlx_instruction:
+       mov     [opcode_prefix],66h
+bzhi_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       or      [vex_required],2
+       call    get_reg_mem
+       jc      bzhi_reg_reg
+       call    get_vex_source_register
+       jc      invalid_operand
+       call    operand_32or64
+       jmp     instruction_ready
+      bzhi_reg_reg:
+       call    get_vex_source_register
+       jc      invalid_operand
+       call    operand_32or64
+       jmp     nomem_instruction_ready
+      get_vex_source_register:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     no_vex_source_register
+       lods    byte [esi]
+       call    convert_register
+       mov     [vex_register],al
+       clc
+       ret
+      no_vex_source_register:
+       stc
+       ret
+bextr_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       or      [vex_required],2
+       call    get_reg_mem
+       jc      bextr_reg_reg
+       call    get_vex_source_register
+       jc      bextr_reg_mem_imm32
+       call    operand_32or64
+       jmp     instruction_ready
+      bextr_reg_reg:
+       call    get_vex_source_register
+       jc      bextr_reg_reg_imm32
+       call    operand_32or64
+       jmp     nomem_instruction_ready
+      setup_bextr_imm_opcode:
+       mov     [xop_opcode_map],0Ah
+       mov     [base_code],10h
+       call    operand_32or64
+       ret
+      bextr_reg_mem_imm32:
+       call    get_imm32
+       call    setup_bextr_imm_opcode
+       jmp     store_instruction_with_imm32
+      bextr_reg_reg_imm32:
+       call    get_imm32
+       call    setup_bextr_imm_opcode
+      store_nomem_instruction_with_imm32:
+       call    store_nomem_instruction
+       mov     eax,dword [value]
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      get_imm32:
+       cmp     al,'('
+       jne     invalid_operand
+       push    edx ebx ecx
+       call    get_dword_value
+       mov     dword [value],eax
+       pop     ecx ebx edx
+       ret
+rorx_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],3Ah
+       mov     [supplemental_code],al
+       or      [vex_required],2
+       call    get_reg_mem
+       jc      rorx_reg_reg
+       call    operand_32or64
+       jmp     mmx_imm8
+      rorx_reg_reg:
+       call    operand_32or64
+       jmp     mmx_nomem_imm8
+
+tbm_instruction:
+       mov     [xop_opcode_map],9
+       mov     ah,al
+       shr     ah,4
+       and     al,111b
+       mov     [base_code],ah
+       mov     [postbyte_register],al
+       jmp     bmi_reg
+
+llwpcb_instruction:
+       or      [vex_required],2
+       mov     [xop_opcode_map],9
+       mov     [base_code],12h
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       call    operand_32or64
+       jmp     nomem_instruction_ready
+lwpins_instruction:
+       or      [vex_required],2
+       mov     [xop_opcode_map],0Ah
+       mov     [base_code],12h
+       mov     [vex_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      lwpins_reg_reg
+       cmp     al,'['
+       jne     invalid_argument
+       push    ecx
+       call    get_address
+       pop     eax
+       xchg    al,[operand_size]
+       test    al,al
+       jz      lwpins_reg_mem_size_ok
+       cmp     al,4
+       jne     invalid_operand_size
+      lwpins_reg_mem_size_ok:
+       call    prepare_lwpins
+       jmp     store_instruction_with_imm32
+      lwpins_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     [operand_size],cl
+       mov     bl,al
+       call    prepare_lwpins
+       jmp     store_nomem_instruction_with_imm32
+      prepare_lwpins:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_imm32
+       call    operand_32or64
+       mov     al,[vex_register]
+       xchg    al,[postbyte_register]
+       mov     [vex_register],al
+       ret
+
+xop_single_source_sd_instruction:
+       or      [operand_flags],2
+       mov     [mmx_size],8
+       jmp     xop_instruction_9
+xop_single_source_ss_instruction:
+       or      [operand_flags],2
+       mov     [mmx_size],4
+       jmp     xop_instruction_9
+xop_single_source_instruction:
+       or      [operand_flags],2
+       mov     [mmx_size],0
+      xop_instruction_9:
+       mov     [base_code],al
+       mov     [xop_opcode_map],9
+       jmp     avx_xop_common
+xop_single_source_128bit_instruction:
+       or      [operand_flags],2
+       mov     [mmx_size],16
+       jmp     xop_instruction_9
+xop_triple_source_128bit_instruction:
+       mov     [immediate_size],-1
+       mov     byte [value],0
+       mov     [mmx_size],16
+       jmp     xop_instruction_8
+xop_128bit_instruction:
+       mov     [immediate_size],-2
+       mov     byte [value],0
+       mov     [mmx_size],16
+      xop_instruction_8:
+       mov     [base_code],al
+       mov     [xop_opcode_map],8
+       jmp     avx_xop_common
+xop_pcom_b_instruction:
+       mov     ah,0CCh
+       jmp     xop_pcom_instruction
+xop_pcom_d_instruction:
+       mov     ah,0CEh
+       jmp     xop_pcom_instruction
+xop_pcom_q_instruction:
+       mov     ah,0CFh
+       jmp     xop_pcom_instruction
+xop_pcom_w_instruction:
+       mov     ah,0CDh
+       jmp     xop_pcom_instruction
+xop_pcom_ub_instruction:
+       mov     ah,0ECh
+       jmp     xop_pcom_instruction
+xop_pcom_ud_instruction:
+       mov     ah,0EEh
+       jmp     xop_pcom_instruction
+xop_pcom_uq_instruction:
+       mov     ah,0EFh
+       jmp     xop_pcom_instruction
+xop_pcom_uw_instruction:
+       mov     ah,0EDh
+      xop_pcom_instruction:
+       mov     byte [value],al
+       mov     [immediate_size],-4
+       mov     [mmx_size],16
+       mov     [base_code],ah
+       mov     [xop_opcode_map],8
+       jmp     avx_xop_common
+vpcmov_instruction:
+       or      [vex_required],2
+       mov     [immediate_size],-2
+       mov     byte [value],0
+       mov     [mmx_size],0
+       mov     [base_code],al
+       mov     [xop_opcode_map],8
+       jmp     avx_xop_common
+xop_shift_instruction:
+       mov     [base_code],al
+       or      [vex_required],2
+       mov     [xop_opcode_map],9
+       call    take_avx_register
+       cmp     ah,16
+       jne     invalid_operand
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      xop_shift_reg_mem
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [vex_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       push    esi
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       pop     esi
+       xchg    cl,[operand_size]
+       cmp     al,'['
+       je      xop_shift_reg_reg_mem
+       cmp     al,10h
+       jne     xop_shift_reg_reg_imm
+       call    take_avx_register
+       mov     bl,al
+       xchg    bl,[vex_register]
+       jmp     nomem_instruction_ready
+      xop_shift_reg_reg_mem:
+       or      [rex_prefix],8
+       lods    byte [esi]
+       call    get_size_operator
+       call    get_address
+       jmp     instruction_ready
+      xop_shift_reg_reg_imm:
+       xor     bl,bl
+       xchg    bl,[vex_register]
+       cmp     [base_code],94h
+       jae     invalid_operand
+       add     [base_code],30h
+       mov     [xop_opcode_map],8
+       dec     esi
+       jmp     mmx_nomem_imm8
+      xop_shift_reg_mem:
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       push    esi
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       call    get_size_operator
+       pop     esi
+       xchg    cl,[operand_size]
+       cmp     al,10h
+       jne     xop_shift_reg_mem_imm
+       call    take_avx_register
+       mov     [vex_register],al
+       jmp     instruction_ready
+      xop_shift_reg_mem_imm:
+       cmp     [base_code],94h
+       jae     invalid_operand
+       add     [base_code],30h
+       mov     [xop_opcode_map],8
+       dec     esi
+       jmp     mmx_imm8
+
+avx512_4vnniw_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       mov     [mmx_size],16
+       mov     [broadcast_size],0
+       or      [vex_required],8
+       call    take_avx_register
+       mov     [postbyte_register],al
+       call    take_avx512_mask
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_register
+       mov     [vex_register],al
+       cmp     byte [esi],'+'
+       jne     reg4_ok
+       inc     esi
+       cmp     dword [esi],29030128h
+       jne     invalid_operand
+       lods    dword [esi]
+      reg4_ok:
+       cmp     [operand_size],64
+       jne     invalid_operand_size
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_avx_rm
+       jc      invalid_operand
+       mov     [operand_size],64
+       jmp     instruction_ready
+
+set_evex_mode:
+       mov     [evex_mode],al
+       jmp     instruction_assembled
+
+take_avx_register:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+convert_avx_register:
+       mov     ah,al
+       and     al,1Fh
+       and     ah,0E0h
+       sub     ah,60h
+       jb      invalid_operand
+       jz      avx512_register_size
+       sub     ah,60h
+       jb      invalid_operand
+       jnz     avx_register_size_ok
+       mov     ah,16
+       jmp     avx_register_size_ok
+      avx512_register_size:
+       mov     ah,64
+      avx_register_size_ok:
+       cmp     al,8
+       jb      match_register_size
+       cmp     [code_type],64
+       jne     invalid_operand
+       jmp     match_register_size
+store_vex_instruction_code:
+       test    [rex_prefix],10h
+       jnz     invalid_operand
+       test    [vex_required],0F8h
+       jnz     store_evex_instruction_code
+       test    [vex_register],10000b
+       jnz     store_evex_instruction_code
+       cmp     [operand_size],64
+       je      store_evex_instruction_code
+       mov     al,[base_code]
+       cmp     al,0Fh
+       jne     store_xop_instruction_code
+       test    [vex_required],2
+       jnz     prepare_vex
+       cmp     [evex_mode],0
+       je      prepare_vex
+       cmp     [displacement_compression],1
+       jne     prepare_vex
+       cmp     edx,80h
+       jb      prepare_vex
+       cmp     edx,-80h
+       jae     prepare_vex
+       mov     al,bl
+       or      al,bh
+       shr     al,4
+       cmp     al,2
+       je      prepare_vex
+       call    compress_displacement
+       cmp     [displacement_compression],2
+       ja      prepare_evex
+       jb      prepare_vex
+       dec     [displacement_compression]
+       mov     edx,[uncompressed_displacement]
+      prepare_vex:
+       mov     ah,[extended_code]
+       cmp     ah,38h
+       je      store_vex_0f38_instruction_code
+       cmp     ah,3Ah
+       je      store_vex_0f3a_instruction_code
+       test    [rex_prefix],1011b
+       jnz     store_vex_0f_instruction_code
+       mov     [edi+2],ah
+       mov     byte [edi],0C5h
+       mov     al,[vex_register]
+       not     al
+       shl     al,3
+       mov     ah,[rex_prefix]
+       shl     ah,5
+       and     ah,80h
+       xor     al,ah
+       call    get_vex_lpp_bits
+       mov     [edi+1],al
+       call    check_vex
+       add     edi,3
+       ret
+      get_vex_lpp_bits:
+       cmp     [operand_size],32
+       jne     get_vex_pp_bits
+       or      al,100b
+      get_vex_pp_bits:
+       mov     ah,[opcode_prefix]
+       cmp     ah,66h
+       je      vex_66
+       cmp     ah,0F3h
+       je      vex_f3
+       cmp     ah,0F2h
+       je      vex_f2
+       test    ah,ah
+       jnz     disallowed_combination_of_registers
+       ret
+      vex_f2:
+       or      al,11b
+       ret
+      vex_f3:
+       or      al,10b
+       ret
+      vex_66:
+       or      al,1
+       ret
+      store_vex_0f38_instruction_code:
+       mov     al,11100010b
+       mov     ah,[supplemental_code]
+       jmp     make_c4_vex
+      store_vex_0f3a_instruction_code:
+       mov     al,11100011b
+       mov     ah,[supplemental_code]
+       jmp     make_c4_vex
+      store_vex_0f_instruction_code:
+       mov     al,11100001b
+      make_c4_vex:
+       mov     [edi+3],ah
+       mov     byte [edi],0C4h
+       mov     ah,[rex_prefix]
+       shl     ah,5
+       xor     al,ah
+       mov     [edi+1],al
+       call    check_vex
+       mov     al,[vex_register]
+       xor     al,1111b
+       shl     al,3
+       mov     ah,[rex_prefix]
+       shl     ah,4
+       and     ah,80h
+       or      al,ah
+       call    get_vex_lpp_bits
+       mov     [edi+2],al
+       add     edi,4
+       ret
+      check_vex:
+       cmp     [code_type],64
+       je      vex_ok
+       not     al
+       test    al,11000000b
+       jnz     invalid_operand
+       test    [rex_prefix],40h
+       jnz     invalid_operand
+      vex_ok:
+       ret
+store_xop_instruction_code:
+       mov     [edi+3],al
+       mov     byte [edi],8Fh
+       mov     al,[xop_opcode_map]
+       mov     ah,[rex_prefix]
+       test    ah,40h
+       jz      xop_ok
+       cmp     [code_type],64
+       jne     invalid_operand
+      xop_ok:
+       not     ah
+       shl     ah,5
+       xor     al,ah
+       mov     [edi+1],al
+       mov     al,[vex_register]
+       xor     al,1111b
+       shl     al,3
+       mov     ah,[rex_prefix]
+       shl     ah,4
+       and     ah,80h
+       or      al,ah
+       call    get_vex_lpp_bits
+       mov     [edi+2],al
+       add     edi,4
+       ret
+store_evex_instruction_code:
+       test    [vex_required],2
+       jnz     invalid_operand
+       cmp     [base_code],0Fh
+       jne     invalid_operand
+       cmp     [displacement_compression],1
+       jne     prepare_evex
+       call    compress_displacement
+      prepare_evex:
+       mov     ah,[extended_code]
+       cmp     ah,38h
+       je      store_evex_0f38_instruction_code
+       cmp     ah,3Ah
+       je      store_evex_0f3a_instruction_code
+       mov     al,11110001b
+      make_evex:
+       mov     [edi+4],ah
+       mov     byte [edi],62h
+       mov     ah,[rex_prefix]
+       shl     ah,5
+       xor     al,ah
+       mov     ah,[vex_required]
+       and     ah,10h
+       xor     al,ah
+       mov     [edi+1],al
+       call    check_vex
+       mov     al,[vex_register]
+       not     al
+       and     al,1111b
+       shl     al,3
+       mov     ah,[rex_prefix]
+       shl     ah,4
+       or      ah,[rex_prefix]
+       and     ah,80h
+       or      al,ah
+       or      al,100b
+       call    get_vex_pp_bits
+       mov     [edi+2],al
+       mov     al,[vex_register]
+       not     al
+       shr     al,1
+       and     al,1000b
+       test    [vex_required],80h
+       jne     evex_rounding
+       mov     ah,[operand_size]
+       cmp     ah,16
+       jbe     evex_l_ok
+       or      al,ah
+       jmp     evex_l_ok
+      evex_rounding:
+       mov     ah,[rounding_mode]
+       shl     ah,5
+       or      al,ah
+      evex_l_ok:
+       test    [vex_required],20h
+       jz      evex_zaaa_ok
+       or      al,[mask_register]
+      evex_zaaa_ok:
+       test    [vex_required],40h
+       jz      evex_b_ok
+       or      al,10h
+      evex_b_ok:
+       mov     [edi+3],al
+       add     edi,5
+       ret
+      store_evex_0f38_instruction_code:
+       mov     al,11110010b
+       mov     ah,[supplemental_code]
+       jmp     make_evex
+      store_evex_0f3a_instruction_code:
+       mov     al,11110011b
+       mov     ah,[supplemental_code]
+       jmp     make_evex
+compress_displacement:
+       mov     ebp,ecx
+       mov     [uncompressed_displacement],edx
+       or      edx,edx
+       jz      displacement_compressed
+       xor     ecx,ecx
+       mov     cl,[mmx_size]
+       test    cl,cl
+       jnz     calculate_displacement_scale
+       mov     cl,[operand_size]
+      calculate_displacement_scale:
+       bsf     ecx,ecx
+       jz      displacement_compression_ok
+       xor     eax,eax
+       shrd    eax,edx,cl
+       jnz     displacement_not_compressed
+       sar     edx,cl
+       cmp     edx,80h
+       jb      displacement_compressed
+       cmp     edx,-80h
+       jnb     displacement_compressed
+       shl     edx,cl
+      displacement_not_compressed:
+       inc     [displacement_compression]
+       jmp     displacement_compression_ok
+      displacement_compressed:
+       add     [displacement_compression],2
+      displacement_compression_ok:
+       mov     ecx,ebp
+       ret
diff --git a/source/errors.inc b/source/errors.inc
new file mode 100644 (file)
index 0000000..48719fa
--- /dev/null
@@ -0,0 +1,191 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+out_of_memory:
+       push    _out_of_memory
+       jmp     fatal_error
+stack_overflow:
+       push    _stack_overflow
+       jmp     fatal_error
+main_file_not_found:
+       push    _main_file_not_found
+       jmp     fatal_error
+write_failed:
+       push    _write_failed
+       jmp     fatal_error
+
+code_cannot_be_generated:
+       push    _code_cannot_be_generated
+       jmp     general_error
+format_limitations_exceeded:
+       push    _format_limitations_exceeded
+       jmp     general_error
+invalid_definition:
+       push    _invalid_definition
+    general_error:
+       cmp     [symbols_file],0
+       je      fatal_error
+       call    dump_preprocessed_source
+       jmp     fatal_error
+
+file_not_found:
+       push    _file_not_found
+       jmp     error_with_source
+error_reading_file:
+       push    _error_reading_file
+       jmp     error_with_source
+invalid_file_format:
+       push    _invalid_file_format
+       jmp     error_with_source
+invalid_macro_arguments:
+       push    _invalid_macro_arguments
+       jmp     error_with_source
+incomplete_macro:
+       push    _incomplete_macro
+       jmp     error_with_source
+unexpected_characters:
+       push    _unexpected_characters
+       jmp     error_with_source
+invalid_argument:
+       push    _invalid_argument
+       jmp     error_with_source
+illegal_instruction:
+       push    _illegal_instruction
+       jmp     error_with_source
+invalid_operand:
+       push    _invalid_operand
+       jmp     error_with_source
+invalid_operand_size:
+       push    _invalid_operand_size
+       jmp     error_with_source
+operand_size_not_specified:
+       push    _operand_size_not_specified
+       jmp     error_with_source
+operand_sizes_do_not_match:
+       push    _operand_sizes_do_not_match
+       jmp     error_with_source
+invalid_address_size:
+       push    _invalid_address_size
+       jmp     error_with_source
+address_sizes_do_not_agree:
+       push    _address_sizes_do_not_agree
+       jmp     error_with_source
+disallowed_combination_of_registers:
+       push    _disallowed_combination_of_registers
+       jmp     error_with_source
+long_immediate_not_encodable:
+       push    _long_immediate_not_encodable
+       jmp     error_with_source
+relative_jump_out_of_range:
+       push    _relative_jump_out_of_range
+       jmp     error_with_source
+invalid_expression:
+       push    _invalid_expression
+       jmp     error_with_source
+invalid_address:
+       push    _invalid_address
+       jmp     error_with_source
+invalid_value:
+       push    _invalid_value
+       jmp     error_with_source
+value_out_of_range:
+       push    _value_out_of_range
+       jmp     error_with_source
+undefined_symbol:
+       mov     edi,message
+       mov     esi,_undefined_symbol
+       call    copy_asciiz
+       push    message
+       cmp     [error_info],0
+       je      error_with_source
+       mov     esi,[error_info]
+       mov     esi,[esi+24]
+       or      esi,esi
+       jz      error_with_source
+       mov     byte [edi-1],20h
+       call    write_quoted_symbol_name
+       jmp     error_with_source
+    copy_asciiz:
+       lods    byte [esi]
+       stos    byte [edi]
+       test    al,al
+       jnz     copy_asciiz
+       ret
+    write_quoted_symbol_name:
+       mov     al,27h
+       stosb
+       movzx   ecx,byte [esi-1]
+       rep     movs byte [edi],[esi]
+       mov     ax,27h
+       stosw
+       ret
+symbol_out_of_scope:
+       mov     edi,message
+       mov     esi,_symbol_out_of_scope_1
+       call    copy_asciiz
+       cmp     [error_info],0
+       je      finish_symbol_out_of_scope_message
+       mov     esi,[error_info]
+       mov     esi,[esi+24]
+       or      esi,esi
+       jz      finish_symbol_out_of_scope_message
+       mov     byte [edi-1],20h
+       call    write_quoted_symbol_name
+    finish_symbol_out_of_scope_message:
+       mov     byte [edi-1],20h
+       mov     esi,_symbol_out_of_scope_2
+       call    copy_asciiz
+       push    message
+       jmp     error_with_source
+invalid_use_of_symbol:
+       push    _invalid_use_of_symbol
+       jmp     error_with_source
+name_too_long:
+       push    _name_too_long
+       jmp     error_with_source
+invalid_name:
+       push    _invalid_name
+       jmp     error_with_source
+reserved_word_used_as_symbol:
+       push    _reserved_word_used_as_symbol
+       jmp     error_with_source
+symbol_already_defined:
+       push    _symbol_already_defined
+       jmp     error_with_source
+missing_end_quote:
+       push    _missing_end_quote
+       jmp     error_with_source
+missing_end_directive:
+       push    _missing_end_directive
+       jmp     error_with_source
+unexpected_instruction:
+       push    _unexpected_instruction
+       jmp     error_with_source
+extra_characters_on_line:
+       push    _extra_characters_on_line
+       jmp     error_with_source
+section_not_aligned_enough:
+       push    _section_not_aligned_enough
+       jmp     error_with_source
+setting_already_specified:
+       push    _setting_already_specified
+       jmp     error_with_source
+data_already_defined:
+       push    _data_already_defined
+       jmp     error_with_source
+too_many_repeats:
+       push    _too_many_repeats
+       jmp     error_with_source
+assertion_failed:
+       push    _assertion_failed
+       jmp     error_with_source
+invoked_error:
+       push    _invoked_error
+    error_with_source:
+       cmp     [symbols_file],0
+       je      assembler_error
+       call    dump_preprocessed_source
+       call    restore_preprocessed_source
+       jmp     assembler_error
diff --git a/source/exprcalc.inc b/source/exprcalc.inc
new file mode 100644 (file)
index 0000000..2bb5b82
--- /dev/null
@@ -0,0 +1,2272 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+calculate_expression:
+       mov     [current_offset],edi
+       mov     [value_undefined],0
+       cmp     byte [esi],0
+       je      get_string_value
+       cmp     byte [esi],'.'
+       je      convert_fp
+      calculation_loop:
+       mov     eax,[tagged_blocks]
+       sub     eax,0Ch
+       cmp     eax,edi
+       jbe     out_of_memory
+       lods    byte [esi]
+       cmp     al,1
+       je      get_byte_number
+       cmp     al,2
+       je      get_word_number
+       cmp     al,4
+       je      get_dword_number
+       cmp     al,8
+       je      get_qword_number
+       cmp     al,0Fh
+       je      value_out_of_range
+       cmp     al,10h
+       je      get_register
+       cmp     al,11h
+       je      get_label
+       cmp     al,')'
+       je      expression_calculated
+       cmp     al,']'
+       je      expression_calculated
+       cmp     al,'!'
+       je      invalid_expression
+       sub     edi,14h
+       mov     ebx,edi
+       sub     ebx,14h
+       cmp     al,0F0h
+       je      calculate_rva
+       cmp     al,0F1h
+       je      calculate_plt
+       cmp     al,0D0h
+       je      calculate_not
+       cmp     al,0E0h
+       je      calculate_bsf
+       cmp     al,0E1h
+       je      calculate_bsr
+       cmp     al,083h
+       je      calculate_neg
+       mov     dx,[ebx+8]
+       or      dx,[edi+8]
+       cmp     al,80h
+       je      calculate_add
+       cmp     al,81h
+       je      calculate_sub
+       mov     ah,[ebx+12]
+       or      ah,[edi+12]
+       jz      absolute_values_calculation
+       call    recoverable_misuse
+      absolute_values_calculation:
+       cmp     al,90h
+       je      calculate_mul
+       cmp     al,91h
+       je      calculate_div
+       or      dx,dx
+       jnz     invalid_expression
+       cmp     al,0A0h
+       je      calculate_mod
+       cmp     al,0B0h
+       je      calculate_and
+       cmp     al,0B1h
+       je      calculate_or
+       cmp     al,0B2h
+       je      calculate_xor
+       cmp     al,0C0h
+       je      calculate_shl
+       cmp     al,0C1h
+       je      calculate_shr
+       jmp     invalid_expression
+      expression_calculated:
+       sub     edi,14h
+       cmp     [value_undefined],0
+       je      expression_value_ok
+       xor     eax,eax
+       mov     [edi],eax
+       mov     [edi+4],eax
+       mov     [edi+12],eax
+      expression_value_ok:
+       ret
+      get_byte_number:
+       xor     eax,eax
+       lods    byte [esi]
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+      got_number:
+       and     word [edi-8+8],0
+       and     word [edi-8+12],0
+       and     dword [edi-8+16],0
+       add     edi,0Ch
+       jmp     calculation_loop
+      get_word_number:
+       xor     eax,eax
+       lods    word [esi]
+       stos    dword [edi]
+       xor     ax,ax
+       stos    dword [edi]
+       jmp     got_number
+      get_dword_number:
+       movs    dword [edi],[esi]
+       xor     eax,eax
+       stos    dword [edi]
+       jmp     got_number
+      get_qword_number:
+       movs    dword [edi],[esi]
+       movs    dword [edi],[esi]
+       jmp     got_number
+      get_register:
+       mov     byte [edi+9],0
+       and     word [edi+12],0
+       lods    byte [esi]
+       mov     [edi+8],al
+       mov     byte [edi+10],1
+       xor     eax,eax
+       mov     [edi+16],eax
+       stos    dword [edi]
+       stos    dword [edi]
+       add     edi,0Ch
+       jmp     calculation_loop
+      get_label:
+       xor     eax,eax
+       mov     [edi+8],eax
+       mov     [edi+12],eax
+       mov     [edi+20],eax
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      predefined_label
+       je      reserved_word_used_as_symbol
+       mov     ebx,eax
+       mov     ax,[current_pass]
+       mov     [ebx+18],ax
+       mov     cl,[ebx+9]
+       shr     cl,1
+       and     cl,1
+       neg     cl
+       or      byte [ebx+8],8
+       test    byte [ebx+8],1
+       jz      label_undefined
+       cmp     ax,[ebx+16]
+       je      unadjusted_label
+       test    byte [ebx+8],4
+       jnz     label_out_of_scope
+       test    byte [ebx+9],1
+       jz      unadjusted_label
+       mov     eax,[ebx]
+       sub     eax,dword [adjustment]
+       stos    dword [edi]
+       mov     eax,[ebx+4]
+       sbb     eax,dword [adjustment+4]
+       stos    dword [edi]
+       sbb     cl,[adjustment_sign]
+       mov     [edi-8+13],cl
+       mov     eax,dword [adjustment]
+       or      al,[adjustment_sign]
+       or      eax,dword [adjustment+4]
+       jz      got_label
+       or      [next_pass_needed],-1
+       jmp     got_label
+      unadjusted_label:
+       mov     eax,[ebx]
+       stos    dword [edi]
+       mov     eax,[ebx+4]
+       stos    dword [edi]
+       mov     [edi-8+13],cl
+      got_label:
+       test    byte [ebx+9],4
+       jnz     invalid_use_of_symbol
+       call    store_label_reference
+       mov     al,[ebx+11]
+       mov     [edi-8+12],al
+       mov     eax,[ebx+12]
+       mov     [edi-8+8],eax
+       cmp     al,ah
+       jne     labeled_registers_ok
+       shr     eax,16
+       add     al,ah
+       jo      labeled_registers_ok
+       xor     ah,ah
+       mov     [edi-8+10],ax
+       mov     [edi-8+9],ah
+      labeled_registers_ok:
+       mov     eax,[ebx+20]
+       mov     [edi-8+16],eax
+       add     edi,0Ch
+       mov     al,[ebx+10]
+       or      al,al
+       jz      calculation_loop
+       test    [operand_flags],1
+       jnz     calculation_loop
+      check_size:
+       xchg    [operand_size],al
+       or      al,al
+       jz      calculation_loop
+       cmp     al,[operand_size]
+       jne     operand_sizes_do_not_match
+       jmp     calculation_loop
+      actual_file_offset_label:
+       mov     eax,[undefined_data_end]
+       mov     ebp,[addressing_space]
+       test    byte [ds:ebp+0Ah],1
+       jnz     use_undefined_data_offset
+       cmp     eax,[current_offset]
+       jne     use_current_offset
+       use_undefined_data_offset:
+       mov     eax,[undefined_data_start]
+       jmp     make_file_offset_label
+      current_file_offset_label:
+       mov     ebp,[addressing_space]
+       test    byte [ds:ebp+0Ah],1
+       jz      use_current_offset
+       mov     eax,[undefined_data_end]
+       jmp     make_file_offset_label
+       use_current_offset:
+       mov     eax,[current_offset]
+       make_file_offset_label:
+       cmp     [output_format],2
+       jae     invalid_use_of_symbol
+       sub     eax,[code_start]
+       jmp     make_dword_label_value
+      current_offset_label:
+       mov     eax,[current_offset]
+       make_current_offset_label:
+       xor     edx,edx
+       xor     ch,ch
+       mov     ebp,[addressing_space]
+       sub     eax,[ds:ebp]
+       sbb     edx,[ds:ebp+4]
+       sbb     ch,[ds:ebp+8]
+       jp      current_offset_label_ok
+       call    recoverable_overflow
+       current_offset_label_ok:
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       mov     eax,[ds:ebp+10h]
+       stos    dword [edi]
+       mov     cl,[ds:ebp+9]
+       mov     [edi-12+12],cx
+       mov     eax,[ds:ebp+14h]
+       mov     [edi-12+16],eax
+       add     edi,8
+       jmp     calculation_loop
+      org_origin_label:
+       mov     eax,[addressing_space]
+       mov     eax,[eax+18h]
+       jmp     make_current_offset_label
+      counter_label:
+       mov     eax,[counter]
+      make_dword_label_value:
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       add     edi,0Ch
+       jmp     calculation_loop
+      timestamp_label:
+       call    make_timestamp
+      make_qword_label_value:
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       add     edi,0Ch
+       jmp     calculation_loop
+      predefined_label:
+       or      eax,eax
+       jz      current_offset_label
+       cmp     eax,1
+       je      counter_label
+       cmp     eax,2
+       je      timestamp_label
+       cmp     eax,3
+       je      org_origin_label
+       cmp     eax,4
+       je      current_file_offset_label
+       cmp     eax,5
+       je      actual_file_offset_label
+       mov     edx,invalid_value
+       jmp     error_undefined
+      label_out_of_scope:
+       mov     edx,symbol_out_of_scope
+       jmp     error_undefined
+      label_undefined:
+       mov     edx,undefined_symbol
+      error_undefined:
+       cmp     [current_pass],1
+       ja      undefined_value
+      force_next_pass:
+       or      [next_pass_needed],-1
+      undefined_value:
+       or      [value_undefined],-1
+       and     word [edi+12],0
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       add     edi,0Ch
+       cmp     [error_line],0
+       jne     calculation_loop
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [error],edx
+       mov     [error_info],ebx
+       jmp     calculation_loop
+      calculate_add:
+       xor     ah,ah
+       mov     ah,[ebx+12]
+       mov     al,[edi+12]
+       or      al,al
+       jz      add_values
+       or      ah,ah
+       jz      add_relocatable
+       add     ah,al
+       jnz     invalid_add
+       mov     ecx,[edi+16]
+       cmp     ecx,[ebx+16]
+       je      add_values
+      invalid_add:
+       call    recoverable_misuse
+       jmp     add_values
+      add_relocatable:
+       mov     ah,al
+       mov     ecx,[edi+16]
+       mov     [ebx+16],ecx
+      add_values:
+       mov     [ebx+12],ah
+       mov     eax,[edi]
+       add     [ebx],eax
+       mov     eax,[edi+4]
+       adc     [ebx+4],eax
+       mov     al,[edi+13]
+       adc     [ebx+13],al
+       jp      add_sign_ok
+       call    recoverable_overflow
+      add_sign_ok:
+       or      dx,dx
+       jz      calculation_loop
+       push    esi
+       mov     esi,ebx
+       mov     cl,[edi+10]
+       mov     al,[edi+8]
+       call    add_register
+       mov     cl,[edi+11]
+       mov     al,[edi+9]
+       call    add_register
+       pop     esi
+       jmp     calculation_loop
+      add_register:
+       or      al,al
+       jz      add_register_done
+      add_register_start:
+       cmp     [esi+8],al
+       jne     add_in_second_slot
+       add     [esi+10],cl
+       jo      value_out_of_range
+       jnz     add_register_done
+       mov     byte [esi+8],0
+       ret
+      add_in_second_slot:
+       cmp     [esi+9],al
+       jne     create_in_first_slot
+       add     [esi+11],cl
+       jo      value_out_of_range
+       jnz     add_register_done
+       mov     byte [esi+9],0
+       ret
+      create_in_first_slot:
+       cmp     byte [esi+8],0
+       jne     create_in_second_slot
+       mov     [esi+8],al
+       mov     [esi+10],cl
+       ret
+      create_in_second_slot:
+       cmp     byte [esi+9],0
+       jne     invalid_expression
+       mov     [esi+9],al
+       mov     [esi+11],cl
+      add_register_done:
+       ret
+      out_of_range:
+       jmp     calculation_loop
+      calculate_sub:
+       xor     ah,ah
+       mov     ah,[ebx+12]
+       mov     al,[edi+12]
+       or      al,al
+       jz      sub_values
+       or      ah,ah
+       jz      negate_relocatable
+       cmp     al,ah
+       jne     invalid_sub
+       xor     ah,ah
+       mov     ecx,[edi+16]
+       cmp     ecx,[ebx+16]
+       je      sub_values
+      invalid_sub:
+       call    recoverable_misuse
+       jmp     sub_values
+      negate_relocatable:
+       neg     al
+       mov     ah,al
+       mov     ecx,[edi+16]
+       mov     [ebx+16],ecx
+      sub_values:
+       mov     [ebx+12],ah
+       mov     eax,[edi]
+       sub     [ebx],eax
+       mov     eax,[edi+4]
+       sbb     [ebx+4],eax
+       mov     al,[edi+13]
+       sbb     [ebx+13],al
+       jp      sub_sign_ok
+       cmp     [error_line],0
+       jne     sub_sign_ok
+       call    recoverable_overflow
+      sub_sign_ok:
+       or      dx,dx
+       jz      calculation_loop
+       push    esi
+       mov     esi,ebx
+       mov     cl,[edi+10]
+       mov     al,[edi+8]
+       call    sub_register
+       mov     cl,[edi+11]
+       mov     al,[edi+9]
+       call    sub_register
+       pop     esi
+       jmp     calculation_loop
+      sub_register:
+       or      al,al
+       jz      add_register_done
+       neg     cl
+       jo      value_out_of_range
+       jmp     add_register_start
+      calculate_mul:
+       or      dx,dx
+       jz      mul_start
+       cmp     word [ebx+8],0
+       jne     mul_start
+       xor     ecx,ecx
+      swap_values:
+       mov     eax,[ebx+ecx]
+       xchg    eax,[edi+ecx]
+       mov     [ebx+ecx],eax
+       add     ecx,4
+       cmp     ecx,16
+       jb      swap_values
+      mul_start:
+       push    esi edx
+       mov     esi,ebx
+       xor     bl,bl
+       cmp     byte [esi+13],0
+       je      mul_first_sign_ok
+       xor     bl,-1
+       mov     eax,[esi]
+       mov     edx,[esi+4]
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     [esi],eax
+       mov     [esi+4],edx
+       or      eax,edx
+       jz      mul_overflow
+      mul_first_sign_ok:
+       cmp     byte [edi+13],0
+       je      mul_second_sign_ok
+       xor     bl,-1
+       cmp     byte [esi+8],0
+       je      mul_first_register_sign_ok
+       neg     byte [esi+10]
+       jo      invalid_expression
+      mul_first_register_sign_ok:
+       cmp     byte [esi+9],0
+       je      mul_second_register_sign_ok
+       neg     byte [esi+11]
+       jo      invalid_expression
+      mul_second_register_sign_ok:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     [edi],eax
+       mov     [edi+4],edx
+       or      eax,edx
+       jz      mul_overflow
+      mul_second_sign_ok:
+       cmp     dword [esi+4],0
+       jz      mul_numbers
+       cmp     dword [edi+4],0
+       jz      mul_numbers
+       jnz     mul_overflow
+      mul_numbers:
+       mov     eax,[esi+4]
+       mul     dword [edi]
+       or      edx,edx
+       jnz     mul_overflow
+       mov     ecx,eax
+       mov     eax,[esi]
+       mul     dword [edi+4]
+       or      edx,edx
+       jnz     mul_overflow
+       add     ecx,eax
+       jc      mul_overflow
+       mov     eax,[esi]
+       mul     dword [edi]
+       add     edx,ecx
+       jc      mul_overflow
+       mov     [esi],eax
+       mov     [esi+4],edx
+       or      bl,bl
+       jz      mul_ok
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     [esi],eax
+       mov     [esi+4],edx
+       or      eax,edx
+       jnz     mul_ok
+       not     bl
+      mul_ok:
+       mov     [esi+13],bl
+       pop     edx
+       or      dx,dx
+       jz      mul_calculated
+       cmp     word [edi+8],0
+       jne     invalid_value
+       cmp     byte [esi+8],0
+       je      mul_first_register_ok
+       call    get_byte_scale
+       imul    byte [esi+10]
+       mov     dl,ah
+       cbw
+       cmp     ah,dl
+       jne     value_out_of_range
+       mov     [esi+10],al
+       or      al,al
+       jnz     mul_first_register_ok
+       mov     [esi+8],al
+      mul_first_register_ok:
+       cmp     byte [esi+9],0
+       je      mul_calculated
+       call    get_byte_scale
+       imul    byte [esi+11]
+       mov     dl,ah
+       cbw
+       cmp     ah,dl
+       jne     value_out_of_range
+       mov     [esi+11],al
+       or      al,al
+       jnz     mul_calculated
+       mov     [esi+9],al
+      mul_calculated:
+       pop     esi
+       jmp     calculation_loop
+      mul_overflow:
+       pop     edx esi
+       call    recoverable_overflow
+       jmp     calculation_loop
+      get_byte_scale:
+       mov     al,[edi]
+       cbw
+       cwde
+       cdq
+       cmp     edx,[edi+4]
+       jne     value_out_of_range
+       cmp     eax,[edi]
+       jne     value_out_of_range
+       ret
+      calculate_div:
+       push    esi edx
+       mov     esi,ebx
+       call    div_64
+       pop     edx
+       or      dx,dx
+       jz      div_calculated
+       cmp     byte [esi+8],0
+       je      div_first_register_ok
+       call    get_byte_scale
+       or      al,al
+       jz      value_out_of_range
+       mov     al,[esi+10]
+       cbw
+       idiv    byte [edi]
+       or      ah,ah
+       jnz     invalid_use_of_symbol
+       mov     [esi+10],al
+      div_first_register_ok:
+       cmp     byte [esi+9],0
+       je      div_calculated
+       call    get_byte_scale
+       or      al,al
+       jz      value_out_of_range
+       mov     al,[esi+11]
+       cbw
+       idiv    byte [edi]
+       or      ah,ah
+       jnz     invalid_use_of_symbol
+       mov     [esi+11],al
+      div_calculated:
+       pop     esi
+       jmp     calculation_loop
+      calculate_mod:
+       push    esi
+       mov     esi,ebx
+       call    div_64
+       mov     [esi],eax
+       mov     [esi+4],edx
+       mov     [esi+13],bh
+       pop     esi
+       jmp     calculation_loop
+      calculate_and:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       mov     cl,[edi+13]
+       and     [ebx],eax
+       and     [ebx+4],edx
+       and     [ebx+13],cl
+       jmp     calculation_loop
+      calculate_or:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       mov     cl,[edi+13]
+       or      [ebx],eax
+       or      [ebx+4],edx
+       or      [ebx+13],cl
+       jmp     calculation_loop
+      calculate_xor:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       mov     cl,[edi+13]
+       xor     [ebx],eax
+       xor     [ebx+4],edx
+       xor     [ebx+13],cl
+       jmp     calculation_loop
+      shr_negative:
+       mov     byte [edi+13],0
+       not     dword [edi]
+       not     dword [edi+4]
+       add     dword [edi],1
+       adc     dword [edi+4],0
+       jc      shl_over
+      calculate_shl:
+       cmp     byte [edi+13],0
+       jne     shl_negative
+       mov     edx,[ebx+4]
+       mov     eax,[ebx]
+       cmp     dword [edi+4],0
+       jne     shl_over
+       movsx   ecx,byte [ebx+13]
+       xchg    ecx,[edi]
+       cmp     ecx,64
+       je      shl_max
+       ja      shl_over
+       cmp     ecx,32
+       jae     shl_high
+       shld    [edi],edx,cl
+       shld    edx,eax,cl
+       shl     eax,cl
+       mov     [ebx],eax
+       mov     [ebx+4],edx
+       jmp     shl_done
+      shl_over:
+       cmp     byte [ebx+13],0
+       jne     shl_overflow
+      shl_max:
+       movsx   ecx,byte [ebx+13]
+       cmp     eax,ecx
+       jne     shl_overflow
+       cmp     edx,ecx
+       jne     shl_overflow
+       xor     eax,eax
+       mov     [ebx],eax
+       mov     [ebx+4],eax
+       jmp     calculation_loop
+      shl_high:
+       sub     cl,32
+       shld    [edi],edx,cl
+       shld    edx,eax,cl
+       shl     eax,cl
+       mov     [ebx+4],eax
+       and     dword [ebx],0
+       cmp     edx,[edi]
+       jne     shl_overflow
+      shl_done:
+       movsx   eax,byte [ebx+13]
+       cmp     eax,[edi]
+       je      calculation_loop
+      shl_overflow:
+       call    recoverable_overflow
+       jmp     calculation_loop
+      shl_negative:
+       mov     byte [edi+13],0
+       not     dword [edi]
+       not     dword [edi+4]
+       add     dword [edi],1
+       adc     dword [edi+4],0
+       jnc     calculate_shr
+       dec     dword [edi+4]
+      calculate_shr:
+       cmp     byte [edi+13],0
+       jne     shr_negative
+       mov     edx,[ebx+4]
+       mov     eax,[ebx]
+       cmp     dword [edi+4],0
+       jne     shr_over
+       mov     ecx,[edi]
+       cmp     ecx,64
+       jae     shr_over
+       push    esi
+       movsx   esi,byte [ebx+13]
+       cmp     ecx,32
+       jae     shr_high
+       shrd    eax,edx,cl
+       shrd    edx,esi,cl
+       mov     [ebx],eax
+       mov     [ebx+4],edx
+       pop     esi
+       jmp     calculation_loop
+      shr_high:
+       sub     cl,32
+       shrd    edx,esi,cl
+       mov     [ebx],edx
+       mov     [ebx+4],esi
+       pop     esi
+       jmp     calculation_loop
+      shr_over:
+       movsx   eax,byte [ebx+13]
+       mov     dword [ebx],eax
+       mov     dword [ebx+4],eax
+       jmp     calculation_loop
+      calculate_not:
+       cmp     word [edi+8],0
+       jne     invalid_expression
+       cmp     byte [edi+12],0
+       je      not_ok
+       call    recoverable_misuse
+      not_ok:
+       not     dword [edi]
+       not     dword [edi+4]
+       not     byte [edi+13]
+       add     edi,14h
+       jmp     calculation_loop
+      calculate_bsf:
+       cmp     word [edi+8],0
+       jne     invalid_expression
+       cmp     byte [edi+12],0
+       je      bsf_ok
+       call    recoverable_misuse
+      bsf_ok:
+       xor     ecx,ecx
+       bsf     eax,[edi]
+       jnz     finish_bs
+       mov     ecx,32
+       bsf     eax,[edi+4]
+       jnz     finish_bs
+       cmp     byte [edi+13],0
+       jne     finish_bs
+      bs_overflow:
+       call    recoverable_overflow
+       add     edi,14h
+       jmp     calculation_loop
+      calculate_bsr:
+       cmp     word [edi+8],0
+       jne     invalid_expression
+       cmp     byte [edi+12],0
+       je      bsr_ok
+       call    recoverable_misuse
+      bsr_ok:
+       cmp     byte [edi+13],0
+       jne     bs_overflow
+       mov     ecx,32
+       bsr     eax,[edi+4]
+       jnz     finish_bs
+       xor     ecx,ecx
+       bsr     eax,[edi]
+       jz      bs_overflow
+      finish_bs:
+       add     eax,ecx
+       xor     edx,edx
+       mov     [edi],eax
+       mov     [edi+4],edx
+       mov     [edi+13],dl
+       add     edi,14h
+       jmp     calculation_loop
+      calculate_neg:
+       cmp     byte [edi+8],0
+       je      neg_first_register_ok
+       neg     byte [edi+10]
+       jo      invalid_expression
+      neg_first_register_ok:
+       cmp     byte [edi+9],0
+       je      neg_second_register_ok
+       neg     byte [edi+11]
+       jo      invalid_expression
+      neg_second_register_ok:
+       neg     byte [edi+12]
+       xor     eax,eax
+       xor     edx,edx
+       xor     cl,cl
+       xchg    eax,[edi]
+       xchg    edx,[edi+4]
+       xchg    cl,[edi+13]
+       sub     [edi],eax
+       sbb     [edi+4],edx
+       sbb     [edi+13],cl
+       jp      neg_sign_ok
+       call    recoverable_overflow
+      neg_sign_ok:
+       add     edi,14h
+       jmp     calculation_loop
+      calculate_rva:
+       cmp     word [edi+8],0
+       jne     invalid_expression
+       mov     al,[output_format]
+       cmp     al,5
+       je      calculate_gotoff
+       cmp     al,4
+       je      calculate_coff_rva
+       cmp     al,3
+       jne     invalid_expression
+       test    [format_flags],8
+       jnz     pe64_rva
+       mov     al,2
+       bt      [resolver_flags],0
+       jc      rva_type_ok
+       xor     al,al
+      rva_type_ok:
+       cmp     byte [edi+12],al
+       je      rva_ok
+       call    recoverable_misuse
+      rva_ok:
+       mov     byte [edi+12],0
+       mov     eax,[code_start]
+       mov     eax,[eax+34h]
+       xor     edx,edx
+      finish_rva:
+       sub     [edi],eax
+       sbb     [edi+4],edx
+       sbb     byte [edi+13],0
+       jp      rva_finished
+       call    recoverable_overflow
+      rva_finished:
+       add     edi,14h
+       jmp     calculation_loop
+      pe64_rva:
+       mov     al,4
+       bt      [resolver_flags],0
+       jc      pe64_rva_type_ok
+       xor     al,al
+      pe64_rva_type_ok:
+       cmp     byte [edi+12],al
+       je      pe64_rva_ok
+       call    recoverable_misuse
+      pe64_rva_ok:
+       mov     byte [edi+12],0
+       mov     eax,[code_start]
+       mov     edx,[eax+34h]
+       mov     eax,[eax+30h]
+       jmp     finish_rva
+      calculate_gotoff:
+       test    [format_flags],1
+       jnz     calculate_elf_dyn_rva
+       test    [format_flags],8
+       jnz     invalid_expression
+      calculate_coff_rva:
+       mov     dl,5
+       cmp     byte [edi+12],2
+       je      change_value_type
+      incorrect_change_of_value_type:
+       call    recoverable_misuse
+      change_value_type:
+       mov     byte [edi+12],dl
+       add     edi,14h
+       jmp     calculation_loop
+      calculate_elf_dyn_rva:
+       xor     dl,dl
+       test    byte [edi+12],1
+       jnz     incorrect_change_of_value_type
+       jmp     change_value_type
+      calculate_plt:
+       cmp     word [edi+8],0
+       jne     invalid_expression
+       cmp     [output_format],5
+       jne     invalid_expression
+       test    [format_flags],1
+       jnz     invalid_expression
+       mov     dl,6
+       mov     dh,2
+       test    [format_flags],8
+       jz      check_value_for_plt
+       mov     dh,4
+      check_value_for_plt:
+       mov     eax,[edi]
+       or      eax,[edi+4]
+       jnz     incorrect_change_of_value_type
+       cmp     byte [edi+12],dh
+       jne     incorrect_change_of_value_type
+       mov     eax,[edi+16]
+       cmp     byte [eax],80h
+       jne     incorrect_change_of_value_type
+       jmp     change_value_type
+      div_64:
+       xor     ebx,ebx
+       cmp     dword [edi],0
+       jne     divider_ok
+       cmp     dword [edi+4],0
+       jne     divider_ok
+       cmp     [next_pass_needed],0
+       je      value_out_of_range
+       jmp     div_done
+      divider_ok:
+       cmp     byte [esi+13],0
+       je      div_first_sign_ok
+       mov     eax,[esi]
+       mov     edx,[esi+4]
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     [esi],eax
+       mov     [esi+4],edx
+       or      eax,edx
+       jz      value_out_of_range
+       xor     bx,-1
+      div_first_sign_ok:
+       cmp     byte [edi+13],0
+       je      div_second_sign_ok
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     [edi],eax
+       mov     [edi+4],edx
+       or      eax,edx
+       jz      value_out_of_range
+       xor     bl,-1
+      div_second_sign_ok:
+       cmp     dword [edi+4],0
+       jne     div_high
+       mov     ecx,[edi]
+       mov     eax,[esi+4]
+       xor     edx,edx
+       div     ecx
+       mov     [esi+4],eax
+       mov     eax,[esi]
+       div     ecx
+       mov     [esi],eax
+       mov     eax,edx
+       xor     edx,edx
+       jmp     div_done
+      div_high:
+       push    ebx
+       mov     eax,[esi+4]
+       xor     edx,edx
+       div     dword [edi+4]
+       mov     ebx,[esi]
+       mov     [esi],eax
+       and     dword [esi+4],0
+       mov     ecx,edx
+       mul     dword [edi]
+      div_high_loop:
+       cmp     ecx,edx
+       ja      div_high_done
+       jb      div_high_large_correction
+       cmp     ebx,eax
+       jae     div_high_done
+      div_high_correction:
+       dec     dword [esi]
+       sub     eax,[edi]
+       sbb     edx,[edi+4]
+       jnc     div_high_loop
+      div_high_done:
+       sub     ebx,eax
+       sbb     ecx,edx
+       mov     edx,ecx
+       mov     eax,ebx
+       pop     ebx
+       jmp     div_done
+      div_high_large_correction:
+       push    eax edx
+       mov     eax,edx
+       sub     eax,ecx
+       xor     edx,edx
+       div     dword [edi+4]
+       shr     eax,1
+       jz      div_high_small_correction
+       sub     [esi],eax
+       push    eax
+       mul     dword [edi+4]
+       sub     dword [esp+4],eax
+       pop     eax
+       mul     dword [edi]
+       sub     dword [esp+4],eax
+       sbb     dword [esp],edx
+       pop     edx eax
+       jmp     div_high_loop
+      div_high_small_correction:
+       pop     edx eax
+       jmp     div_high_correction
+      div_done:
+       or      bh,bh
+       jz      remainder_ok
+       not     eax
+       not     edx
+       add     eax,1
+       adc     edx,0
+       mov     ecx,eax
+       or      ecx,edx
+       jnz     remainder_ok
+       not     bh
+      remainder_ok:
+       or      bl,bl
+       jz      div_ok
+       not     dword [esi]
+       not     dword [esi+4]
+       add     dword [esi],1
+       adc     dword [esi+4],0
+       mov     ecx,[esi]
+       or      ecx,[esi+4]
+       jnz     div_ok
+       not     bl
+      div_ok:
+       mov     [esi+13],bl
+       ret
+      store_label_reference:
+       cmp     [symbols_file],0
+       je      label_reference_ok
+       cmp     [next_pass_needed],0
+       jne     label_reference_ok
+       mov     eax,[tagged_blocks]
+       mov     dword [eax-4],2
+       mov     dword [eax-8],4
+       sub     eax,8+4
+       cmp     eax,edi
+       jbe     out_of_memory
+       mov     [tagged_blocks],eax
+       mov     [eax],ebx
+      label_reference_ok:
+       ret
+      convert_fp:
+       inc     esi
+       and     word [edi+8],0
+       and     word [edi+12],0
+       mov     al,[value_size]
+       cmp     al,2
+       je      convert_fp_word
+       cmp     al,4
+       je      convert_fp_dword
+       test    al,not 8
+       jz      convert_fp_qword
+       call    recoverable_misuse
+      convert_fp_qword:
+       xor     eax,eax
+       xor     edx,edx
+       cmp     word [esi+8],8000h
+       je      fp_qword_store
+       mov     bx,[esi+8]
+       mov     eax,[esi]
+       mov     edx,[esi+4]
+       add     eax,eax
+       adc     edx,edx
+       mov     ecx,edx
+       shr     edx,12
+       shrd    eax,ecx,12
+       jnc     fp_qword_ok
+       add     eax,1
+       adc     edx,0
+       bt      edx,20
+       jnc     fp_qword_ok
+       and     edx,1 shl 20 - 1
+       inc     bx
+       shr     edx,1
+       rcr     eax,1
+      fp_qword_ok:
+       add     bx,3FFh
+       cmp     bx,7FFh
+       jge     value_out_of_range
+       cmp     bx,0
+       jg      fp_qword_exp_ok
+       or      edx,1 shl 20
+       mov     cx,bx
+       neg     cx
+       inc     cx
+       cmp     cx,52+1
+       ja      value_out_of_range
+       cmp     cx,32
+       jb      fp_qword_small_shift
+       sub     cx,32
+       mov     eax,edx
+       xor     edx,edx
+       shr     eax,cl
+       jmp     fp_qword_shift_done
+      fp_qword_small_shift:
+       mov     ebx,edx
+       shr     edx,cl
+       shrd    eax,ebx,cl
+      fp_qword_shift_done:
+       mov     bx,0
+       jnc     fp_qword_exp_ok
+       add     eax,1
+       adc     edx,0
+       test    edx,1 shl 20
+       jz      fp_qword_exp_ok
+       and     edx,1 shl 20 - 1
+       inc     bx
+      fp_qword_exp_ok:
+       shl     ebx,20
+       or      edx,ebx
+       jnz     fp_qword_store
+       or      eax,eax
+       jz      value_out_of_range
+      fp_qword_store:
+       mov     bl,[esi+11]
+       shl     ebx,31
+       or      edx,ebx
+       mov     [edi],eax
+       mov     [edi+4],edx
+       add     esi,13
+       ret
+      convert_fp_word:
+       xor     eax,eax
+       cmp     word [esi+8],8000h
+       je      fp_word_store
+       mov     bx,[esi+8]
+       mov     ax,[esi+6]
+       shl     ax,1
+       shr     ax,6
+       jnc     fp_word_ok
+       inc     ax
+       bt      ax,10
+       jnc     fp_word_ok
+       and     ax,1 shl 10 - 1
+       inc     bx
+       shr     ax,1
+      fp_word_ok:
+       add     bx,0Fh
+       cmp     bx,01Fh
+       jge     value_out_of_range
+       cmp     bx,0
+       jg      fp_word_exp_ok
+       or      ax,1 shl 10
+       mov     cx,bx
+       neg     cx
+       inc     cx
+       cmp     cx,10+1
+       ja      value_out_of_range
+       xor     bx,bx
+       shr     ax,cl
+       jnc     fp_word_exp_ok
+       inc     ax
+       test    ax,1 shl 10
+       jz      fp_word_exp_ok
+       and     ax,1 shl 10 - 1
+       inc     bx
+      fp_word_exp_ok:
+       shl     bx,10
+       or      ax,bx
+       jz      value_out_of_range
+      fp_word_store:
+       mov     bl,[esi+11]
+       shl     bx,15
+       or      ax,bx
+       mov     [edi],eax
+       xor     eax,eax
+       mov     [edi+4],eax
+       add     esi,13
+       ret
+      convert_fp_dword:
+       xor     eax,eax
+       cmp     word [esi+8],8000h
+       je      fp_dword_store
+       mov     bx,[esi+8]
+       mov     eax,[esi+4]
+       shl     eax,1
+       shr     eax,9
+       jnc     fp_dword_ok
+       inc     eax
+       bt      eax,23
+       jnc     fp_dword_ok
+       and     eax,1 shl 23 - 1
+       inc     bx
+       shr     eax,1
+      fp_dword_ok:
+       add     bx,7Fh
+       cmp     bx,0FFh
+       jge     value_out_of_range
+       cmp     bx,0
+       jg      fp_dword_exp_ok
+       or      eax,1 shl 23
+       mov     cx,bx
+       neg     cx
+       inc     cx
+       cmp     cx,23+1
+       ja      value_out_of_range
+       xor     bx,bx
+       shr     eax,cl
+       jnc     fp_dword_exp_ok
+       inc     eax
+       test    eax,1 shl 23
+       jz      fp_dword_exp_ok
+       and     eax,1 shl 23 - 1
+       inc     bx
+      fp_dword_exp_ok:
+       shl     ebx,23
+       or      eax,ebx
+       jz      value_out_of_range
+      fp_dword_store:
+       mov     bl,[esi+11]
+       shl     ebx,31
+       or      eax,ebx
+       mov     [edi],eax
+       xor     eax,eax
+       mov     [edi+4],eax
+       add     esi,13
+       ret
+      get_string_value:
+       inc     esi
+       lods    dword [esi]
+       mov     ecx,eax
+       cmp     ecx,8
+       ja      value_out_of_range
+       mov     edx,edi
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     edi,edx
+       rep     movs byte [edi],[esi]
+       mov     edi,edx
+       inc     esi
+       and     word [edi+8],0
+       and     word [edi+12],0
+       ret
+
+get_byte_value:
+       mov     [value_size],1
+       or      [operand_flags],1
+       call    calculate_value
+       or      al,al
+       jz      check_byte_value
+       call    recoverable_misuse
+      check_byte_value:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       cmp     byte [edi+13],0
+       je      byte_positive
+       cmp     edx,-1
+       jne     range_exceeded
+       cmp     eax,-100h
+       jb      range_exceeded
+       ret
+      byte_positive:
+       test    edx,edx
+       jnz     range_exceeded
+       cmp     eax,100h
+       jae     range_exceeded
+      return_byte_value:
+       ret
+      range_exceeded:
+       xor     eax,eax
+       xor     edx,edx
+      recoverable_overflow:
+       cmp     [error_line],0
+       jne     ignore_overflow
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],value_out_of_range
+       or      [value_undefined],-1
+      ignore_overflow:
+       ret
+      recoverable_misuse:
+       cmp     [error_line],0
+       jne     ignore_misuse
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],invalid_use_of_symbol
+      ignore_misuse:
+       ret
+get_word_value:
+       mov     [value_size],2
+       or      [operand_flags],1
+       call    calculate_value
+       cmp     al,2
+       jb      check_word_value
+       call    recoverable_misuse
+      check_word_value:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       cmp     byte [edi+13],0
+       je      word_positive
+       cmp     edx,-1
+       jne     range_exceeded
+       cmp     eax,-10000h
+       jb      range_exceeded
+       ret
+      word_positive:
+       test    edx,edx
+       jnz     range_exceeded
+       cmp     eax,10000h
+       jae     range_exceeded
+       ret
+get_dword_value:
+       mov     [value_size],4
+       or      [operand_flags],1
+       call    calculate_value
+       cmp     al,4
+       jne     check_dword_value
+       mov     [value_type],2
+       mov     eax,[edi]
+       cdq
+       cmp     edx,[edi+4]
+       jne     range_exceeded
+       mov     ecx,edx
+       sar     ecx,31
+       cmp     cl,[value_sign]
+       jne     range_exceeded
+       ret
+      check_dword_value:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       cmp     byte [edi+13],0
+       je      dword_positive
+       cmp     edx,-1
+       jne     range_exceeded
+       ret
+      dword_positive:
+       test    edx,edx
+       jne     range_exceeded
+       ret
+get_pword_value:
+       mov     [value_size],6
+       or      [operand_flags],1
+       call    calculate_value
+       cmp     al,4
+       jne     check_pword_value
+       call    recoverable_misuse
+      check_pword_value:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       cmp     byte [edi+13],0
+       je      pword_positive
+       cmp     edx,-10000h
+       jb      range_exceeded
+       ret
+      pword_positive:
+       cmp     edx,10000h
+       jae     range_exceeded
+       ret
+get_qword_value:
+       mov     [value_size],8
+       or      [operand_flags],1
+       call    calculate_value
+      check_qword_value:
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       ret
+get_count_value:
+       mov     [value_size],8
+       or      [operand_flags],1
+       call    calculate_expression
+       cmp     word [edi+8],0
+       jne     invalid_value
+       mov     [value_sign],0
+       mov     al,[edi+12]
+       or      al,al
+       jz      check_count_value
+       call    recoverable_misuse
+      check_count_value:
+       cmp     byte [edi+13],0
+       jne     invalid_count_value
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       or      edx,edx
+       jnz     invalid_count_value
+       ret
+      invalid_count_value:
+       cmp     [error_line],0
+       jne     zero_count
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [error],invalid_value
+      zero_count:
+       xor     eax,eax
+       ret
+get_value:
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_value
+       mov     al,[operand_size]
+       cmp     al,1
+       je      value_byte
+       cmp     al,2
+       je      value_word
+       cmp     al,4
+       je      value_dword
+       cmp     al,6
+       je      value_pword
+       cmp     al,8
+       je      value_qword
+       or      al,al
+       jnz     invalid_value
+       mov     [value_size],al
+       call    calculate_value
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       ret
+      calculate_value:
+       call    calculate_expression
+       cmp     word [edi+8],0
+       jne     invalid_value
+       mov     eax,[edi+16]
+       mov     [symbol_identifier],eax
+       mov     al,[edi+13]
+       mov     [value_sign],al
+       mov     al,[edi+12]
+       mov     [value_type],al
+       ret
+      value_qword:
+       call    get_qword_value
+      truncated_value:
+       mov     [value_sign],0
+       ret
+      value_pword:
+       call    get_pword_value
+       movzx   edx,dx
+       jmp     truncated_value
+      value_dword:
+       call    get_dword_value
+       xor     edx,edx
+       jmp     truncated_value
+      value_word:
+       call    get_word_value
+       xor     edx,edx
+       movzx   eax,ax
+       jmp     truncated_value
+      value_byte:
+       call    get_byte_value
+       xor     edx,edx
+       movzx   eax,al
+       jmp     truncated_value
+get_address_word_value:
+       mov     [address_size],2
+       mov     [value_size],2
+       mov     [free_address_range],0
+       jmp     calculate_address
+get_address_dword_value:
+       mov     [address_size],4
+       mov     [value_size],4
+       mov     [free_address_range],0
+       jmp     calculate_address
+get_address_qword_value:
+       mov     [address_size],8
+       mov     [value_size],8
+       mov     [free_address_range],0
+       jmp     calculate_address
+get_address_value:
+       mov     [address_size],0
+       mov     [value_size],8
+       or      [free_address_range],-1
+      calculate_address:
+       cmp     byte [esi],'.'
+       je      invalid_address
+       call    calculate_expression
+       mov     eax,[edi+16]
+       mov     [address_symbol],eax
+       mov     al,[edi+13]
+       mov     [address_sign],al
+       mov     al,[edi+12]
+       mov     [value_type],al
+       cmp     al,0
+       je      address_size_ok
+       jg      get_address_symbol_size
+       neg     al
+      get_address_symbol_size:
+       cmp     al,6
+       je      special_address_type_32bit
+       cmp     al,5
+       je      special_address_type_32bit
+       ja      invalid_address_type
+       test    al,1
+       jnz     invalid_address_type
+       shl     al,5
+       jmp     address_symbol_ok
+      invalid_address_type:
+       call    recoverable_misuse
+      special_address_type_32bit:
+       mov     al,40h
+      address_symbol_ok:
+       mov     ah,[address_size]
+       or      [address_size],al
+       shr     al,4
+       or      ah,ah
+       jz      address_size_ok
+       cmp     al,ah
+       je      address_size_ok
+       cmp     ax,0408h
+       je      address_sizes_mixed
+       cmp     ax,0804h
+       jne     address_sizes_do_not_agree
+      address_sizes_mixed:
+       cmp     [value_type],4
+       jne     address_sizes_mixed_type_ok
+       mov     [value_type],2
+      address_sizes_mixed_type_ok:
+       mov     eax,[edi]
+       cdq
+       cmp     edx,[edi+4]
+       je      address_size_ok
+       cmp     [error_line],0
+       jne     address_size_ok
+       call    recoverable_overflow
+      address_size_ok:
+       xor     ebx,ebx
+       xor     ecx,ecx
+       mov     cl,[value_type]
+       shl     ecx,16
+       mov     ch,[address_size]
+       cmp     word [edi+8],0
+       je      check_immediate_address
+       mov     al,[edi+8]
+       mov     dl,[edi+10]
+       call    get_address_register
+       mov     al,[edi+9]
+       mov     dl,[edi+11]
+       call    get_address_register
+       mov     ax,bx
+       shr     ah,4
+       shr     al,4
+       or      bh,bh
+       jz      check_address_registers
+       or      bl,bl
+       jz      check_address_registers
+       cmp     al,ah
+       jne     check_vsib
+      check_address_registers:
+       or      al,ah
+       cmp     al,0Ch
+       jae     check_vsib
+       cmp     al,6
+       je      check_vsib
+       cmp     al,7
+       je      check_vsib
+       mov     ah,[address_size]
+       and     ah,0Fh
+       jz      address_registers_sizes_ok
+       cmp     al,ah
+       jne     invalid_address
+      address_registers_sizes_ok:
+       cmp     al,4
+       je      sib_allowed
+       cmp     al,8
+       je      sib_allowed
+       cmp     al,9
+       je      check_ip_relative_address
+       cmp     cl,1
+       ja      invalid_address
+       cmp     [free_address_range],0
+       jne     check_qword_value
+       jmp     check_word_value
+      address_sizes_do_not_match:
+       cmp     al,0Fh
+       jne     invalid_address
+       mov     al,bh
+       and     al,0Fh
+       cmp     al,ah
+       jne     invalid_address
+      check_ip_relative_address:
+       or      bl,bl
+       jnz     invalid_address
+       cmp     bh,98h
+       je      check_rip_relative_address
+       cmp     bh,94h
+       jne     invalid_address
+       cmp     [free_address_range],0
+       je      check_dword_value
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       ret
+      check_rip_relative_address:
+       mov     eax,[edi]
+       cdq
+       cmp     edx,[edi+4]
+       jne     range_exceeded
+       cmp     dl,[edi+13]
+       jne     range_exceeded
+       ret
+      get_address_register:
+       or      al,al
+       jz      address_register_ok
+       cmp     dl,1
+       jne     scaled_register
+       or      bh,bh
+       jnz     scaled_register
+       mov     bh,al
+      address_register_ok:
+       ret
+      scaled_register:
+       or      bl,bl
+       jnz     invalid_address
+       mov     bl,al
+       mov     cl,dl
+       jmp     address_register_ok
+      sib_allowed:
+       or      bh,bh
+       jnz     check_index_with_base
+       cmp     cl,3
+       je      special_index_scale
+       cmp     cl,5
+       je      special_index_scale
+       cmp     cl,9
+       je      special_index_scale
+       cmp     cl,2
+       jne     check_index_scale
+       cmp     bl,45h
+       jne     special_index_scale
+       cmp     [code_type],64
+       je      special_index_scale
+       cmp     [segment_register],4
+       jne     special_index_scale
+       cmp     [value_type],0
+       jne     check_index_scale
+       mov     al,[edi]
+       cbw
+       cwde
+       cmp     eax,[edi]
+       jne     check_index_scale
+       cdq
+       cmp     edx,[edi+4]
+       jne     check_immediate_address
+      special_index_scale:
+       mov     bh,bl
+       dec     cl
+      check_immediate_address:
+       cmp     [free_address_range],0
+       jne     check_qword_value
+       mov     al,[address_size]
+       and     al,0Fh
+       cmp     al,2
+       je      check_word_value
+       cmp     al,4
+       je      check_dword_value
+       cmp     al,8
+       je      check_qword_value
+       or      al,al
+       jnz     invalid_value
+       cmp     [code_type],64
+       jne     check_dword_value
+       jmp     check_qword_value
+      check_index_with_base:
+       cmp     cl,1
+       jne     check_index_scale
+       cmp     bl,44h
+       je      swap_base_with_index
+       cmp     bl,84h
+       je      swap_base_with_index
+       cmp     [code_type],64
+       je      check_for_rbp_base
+       cmp     bl,45h
+       jne     check_for_ebp_base
+       cmp     [segment_register],3
+       je      swap_base_with_index
+       jmp     check_immediate_address
+      check_for_ebp_base:
+       cmp     bh,45h
+       jne     check_immediate_address
+       cmp     [segment_register],4
+       jne     check_immediate_address
+      swap_base_with_index:
+       xchg    bl,bh
+       jmp     check_immediate_address
+      check_for_rbp_base:
+       cmp     bh,45h
+       je      swap_base_with_index
+       cmp     bh,85h
+       je      swap_base_with_index
+       jmp     check_immediate_address
+      check_index_scale:
+       test    cl,not 1111b
+       jnz     invalid_address
+       mov     al,cl
+       dec     al
+       and     al,cl
+       jz      check_immediate_address
+       jmp     invalid_address
+      check_vsib:
+       xor     ah,ah
+      check_vsib_base:
+       test    bh,bh
+       jz      check_vsib_index
+       mov     al,bh
+       shr     al,4
+       cmp     al,4
+       je      check_vsib_base_size
+       cmp     [code_type],64
+       jne     swap_vsib_registers
+       cmp     al,8
+       jne     swap_vsib_registers
+      check_vsib_base_size:
+       mov     ah,[address_size]
+       and     ah,0Fh
+       jz      check_vsib_index
+       cmp     al,ah
+       jne     invalid_address
+      check_vsib_index:
+       mov     al,bl
+       and     al,0E0h
+       cmp     al,0C0h
+       jae     check_index_scale
+       cmp     al,60h
+       je      check_index_scale
+       jmp     invalid_address
+      swap_vsib_registers:
+       xor     ah,-1
+       jz      invalid_address
+       cmp     cl,1
+       ja      invalid_address
+       xchg    bl,bh
+       mov     cl,1
+       jmp     check_vsib_base
+
+calculate_relative_offset:
+       cmp     [value_undefined],0
+       jne     relative_offset_ok
+       test    bh,bh
+       setne   ch
+       cmp     bx,[ds:ebp+10h]
+       je      origin_registers_ok
+       xchg    bh,bl
+       xchg    ch,cl
+       cmp     bx,[ds:ebp+10h]
+       jne     invalid_value
+      origin_registers_ok:
+       cmp     cx,[ds:ebp+10h+2]
+       jne     invalid_value
+       mov     bl,[address_sign]
+       add     eax,[ds:ebp]
+       adc     edx,[ds:ebp+4]
+       adc     bl,[ds:ebp+8]
+       sub     eax,edi
+       sbb     edx,0
+       sbb     bl,0
+       mov     [value_sign],bl
+       mov     bl,[value_type]
+       mov     ecx,[address_symbol]
+       mov     [symbol_identifier],ecx
+       test    bl,1
+       jnz     relative_offset_unallowed
+       cmp     bl,6
+       je      plt_relative_offset
+       mov     bh,[ds:ebp+9]
+       cmp     bl,bh
+       je      set_relative_offset_type
+       cmp     bx,0402h
+       je      set_relative_offset_type
+      relative_offset_unallowed:
+       call    recoverable_misuse
+      set_relative_offset_type:
+       cmp     [value_type],0
+       je      relative_offset_ok
+       mov     [value_type],0
+       cmp     ecx,[ds:ebp+14h]
+       je      relative_offset_ok
+       mov     [value_type],3
+      relative_offset_ok:
+       ret
+      plt_relative_offset:
+       mov     [value_type],7
+       cmp     byte [ds:ebp+9],2
+       je      relative_offset_ok
+       cmp     byte [ds:ebp+9],4
+       jne     recoverable_misuse
+       ret
+
+calculate_logical_expression:
+       xor     al,al
+  calculate_embedded_logical_expression:
+       mov     [logical_value_wrapping],al
+       call    get_logical_value
+      logical_loop:
+       cmp     byte [esi],'|'
+       je      logical_or
+       cmp     byte [esi],'&'
+       je      logical_and
+       ret
+      logical_or:
+       inc     esi
+       or      al,al
+       jnz     logical_value_already_determined
+       push    eax
+       call    get_logical_value
+       pop     ebx
+       or      al,bl
+       jmp     logical_loop
+      logical_and:
+       inc     esi
+       or      al,al
+       jz      logical_value_already_determined
+       push    eax
+       call    get_logical_value
+       pop     ebx
+       and     al,bl
+       jmp     logical_loop
+      logical_value_already_determined:
+       push    eax
+       call    skip_logical_value
+       jc      invalid_expression
+       pop     eax
+       jmp     logical_loop
+  get_value_for_comparison:
+       mov     [value_size],8
+       or      [operand_flags],1
+       lods    byte [esi]
+       call    calculate_expression
+       cmp     byte [edi+8],0
+       jne     first_register_size_ok
+       mov     byte [edi+10],0
+      first_register_size_ok:
+       cmp     byte [edi+9],0
+       jne     second_register_size_ok
+       mov     byte [edi+11],0
+      second_register_size_ok:
+       mov     eax,[edi+16]
+       mov     [symbol_identifier],eax
+       mov     al,[edi+13]
+       mov     [value_sign],al
+       mov     bl,[edi+12]
+       mov     eax,[edi]
+       mov     edx,[edi+4]
+       mov     ecx,[edi+8]
+       ret
+  get_logical_value:
+       xor     al,al
+      check_for_negation:
+       cmp     byte [esi],'~'
+       jne     negation_ok
+       inc     esi
+       xor     al,-1
+       jmp     check_for_negation
+      negation_ok:
+       push    eax
+       mov     al,[esi]
+       cmp     al,91h
+       je      logical_expression
+       cmp     al,0FFh
+       je      invalid_expression
+       cmp     al,88h
+       je      check_for_defined
+       cmp     al,8Ah
+       je      check_for_earlier_defined
+       cmp     al,89h
+       je      check_for_used
+       cmp     al,'0'
+       je      given_false
+       cmp     al,'1'
+       je      given_true
+       cmp     al,'('
+       jne     invalid_value
+       call    get_value_for_comparison
+       mov     bh,[value_sign]
+       push    eax edx
+       push    [symbol_identifier]
+       push    ebx ecx
+       mov     al,[esi]
+       or      al,al
+       jz      logical_number
+       cmp     al,0Fh
+       je      logical_number
+       cmp     al,92h
+       je      logical_number
+       cmp     al,'&'
+       je      logical_number
+       cmp     al,'|'
+       je      logical_number
+       inc     esi
+       mov     [compare_type],al
+       cmp     byte [esi],'('
+       jne     invalid_value
+       call    get_value_for_comparison
+       cmp     bl,[esp+4]
+       jne     values_not_relative
+       or      bl,bl
+       jz      check_values_registers
+       mov     ebx,[symbol_identifier]
+       cmp     ebx,[esp+8]
+       jne     values_not_relative
+      check_values_registers:
+       cmp     ecx,[esp]
+       je      values_relative
+       ror     ecx,16
+       xchg    ch,cl
+       ror     ecx,16
+       xchg    ch,cl
+       cmp     ecx,[esp]
+       je      values_relative
+      values_not_relative:
+       cmp     [compare_type],0F8h
+       jne     invalid_comparison
+       add     esp,12+8
+       jmp     return_false
+      invalid_comparison:
+       call    recoverable_misuse
+      values_relative:
+       pop     ebx
+       shl     ebx,16
+       mov     bx,[esp]
+       add     esp,8
+       pop     ecx ebp
+       cmp     [compare_type],'='
+       je      check_equal
+       cmp     [compare_type],0F1h
+       je      check_not_equal
+       cmp     [compare_type],0F8h
+       je      return_true
+       test    ebx,0FFFF0000h
+       jz      check_less_or_greater
+       call    recoverable_misuse
+      check_less_or_greater:
+       cmp     [compare_type],'>'
+       je      check_greater
+       cmp     [compare_type],'<'
+       je      check_less
+       cmp     [compare_type],0F2h
+       je      check_not_less
+       cmp     [compare_type],0F3h
+       je      check_not_greater
+       jmp     invalid_expression
+      check_equal:
+       cmp     bh,[value_sign]
+       jne     return_false
+       cmp     eax,ebp
+       jne     return_false
+       cmp     edx,ecx
+       jne     return_false
+       jmp     return_true
+      check_greater:
+       cmp     bh,[value_sign]
+       jg      return_true
+       jl      return_false
+       cmp     edx,ecx
+       jb      return_true
+       ja      return_false
+       cmp     eax,ebp
+       jb      return_true
+       jae     return_false
+      check_less:
+       cmp     bh,[value_sign]
+       jg      return_false
+       jl      return_true
+       cmp     edx,ecx
+       jb      return_false
+       ja      return_true
+       cmp     eax,ebp
+       jbe     return_false
+       ja      return_true
+      check_not_less:
+       cmp     bh,[value_sign]
+       jg      return_true
+       jl      return_false
+       cmp     edx,ecx
+       jb      return_true
+       ja      return_false
+       cmp     eax,ebp
+       jbe     return_true
+       ja      return_false
+      check_not_greater:
+       cmp     bh,[value_sign]
+       jg      return_false
+       jl      return_true
+       cmp     edx,ecx
+       jb      return_false
+       ja      return_true
+       cmp     eax,ebp
+       jb      return_false
+       jae     return_true
+      check_not_equal:
+       cmp     bh,[value_sign]
+       jne     return_true
+       cmp     eax,ebp
+       jne     return_true
+       cmp     edx,ecx
+       jne     return_true
+       jmp     return_false
+      logical_number:
+       pop     ecx ebx eax edx eax
+       or      bl,bl
+       jnz     invalid_logical_number
+       or      cx,cx
+       jz      logical_number_ok
+      invalid_logical_number:
+       call    recoverable_misuse
+      logical_number_ok:
+       test    bh,bh
+       jnz     return_true
+       or      eax,edx
+       jnz     return_true
+       jmp     return_false
+      check_for_earlier_defined:
+       or      bh,-1
+       jmp     check_if_expression_defined
+      check_for_defined:
+       xor     bh,bh
+      check_if_expression_defined:
+       or      bl,-1
+       lods    word [esi]
+       cmp     ah,'('
+       jne     invalid_expression
+      check_expression:
+       lods    byte [esi]
+       or      al,al
+       jz      defined_string
+       cmp     al,'.'
+       je      defined_fp_value
+       cmp     al,')'
+       je      expression_checked
+       cmp     al,'!'
+       je      invalid_expression
+       cmp     al,0Fh
+       je      check_expression
+       cmp     al,10h
+       je      defined_register
+       cmp     al,11h
+       je      check_if_symbol_defined
+       cmp     al,80h
+       jae     check_expression
+       movzx   eax,al
+       add     esi,eax
+       jmp     check_expression
+      defined_register:
+       inc     esi
+       jmp     check_expression
+      defined_fp_value:
+       add     esi,12+1
+       jmp     expression_checked
+      defined_string:
+       lods    dword [esi]
+       add     esi,eax
+       inc     esi
+       jmp     expression_checked
+      check_if_symbol_defined:
+       lods    dword [esi]
+       cmp     eax,-1
+       je      invalid_expression
+       cmp     eax,0Fh
+       jb      check_expression
+       je      reserved_word_used_as_symbol
+       test    bh,bh
+       jnz     no_prediction
+       test    byte [eax+8],4
+       jnz     no_prediction
+       test    byte [eax+8],1
+       jz      symbol_predicted_undefined
+       mov     cx,[current_pass]
+       sub     cx,[eax+16]
+       jz      check_expression
+       cmp     cx,1
+       ja      symbol_predicted_undefined
+       or      byte [eax+8],40h+80h
+       jmp     check_expression
+      no_prediction:
+       test    byte [eax+8],1
+       jz      symbol_undefined
+       mov     cx,[current_pass]
+       sub     cx,[eax+16]
+       jz      check_expression
+       jmp     symbol_undefined
+      symbol_predicted_undefined:
+       or      byte [eax+8],40h
+       and     byte [eax+8],not 80h
+      symbol_undefined:
+       xor     bl,bl
+       jmp     check_expression
+      expression_checked:
+       mov     al,bl
+       jmp     logical_value_ok
+      check_for_used:
+       lods    word [esi]
+       cmp     ah,2
+       jne     invalid_expression
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       test    byte [eax+8],8
+       jz      not_used
+       mov     cx,[current_pass]
+       sub     cx,[eax+18]
+       jz      return_true
+       cmp     cx,1
+       ja      not_used
+       or      byte [eax+8],10h+20h
+       jmp     return_true
+      not_used:
+       or      byte [eax+8],10h
+       and     byte [eax+8],not 20h
+       jmp     return_false
+      given_false:
+       inc     esi
+      return_false:
+       xor     al,al
+       jmp     logical_value_ok
+      given_true:
+       inc     esi
+      return_true:
+       or      al,-1
+       jmp     logical_value_ok
+      logical_expression:
+       lods    byte [esi]
+       mov     dl,[logical_value_wrapping]
+       push    edx
+       call    calculate_embedded_logical_expression
+       pop     edx
+       mov     [logical_value_wrapping],dl
+       push    eax
+       lods    byte [esi]
+       cmp     al,92h
+       jne     invalid_expression
+       pop     eax
+      logical_value_ok:
+       pop     ebx
+       xor     al,bl
+       ret
+
+skip_symbol:
+       lods    byte [esi]
+       or      al,al
+       jz      nothing_to_skip
+       cmp     al,0Fh
+       je      nothing_to_skip
+       cmp     al,1
+       je      skip_instruction
+       cmp     al,2
+       je      skip_label
+       cmp     al,3
+       je      skip_label
+       cmp     al,4
+       je      skip_special_label
+       cmp     al,20h
+       jb      skip_assembler_symbol
+       cmp     al,'('
+       je      skip_expression
+       cmp     al,'['
+       je      skip_address
+      skip_done:
+       clc
+       ret
+      skip_label:
+       add     esi,2
+      skip_instruction:
+       add     esi,2
+      skip_assembler_symbol:
+       inc     esi
+       jmp     skip_done
+      skip_special_label:
+       add     esi,4
+       jmp     skip_done
+      skip_address:
+       mov     al,[esi]
+       and     al,11110000b
+       cmp     al,60h
+       jb      skip_expression
+       cmp     al,70h
+       ja      skip_expression
+       inc     esi
+       jmp     skip_address
+      skip_expression:
+       lods    byte [esi]
+       or      al,al
+       jz      skip_string
+       cmp     al,'.'
+       je      skip_fp_value
+       cmp     al,')'
+       je      skip_done
+       cmp     al,']'
+       je      skip_done
+       cmp     al,'!'
+       je      skip_expression
+       cmp     al,0Fh
+       je      skip_expression
+       cmp     al,10h
+       je      skip_register
+       cmp     al,11h
+       je      skip_label_value
+       cmp     al,80h
+       jae     skip_expression
+       movzx   eax,al
+       add     esi,eax
+       jmp     skip_expression
+      skip_label_value:
+       add     esi,3
+      skip_register:
+       inc     esi
+       jmp     skip_expression
+      skip_fp_value:
+       add     esi,12
+       jmp     skip_done
+      skip_string:
+       lods    dword [esi]
+       add     esi,eax
+       inc     esi
+       jmp     skip_done
+      nothing_to_skip:
+       dec     esi
+       stc
+       ret
+
+expand_path:
+       lods    byte [esi]
+       cmp     al,'%'
+       je      environment_variable
+       stos    byte [edi]
+       or      al,al
+       jnz     expand_path
+       cmp     edi,[memory_end]
+       ja      out_of_memory
+       ret
+      environment_variable:
+       mov     ebx,esi
+      find_variable_end:
+       lods    byte [esi]
+       or      al,al
+       jz      not_environment_variable
+       cmp     al,'%'
+       jne     find_variable_end
+       mov     byte [esi-1],0
+       push    esi
+       mov     esi,ebx
+       call    get_environment_variable
+       pop     esi
+       mov     byte [esi-1],'%'
+       jmp     expand_path
+      not_environment_variable:
+       mov     al,'%'
+       stos    byte [edi]
+       mov     esi,ebx
+       jmp     expand_path
+get_include_directory:
+       lods    byte [esi]
+       cmp     al,';'
+       je      include_directory_ok
+       stos    byte [edi]
+       or      al,al
+       jnz     get_include_directory
+       dec     esi
+       dec     edi
+      include_directory_ok:
+       cmp     byte [edi-1],'/'
+       je      path_separator_ok
+       cmp     byte [edi-1],'\'
+       je      path_separator_ok
+       mov     al,'/'
+       stos    byte [edi]
+      path_separator_ok:
+       ret
diff --git a/source/exprpars.inc b/source/exprpars.inc
new file mode 100644 (file)
index 0000000..2863946
--- /dev/null
@@ -0,0 +1,1289 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+convert_expression:
+       push    ebp
+       call    get_fp_value
+       jnc     fp_expression
+       mov     [current_offset],esp
+      expression_loop:
+       push    edi
+       mov     edi,single_operand_operators
+       call    get_operator
+       pop     edi
+       or      al,al
+       jz      expression_element
+       cmp     al,82h
+       je      expression_loop
+       push    eax
+       jmp     expression_loop
+      expression_element:
+       mov     al,[esi]
+       cmp     al,1Ah
+       je      expression_number
+       cmp     al,22h
+       je      expression_number
+       cmp     al,'('
+       je      expression_number
+       mov     al,'!'
+       stos    byte [edi]
+       jmp     expression_operator
+      expression_number:
+       call    convert_number
+      expression_operator:
+       push    edi
+       mov     edi,operators
+       call    get_operator
+       pop     edi
+       or      al,al
+       jz      expression_end
+      operators_loop:
+       cmp     esp,[current_offset]
+       je      push_operator
+       mov     bl,al
+       and     bl,0F0h
+       mov     bh,byte [esp]
+       and     bh,0F0h
+       cmp     bl,bh
+       ja      push_operator
+       pop     ebx
+       mov     byte [edi],bl
+       inc     edi
+       jmp     operators_loop
+      push_operator:
+       push    eax
+       jmp     expression_loop
+      expression_end:
+       cmp     esp,[current_offset]
+       je      expression_converted
+       pop     eax
+       stos    byte [edi]
+       jmp     expression_end
+      expression_converted:
+       pop     ebp
+       ret
+      fp_expression:
+       mov     al,'.'
+       stos    byte [edi]
+       mov     eax,[fp_value]
+       stos    dword [edi]
+       mov     eax,[fp_value+4]
+       stos    dword [edi]
+       mov     eax,[fp_value+8]
+       stos    dword [edi]
+       pop     ebp
+       ret
+
+convert_number:
+       lea     eax,[edi+20h]
+       mov     edx,[memory_end]
+       cmp     [source_start],0
+       je      check_memory_for_number
+       mov     edx,[labels_list]
+      check_memory_for_number:
+       cmp     eax,edx
+       jae     out_of_memory
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       cmp     byte [esi],'('
+       je      expression_value
+       inc     edi
+       call    get_number
+       jc      symbol_value
+       or      ebp,ebp
+       jz      valid_number
+       mov     byte [edi-1],0Fh
+       ret
+      valid_number:
+       cmp     dword [edi+4],0
+       jne     qword_number
+       cmp     word [edi+2],0
+       jne     dword_number
+       cmp     byte [edi+1],0
+       jne     word_number
+      byte_number:
+       mov     byte [edi-1],1
+       inc     edi
+       ret
+      qword_number:
+       mov     byte [edi-1],8
+       add     edi,8
+       ret
+      dword_number:
+       mov     byte [edi-1],4
+       scas    dword [edi]
+       ret
+      word_number:
+       mov     byte [edi-1],2
+       scas    word [edi]
+       ret
+      expression_value:
+       inc     esi
+       push    [current_offset]
+       call    convert_expression
+       pop     [current_offset]
+       lods    byte [esi]
+       cmp     al,')'
+       je      subexpression_closed
+       dec     esi
+       mov     al,'!'
+       stosb
+      subexpression_closed:
+       ret
+      symbol_value:
+       mov     eax,[source_start]
+       test    eax,eax
+       jz      preprocessor_value
+       cmp     eax,-1
+       je      invalid_value
+       push    edi esi
+       lods    word [esi]
+       cmp     al,1Ah
+       jne     no_address_register
+       movzx   ecx,ah
+       call    get_symbol
+       jc      no_address_register
+       cmp     al,10h
+       jne     no_address_register
+       mov     al,ah
+       shr     ah,4
+       cmp     ah,4
+       je      register_value
+       and     ah,not 1
+       cmp     ah,8
+       je      register_value
+       cmp     ah,0Ch
+       jae     register_value
+       cmp     ah,6
+       je      register_value
+       cmp     al,23h
+       je      register_value
+       cmp     al,25h
+       je      register_value
+       cmp     al,26h
+       je      register_value
+       cmp     al,27h
+       je      register_value
+      no_address_register:
+       pop     esi
+       mov     edi,directive_operators
+       call    get_operator
+       pop     edi
+       or      al,al
+       jnz     broken_value
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_value
+       lods    byte [esi]
+       movzx   ecx,al
+       call    get_label_id
+      store_label_value:
+       mov     byte [edi-1],11h
+       stos    dword [edi]
+       ret
+      broken_value:
+       mov     eax,0Fh
+       jmp     store_label_value
+      register_value:
+       pop     edx edi
+       mov     byte [edi-1],10h
+       stos    byte [edi]
+       ret
+      preprocessor_value:
+       dec     edi
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_value
+       lods    byte [esi]
+       mov     cl,al
+       mov     ch,10b
+       call    get_preprocessor_symbol
+       jc      invalid_value
+       test    edx,edx
+       jz      special_preprocessor_value
+       push    esi
+       mov     esi,[edx+8]
+       push    [current_offset]
+       call    convert_expression
+       pop     [current_offset]
+       pop     esi
+       ret
+      special_preprocessor_value:
+       cmp     eax,preprocessed_line_value
+       jne     invalid_value
+       call    get_current_line_from_file
+       mov     al,4
+       stos    byte [edi]
+       mov     eax,[ebx+4]
+       stos    dword [edi]
+       ret
+
+get_number:
+       xor     ebp,ebp
+       lods    byte [esi]
+       cmp     al,22h
+       je      get_text_number
+       cmp     al,1Ah
+       jne     not_number
+       lods    byte [esi]
+       movzx   ecx,al
+       mov     [number_start],esi
+       mov     al,[esi]
+       cmp     al,'$'
+       je      number_begin
+       sub     al,30h
+       cmp     al,9
+       ja      invalid_number
+      number_begin:
+       mov     ebx,esi
+       add     esi,ecx
+       push    esi
+       dec     esi
+       mov     dword [edi],0
+       mov     dword [edi+4],0
+       cmp     byte [ebx],'$'
+       je      pascal_hex_number
+       cmp     word [ebx],'0x'
+       je      get_hex_number
+       mov     al,[esi]
+       dec     esi
+       cmp     al,'h'
+       je      get_hex_number
+       cmp     al,'b'
+       je      get_bin_number
+       cmp     al,'d'
+       je      get_dec_number
+       cmp     al,'o'
+       je      get_oct_number
+       cmp     al,'q'
+       je      get_oct_number
+       cmp     al,'H'
+       je      get_hex_number
+       cmp     al,'B'
+       je      get_bin_number
+       cmp     al,'D'
+       je      get_dec_number
+       cmp     al,'O'
+       je      get_oct_number
+       cmp     al,'Q'
+       je      get_oct_number
+       inc     esi
+      get_dec_number:
+       mov     ebx,esi
+       mov     esi,[number_start]
+      get_dec_digit:
+       cmp     esi,ebx
+       ja      number_ok
+       cmp     byte [esi],27h
+       je      next_dec_digit
+       cmp     byte [esi],'_'
+       je      next_dec_digit
+       xor     edx,edx
+       mov     eax,[edi]
+       shld    edx,eax,2
+       shl     eax,2
+       add     eax,[edi]
+       adc     edx,0
+       add     eax,eax
+       adc     edx,edx
+       mov     [edi],eax
+       mov     eax,[edi+4]
+       add     eax,eax
+       jc      dec_out_of_range
+       add     eax,eax
+       jc      dec_out_of_range
+       add     eax,[edi+4]
+       jc      dec_out_of_range
+       add     eax,eax
+       jc      dec_out_of_range
+       add     eax,edx
+       jc      dec_out_of_range
+       mov     [edi+4],eax
+       movzx   eax,byte [esi]
+       sub     al,30h
+       jc      bad_number
+       cmp     al,9
+       ja      bad_number
+       add     [edi],eax
+       adc     dword [edi+4],0
+       jc      dec_out_of_range
+      next_dec_digit:
+       inc     esi
+       jmp     get_dec_digit
+      dec_out_of_range:
+       cmp     esi,ebx
+       ja      dec_out_of_range_finished
+       lods    byte [esi]
+       cmp     al,27h
+       je      bad_number
+       cmp     al,'_'
+       je      bad_number
+       sub     al,30h
+       jc      bad_number
+       cmp     al,9
+       ja      bad_number
+       jmp     dec_out_of_range
+      dec_out_of_range_finished:
+       or      ebp,-1
+       jmp     number_ok
+      bad_number:
+       pop     eax
+      invalid_number:
+       mov     esi,[number_start]
+       dec     esi
+      not_number:
+       dec     esi
+       stc
+       ret
+      get_bin_number:
+       xor     bl,bl
+      get_bin_digit:
+       cmp     esi,[number_start]
+       jb      number_ok
+       movzx   eax,byte [esi]
+       cmp     al,27h
+       je      bin_digit_skip
+       cmp     al,'_'
+       je      bin_digit_skip
+       sub     al,30h
+       cmp     al,1
+       ja      bad_number
+       xor     edx,edx
+       mov     cl,bl
+       dec     esi
+       cmp     bl,64
+       je      bin_out_of_range
+       inc     bl
+       cmp     cl,32
+       jae     bin_digit_high
+       shl     eax,cl
+       or      dword [edi],eax
+       jmp     get_bin_digit
+      bin_digit_high:
+       sub     cl,32
+       shl     eax,cl
+       or      dword [edi+4],eax
+       jmp     get_bin_digit
+      bin_out_of_range:
+       or      al,al
+       jz      get_bin_digit
+       or      ebp,-1
+       jmp     get_bin_digit
+      bin_digit_skip:
+       dec     esi
+       jmp     get_bin_digit
+      pascal_hex_number:
+       cmp     cl,1
+       je      bad_number
+      get_hex_number:
+       xor     bl,bl
+      get_hex_digit:
+       cmp     esi,[number_start]
+       jb      number_ok
+       movzx   eax,byte [esi]
+       cmp     al,27h
+       je      hex_digit_skip
+       cmp     al,'_'
+       je      hex_digit_skip
+       cmp     al,'x'
+       je      hex_number_ok
+       cmp     al,'$'
+       je      pascal_hex_ok
+       sub     al,30h
+       cmp     al,9
+       jbe     hex_digit_ok
+       sub     al,7
+       cmp     al,15
+       jbe     hex_letter_digit_ok
+       sub     al,20h
+       cmp     al,15
+       ja      bad_number
+      hex_letter_digit_ok:
+       cmp     al,10
+       jb      bad_number
+      hex_digit_ok:
+       xor     edx,edx
+       mov     cl,bl
+       dec     esi
+       cmp     bl,64
+       je      hex_out_of_range
+       add     bl,4
+       cmp     cl,32
+       jae     hex_digit_high
+       shl     eax,cl
+       or      dword [edi],eax
+       jmp     get_hex_digit
+      hex_digit_high:
+       sub     cl,32
+       shl     eax,cl
+       or      dword [edi+4],eax
+       jmp     get_hex_digit
+      hex_out_of_range:
+       or      al,al
+       jz      get_hex_digit
+       or      ebp,-1
+       jmp     get_hex_digit
+      hex_digit_skip:
+       dec     esi
+       jmp     get_hex_digit
+      get_oct_number:
+       xor     bl,bl
+      get_oct_digit:
+       cmp     esi,[number_start]
+       jb      number_ok
+       movzx   eax,byte [esi]
+       cmp     al,27h
+       je      oct_digit_skip
+       cmp     al,'_'
+       je      oct_digit_skip
+       sub     al,30h
+       cmp     al,7
+       ja      bad_number
+      oct_digit_ok:
+       xor     edx,edx
+       mov     cl,bl
+       dec     esi
+       cmp     bl,63
+       ja      oct_out_of_range
+       jne     oct_range_ok
+       cmp     al,1
+       ja      oct_out_of_range
+      oct_range_ok:
+       add     bl,3
+       cmp     cl,30
+       je      oct_digit_wrap
+       ja      oct_digit_high
+       shl     eax,cl
+       or      dword [edi],eax
+       jmp     get_oct_digit
+      oct_digit_wrap:
+       shl     eax,cl
+       adc     dword [edi+4],0
+       or      dword [edi],eax
+       jmp     get_oct_digit
+      oct_digit_high:
+       sub     cl,32
+       shl     eax,cl
+       or      dword [edi+4],eax
+       jmp     get_oct_digit
+      oct_digit_skip:
+       dec     esi
+       jmp     get_oct_digit
+      oct_out_of_range:
+       or      al,al
+       jz      get_oct_digit
+       or      ebp,-1
+       jmp     get_oct_digit
+      hex_number_ok:
+       dec     esi
+      pascal_hex_ok:
+       cmp     esi,[number_start]
+       jne     bad_number
+      number_ok:
+       pop     esi
+      number_done:
+       clc
+       ret
+      get_text_number:
+       lods    dword [esi]
+       mov     edx,eax
+       xor     bl,bl
+       mov     dword [edi],0
+       mov     dword [edi+4],0
+      get_text_character:
+       sub     edx,1
+       jc      number_done
+       movzx   eax,byte [esi]
+       inc     esi
+       mov     cl,bl
+       cmp     bl,64
+       je      text_out_of_range
+       add     bl,8
+       cmp     cl,32
+       jae     text_character_high
+       shl     eax,cl
+       or      dword [edi],eax
+       jmp     get_text_character
+      text_character_high:
+       sub     cl,32
+       shl     eax,cl
+       or      dword [edi+4],eax
+       jmp     get_text_character
+      text_out_of_range:
+       or      ebp,-1
+       jmp     get_text_character
+
+get_fp_value:
+       push    edi esi
+      fp_value_start:
+       lods    byte [esi]
+       cmp     al,'-'
+       je      fp_value_start
+       cmp     al,'+'
+       je      fp_value_start
+       cmp     al,1Ah
+       jne     not_fp_value
+       lods    byte [esi]
+       movzx   ecx,al
+       cmp     cl,1
+       jbe     not_fp_value
+       lea     edx,[esi+1]
+       xor     ah,ah
+      check_fp_value:
+       lods    byte [esi]
+       cmp     al,'.'
+       je      fp_character_dot
+       cmp     al,'E'
+       je      fp_character_exp
+       cmp     al,'e'
+       je      fp_character_exp
+       cmp     al,'F'
+       je      fp_last_character
+       cmp     al,'f'
+       je      fp_last_character
+      digit_expected:
+       cmp     al,'0'
+       jb      not_fp_value
+       cmp     al,'9'
+       ja      not_fp_value
+       jmp     fp_character_ok
+      fp_character_dot:
+       cmp     esi,edx
+       je      not_fp_value
+       or      ah,ah
+       jnz     not_fp_value
+       or      ah,1
+       lods    byte [esi]
+       loop    digit_expected
+      not_fp_value:
+       pop     esi edi
+       stc
+       ret
+      fp_last_character:
+       cmp     cl,1
+       jne     not_fp_value
+       or      ah,4
+       jmp     fp_character_ok
+      fp_character_exp:
+       cmp     esi,edx
+       je      not_fp_value
+       cmp     ah,1
+       ja      not_fp_value
+       or      ah,2
+       cmp     ecx,1
+       jne     fp_character_ok
+       cmp     byte [esi],'+'
+       je      fp_exp_sign
+       cmp     byte [esi],'-'
+       jne     fp_character_ok
+      fp_exp_sign:
+       inc     esi
+       cmp     byte [esi],1Ah
+       jne     not_fp_value
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       inc     ecx
+      fp_character_ok:
+       dec     ecx
+       jnz     check_fp_value
+       or      ah,ah
+       jz      not_fp_value
+       pop     esi
+       mov     [fp_sign],0
+      fp_get_sign:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      fp_get
+       cmp     al,'+'
+       je      fp_get_sign
+       xor     [fp_sign],1
+       jmp     fp_get_sign
+      fp_get:
+       lods    byte [esi]
+       movzx   ecx,al
+       xor     edx,edx
+       mov     edi,fp_value
+       mov     [edi],edx
+       mov     [edi+4],edx
+       mov     [edi+12],edx
+       call    fp_optimize
+       mov     [fp_format],0
+       mov     al,[esi]
+      fp_before_dot:
+       lods    byte [esi]
+       cmp     al,'.'
+       je      fp_dot
+       cmp     al,'E'
+       je      fp_exponent
+       cmp     al,'e'
+       je      fp_exponent
+       cmp     al,'F'
+       je      fp_done
+       cmp     al,'f'
+       je      fp_done
+       sub     al,30h
+       mov     edi,fp_value+16
+       xor     edx,edx
+       mov     dword [edi+12],edx
+       mov     dword [edi],edx
+       mov     dword [edi+4],edx
+       mov     [edi+7],al
+       mov     dl,7
+       mov     dword [edi+8],edx
+       call    fp_optimize
+       mov     edi,fp_value
+       push    ecx
+       mov     ecx,10
+       call    fp_mul
+       pop     ecx
+       mov     ebx,fp_value+16
+       call    fp_add
+       loop    fp_before_dot
+      fp_dot:
+       mov     edi,fp_value+16
+       xor     edx,edx
+       mov     [edi],edx
+       mov     [edi+4],edx
+       mov     byte [edi+7],80h
+       mov     [edi+8],edx
+       mov     dword [edi+12],edx
+       dec     ecx
+       jz      fp_done
+      fp_after_dot:
+       lods    byte [esi]
+       cmp     al,'E'
+       je      fp_exponent
+       cmp     al,'e'
+       je      fp_exponent
+       cmp     al,'F'
+       je      fp_done
+       cmp     al,'f'
+       je      fp_done
+       inc     [fp_format]
+       cmp     [fp_format],80h
+       jne     fp_counter_ok
+       mov     [fp_format],7Fh
+      fp_counter_ok:
+       dec     esi
+       mov     edi,fp_value+16
+       push    ecx
+       mov     ecx,10
+       call    fp_div
+       push    dword [edi]
+       push    dword [edi+4]
+       push    dword [edi+8]
+       push    dword [edi+12]
+       lods    byte [esi]
+       sub     al,30h
+       movzx   ecx,al
+       call    fp_mul
+       mov     ebx,edi
+       mov     edi,fp_value
+       call    fp_add
+       mov     edi,fp_value+16
+       pop     dword [edi+12]
+       pop     dword [edi+8]
+       pop     dword [edi+4]
+       pop     dword [edi]
+       pop     ecx
+       dec     ecx
+       jnz     fp_after_dot
+       jmp     fp_done
+      fp_exponent:
+       or      [fp_format],80h
+       xor     edx,edx
+       xor     ebp,ebp
+       dec     ecx
+       jnz     get_exponent
+       cmp     byte [esi],'+'
+       je      fp_exponent_sign
+       cmp     byte [esi],'-'
+       jne     fp_done
+       not     ebp
+      fp_exponent_sign:
+       add     esi,2
+       lods    byte [esi]
+       movzx   ecx,al
+      get_exponent:
+       movzx   eax,byte [esi]
+       inc     esi
+       sub     al,30h
+       cmp     al,10
+       jae     exponent_ok
+       imul    edx,10
+       cmp     edx,8000h
+       jae     value_out_of_range
+       add     edx,eax
+       loop    get_exponent
+      exponent_ok:
+       mov     edi,fp_value
+       or      edx,edx
+       jz      fp_done
+       mov     ecx,edx
+       or      ebp,ebp
+       jnz     fp_negative_power
+      fp_power:
+       push    ecx
+       mov     ecx,10
+       call    fp_mul
+       pop     ecx
+       loop    fp_power
+       jmp     fp_done
+      fp_negative_power:
+       push    ecx
+       mov     ecx,10
+       call    fp_div
+       pop     ecx
+       loop    fp_negative_power
+      fp_done:
+       mov     edi,fp_value
+       mov     al,[fp_format]
+       mov     [edi+10],al
+       mov     al,[fp_sign]
+       mov     [edi+11],al
+       test    byte [edi+15],80h
+       jz      fp_ok
+       add     dword [edi],1
+       adc     dword [edi+4],0
+       jnc     fp_ok
+       mov     eax,[edi+4]
+       shrd    [edi],eax,1
+       shr     eax,1
+       or      eax,80000000h
+       mov     [edi+4],eax
+       inc     word [edi+8]
+      fp_ok:
+       pop     edi
+       clc
+       ret
+      fp_mul:
+       or      ecx,ecx
+       jz      fp_zero
+       mov     eax,[edi+12]
+       mul     ecx
+       mov     [edi+12],eax
+       mov     ebx,edx
+       mov     eax,[edi]
+       mul     ecx
+       add     eax,ebx
+       adc     edx,0
+       mov     [edi],eax
+       mov     ebx,edx
+       mov     eax,[edi+4]
+       mul     ecx
+       add     eax,ebx
+       adc     edx,0
+       mov     [edi+4],eax
+      .loop:
+       or      edx,edx
+       jz      .done
+       mov     eax,[edi]
+       shrd    [edi+12],eax,1
+       mov     eax,[edi+4]
+       shrd    [edi],eax,1
+       shrd    eax,edx,1
+       mov     [edi+4],eax
+       shr     edx,1
+       inc     dword [edi+8]
+       cmp     dword [edi+8],8000h
+       jge     value_out_of_range
+       jmp     .loop
+      .done:
+       ret
+      fp_div:
+       mov     eax,[edi+4]
+       xor     edx,edx
+       div     ecx
+       mov     [edi+4],eax
+       mov     eax,[edi]
+       div     ecx
+       mov     [edi],eax
+       mov     eax,[edi+12]
+       div     ecx
+       mov     [edi+12],eax
+       mov     ebx,eax
+       or      ebx,[edi]
+       or      ebx,[edi+4]
+       jz      fp_zero
+      .loop:
+       test    byte [edi+7],80h
+       jnz     .exp_ok
+       mov     eax,[edi]
+       shld    [edi+4],eax,1
+       mov     eax,[edi+12]
+       shld    [edi],eax,1
+       add     eax,eax
+       mov     [edi+12],eax
+       dec     dword [edi+8]
+       add     edx,edx
+       jmp     .loop
+      .exp_ok:
+       mov     eax,edx
+       xor     edx,edx
+       div     ecx
+       add     [edi+12],eax
+       adc     dword [edi],0
+       adc     dword [edi+4],0
+       jnc     .done
+       mov     eax,[edi+4]
+       mov     ebx,[edi]
+       shrd    [edi],eax,1
+       shrd    [edi+12],ebx,1
+       shr     eax,1
+       or      eax,80000000h
+       mov     [edi+4],eax
+       inc     dword [edi+8]
+      .done:
+       ret
+      fp_add:
+       cmp     dword [ebx+8],8000h
+       je      .done
+       cmp     dword [edi+8],8000h
+       je      .copy
+       mov     eax,[ebx+8]
+       cmp     eax,[edi+8]
+       jge     .exp_ok
+       mov     eax,[edi+8]
+      .exp_ok:
+       call    .change_exp
+       xchg    ebx,edi
+       call    .change_exp
+       xchg    ebx,edi
+       mov     edx,[ebx+12]
+       mov     eax,[ebx]
+       mov     ebx,[ebx+4]
+       add     [edi+12],edx
+       adc     [edi],eax
+       adc     [edi+4],ebx
+       jnc     .done
+       mov     eax,[edi]
+       shrd    [edi+12],eax,1
+       mov     eax,[edi+4]
+       shrd    [edi],eax,1
+       shr     eax,1
+       or      eax,80000000h
+       mov     [edi+4],eax
+       inc     dword [edi+8]
+      .done:
+       ret
+      .copy:
+       mov     eax,[ebx]
+       mov     [edi],eax
+       mov     eax,[ebx+4]
+       mov     [edi+4],eax
+       mov     eax,[ebx+8]
+       mov     [edi+8],eax
+       mov     eax,[ebx+12]
+       mov     [edi+12],eax
+       ret
+      .change_exp:
+       push    ecx
+       mov     ecx,eax
+       sub     ecx,[ebx+8]
+       mov     edx,[ebx+4]
+       jecxz   .exp_done
+      .exp_loop:
+       mov     ebp,[ebx]
+       shrd    [ebx+12],ebp,1
+       shrd    [ebx],edx,1
+       shr     edx,1
+       inc     dword [ebx+8]
+       loop    .exp_loop
+      .exp_done:
+       mov     [ebx+4],edx
+       pop     ecx
+       ret
+      fp_optimize:
+       mov     eax,[edi]
+       mov     ebp,[edi+4]
+       or      ebp,[edi]
+       or      ebp,[edi+12]
+       jz      fp_zero
+      .loop:
+       test    byte [edi+7],80h
+       jnz     .done
+       shld    [edi+4],eax,1
+       mov     ebp,[edi+12]
+       shld    eax,ebp,1
+       mov     [edi],eax
+       shl     dword [edi+12],1
+       dec     dword [edi+8]
+       jmp     .loop
+      .done:
+       ret
+      fp_zero:
+       mov     dword [edi+8],8000h
+       ret
+
+preevaluate_logical_expression:
+       xor     al,al
+  preevaluate_embedded_logical_expression:
+       mov     [logical_value_wrapping],al
+       push    edi
+       call    preevaluate_logical_value
+      preevaluation_loop:
+       cmp     al,0FFh
+       je      invalid_logical_expression
+       mov     dl,[esi]
+       inc     esi
+       cmp     dl,'|'
+       je      preevaluate_or
+       cmp     dl,'&'
+       je      preevaluate_and
+       cmp     dl,92h
+       je      preevaluation_done
+       or      dl,dl
+       jnz     invalid_logical_expression
+      preevaluation_done:
+       pop     edx
+       dec     esi
+       ret
+      preevaluate_or:
+       cmp     al,'1'
+       je      quick_true
+       cmp     al,'0'
+       je      leave_only_following
+       push    edi
+       mov     al,dl
+       stos    byte [edi]
+       call    preevaluate_logical_value
+       pop     ebx
+       cmp     al,'0'
+       je      leave_only_preceding
+       cmp     al,'1'
+       jne     preevaluation_loop
+       stos    byte [edi]
+       xor     al,al
+       jmp     preevaluation_loop
+      preevaluate_and:
+       cmp     al,'0'
+       je      quick_false
+       cmp     al,'1'
+       je      leave_only_following
+       push    edi
+       mov     al,dl
+       stos    byte [edi]
+       call    preevaluate_logical_value
+       pop     ebx
+       cmp     al,'1'
+       je      leave_only_preceding
+       cmp     al,'0'
+       jne     preevaluation_loop
+       stos    byte [edi]
+       xor     al,al
+       jmp     preevaluation_loop
+      leave_only_following:
+       mov     edi,[esp]
+       call    preevaluate_logical_value
+       jmp     preevaluation_loop
+      leave_only_preceding:
+       mov     edi,ebx
+       xor     al,al
+       jmp     preevaluation_loop
+      quick_true:
+       call    skip_logical_value
+       jc      invalid_logical_expression
+       mov     edi,[esp]
+       mov     al,'1'
+       jmp     preevaluation_loop
+      quick_false:
+       call    skip_logical_value
+       jc      invalid_logical_expression
+       mov     edi,[esp]
+       mov     al,'0'
+       jmp     preevaluation_loop
+      invalid_logical_expression:
+       pop     edi
+       mov     esi,edi
+       mov     al,0FFh
+       stos    byte [edi]
+       ret
+  skip_logical_value:
+       cmp     byte [esi],'~'
+       jne     negation_skipped
+       inc     esi
+       jmp     skip_logical_value
+      negation_skipped:
+       mov     al,[esi]
+       cmp     al,91h
+       jne     skip_simple_logical_value
+       inc     esi
+       xchg    al,[logical_value_wrapping]
+       push    eax
+      skip_logical_expression:
+       call    skip_logical_value
+       lods    byte [esi]
+       or      al,al
+       jz      wrongly_structured_logical_expression
+       cmp     al,0Fh
+       je      wrongly_structured_logical_expression
+       cmp     al,'|'
+       je      skip_logical_expression
+       cmp     al,'&'
+       je      skip_logical_expression
+       cmp     al,92h
+       jne     wrongly_structured_logical_expression
+       pop     eax
+       mov     [logical_value_wrapping],al
+      logical_value_skipped:
+       clc
+       ret
+      wrongly_structured_logical_expression:
+       pop     eax
+       stc
+       ret
+      skip_simple_logical_value:
+       mov     [logical_value_parentheses],0
+      find_simple_logical_value_end:
+       mov     al,[esi]
+       or      al,al
+       jz      logical_value_skipped
+       cmp     al,0Fh
+       je      logical_value_skipped
+       cmp     al,'|'
+       je      logical_value_skipped
+       cmp     al,'&'
+       je      logical_value_skipped
+       cmp     al,91h
+       je      skip_logical_value_internal_parenthesis
+       cmp     al,92h
+       jne     skip_logical_value_symbol
+       sub     [logical_value_parentheses],1
+       jnc     skip_logical_value_symbol
+       cmp     [logical_value_wrapping],91h
+       jne     skip_logical_value_symbol
+       jmp     logical_value_skipped
+      skip_logical_value_internal_parenthesis:
+       inc     [logical_value_parentheses]
+      skip_logical_value_symbol:
+       call    skip_symbol
+       jmp     find_simple_logical_value_end
+  preevaluate_logical_value:
+       mov     ebp,edi
+      preevaluate_negation:
+       cmp     byte [esi],'~'
+       jne     preevaluate_negation_ok
+       movs    byte [edi],[esi]
+       jmp     preevaluate_negation
+      preevaluate_negation_ok:
+       mov     ebx,esi
+       cmp     byte [esi],91h
+       jne     preevaluate_simple_logical_value
+       lods    byte [esi]
+       stos    byte [edi]
+       push    ebp
+       mov     dl,[logical_value_wrapping]
+       push    edx
+       call    preevaluate_embedded_logical_expression
+       pop     edx
+       mov     [logical_value_wrapping],dl
+       pop     ebp
+       cmp     al,0FFh
+       je      invalid_logical_value
+       cmp     byte [esi],92h
+       jne     invalid_logical_value
+       or      al,al
+       jnz     preevaluated_expression_value
+       movs    byte [edi],[esi]
+       ret
+      preevaluated_expression_value:
+       inc     esi
+       lea     edx,[edi-1]
+       sub     edx,ebp
+       test    edx,1
+       jz      expression_negation_ok
+       xor     al,1
+      expression_negation_ok:
+       mov     edi,ebp
+       ret
+      invalid_logical_value:
+       mov     edi,ebp
+       mov     al,0FFh
+       ret
+      preevaluate_simple_logical_value:
+       xor     edx,edx
+       mov     [logical_value_parentheses],edx
+      find_logical_value_boundaries:
+       mov     al,[esi]
+       or      al,al
+       jz      logical_value_boundaries_found
+       cmp     al,91h
+       je      logical_value_internal_parentheses
+       cmp     al,92h
+       je      logical_value_boundaries_parenthesis_close
+       cmp     al,'|'
+       je      logical_value_boundaries_found
+       cmp     al,'&'
+       je      logical_value_boundaries_found
+       or      edx,edx
+       jnz     next_symbol_in_logical_value
+       cmp     al,0F0h
+       je      preevaluable_logical_operator
+       cmp     al,0F7h
+       je      preevaluable_logical_operator
+       cmp     al,0F6h
+       jne     next_symbol_in_logical_value
+      preevaluable_logical_operator:
+       mov     edx,esi
+      next_symbol_in_logical_value:
+       call    skip_symbol
+       jmp     find_logical_value_boundaries
+      logical_value_internal_parentheses:
+       inc     [logical_value_parentheses]
+       jmp     next_symbol_in_logical_value
+      logical_value_boundaries_parenthesis_close:
+       sub     [logical_value_parentheses],1
+       jnc     next_symbol_in_logical_value
+       cmp     [logical_value_wrapping],91h
+       jne     next_symbol_in_logical_value
+      logical_value_boundaries_found:
+       or      edx,edx
+       jz      non_preevaluable_logical_value
+       mov     al,[edx]
+       cmp     al,0F0h
+       je      compare_symbols
+       cmp     al,0F7h
+       je      compare_symbol_types
+       cmp     al,0F6h
+       je      scan_symbols_list
+      non_preevaluable_logical_value:
+       mov     ecx,esi
+       mov     esi,ebx
+       sub     ecx,esi
+       jz      invalid_logical_value
+       cmp     esi,edi
+       je      leave_logical_value_intact
+       rep     movs byte [edi],[esi]
+       xor     al,al
+       ret
+      leave_logical_value_intact:
+       add     edi,ecx
+       add     esi,ecx
+       xor     al,al
+       ret
+      compare_symbols:
+       lea     ecx,[esi-1]
+       sub     ecx,edx
+       mov     eax,edx
+       sub     eax,ebx
+       cmp     ecx,eax
+       jne     preevaluated_false
+       push    esi edi
+       mov     esi,ebx
+       lea     edi,[edx+1]
+       repe    cmps byte [esi],[edi]
+       pop     edi esi
+       je      preevaluated_true
+      preevaluated_false:
+       mov     eax,edi
+       sub     eax,ebp
+       test    eax,1
+       jnz     store_true
+      store_false:
+       mov     edi,ebp
+       mov     al,'0'
+       ret
+      preevaluated_true:
+       mov     eax,edi
+       sub     eax,ebp
+       test    eax,1
+       jnz     store_false
+      store_true:
+       mov     edi,ebp
+       mov     al,'1'
+       ret
+      compare_symbol_types:
+       push    esi
+       lea     esi,[edx+1]
+      type_comparison:
+       cmp     esi,[esp]
+       je      types_compared
+       mov     al,[esi]
+       cmp     al,[ebx]
+       jne     different_type
+       cmp     al,'('
+       jne     equal_type
+       mov     al,[esi+1]
+       mov     ah,[ebx+1]
+       cmp     al,ah
+       je      equal_type
+       or      al,al
+       jz      different_type
+       or      ah,ah
+       jz      different_type
+       cmp     al,'.'
+       je      different_type
+       cmp     ah,'.'
+       je      different_type
+      equal_type:
+       call    skip_symbol
+       xchg    esi,ebx
+       call    skip_symbol
+       xchg    esi,ebx
+       jmp     type_comparison
+      types_compared:
+       pop     esi
+       cmp     byte [ebx],0F7h
+       jne     preevaluated_false
+       jmp     preevaluated_true
+      different_type:
+       pop     esi
+       jmp     preevaluated_false
+      scan_symbols_list:
+       push    edi esi
+       lea     esi,[edx+1]
+       sub     edx,ebx
+       lods    byte [esi]
+       cmp     al,'<'
+       jne     invalid_symbols_list
+      get_next_from_list:
+       mov     edi,esi
+      get_from_list:
+       cmp     byte [esi],','
+       je      compare_in_list
+       cmp     byte [esi],'>'
+       je      compare_in_list
+       cmp     esi,[esp]
+       jae     invalid_symbols_list
+       call    skip_symbol
+       jmp     get_from_list
+      compare_in_list:
+       mov     ecx,esi
+       sub     ecx,edi
+       cmp     ecx,edx
+       jne     not_equal_length_in_list
+       mov     esi,ebx
+       repe    cmps byte [esi],[edi]
+       mov     esi,edi
+       jne     not_equal_in_list
+      skip_rest_of_list:
+       cmp     byte [esi],'>'
+       je      check_list_end
+       cmp     esi,[esp]
+       jae     invalid_symbols_list
+       call    skip_symbol
+       jmp     skip_rest_of_list
+      check_list_end:
+       inc     esi
+       cmp     esi,[esp]
+       jne     invalid_symbols_list
+       pop     esi edi
+       jmp     preevaluated_true
+      not_equal_in_list:
+       add     esi,ecx
+      not_equal_length_in_list:
+       lods    byte [esi]
+       cmp     al,','
+       je      get_next_from_list
+       cmp     esi,[esp]
+       jne     invalid_symbols_list
+       pop     esi edi
+       jmp     preevaluated_false
+      invalid_symbols_list:
+       pop     esi edi
+       jmp     invalid_logical_value
diff --git a/source/formats.inc b/source/formats.inc
new file mode 100644 (file)
index 0000000..821175f
--- /dev/null
@@ -0,0 +1,4195 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+formatter:
+       mov     [current_offset],edi
+       cmp     [output_file],0
+       jne     output_path_ok
+       mov     esi,[input_file]
+       mov     edi,[free_additional_memory]
+      duplicate_output_path:
+       lods    byte [esi]
+       cmp     edi,[structures_buffer]
+       jae     out_of_memory
+       stos    byte [edi]
+       or      al,al
+       jnz     duplicate_output_path
+       dec     edi
+       mov     eax,edi
+      find_extension:
+       dec     eax
+       cmp     eax,[free_additional_memory]
+       jb      extension_found
+       cmp     byte [eax],'\'
+       je      extension_found
+       cmp     byte [eax],'/'
+       je      extension_found
+       cmp     byte [eax],'.'
+       jne     find_extension
+       mov     edi,eax
+      extension_found:
+       lea     eax,[edi+9]
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       cmp     [file_extension],0
+       jne     extension_specified
+       mov     al,[output_format]
+       cmp     al,2
+       je      exe_extension
+       jb      bin_extension
+       cmp     al,4
+       je      obj_extension
+       cmp     al,5
+       je      o_extension
+       cmp     al,3
+       jne     no_extension
+       cmp     [subsystem],1
+       je      sys_extension
+       cmp     [subsystem],10
+       jae     efi_extension
+       bt      [format_flags],8
+       jnc     exe_extension
+       mov     eax,'.dll'
+       jmp     make_extension
+      sys_extension:
+       mov     eax,'.sys'
+       jmp     make_extension
+      efi_extension:
+       mov     eax,'.efi'
+       jmp     make_extension
+      bin_extension:
+       mov     eax,'.bin'
+       bt      [format_flags],0
+       jnc     make_extension
+       mov     eax,'.com'
+       jmp     make_extension
+      obj_extension:
+       mov     eax,'.obj'
+       jmp     make_extension
+      o_extension:
+       mov     eax,'.o'
+       bt      [format_flags],0
+       jnc     make_extension
+      no_extension:
+       xor     eax,eax
+       jmp     make_extension
+      exe_extension:
+       mov     eax,'.exe'
+      make_extension:
+       xchg    eax,[edi]
+       scas    dword [edi]
+       mov     byte [edi],0
+       scas    byte [edi]
+       mov     esi,edi
+       stos    dword [edi]
+       sub     edi,9
+       xor     eax,eax
+       mov     ebx,characters
+      adapt_case:
+       mov     al,[esi]
+       or      al,al
+       jz      adapt_next
+       xlat    byte [ebx]
+       cmp     al,[esi]
+       je      adapt_ok
+       sub     byte [edi],20h
+      adapt_ok:
+       inc     esi
+      adapt_next:
+       inc     edi
+       cmp     byte [edi],0
+       jne     adapt_case
+       jmp     extension_ok
+      extension_specified:
+       mov     al,'.'
+       stos    byte [edi]
+       mov     esi,[file_extension]
+      copy_extension:
+       lods    byte [esi]
+       stos    byte [edi]
+       test    al,al
+       jnz     copy_extension
+       dec     edi
+      extension_ok:
+       mov     esi,edi
+       lea     ecx,[esi+1]
+       sub     ecx,[free_additional_memory]
+       mov     edi,[structures_buffer]
+       dec     edi
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       inc     edi
+       mov     [structures_buffer],edi
+       mov     [output_file],edi
+      output_path_ok:
+       cmp     [symbols_file],0
+       je      labels_table_ok
+       mov     ecx,[memory_end]
+       sub     ecx,[labels_list]
+       mov     edi,[tagged_blocks]
+       sub     edi,8
+       mov     [edi],ecx
+       or      dword [edi+4],-1
+       sub     edi,ecx
+       cmp     edi,[current_offset]
+       jbe     out_of_memory
+       mov     [tagged_blocks],edi
+       mov     esi,[memory_end]
+      copy_labels:
+       sub     esi,32
+       cmp     esi,[labels_list]
+       jb      labels_table_ok
+       mov     ecx,32 shr 2
+       rep     movs dword [edi],[esi]
+       sub     esi,32
+       jmp     copy_labels
+      labels_table_ok:
+       mov     edi,[current_offset]
+       cmp     [output_format],4
+       je      coff_formatter
+       cmp     [output_format],5
+       jne     common_formatter
+       bt      [format_flags],0
+       jnc     elf_formatter
+      common_formatter:
+       mov     eax,edi
+       sub     eax,[code_start]
+       mov     [real_code_size],eax
+       cmp     edi,[undefined_data_end]
+       jne     calculate_code_size
+       mov     edi,[undefined_data_start]
+      calculate_code_size:
+       mov     [current_offset],edi
+       sub     edi,[code_start]
+       mov     [code_size],edi
+       and     [written_size],0
+       mov     edx,[output_file]
+       call    create
+       jc      write_failed
+       cmp     [output_format],3
+       jne     stub_written
+       mov     edx,[code_start]
+       mov     ecx,[stub_size]
+       sub     edx,ecx
+       add     [written_size],ecx
+       call    write
+      stub_written:
+       cmp     [output_format],2
+       jne     write_output
+       call    write_mz_header
+      write_output:
+       call    write_code
+      output_written:
+       call    close
+       cmp     [symbols_file],0
+       jne     dump_symbols
+       ret
+      write_code:
+       mov     eax,[written_size]
+       mov     [headers_size],eax
+       mov     edx,[code_start]
+       mov     ecx,[code_size]
+       add     [written_size],ecx
+       lea     eax,[edx+ecx]
+       call    write
+       jc      write_failed
+       ret
+format_directive:
+       cmp     edi,[code_start]
+       jne     unexpected_instruction
+       mov     ebp,[addressing_space]
+       test    byte [ds:ebp+0Ah],1
+       jnz     unexpected_instruction
+       cmp     [output_format],0
+       jne     unexpected_instruction
+       lods    byte [esi]
+       cmp     al,1Ch
+       je      format_prefix
+       cmp     al,18h
+       jne     invalid_argument
+       lods    byte [esi]
+      select_format:
+       mov     dl,al
+       shr     al,4
+       mov     [output_format],al
+       and     edx,0Fh
+       or      [format_flags],edx
+       cmp     al,2
+       je      format_mz
+       cmp     al,3
+       je      format_pe
+       cmp     al,4
+       je      format_coff
+       cmp     al,5
+       je      format_elf
+      format_defined:
+       cmp     byte [esi],86h
+       jne     instruction_assembled
+       cmp     word [esi+1],'('
+       jne     invalid_argument
+       mov     eax,[esi+3]
+       add     esi,3+4
+       mov     [file_extension],esi
+       lea     esi,[esi+eax+1]
+       jmp     instruction_assembled
+      format_prefix:
+       lods    byte [esi]
+       mov     ah,al
+       lods    byte [esi]
+       cmp     al,18h
+       jne     invalid_argument
+       lods    byte [esi]
+       mov     edx,eax
+       shr     dl,4
+       shr     dh,4
+       cmp     dl,dh
+       jne     invalid_argument
+       or      al,ah
+       jmp     select_format
+entry_directive:
+       bts     [format_flags],10h
+       jc      setting_already_specified
+       mov     al,[output_format]
+       cmp     al,2
+       je      mz_entry
+       cmp     al,3
+       je      pe_entry
+       cmp     al,5
+       jne     illegal_instruction
+       bt      [format_flags],0
+       jc      elf_entry
+       jmp     illegal_instruction
+stack_directive:
+       bts     [format_flags],11h
+       jc      setting_already_specified
+       mov     al,[output_format]
+       cmp     al,2
+       je      mz_stack
+       cmp     al,3
+       je      pe_stack
+       jmp     illegal_instruction
+heap_directive:
+       bts     [format_flags],12h
+       jc      setting_already_specified
+       mov     al,[output_format]
+       cmp     al,2
+       je      mz_heap
+       cmp     al,3
+       je      pe_heap
+       jmp     illegal_instruction
+segment_directive:
+       mov     al,[output_format]
+       cmp     al,2
+       je      mz_segment
+       cmp     al,5
+       je      elf_segment
+       jmp     illegal_instruction
+section_directive:
+       mov     al,[output_format]
+       cmp     al,3
+       je      pe_section
+       cmp     al,4
+       je      coff_section
+       cmp     al,5
+       je      elf_section
+       jmp     illegal_instruction
+public_directive:
+       mov     al,[output_format]
+       cmp     al,4
+       je      public_allowed
+       cmp     al,5
+       jne     illegal_instruction
+       bt      [format_flags],0
+       jc      illegal_instruction
+      public_allowed:
+       mov     [base_code],0C0h
+       lods    byte [esi]
+       cmp     al,2
+       je      public_label
+       cmp     al,1Dh
+       jne     invalid_argument
+       lods    byte [esi]
+       and     al,7
+       add     [base_code],al
+       lods    byte [esi]
+       cmp     al,2
+       jne     invalid_argument
+      public_label:
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       mov     dx,[current_pass]
+       mov     [eax+18],dx
+       or      byte [eax+8],8
+       mov     ebx,eax
+       call    store_label_reference
+       mov     eax,ebx
+       mov     ebx,[free_additional_memory]
+       lea     edx,[ebx+10h]
+       cmp     edx,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],edx
+       mov     [ebx+8],eax
+       mov     eax,[current_line]
+       mov     [ebx+0Ch],eax
+       lods    byte [esi]
+       cmp     al,86h
+       jne     invalid_argument
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       mov     [ebx+4],esi
+       lods    dword [esi]
+       lea     esi,[esi+eax+1]
+       mov     al,[base_code]
+       mov     [ebx],al
+       jmp     instruction_assembled
+extrn_directive:
+       mov     al,[output_format]
+       cmp     al,4
+       je      extrn_allowed
+       cmp     al,5
+       jne     illegal_instruction
+       bt      [format_flags],0
+       jc      illegal_instruction
+      extrn_allowed:
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       mov     ebx,esi
+       lods    dword [esi]
+       lea     esi,[esi+eax+1]
+       mov     edx,[free_additional_memory]
+       lea     eax,[edx+0Ch]
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],eax
+       mov     byte [edx],80h
+       mov     [edx+4],ebx
+       lods    byte [esi]
+       cmp     al,86h
+       jne     invalid_argument
+       lods    byte [esi]
+       cmp     al,2
+       jne     invalid_argument
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       mov     ebx,eax
+       xor     ah,ah
+       lods    byte [esi]
+       cmp     al,':'
+       je      get_extrn_size
+       dec     esi
+       cmp     al,11h
+       jne     extrn_size_ok
+      get_extrn_size:
+       lods    word [esi]
+       cmp     al,11h
+       jne     invalid_argument
+      extrn_size_ok:
+       mov     [address_symbol],edx
+       mov     [label_size],ah
+       movzx   ecx,ah
+       mov     [edx+8],ecx
+       xor     eax,eax
+       xor     edx,edx
+       xor     ebp,ebp
+       mov     [address_sign],0
+       mov     ch,2
+       test    [format_flags],8
+       jz      make_free_label
+       mov     ch,4
+       jmp     make_free_label
+mark_relocation:
+       cmp     [value_type],0
+       je      relocation_ok
+       mov     ebp,[addressing_space]
+       test    byte [ds:ebp+0Ah],1
+       jnz     relocation_ok
+       cmp     [output_format],2
+       je      mark_mz_relocation
+       cmp     [output_format],3
+       je      mark_pe_relocation
+       cmp     [output_format],4
+       je      mark_coff_relocation
+       cmp     [output_format],5
+       je      mark_elf_relocation
+      relocation_ok:
+       ret
+close_pass:
+       mov     al,[output_format]
+       cmp     al,3
+       je      close_pe
+       cmp     al,4
+       je      close_coff
+       cmp     al,5
+       je      close_elf
+       ret
+
+format_mz:
+       mov     edx,[additional_memory]
+       push    edi
+       mov     edi,edx
+       mov     ecx,1Ch shr 2
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     [free_additional_memory],edi
+       pop     edi
+       mov     word [edx+0Ch],0FFFFh
+       mov     word [edx+10h],1000h
+       mov     [code_type],16
+       jmp     format_defined
+mark_mz_relocation:
+       push    eax ebx
+       inc     word [number_of_relocations]
+       jz      format_limitations_exceeded
+       mov     ebx,[free_additional_memory]
+       mov     eax,edi
+       sub     eax,[code_start]
+       mov     [ebx],ax
+       shr     eax,16
+       shl     ax,12
+       mov     [ebx+2],ax
+       cmp     word [ebx],0FFFFh
+       jne     mz_relocation_ok
+       inc     word [ebx+2]
+       sub     word [ebx],10h
+      mz_relocation_ok:
+       add     ebx,4
+       cmp     ebx,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],ebx
+       pop     ebx eax
+       ret
+mz_segment:
+       lods    byte [esi]
+       cmp     al,2
+       jne     invalid_argument
+       lods    dword [esi]
+       cmp     eax,0Fh
+       jb      invalid_use_of_symbol
+       je      reserved_word_used_as_symbol
+       inc     esi
+       mov     ebx,eax
+       mov     eax,edi
+       sub     eax,[code_start]
+       mov     ecx,0Fh
+       add     eax,0Fh
+       and     eax,1111b
+       sub     ecx,eax
+       mov     edx,edi
+       xor     eax,eax
+       rep     stos byte [edi]
+       mov     eax,edx
+       call    undefined_data
+       push    ebx
+       call    create_addressing_space
+       pop     ebx
+       mov     eax,edi
+       sub     eax,[code_start]
+       shr     eax,4
+       cmp     eax,10000h
+       jae     value_out_of_range
+       mov     edx,eax
+       mov     al,16
+       cmp     byte [esi],13h
+       jne     segment_type_ok
+       inc     esi
+       lods    byte [esi]
+      segment_type_ok:
+       mov     [code_type],al
+       mov     eax,edx
+       mov     ch,1
+       mov     [address_sign],0
+       xor     edx,edx
+       xor     ebp,ebp
+       mov     [label_size],0
+       mov     [address_symbol],edx
+       jmp     make_free_label
+mz_entry:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_word_value
+       cmp     [value_type],1
+       je      initial_cs_ok
+       call    recoverable_invalid_address
+      initial_cs_ok:
+       mov     edx,[additional_memory]
+       mov     [edx+16h],ax
+       lods    byte [esi]
+       cmp     al,':'
+       jne     invalid_argument
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       ja      invalid_address
+       call    get_word_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,[additional_memory]
+       mov     [edx+14h],ax
+       jmp     instruction_assembled
+      recoverable_invalid_address:
+       cmp     [error_line],0
+       jne     ignore_invalid_address
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],invalid_address
+      ignore_invalid_address:
+       ret
+mz_stack:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_word_value
+       cmp     byte [esi],':'
+       je      stack_pointer
+       cmp     ax,10h
+       jb      invalid_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,[additional_memory]
+       mov     [edx+10h],ax
+       jmp     instruction_assembled
+      stack_pointer:
+       cmp     [value_type],1
+       je      initial_ss_ok
+       call    recoverable_invalid_address
+      initial_ss_ok:
+       mov     edx,[additional_memory]
+       mov     [edx+0Eh],ax
+       lods    byte [esi]
+       cmp     al,':'
+       jne     invalid_argument
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_word_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,[additional_memory]
+       mov     [edx+10h],ax
+       bts     [format_flags],4
+       jmp     instruction_assembled
+mz_heap:
+       cmp     [output_format],2
+       jne     illegal_instruction
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     ah,1
+       je      invalid_value
+       cmp     ah,2
+       ja      invalid_value
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_word_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,[additional_memory]
+       mov     [edx+0Ch],ax
+       jmp     instruction_assembled
+write_mz_header:
+       mov     edx,[additional_memory]
+       bt      [format_flags],4
+       jc      mz_stack_ok
+       mov     eax,[real_code_size]
+       dec     eax
+       shr     eax,4
+       inc     eax
+       mov     [edx+0Eh],ax
+       shl     eax,4
+       movzx   ecx,word [edx+10h]
+       add     eax,ecx
+       mov     [real_code_size],eax
+      mz_stack_ok:
+       mov     edi,[free_additional_memory]
+       mov     eax,[number_of_relocations]
+       shl     eax,2
+       add     eax,1Ch
+       sub     edi,eax
+       xchg    edi,[free_additional_memory]
+       mov     ecx,0Fh
+       add     eax,0Fh
+       and     eax,1111b
+       sub     ecx,eax
+       xor     al,al
+       rep     stos byte [edi]
+       sub     edi,[free_additional_memory]
+       mov     ecx,edi
+       shr     edi,4
+       mov     word [edx],'MZ'         ; signature
+       mov     [edx+8],di              ; header size in paragraphs
+       mov     eax,[number_of_relocations]
+       mov     [edx+6],ax              ; number of relocation entries
+       mov     eax,[code_size]
+       add     eax,ecx
+       mov     esi,eax
+       shr     esi,9
+       and     eax,1FFh
+       inc     si
+       or      ax,ax
+       jnz     mz_size_ok
+       dec     si
+      mz_size_ok:
+       mov     [edx+2],ax              ; number of bytes in last page
+       mov     [edx+4],si              ; number of pages
+       mov     eax,[real_code_size]
+       dec     eax
+       shr     eax,4
+       inc     eax
+       mov     esi,[code_size]
+       dec     esi
+       shr     esi,4
+       inc     esi
+       sub     eax,esi
+       mov     [edx+0Ah],ax            ; minimum memory in addition to code
+       add     [edx+0Ch],ax            ; maximum memory in addition to code
+       salc
+       mov     ah,al
+       or      [edx+0Ch],ax
+       mov     word [edx+18h],1Ch      ; offset of relocation table
+       add     [written_size],ecx
+       call    write
+       jc      write_failed
+       ret
+
+make_stub:
+       mov     [stub_file],edx
+       or      edx,edx
+       jnz     stub_from_file
+       push    esi
+       mov     edx,edi
+       xor     eax,eax
+       mov     ecx,20h
+       rep     stos dword [edi]
+       mov     eax,40h+default_stub_end-default_stub
+       mov     cx,100h+default_stub_end-default_stub
+       mov     word [edx],'MZ'
+       mov     byte [edx+4],1
+       mov     word [edx+2],ax
+       mov     byte [edx+8],4
+       mov     byte [edx+0Ah],10h
+       mov     word [edx+0Ch],0FFFFh
+       mov     word [edx+10h],cx
+       mov     word [edx+3Ch],ax
+       mov     byte [edx+18h],40h
+       lea     edi,[edx+40h]
+       mov     esi,default_stub
+       mov     ecx,default_stub_end-default_stub
+       rep     movs byte [edi],[esi]
+       pop     esi
+       jmp     stub_ok
+      default_stub:
+       use16
+       push    cs
+       pop     ds
+       mov     dx,stub_message-default_stub
+       mov     ah,9
+       int     21h
+       mov     ax,4C01h
+       int     21h
+      stub_message db 'This program cannot be run in DOS mode.',0Dh,0Ah,24h
+       rq      1
+      default_stub_end:
+       use32
+      stub_from_file:
+       push    esi
+       mov     esi,edx
+       call    open_binary_file
+       mov     edx,edi
+       mov     ecx,1Ch
+       mov     esi,edx
+       call    read
+       jc      binary_stub
+       cmp     word [esi],'MZ'
+       jne     binary_stub
+       add     edi,1Ch
+       movzx   ecx,word [esi+6]
+       add     ecx,11b
+       and     ecx,not 11b
+       add     ecx,(40h-1Ch) shr 2
+       lea     eax,[edi+ecx*4]
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     edx,40h
+       xchg    dx,[esi+18h]
+       xor     al,al
+       call    lseek
+       movzx   ecx,word [esi+6]
+       shl     ecx,2
+       lea     edx,[esi+40h]
+       call    read
+       mov     edx,edi
+       sub     edx,esi
+       shr     edx,4
+       xchg    dx,[esi+8]
+       shl     edx,4
+       xor     al,al
+       call    lseek
+       movzx   ecx,word [esi+4]
+       dec     ecx
+       js      out_of_memory
+       shl     ecx,9
+       movzx   edx,word [esi+2]
+       test    edx,edx
+       jnz     stub_header_size_ok
+       mov     dx,200h
+     stub_header_size_ok:
+       add     ecx,edx
+       mov     edx,edi
+       sub     ecx,eax
+       je      read_stub_code
+       jb      stub_code_ok
+       push    ecx
+       dec     ecx
+       shr     ecx,3
+       inc     ecx
+       shl     ecx,1
+       lea     eax,[edi+ecx*4]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       rep     stos dword [edi]
+       pop     ecx
+     read_stub_code:
+       call    read
+     stub_code_ok:
+       call    close
+       mov     edx,edi
+       sub     edx,esi
+       mov     ax,dx
+       and     ax,1FFh
+       mov     [esi+2],ax
+       dec     edx
+       shr     edx,9
+       inc     edx
+       mov     [esi+4],dx
+       mov     eax,edi
+       sub     eax,esi
+       mov     [esi+3Ch],eax
+       pop     esi
+      stub_ok:
+       ret
+      binary_stub:
+       mov     esi,edi
+       mov     ecx,40h shr 2
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     al,2
+       xor     edx,edx
+       call    lseek
+       push    eax
+       xor     al,al
+       xor     edx,edx
+       call    lseek
+       mov     ecx,[esp]
+       add     ecx,40h+111b
+       and     ecx,not 111b
+       mov     ax,cx
+       and     ax,1FFh
+       mov     [esi+2],ax
+       lea     eax,[ecx+1FFh]
+       shr     eax,9
+       mov     [esi+4],ax
+       mov     [esi+3Ch],ecx
+       sub     ecx,40h
+       mov     eax,10000h
+       sub     eax,ecx
+       jbe     binary_heap_ok
+       shr     eax,4
+       mov     [esi+0Ah],ax
+      binary_heap_ok:
+       mov     word [esi],'MZ'
+       mov     byte [esi+8],4
+       mov     ax,0FFFFh
+       mov     [esi+0Ch],ax
+       dec     ax
+       mov     [esi+10h],ax
+       sub     ax,0Eh
+       mov     [esi+0Eh],ax
+       mov     [esi+16h],ax
+       mov     word [esi+14h],100h
+       mov     byte [esi+18h],40h
+       mov     eax,[tagged_blocks]
+       sub     eax,ecx
+       cmp     edi,eax
+       jae     out_of_memory
+       mov     edx,edi
+       shr     ecx,2
+       xor     eax,eax
+       rep     stos dword [edi]
+       pop     ecx
+       call    read
+       call    close
+       pop     esi
+       ret
+
+format_pe:
+       xor     edx,edx
+       mov     [machine],14Ch
+       mov     [subsystem],3
+       mov     [subsystem_version],3 + 10 shl 16
+       mov     [image_base],400000h
+       and     [image_base_high],0
+       test    [format_flags],8
+       jz      pe_settings
+       mov     [machine],8664h
+       mov     [subsystem_version],5 + 0 shl 16
+      pe_settings:
+       cmp     byte [esi],84h
+       je      get_stub_name
+       cmp     byte [esi],80h
+       je      get_pe_base
+       cmp     byte [esi],1Bh
+       jne     pe_settings_ok
+       lods    byte [esi]
+       lods    byte [esi]
+       test    al,80h+40h
+       jz      subsystem_setting
+       cmp     al,80h
+       je      dll_flag
+       cmp     al,81h
+       je      wdm_flag
+       cmp     al,82h
+       je      large_flag
+       cmp     al,83h
+       je      nx_flag
+       jmp     pe_settings
+      dll_flag:
+       bts     [format_flags],8
+       jc      setting_already_specified
+       jmp     pe_settings
+      wdm_flag:
+       bts     [format_flags],9
+       jc      setting_already_specified
+       jmp     pe_settings
+      large_flag:
+       bts     [format_flags],11
+       jc      setting_already_specified
+       test    [format_flags],8
+       jnz     invalid_argument
+       jmp     pe_settings
+      nx_flag:
+       bts     [format_flags],12
+       jc      setting_already_specified
+       jmp     pe_settings
+      subsystem_setting:
+       bts     [format_flags],7
+       jc      setting_already_specified
+       and     ax,3Fh
+       mov     [subsystem],ax
+       cmp     ax,10
+       jb      subsystem_type_ok
+       or      [format_flags],4
+      subsystem_type_ok:
+       cmp     byte [esi],'('
+       jne     pe_settings
+       inc     esi
+       cmp     byte [esi],'.'
+       jne     invalid_value
+       inc     esi
+       push    edx
+       cmp     byte [esi+11],0
+       jne     invalid_value
+       cmp     byte [esi+10],2
+       ja      invalid_value
+       mov     dx,[esi+8]
+       cmp     dx,8000h
+       je      zero_version
+       mov     eax,[esi+4]
+       cmp     dx,7
+       jg      invalid_value
+       mov     cx,7
+       sub     cx,dx
+       mov     eax,[esi+4]
+       shr     eax,cl
+       mov     ebx,eax
+       shr     ebx,24
+       cmp     bl,100
+       jae     invalid_value
+       and     eax,0FFFFFFh
+       mov     ecx,100
+       mul     ecx
+       shrd    eax,edx,24
+       jnc     version_value_ok
+       inc     eax
+      version_value_ok:
+       shl     eax,16
+       mov     ax,bx
+       jmp     subsystem_version_ok
+      zero_version:
+       xor     eax,eax
+      subsystem_version_ok:
+       pop     edx
+       add     esi,13
+       mov     [subsystem_version],eax
+       jmp     pe_settings
+      get_pe_base:
+       bts     [format_flags],10
+       jc      setting_already_specified
+       lods    word [esi]
+       cmp     ah,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    edx edi
+       add     edi,[stub_size]
+       test    [format_flags],4
+       jnz     get_peplus_base
+       call    get_dword_value
+       mov     [image_base],eax
+       jmp     pe_base_ok
+      get_peplus_base:
+       call    get_qword_value
+       mov     [image_base],eax
+       mov     [image_base_high],edx
+      pe_base_ok:
+       pop     edi edx
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       cmp     byte [esi],84h
+       jne     pe_settings_ok
+      get_stub_name:
+       lods    byte [esi]
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       lods    dword [esi]
+       mov     edx,esi
+       add     esi,eax
+       inc     esi
+      pe_settings_ok:
+       mov     ebp,[stub_size]
+       or      ebp,ebp
+       jz      make_pe_stub
+       cmp     edx,[stub_file]
+       je      pe_stub_ok
+       sub     edi,[stub_size]
+       mov     [code_start],edi
+      make_pe_stub:
+       call    make_stub
+       mov     eax,edi
+       sub     eax,[code_start]
+       mov     [stub_size],eax
+       mov     [code_start],edi
+       mov     ebp,eax
+      pe_stub_ok:
+       mov     edx,edi
+       mov     ecx,18h+0E0h
+       test    [format_flags],4
+       jz      zero_pe_header
+       add     ecx,10h
+      zero_pe_header:
+       add     ebp,ecx
+       shr     ecx,2
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     word [edx],'PE'         ; signature
+       mov     ax,[machine]
+       mov     word [edx+4],ax
+       mov     byte [edx+38h+1],10h    ; section alignment
+       mov     byte [edx+3Ch+1],2      ; file alignment
+       mov     byte [edx+40h],1        ; OS version
+       mov     eax,[subsystem_version]
+       mov     [edx+48h],eax
+       mov     ax,[subsystem]
+       mov     [edx+5Ch],ax
+       cmp     ax,1
+       jne     pe_alignment_ok
+       mov     eax,20h
+       mov     dword [edx+38h],eax
+       mov     dword [edx+3Ch],eax
+      pe_alignment_ok:
+       mov     word [edx+1Ah],VERSION_MAJOR + VERSION_MINOR shl 8
+       test    [format_flags],4
+       jnz     init_peplus_specific
+       mov     byte [edx+14h],0E0h     ; size of optional header
+       mov     dword [edx+16h],10B010Fh; flags and magic value
+       mov     eax,[image_base]
+       mov     [edx+34h],eax
+       mov     byte [edx+60h+1],10h    ; stack reserve
+       mov     byte [edx+64h+1],10h    ; stack commit
+       mov     byte [edx+68h+2],1      ; heap reserve
+       mov     byte [edx+74h],16       ; number of directories
+       jmp     pe_header_ok
+      init_peplus_specific:
+       mov     byte [edx+14h],0F0h     ; size of optional header
+       mov     dword [edx+16h],20B002Fh; flags and magic value
+       mov     eax,[image_base]
+       mov     [edx+30h],eax
+       mov     eax,[image_base_high]
+       mov     [edx+34h],eax
+       mov     byte [edx+60h+1],10h    ; stack reserve
+       mov     byte [edx+68h+1],10h    ; stack commit
+       mov     byte [edx+70h+2],1      ; heap reserve
+       mov     byte [edx+84h],16       ; number of directories
+      pe_header_ok:
+       bsf     ecx,[edx+3Ch]
+       imul    ebx,[number_of_sections],28h
+       or      ebx,ebx
+       jnz     reserve_space_for_section_headers
+       mov     ebx,28h
+      reserve_space_for_section_headers:
+       add     ebx,ebp
+       dec     ebx
+       shr     ebx,cl
+       inc     ebx
+       shl     ebx,cl
+       sub     ebx,ebp
+       mov     ecx,ebx
+       mov     eax,[tagged_blocks]
+       sub     eax,ecx
+       cmp     edi,eax
+       jae     out_of_memory
+       shr     ecx,2
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     eax,edi
+       sub     eax,[code_start]
+       add     eax,[stub_size]
+       mov     [edx+54h],eax           ; size of headers
+       mov     ecx,[edx+38h]
+       dec     ecx
+       add     eax,ecx
+       not     ecx
+       and     eax,ecx
+       bt      [format_flags],8
+       jc      pe_entry_init_ok
+       mov     [edx+28h],eax           ; entry point rva
+      pe_entry_init_ok:
+       and     [number_of_sections],0
+       movzx   ebx,word [edx+14h]
+       lea     ebx,[edx+18h+ebx]
+       mov     [current_section],ebx
+       mov     dword [ebx],'.fla'
+       mov     dword [ebx+4],'t'
+       mov     [ebx+14h],edi
+       mov     [ebx+0Ch],eax
+       mov     dword [ebx+24h],0E0000060h
+       xor     ecx,ecx
+       xor     bl,bl
+       not     eax
+       not     ecx
+       not     bl
+       add     eax,1
+       adc     ecx,0
+       adc     bl,0
+       add     eax,edi
+       adc     ecx,0
+       adc     bl,0
+       test    [format_flags],4
+       jnz     peplus_org
+       sub     eax,[edx+34h]
+       sbb     ecx,0
+       sbb     bl,0
+       jmp     pe_org_ok
+      peplus_org:
+       sub     eax,[edx+30h]
+       sbb     ecx,[edx+34h]
+       sbb     bl,0
+      pe_org_ok:
+       test    [format_flags],8
+       jnz     pe64_code
+       mov     bh,2
+       mov     [code_type],32
+       jmp     pe_code_type_ok
+      pe64_code:
+       mov     bh,4
+       mov     [code_type],64
+      pe_code_type_ok:
+       bt      [resolver_flags],0
+       jc      pe_labels_type_ok
+       xor     bh,bh
+      pe_labels_type_ok:
+       push    eax ebx
+       call    init_addressing_space
+       mov     ebp,ebx
+       pop     ebx eax
+       mov     [ds:ebp],eax
+       mov     [ds:ebp+4],ecx
+       mov     [ds:ebp+8],bx
+       mov     [ds:ebp+18h],edi
+       bt      [format_flags],8
+       jnc     dll_flag_ok
+       or      byte [edx+16h+1],20h
+      dll_flag_ok:
+       bt      [format_flags],9
+       jnc     wdm_flag_ok
+       or      byte [edx+5Eh+1],20h
+      wdm_flag_ok:
+       bt      [format_flags],11
+       jnc     large_flag_ok
+       or      byte [edx+16h],20h
+      large_flag_ok:
+       bt      [format_flags],12
+       jnc     nx_ok
+       or      byte [edx+5Eh+1],1
+      nx_ok:
+       jmp     format_defined
+pe_section:
+       call    close_pe_section
+       push    eax ebx
+       call    create_addressing_space
+       mov     ebp,ebx
+       pop     ebx eax
+       bts     [format_flags],5
+       lea     ecx,[ebx+28h]
+       add     edx,[edx+54h]
+       sub     edx,[stub_size]
+       cmp     ecx,edx
+       jbe     new_section
+       lea     ebx,[edx-28h]
+       or      [next_pass_needed],-1
+       push    edi
+       mov     edi,ebx
+       mov     ecx,28h shr 4
+       xor     eax,eax
+       rep     stos dword [edi]
+       pop     edi
+      new_section:
+       mov     [ebx+0Ch],eax
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       lea     edx,[esi+4]
+       mov     ecx,[esi]
+       lea     esi,[esi+4+ecx+1]
+       cmp     ecx,8
+       ja      name_too_long
+       xor     eax,eax
+       mov     [ebx],eax
+       mov     [ebx+4],eax
+       push    esi edi
+       mov     edi,ebx
+       mov     esi,edx
+       rep     movs byte [edi],[esi]
+       pop     edi esi
+       and     dword [ebx+24h],0
+       mov     [ebx+14h],edi
+       mov     edx,[code_start]
+       mov     eax,edi
+       xor     ecx,ecx
+       sub     eax,[ebx+0Ch]
+       sbb     ecx,0
+       sbb     byte [ds:ebp+8],0
+       mov     byte [ds:ebp+9],2
+       mov     [code_type],32
+       test    [format_flags],8
+       jz      pe_section_code_type_ok
+       mov     byte [ds:ebp+9],4
+       mov     [code_type],64
+      pe_section_code_type_ok:
+       test    [format_flags],4
+       jnz     peplus_section_org
+       sub     eax,[edx+34h]
+       sbb     ecx,0
+       sbb     byte [ds:ebp+8],0
+       bt      [resolver_flags],0
+       jc      pe_section_org_ok
+       mov     byte [ds:ebp+9],0
+       jmp     pe_section_org_ok
+      peplus_section_org:
+       sub     eax,[edx+30h]
+       sbb     ecx,[edx+34h]
+       sbb     byte [ds:ebp+8],0
+       bt      [resolver_flags],0
+       jc      pe_section_org_ok
+       mov     byte [ds:ebp+9],0
+      pe_section_org_ok:
+       mov     [ds:ebp],eax
+       mov     [ds:ebp+4],ecx
+       mov     [ds:ebp+18h],edi
+      get_section_flags:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      set_directory
+       cmp     al,19h
+       je      section_flag
+       dec     esi
+       jmp     instruction_assembled
+      set_directory:
+       movzx   eax,byte [esi]
+       inc     esi
+       mov     ecx,ebx
+       test    [format_flags],4
+       jnz     peplus_directory
+       xchg    ecx,[edx+78h+eax*8]
+       mov     dword [edx+78h+eax*8+4],-1
+       jmp     pe_directory_set
+      peplus_directory:
+       xchg    ecx,[edx+88h+eax*8]
+       mov     dword [edx+88h+eax*8+4],-1
+      pe_directory_set:
+       or      ecx,ecx
+       jnz     data_already_defined
+       push    ebx edx
+       call    generate_pe_data
+       pop     edx ebx
+       jmp     get_section_flags
+      section_flag:
+       lods    byte [esi]
+       cmp     al,9
+       je      invalid_argument
+       cmp     al,11
+       je      invalid_argument
+       mov     cl,al
+       mov     eax,1
+       shl     eax,cl
+       test    dword [ebx+24h],eax
+       jnz     setting_already_specified
+       or      dword [ebx+24h],eax
+       jmp     get_section_flags
+      close_pe_section:
+       mov     ebx,[current_section]
+       mov     edx,[code_start]
+       mov     eax,edi
+       sub     eax,[ebx+14h]
+       jnz     finish_section
+       bt      [format_flags],5
+       jc      finish_section
+       mov     eax,[ebx+0Ch]
+       ret
+      finish_section:
+       mov     [ebx+8],eax
+       cmp     edi,[undefined_data_end]
+       jne     align_section
+       cmp     dword [edx+38h],1000h
+       jb      align_section
+       mov     edi,[undefined_data_start]
+      align_section:
+       and     [undefined_data_end],0
+       mov     ebp,edi
+       sub     ebp,[ebx+14h]
+       mov     ecx,[edx+3Ch]
+       dec     ecx
+       lea     eax,[ebp+ecx]
+       not     ecx
+       and     eax,ecx
+       mov     [ebx+10h],eax
+       sub     eax,ebp
+       mov     ecx,eax
+       xor     al,al
+       rep     stos byte [edi]
+       mov     eax,[code_start]
+       sub     eax,[stub_size]
+       sub     [ebx+14h],eax
+       mov     ecx,[ebx+10h]
+       test    byte [ebx+24h],20h
+       jz      pe_code_sum_ok
+       add     [edx+1Ch],ecx
+       cmp     dword [edx+2Ch],0
+       jne     pe_code_sum_ok
+       mov     eax,[ebx+0Ch]
+       mov     [edx+2Ch],eax
+      pe_code_sum_ok:
+       test    byte [ebx+24h],40h
+       jz      pe_data_sum_ok
+       add     [edx+20h],ecx
+       test    [format_flags],4
+       jnz     pe_data_sum_ok
+       cmp     dword [edx+30h],0
+       jne     pe_data_sum_ok
+       mov     eax,[ebx+0Ch]
+       mov     [edx+30h],eax
+      pe_data_sum_ok:
+       mov     eax,[ebx+8]
+       or      eax,eax
+       jz      udata_ok
+       cmp     dword [ebx+10h],0
+       jne     udata_ok
+       or      byte [ebx+24h],80h
+       add     [edx+24h],ecx
+      udata_ok:
+       mov     ecx,[edx+38h]
+       dec     ecx
+       add     eax,ecx
+       not     ecx
+       and     eax,ecx
+       add     eax,[ebx+0Ch]
+       add     ebx,28h
+       mov     [current_section],ebx
+       inc     word [number_of_sections]
+       jz      format_limitations_exceeded
+       ret
+data_directive:
+       cmp     [output_format],3
+       jne     illegal_instruction
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      predefined_data_type
+       cmp     al,'('
+       jne     invalid_argument
+       call    get_byte_value
+       cmp     al,16
+       jb      data_type_ok
+       jmp     invalid_value
+      predefined_data_type:
+       movzx   eax,byte [esi]
+       inc     esi
+      data_type_ok:
+       mov     ebx,[current_section]
+       mov     ecx,edi
+       sub     ecx,[ebx+14h]
+       add     ecx,[ebx+0Ch]
+       mov     edx,[code_start]
+       test    [format_flags],4
+       jnz     peplus_data
+       xchg    ecx,[edx+78h+eax*8]
+       jmp     init_pe_data
+      peplus_data:
+       xchg    ecx,[edx+88h+eax*8]
+      init_pe_data:
+       or      ecx,ecx
+       jnz     data_already_defined
+       call    allocate_structure_data
+       mov     word [ebx],data_directive-instruction_handler
+       mov     [ebx+2],al
+       mov     edx,[current_line]
+       mov     [ebx+4],edx
+       call    generate_pe_data
+       jmp     instruction_assembled
+      end_data:
+       cmp     [output_format],3
+       jne     illegal_instruction
+       call    find_structure_data
+       jc      unexpected_instruction
+       movzx   eax,byte [ebx+2]
+       mov     edx,[current_section]
+       mov     ecx,edi
+       sub     ecx,[edx+14h]
+       add     ecx,[edx+0Ch]
+       mov     edx,[code_start]
+       test    [format_flags],4
+       jnz     end_peplus_data
+       sub     ecx,[edx+78h+eax*8]
+       mov     [edx+78h+eax*8+4],ecx
+       jmp     remove_structure_data
+      end_peplus_data:
+       sub     ecx,[edx+88h+eax*8]
+       mov     [edx+88h+eax*8+4],ecx
+       jmp     remove_structure_data
+pe_entry:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       test    [format_flags],8
+       jnz     pe64_entry
+       call    get_dword_value
+       mov     bl,2
+       bt      [resolver_flags],0
+       jc      check_pe_entry_label_type
+       xor     bl,bl
+      check_pe_entry_label_type:
+       cmp     [value_type],bl
+       je      pe_entry_ok
+       call    recoverable_invalid_address
+      pe_entry_ok:
+       cdq
+       test    [format_flags],4
+       jnz     pe64_entry_type_ok
+       mov     edx,[code_start]
+       sub     eax,[edx+34h]
+       mov     [edx+28h],eax
+       jmp     instruction_assembled
+      pe64_entry:
+       call    get_qword_value
+       mov     bl,4
+       bt      [resolver_flags],0
+       jc      check_pe64_entry_label_type
+       xor     bl,bl
+      check_pe64_entry_label_type:
+       cmp     [value_type],bl
+       je      pe64_entry_type_ok
+       call    recoverable_invalid_address
+      pe64_entry_type_ok:
+       mov     ecx,[code_start]
+       sub     eax,[ecx+30h]
+       sbb     edx,[ecx+34h]
+       jz      pe64_entry_range_ok
+       call    recoverable_overflow
+      pe64_entry_range_ok:
+       mov     [ecx+28h],eax
+       jmp     instruction_assembled
+pe_stack:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       test    [format_flags],4
+       jnz     peplus_stack
+       call    get_count_value
+       mov     edx,[code_start]
+       mov     [edx+60h],eax
+       cmp     byte [esi],','
+       jne     default_stack_commit
+       lods    byte [esi]
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     edx,[code_start]
+       mov     [edx+64h],eax
+       cmp     eax,[edx+60h]
+       ja      value_out_of_range
+       jmp     instruction_assembled
+      default_stack_commit:
+       mov     dword [edx+64h],1000h
+       mov     eax,[edx+60h]
+       cmp     eax,1000h
+       ja      instruction_assembled
+       mov     dword [edx+64h],eax
+       jmp     instruction_assembled
+      peplus_stack:
+       call    get_qword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     ecx,[code_start]
+       mov     [ecx+60h],eax
+       mov     [ecx+64h],edx
+       cmp     byte [esi],','
+       jne     default_peplus_stack_commit
+       lods    byte [esi]
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_qword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     ecx,[code_start]
+       mov     [ecx+68h],eax
+       mov     [ecx+6Ch],edx
+       cmp     edx,[ecx+64h]
+       ja      value_out_of_range
+       jb      instruction_assembled
+       cmp     eax,[ecx+60h]
+       ja      value_out_of_range
+       jmp     instruction_assembled
+      default_peplus_stack_commit:
+       mov     dword [ecx+68h],1000h
+       cmp     dword [ecx+64h],0
+       jne     instruction_assembled
+       mov     eax,[ecx+60h]
+       cmp     eax,1000h
+       ja      instruction_assembled
+       mov     dword [ecx+68h],eax
+       jmp     instruction_assembled
+pe_heap:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       test    [format_flags],4
+       jnz     peplus_heap
+       call    get_count_value
+       mov     edx,[code_start]
+       mov     [edx+68h],eax
+       cmp     byte [esi],','
+       jne     instruction_assembled
+       lods    byte [esi]
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_count_value
+       mov     edx,[code_start]
+       mov     [edx+6Ch],eax
+       cmp     eax,[edx+68h]
+       ja      value_out_of_range
+       jmp     instruction_assembled
+      peplus_heap:
+       call    get_qword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     ecx,[code_start]
+       mov     [ecx+70h],eax
+       mov     [ecx+74h],edx
+       cmp     byte [esi],','
+       jne     instruction_assembled
+       lods    byte [esi]
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       call    get_qword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     ecx,[code_start]
+       mov     [ecx+78h],eax
+       mov     [ecx+7Ch],edx
+       cmp     edx,[ecx+74h]
+       ja      value_out_of_range
+       jb      instruction_assembled
+       cmp     eax,[ecx+70h]
+       ja      value_out_of_range
+       jmp     instruction_assembled
+mark_pe_relocation:
+       push    eax ebx
+       test    [format_flags],4
+       jz      check_standard_pe_relocation_type
+       cmp     [value_type],4
+       je      pe_relocation_type_ok
+      check_standard_pe_relocation_type:
+       cmp     [value_type],2
+       je      pe_relocation_type_ok
+       call    recoverable_misuse
+      pe_relocation_type_ok:
+       mov     ebx,[current_section]
+       mov     eax,edi
+       sub     eax,[ebx+14h]
+       add     eax,[ebx+0Ch]
+       mov     ebx,[free_additional_memory]
+       inc     [number_of_relocations]
+       add     ebx,5
+       cmp     ebx,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],ebx
+       mov     [ebx-5],eax
+       cmp     [value_type],2
+       je      fixup_32bit
+       mov     byte [ebx-1],0Ah
+       jmp     fixup_ok
+      fixup_32bit:
+       mov     byte [ebx-1],3
+      fixup_ok:
+       pop     ebx eax
+       ret
+generate_pe_data:
+       cmp     al,2
+       je      make_pe_resource
+       cmp     al,5
+       je      make_pe_fixups
+       ret
+make_pe_fixups:
+       mov     edx,[code_start]
+       and     byte [edx+16h],not 1
+       or      byte [edx+5Eh],40h
+       bts     [resolver_flags],0
+       jc      fixups_ready
+       or      [next_pass_needed],-1
+      fixups_ready:
+       and     [last_fixup_base],0
+       call    make_fixups
+       xchg    eax,[actual_fixups_size]
+       sub     eax,[actual_fixups_size]
+       ja      reserve_forward_fixups
+       xor     eax,eax
+      reserve_forward_fixups:
+       mov     [reserved_fixups],edi
+       add     edi,eax
+       mov     [reserved_fixups_size],eax
+       ret
+      make_fixups:
+       push    esi
+       xor     ecx,ecx
+       xchg    ecx,[number_of_relocations]
+       mov     esi,[free_additional_memory]
+       lea     eax,[ecx*5]
+       sub     esi,eax
+       mov     [free_additional_memory],esi
+       mov     edx,[last_fixup_base]
+       mov     ebx,[last_fixup_header]
+       mov     ebp,edi
+       jecxz   fixups_done
+      make_fixup:
+       cmp     [esi],edx
+       jb      store_fixup
+       mov     eax,edi
+       sub     eax,ebp
+       test    eax,11b
+       jz      fixups_block
+       xor     ax,ax
+       stos    word [edi]
+       add     dword [ebx],2
+      fixups_block:
+       mov     eax,edx
+       add     edx,1000h
+       cmp     [esi],edx
+       jae     fixups_block
+       stos    dword [edi]
+       mov     ebx,edi
+       mov     eax,8
+       stos    dword [edi]
+      store_fixup:
+       add     dword [ebx],2
+       mov     ah,[esi+1]
+       and     ah,0Fh
+       mov     al,[esi+4]
+       shl     al,4
+       or      ah,al
+       mov     al,[esi]
+       stos    word [edi]
+       add     esi,5
+       loop    make_fixup
+      fixups_done:
+       mov     [last_fixup_base],edx
+       mov     [last_fixup_header],ebx
+       pop     esi
+       mov     eax,edi
+       sub     eax,ebp
+       ret
+make_pe_resource:
+       cmp     byte [esi],82h
+       jne     resource_done
+       inc     esi
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       lods    dword [esi]
+       mov     edx,esi
+       lea     esi,[esi+eax+1]
+       cmp     [next_pass_needed],0
+       je      resource_from_file
+       cmp     [current_pass],0
+       jne     reserve_space_for_resource
+       and     [resource_size],0
+      reserve_space_for_resource:
+       add     edi,[resource_size]
+       cmp     edi,[tagged_blocks]
+       ja      out_of_memory
+       jmp     resource_done
+      resource_from_file:
+       push    esi
+       mov     esi,edx
+       call    open_binary_file
+       push    ebx
+       mov     esi,[free_additional_memory]
+       lea     eax,[esi+20h]
+       cmp     eax,[structures_buffer]
+       ja      out_of_memory
+       mov     edx,esi
+       mov     ecx,20h
+       call    read
+       jc      invalid_file_format
+       xor     eax,eax
+       cmp     [esi],eax
+       jne     invalid_file_format
+       mov     ax,0FFFFh
+       cmp     [esi+8],eax
+       jne     invalid_file_format
+       cmp     [esi+12],eax
+       jne     invalid_file_format
+       mov     eax,20h
+       cmp     [esi+4],eax
+       jne     invalid_file_format
+      read_resource_headers:
+       test    eax,11b
+       jz      resource_file_alignment_ok
+       mov     edx,4
+       and     eax,11b
+       sub     edx,eax
+       mov     al,1
+       call    lseek
+       jc      resource_headers_ok
+      resource_file_alignment_ok:
+       mov     [esi],eax
+       lea     edx,[esi+12]
+       mov     ecx,8
+       call    read
+       jc      resource_headers_ok
+       mov     ecx,[esi+16]
+       add     [esi],ecx
+       lea     edx,[esi+20]
+       sub     ecx,8
+       mov     [esi+16],ecx
+       lea     eax,[edx+ecx]
+       cmp     eax,[structures_buffer]
+       ja      out_of_memory
+       call    read
+       jc      invalid_file_format
+       mov     edx,[esi]
+       add     edx,[esi+12]
+       mov     eax,[esi+16]
+       lea     ecx,[esi+20]
+       lea     esi,[ecx+eax]
+       add     ecx,2
+       cmp     word [ecx-2],0FFFFh
+       je      resource_header_type_ok
+      check_resource_header_type:
+       cmp     ecx,esi
+       jae     invalid_file_format
+       cmp     word [ecx],0
+       je      resource_header_type_ok
+       add     ecx,2
+       jmp     check_resource_header_type
+      resource_header_type_ok:
+       add     ecx,2
+       cmp     word [ecx],0FFFFh
+       je      resource_header_name_ok
+      check_resource_header_name:
+       cmp     ecx,esi
+       jae     invalid_file_format
+       cmp     word [ecx],0
+       je      resource_header_name_ok
+       add     ecx,2
+       jmp     check_resource_header_name
+      resource_header_name_ok:
+       xor     al,al
+       call    lseek
+       jnc     read_resource_headers
+      resource_headers_ok:
+       cmp     esi,[free_additional_memory]
+       je      invalid_file_format
+       xor     eax,eax
+       mov     [esi],eax
+       mov     [resource_data],edi
+       lea     eax,[edi+16]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       stos    dword [edi]
+       call    make_timestamp
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       xor     ebx,ebx
+      make_type_name_directory:
+       mov     esi,[free_additional_memory]
+       xor     edx,edx
+      find_type_name:
+       cmp     dword [esi],0
+       je      type_name_ok
+       add     esi,20
+       cmp     word [esi],0FFFFh
+       je      check_next_type_name
+       or      ebx,ebx
+       jz      check_this_type_name
+       xor     ecx,ecx
+      compare_with_previous_type_name:
+       mov     ax,[esi+ecx]
+       cmp     ax,[ebx+ecx]
+       ja      check_this_type_name
+       jb      check_next_type_name
+       add     ecx,2
+       mov     ax,[esi+ecx]
+       or      ax,[ebx+ecx]
+       jnz     compare_with_previous_type_name
+       jmp     check_next_type_name
+      check_this_type_name:
+       or      edx,edx
+       jz      type_name_found
+       xor     ecx,ecx
+      compare_with_current_type_name:
+       mov     ax,[esi+ecx]
+       cmp     ax,[edx+ecx]
+       ja      check_next_type_name
+       jb      type_name_found
+       add     ecx,2
+       mov     ax,[esi+ecx]
+       or      ax,[edx+ecx]
+       jnz     compare_with_current_type_name
+       jmp     same_type_name
+      type_name_found:
+       mov     edx,esi
+      same_type_name:
+       mov     [esi-16],edi
+      check_next_type_name:
+       mov     eax,[esi-4]
+       add     esi,eax
+       jmp     find_type_name
+      type_name_ok:
+       or      edx,edx
+       jz      type_name_directory_done
+       mov     ebx,edx
+      make_type_name_entry:
+       mov     eax,[resource_data]
+       inc     word [eax+12]
+       lea     eax,[edi+8]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,ebx
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       jmp     make_type_name_directory
+      type_name_directory_done:
+       mov     ebx,-1
+      make_type_id_directory:
+       mov     esi,[free_additional_memory]
+       mov     edx,10000h
+      find_type_id:
+       cmp     dword [esi],0
+       je      type_id_ok
+       add     esi,20
+       cmp     word [esi],0FFFFh
+       jne     check_next_type_id
+       movzx   eax,word [esi+2]
+       cmp     eax,ebx
+       jle     check_next_type_id
+       cmp     eax,edx
+       jg      check_next_type_id
+       mov     edx,eax
+       mov     [esi-16],edi
+      check_next_type_id:
+       mov     eax,[esi-4]
+       add     esi,eax
+       jmp     find_type_id
+      type_id_ok:
+       cmp     edx,10000h
+       je      type_id_directory_done
+       mov     ebx,edx
+      make_type_id_entry:
+       mov     eax,[resource_data]
+       inc     word [eax+14]
+       lea     eax,[edi+8]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,ebx
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       jmp     make_type_id_directory
+      type_id_directory_done:
+       mov     esi,[resource_data]
+       add     esi,10h
+       mov     ecx,[esi-4]
+       or      cx,cx
+       jz      resource_directories_ok
+      make_resource_directories:
+       push    ecx
+       push    edi
+       mov     edx,edi
+       sub     edx,[resource_data]
+       bts     edx,31
+       mov     [esi+4],edx
+       lea     eax,[edi+16]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       stos    dword [edi]
+       call    make_timestamp
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     ebp,esi
+       xor     ebx,ebx
+      make_resource_name_directory:
+       mov     esi,[free_additional_memory]
+       xor     edx,edx
+      find_resource_name:
+       cmp     dword [esi],0
+       je      resource_name_ok
+       push    esi
+       cmp     [esi+4],ebp
+       jne     check_next_resource_name
+       add     esi,20
+       call    skip_resource_name
+       cmp     word [esi],0FFFFh
+       je      check_next_resource_name
+       or      ebx,ebx
+       jz      check_this_resource_name
+       xor     ecx,ecx
+      compare_with_previous_resource_name:
+       mov     ax,[esi+ecx]
+       cmp     ax,[ebx+ecx]
+       ja      check_this_resource_name
+       jb      check_next_resource_name
+       add     ecx,2
+       mov     ax,[esi+ecx]
+       or      ax,[ebx+ecx]
+       jnz     compare_with_previous_resource_name
+       jmp     check_next_resource_name
+      skip_resource_name:
+       cmp     word [esi],0FFFFh
+       jne     skip_unicode_string
+       add     esi,4
+       ret
+      skip_unicode_string:
+       add     esi,2
+       cmp     word [esi-2],0
+       jne     skip_unicode_string
+       ret
+      check_this_resource_name:
+       or      edx,edx
+       jz      resource_name_found
+       xor     ecx,ecx
+      compare_with_current_resource_name:
+       mov     ax,[esi+ecx]
+       cmp     ax,[edx+ecx]
+       ja      check_next_resource_name
+       jb      resource_name_found
+       add     ecx,2
+       mov     ax,[esi+ecx]
+       or      ax,[edx+ecx]
+       jnz     compare_with_current_resource_name
+       jmp     same_resource_name
+      resource_name_found:
+       mov     edx,esi
+      same_resource_name:
+       mov     eax,[esp]
+       mov     [eax+8],edi
+      check_next_resource_name:
+       pop     esi
+       mov     eax,[esi+16]
+       lea     esi,[esi+20+eax]
+       jmp     find_resource_name
+      resource_name_ok:
+       or      edx,edx
+       jz      resource_name_directory_done
+       mov     ebx,edx
+      make_resource_name_entry:
+       mov     eax,[esp]
+       inc     word [eax+12]
+       lea     eax,[edi+8]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,ebx
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       jmp     make_resource_name_directory
+      resource_name_directory_done:
+       mov     ebx,-1
+      make_resource_id_directory:
+       mov     esi,[free_additional_memory]
+       mov     edx,10000h
+      find_resource_id:
+       cmp     dword [esi],0
+       je      resource_id_ok
+       push    esi
+       cmp     [esi+4],ebp
+       jne     check_next_resource_id
+       add     esi,20
+       call    skip_resource_name
+       cmp     word [esi],0FFFFh
+       jne     check_next_resource_id
+       movzx   eax,word [esi+2]
+       cmp     eax,ebx
+       jle     check_next_resource_id
+       cmp     eax,edx
+       jg      check_next_resource_id
+       mov     edx,eax
+       mov     eax,[esp]
+       mov     [eax+8],edi
+      check_next_resource_id:
+       pop     esi
+       mov     eax,[esi+16]
+       lea     esi,[esi+20+eax]
+       jmp     find_resource_id
+      resource_id_ok:
+       cmp     edx,10000h
+       je      resource_id_directory_done
+       mov     ebx,edx
+      make_resource_id_entry:
+       mov     eax,[esp]
+       inc     word [eax+14]
+       lea     eax,[edi+8]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,ebx
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       jmp     make_resource_id_directory
+      resource_id_directory_done:
+       pop     eax
+       mov     esi,ebp
+       pop     ecx
+       add     esi,8
+       dec     cx
+       jnz     make_resource_directories
+      resource_directories_ok:
+       shr     ecx,16
+       jnz     make_resource_directories
+       mov     esi,[resource_data]
+       add     esi,10h
+       movzx   eax,word [esi-4]
+       movzx   edx,word [esi-2]
+       add     eax,edx
+       lea     esi,[esi+eax*8]
+       push    edi                     ; address of language directories
+      update_resource_directories:
+       cmp     esi,[esp]
+       je      resource_directories_updated
+       add     esi,10h
+       mov     ecx,[esi-4]
+       or      cx,cx
+       jz      language_directories_ok
+      make_language_directories:
+       push    ecx
+       push    edi
+       mov     edx,edi
+       sub     edx,[resource_data]
+       bts     edx,31
+       mov     [esi+4],edx
+       lea     eax,[edi+16]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       stos    dword [edi]
+       call    make_timestamp
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     ebp,esi
+       mov     ebx,-1
+      make_language_id_directory:
+       mov     esi,[free_additional_memory]
+       mov     edx,10000h
+      find_language_id:
+       cmp     dword [esi],0
+       je      language_id_ok
+       push    esi
+       cmp     [esi+8],ebp
+       jne     check_next_language_id
+       add     esi,20
+       mov     eax,esi
+       call    skip_resource_name
+       call    skip_resource_name
+       neg     eax
+       add     eax,esi
+       and     eax,11b
+       add     esi,eax
+      get_language_id:
+       movzx   eax,word [esi+6]
+       cmp     eax,ebx
+       jle     check_next_language_id
+       cmp     eax,edx
+       jge     check_next_language_id
+       mov     edx,eax
+       mov     eax,[esp]
+       mov     dword [value],eax
+      check_next_language_id:
+       pop     esi
+       mov     eax,[esi+16]
+       lea     esi,[esi+20+eax]
+       jmp     find_language_id
+      language_id_ok:
+       cmp     edx,10000h
+       je      language_id_directory_done
+       mov     ebx,edx
+      make_language_id_entry:
+       mov     eax,[esp]
+       inc     word [eax+14]
+       lea     eax,[edi+8]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,ebx
+       stos    dword [edi]
+       mov     eax,dword [value]
+       stos    dword [edi]
+       jmp     make_language_id_directory
+      language_id_directory_done:
+       pop     eax
+       mov     esi,ebp
+       pop     ecx
+       add     esi,8
+       dec     cx
+       jnz     make_language_directories
+      language_directories_ok:
+       shr     ecx,16
+       jnz     make_language_directories
+       jmp     update_resource_directories
+      resource_directories_updated:
+       mov     esi,[resource_data]
+       push    edi
+      make_name_strings:
+       add     esi,10h
+       movzx   eax,word [esi-2]
+       movzx   ecx,word [esi-4]
+       add     eax,ecx
+       lea     eax,[esi+eax*8]
+       push    eax
+       or      ecx,ecx
+       jz      string_entries_processed
+      process_string_entries:
+       push    ecx
+       mov     edx,edi
+       sub     edx,[resource_data]
+       bts     edx,31
+       xchg    [esi],edx
+       mov     ebx,edi
+       xor     ax,ax
+       stos    word [edi]
+      copy_string_data:
+       lea     eax,[edi+2]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     ax,[edx]
+       or      ax,ax
+       jz      string_data_copied
+       stos    word [edi]
+       inc     word [ebx]
+       add     edx,2
+       jmp     copy_string_data
+      string_data_copied:
+       add     esi,8
+       pop     ecx
+       loop    process_string_entries
+      string_entries_processed:
+       pop     esi
+       cmp     esi,[esp]
+       jb      make_name_strings
+       mov     eax,edi
+       sub     eax,[resource_data]
+       test    al,11b
+       jz      resource_strings_alignment_ok
+       xor     ax,ax
+       stos    word [edi]
+      resource_strings_alignment_ok:
+       pop     edx
+       pop     ebx                     ; address of language directories
+       mov     ebp,edi
+      update_language_directories:
+       add     ebx,10h
+       movzx   eax,word [ebx-2]
+       movzx   ecx,word [ebx-4]
+       add     ecx,eax
+      make_data_records:
+       push    ecx
+       mov     esi,edi
+       sub     esi,[resource_data]
+       xchg    esi,[ebx+4]
+       lea     eax,[edi+16]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,esi
+       stos    dword [edi]
+       mov     eax,[esi+12]
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       pop     ecx
+       add     ebx,8
+       loop    make_data_records
+       cmp     ebx,edx
+       jb      update_language_directories
+       pop     ebx                     ; file handle
+       mov     esi,ebp
+       mov     ebp,edi
+      update_data_records:
+       push    ebp
+       mov     ecx,edi
+       mov     eax,[current_section]
+       sub     ecx,[eax+14h]
+       add     ecx,[eax+0Ch]
+       xchg    ecx,[esi]
+       mov     edx,[ecx]
+       xor     al,al
+       call    lseek
+       mov     edx,edi
+       mov     ecx,[esi+4]
+       add     edi,ecx
+       cmp     edi,[tagged_blocks]
+       ja      out_of_memory
+       call    read
+       mov     eax,edi
+       sub     eax,[resource_data]
+       and     eax,11b
+       jz      resource_data_alignment_ok
+       mov     ecx,4
+       sub     ecx,eax
+       xor     al,al
+       rep     stos byte [edi]
+      resource_data_alignment_ok:
+       pop     ebp
+       add     esi,16
+       cmp     esi,ebp
+       jb      update_data_records
+       pop     esi
+       call    close
+       mov     eax,edi
+       sub     eax,[resource_data]
+       mov     [resource_size],eax
+      resource_done:
+       ret
+close_pe:
+       call    close_pe_section
+       mov     edx,[code_start]
+       mov     [edx+50h],eax
+       call    make_timestamp
+       mov     edx,[code_start]
+       mov     [edx+8],eax
+       mov     eax,[number_of_sections]
+       mov     [edx+6],ax
+       imul    eax,28h
+       movzx   ecx,word [edx+14h]
+       lea     eax,[eax+18h+ecx]
+       add     eax,[stub_size]
+       mov     ecx,[edx+3Ch]
+       dec     ecx
+       add     eax,ecx
+       not     ecx
+       and     eax,ecx
+       cmp     eax,[edx+54h]
+       je      pe_sections_ok
+       or      [next_pass_needed],-1
+      pe_sections_ok:
+       xor     ecx,ecx
+       add     edx,78h
+       test    [format_flags],4
+       jz      process_directories
+       add     edx,10h
+      process_directories:
+       mov     eax,[edx+ecx*8]
+       or      eax,eax
+       jz      directory_ok
+       cmp     dword [edx+ecx*8+4],-1
+       jne     directory_ok
+      section_data:
+       mov     ebx,[edx+ecx*8]
+       mov     eax,[ebx+0Ch]
+       mov     [edx+ecx*8],eax         ; directory rva
+       mov     eax,[ebx+8]
+       mov     [edx+ecx*8+4],eax       ; directory size
+      directory_ok:
+       inc     cl
+       cmp     cl,10h
+       jb      process_directories
+       cmp     dword [edx+5*8],0
+       jne     finish_pe_relocations
+       mov     eax,[number_of_relocations]
+       shl     eax,2
+       sub     [free_additional_memory],eax
+       btr     [resolver_flags],0
+       jnc     pe_relocations_ok
+       or      [next_pass_needed],-1
+       jmp     pe_relocations_ok
+      finish_pe_relocations:
+       push    edi
+       mov     edi,[reserved_fixups]
+       call    make_fixups
+       pop     edi
+       add     [actual_fixups_size],eax
+       cmp     eax,[reserved_fixups_size]
+       je      pe_relocations_ok
+       or      [next_pass_needed],-1
+      pe_relocations_ok:
+       mov     ebx,[code_start]
+       sub     ebx,[stub_size]
+       mov     ecx,edi
+       sub     ecx,ebx
+       mov     ebp,ecx
+       shr     ecx,1
+       xor     eax,eax
+       cdq
+      calculate_checksum:
+       mov     dx,[ebx]
+       add     eax,edx
+       mov     dx,ax
+       shr     eax,16
+       add     eax,edx
+       add     ebx,2
+       loop    calculate_checksum
+       add     eax,ebp
+       mov     ebx,[code_start]
+       mov     [ebx+58h],eax
+       ret
+
+format_coff:
+       mov     eax,[additional_memory]
+       mov     [symbols_stream],eax
+       mov     ebx,eax
+       add     eax,20h
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],eax
+       xor     eax,eax
+       mov     [ebx],al
+       mov     [ebx+4],eax
+       mov     [ebx+8],edi
+       mov     al,4
+       mov     [ebx+10h],eax
+       mov     al,60h
+       bt      [format_flags],0
+       jnc     flat_section_flags_ok
+       or      eax,0E0000000h
+      flat_section_flags_ok:
+       mov     dword [ebx+14h],eax
+       mov     [current_section],ebx
+       xor     eax,eax
+       mov     [number_of_sections],eax
+       mov     edx,ebx
+       call    init_addressing_space
+       mov     [ebx+14h],edx
+       mov     byte [ebx+9],2
+       mov     [code_type],32
+       test    [format_flags],8
+       jz      format_defined
+       mov     byte [ebx+9],4
+       mov     [code_type],64
+       jmp     format_defined
+coff_section:
+       call    close_coff_section
+       mov     ebx,[free_additional_memory]
+       lea     eax,[ebx+20h]
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],eax
+       mov     [current_section],ebx
+       inc     [number_of_sections]
+       xor     eax,eax
+       mov     [ebx],al
+       mov     [ebx+8],edi
+       mov     [ebx+10h],eax
+       mov     [ebx+14h],eax
+       mov     edx,ebx
+       call    create_addressing_space
+       xchg    edx,ebx
+       mov     [edx+14h],ebx
+       mov     byte [edx+9],2
+       test    [format_flags],8
+       jz      coff_labels_type_ok
+       mov     byte [edx+9],4
+      coff_labels_type_ok:
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       mov     [ebx+4],esi
+       mov     ecx,[esi]
+       lea     esi,[esi+4+ecx+1]
+       cmp     ecx,8
+       ja      name_too_long
+      coff_section_flags:
+       cmp     byte [esi],8Ch
+       je      coff_section_alignment
+       cmp     byte [esi],19h
+       jne     coff_section_settings_ok
+       inc     esi
+       lods    byte [esi]
+       bt      [format_flags],0
+       jc      coff_section_flag_ok
+       cmp     al,7
+       ja      invalid_argument
+      coff_section_flag_ok:
+       mov     cl,al
+       mov     eax,1
+       shl     eax,cl
+       test    dword [ebx+14h],eax
+       jnz     setting_already_specified
+       or      dword [ebx+14h],eax
+       jmp     coff_section_flags
+      coff_section_alignment:
+       bt      [format_flags],0
+       jnc     invalid_argument
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    ebx
+       call    get_count_value
+       pop     ebx
+       mov     edx,eax
+       dec     edx
+       test    eax,edx
+       jnz     invalid_value
+       or      eax,eax
+       jz      invalid_value
+       cmp     eax,2000h
+       ja      invalid_value
+       bsf     edx,eax
+       inc     edx
+       shl     edx,20
+       or      [ebx+14h],edx
+       xchg    [ebx+10h],eax
+       or      eax,eax
+       jnz     setting_already_specified
+       jmp     coff_section_flags
+      coff_section_settings_ok:
+       cmp     dword [ebx+10h],0
+       jne     instruction_assembled
+       mov     dword [ebx+10h],4
+       bt      [format_flags],0
+       jnc     instruction_assembled
+       or      dword [ebx+14h],300000h
+       jmp     instruction_assembled
+      close_coff_section:
+       mov     ebx,[current_section]
+       mov     eax,edi
+       mov     edx,[ebx+8]
+       sub     eax,edx
+       mov     [ebx+0Ch],eax
+       xor     eax,eax
+       xchg    [undefined_data_end],eax
+       cmp     eax,edi
+       jne     coff_section_ok
+       cmp     edx,[undefined_data_start]
+       jne     coff_section_ok
+       mov     edi,edx
+       or      byte [ebx+14h],80h
+      coff_section_ok:
+       ret
+mark_coff_relocation:
+       cmp     [value_type],3
+       je      coff_relocation_relative
+       push    ebx eax
+       test    [format_flags],8
+       jnz     coff_64bit_relocation
+       mov     al,6
+       cmp     [value_type],2
+       je      coff_relocation
+       cmp     [value_type],5
+       jne     invalid_use_of_symbol
+       inc     al
+       jmp     coff_relocation
+      coff_64bit_relocation:
+       mov     al,1
+       cmp     [value_type],4
+       je      coff_relocation
+       mov     al,2
+       cmp     [value_type],2
+       je      coff_relocation
+       cmp     [value_type],5
+       jne     invalid_use_of_symbol
+       inc     al
+       jmp     coff_relocation
+      coff_relocation_relative:
+       push    ebx
+       bt      [format_flags],0
+       jnc     relative_ok
+       mov     ebx,[current_section]
+       mov     ebx,[ebx+8]
+       sub     ebx,edi
+       sub     eax,ebx
+       add     eax,4
+      relative_ok:
+       mov     ebx,[addressing_space]
+       push    eax
+       mov     al,20
+       test    [format_flags],8
+       jnz     relative_coff_64bit_relocation
+       cmp     byte [ebx+9],2
+       jne     invalid_use_of_symbol
+       jmp     coff_relocation
+      relative_coff_64bit_relocation:
+       mov     al,4
+       cmp     byte [ebx+9],4
+       jne     invalid_use_of_symbol
+      coff_relocation:
+       mov     ebx,[free_additional_memory]
+       add     ebx,0Ch
+       cmp     ebx,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],ebx
+       mov     byte [ebx-0Ch],al
+       mov     eax,[current_section]
+       mov     eax,[eax+8]
+       neg     eax
+       add     eax,edi
+       mov     [ebx-0Ch+4],eax
+       mov     eax,[symbol_identifier]
+       mov     [ebx-0Ch+8],eax
+       pop     eax ebx
+       ret
+close_coff:
+       call    close_coff_section
+       cmp     [next_pass_needed],0
+       je      coff_closed
+       mov     eax,[symbols_stream]
+       mov     [free_additional_memory],eax
+      coff_closed:
+       ret
+coff_formatter:
+       sub     edi,[code_start]
+       mov     [code_size],edi
+       call    prepare_default_section
+       mov     edi,[free_additional_memory]
+       mov     ebx,edi
+       mov     ecx,28h shr 2
+       imul    ecx,[number_of_sections]
+       add     ecx,14h shr 2
+       lea     eax,[edi+ecx*4]
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     word [ebx],14Ch
+       test    [format_flags],8
+       jz      coff_magic_ok
+       mov     word [ebx],8664h
+      coff_magic_ok:
+       mov     word [ebx+12h],104h
+       bt      [format_flags],0
+       jnc     coff_flags_ok
+       or      byte [ebx+12h],80h
+      coff_flags_ok:
+       push    ebx
+       call    make_timestamp
+       pop     ebx
+       mov     [ebx+4],eax
+       mov     eax,[number_of_sections]
+       mov     [ebx+2],ax
+       mov     esi,[symbols_stream]
+       xor     eax,eax
+       xor     ecx,ecx
+      enumerate_symbols:
+       cmp     esi,[free_additional_memory]
+       je      symbols_enumerated
+       mov     dl,[esi]
+       or      dl,dl
+       jz      enumerate_section
+       cmp     dl,0C0h
+       jae     enumerate_public
+       cmp     dl,80h
+       jae     enumerate_extrn
+       add     esi,0Ch
+       jmp     enumerate_symbols
+      enumerate_section:
+       mov     edx,eax
+       shl     edx,8
+       mov     [esi],edx
+       inc     eax
+       inc     ecx
+       mov     [esi+1Eh],cx
+       add     esi,20h
+       jmp     enumerate_symbols
+      enumerate_public:
+       mov     edx,eax
+       shl     edx,8
+       mov     dl,[esi]
+       mov     [esi],edx
+       mov     edx,[esi+8]
+       add     esi,10h
+       inc     eax
+       cmp     byte [edx+11],0
+       je      enumerate_symbols
+       mov     edx,[edx+20]
+       cmp     byte [edx],0C0h
+       jae     enumerate_symbols
+       cmp     byte [edx],80h
+       jb      enumerate_symbols
+       inc     eax
+       jmp     enumerate_symbols
+      enumerate_extrn:
+       mov     edx,eax
+       shl     edx,8
+       mov     dl,[esi]
+       mov     [esi],edx
+       add     esi,0Ch
+       inc     eax
+       jmp     enumerate_symbols
+      prepare_default_section:
+       mov     ebx,[symbols_stream]
+       cmp     dword [ebx+0Ch],0
+       jne     default_section_ok
+       cmp     [number_of_sections],0
+       je      default_section_ok
+       mov     edx,ebx
+      find_references_to_default_section:
+       cmp     ebx,[free_additional_memory]
+       jne     check_reference
+       add     [symbols_stream],20h
+       ret
+      check_reference:
+       mov     al,[ebx]
+       or      al,al
+       jz      skip_other_section
+       cmp     al,0C0h
+       jae     check_public_reference
+       cmp     al,80h
+       jae     next_reference
+       cmp     edx,[ebx+8]
+       je      default_section_ok
+      next_reference:
+       add     ebx,0Ch
+       jmp     find_references_to_default_section
+      check_public_reference:
+       mov     eax,[ebx+8]
+       add     ebx,10h
+       test    byte [eax+8],1
+       jz      find_references_to_default_section
+       mov     cx,[current_pass]
+       cmp     cx,[eax+16]
+       jne     find_references_to_default_section
+       cmp     edx,[eax+20]
+       je      default_section_ok
+       jmp     find_references_to_default_section
+      skip_other_section:
+       add     ebx,20h
+       jmp     find_references_to_default_section
+      default_section_ok:
+       inc     [number_of_sections]
+       ret
+      symbols_enumerated:
+       mov     [ebx+0Ch],eax
+       mov     ebp,edi
+       sub     ebp,ebx
+       push    ebp
+       lea     edi,[ebx+14h]
+       mov     esi,[symbols_stream]
+      find_section:
+       cmp     esi,[free_additional_memory]
+       je      sections_finished
+       mov     al,[esi]
+       or      al,al
+       jz      section_found
+       add     esi,0Ch
+       cmp     al,0C0h
+       jb      find_section
+       add     esi,4
+       jmp     find_section
+      section_found:
+       push    esi edi
+       mov     esi,[esi+4]
+       or      esi,esi
+       jz      default_section
+       mov     ecx,[esi]
+       add     esi,4
+       rep     movs byte [edi],[esi]
+       jmp     section_name_ok
+      default_section:
+       mov     al,'.'
+       stos    byte [edi]
+       mov     eax,'flat'
+       stos    dword [edi]
+      section_name_ok:
+       pop     edi esi
+       mov     eax,[esi+0Ch]
+       mov     [edi+10h],eax
+       mov     eax,[esi+14h]
+       mov     [edi+24h],eax
+       test    al,80h
+       jnz     section_ptr_ok
+       mov     eax,[esi+8]
+       sub     eax,[code_start]
+       add     eax,ebp
+       mov     [edi+14h],eax
+      section_ptr_ok:
+       mov     ebx,[code_start]
+       mov     edx,[code_size]
+       add     ebx,edx
+       add     edx,ebp
+       xor     ecx,ecx
+       add     esi,20h
+      find_relocations:
+       cmp     esi,[free_additional_memory]
+       je      section_relocations_done
+       mov     al,[esi]
+       or      al,al
+       jz      section_relocations_done
+       cmp     al,80h
+       jb      add_relocation
+       cmp     al,0C0h
+       jb      next_relocation
+       add     esi,10h
+       jmp     find_relocations
+      add_relocation:
+       lea     eax,[ebx+0Ah]
+       cmp     eax,[tagged_blocks]
+       ja      out_of_memory
+       mov     eax,[esi+4]
+       mov     [ebx],eax
+       mov     eax,[esi+8]
+       mov     eax,[eax]
+       shr     eax,8
+       mov     [ebx+4],eax
+       movzx   ax,byte [esi]
+       mov     [ebx+8],ax
+       add     ebx,0Ah
+       inc     ecx
+      next_relocation:
+       add     esi,0Ch
+       jmp     find_relocations
+      section_relocations_done:
+       cmp     ecx,10000h
+       jb      section_relocations_count_16bit
+       bt      [format_flags],0
+       jnc     format_limitations_exceeded
+       mov     word [edi+20h],0FFFFh
+       or      dword [edi+24h],1000000h
+       mov     [edi+18h],edx
+       push    esi edi
+       push    ecx
+       lea     esi,[ebx-1]
+       add     ebx,0Ah
+       lea     edi,[ebx-1]
+       imul    ecx,0Ah
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       pop     ecx
+       inc     esi
+       inc     ecx
+       mov     [esi],ecx
+       xor     eax,eax
+       mov     [esi+4],eax
+       mov     [esi+8],ax
+       pop     edi esi
+       jmp     section_relocations_ok
+      section_relocations_count_16bit:
+       mov     [edi+20h],cx
+       jcxz    section_relocations_ok
+       mov     [edi+18h],edx
+      section_relocations_ok:
+       sub     ebx,[code_start]
+       mov     [code_size],ebx
+       add     edi,28h
+       jmp     find_section
+      sections_finished:
+       mov     edx,[free_additional_memory]
+       mov     ebx,[code_size]
+       add     ebp,ebx
+       mov     [edx+8],ebp
+       add     ebx,[code_start]
+       mov     edi,ebx
+       mov     ecx,[edx+0Ch]
+       imul    ecx,12h shr 1
+       xor     eax,eax
+       shr     ecx,1
+       jnc     zero_symbols_table
+       stos    word [edi]
+      zero_symbols_table:
+       rep     stos dword [edi]
+       mov     edx,edi
+       stos    dword [edi]
+       mov     esi,[symbols_stream]
+      make_symbols_table:
+       cmp     esi,[free_additional_memory]
+       je      symbols_table_ok
+       mov     al,[esi]
+       cmp     al,0C0h
+       jae     add_public_symbol
+       cmp     al,80h
+       jae     add_extrn_symbol
+       or      al,al
+       jz      add_section_symbol
+       add     esi,0Ch
+       jmp     make_symbols_table
+      add_section_symbol:
+       call    store_symbol_name
+       movzx   eax,word [esi+1Eh]
+       mov     [ebx+0Ch],ax
+       mov     byte [ebx+10h],3
+       add     esi,20h
+       add     ebx,12h
+       jmp     make_symbols_table
+      add_extrn_symbol:
+       call    store_symbol_name
+       mov     byte [ebx+10h],2
+       add     esi,0Ch
+       add     ebx,12h
+       jmp     make_symbols_table
+      add_public_symbol:
+       call    store_symbol_name
+       mov     eax,[esi+0Ch]
+       mov     [current_line],eax
+       mov     eax,[esi+8]
+       test    byte [eax+8],1
+       jz      undefined_coff_public
+       mov     cx,[current_pass]
+       cmp     cx,[eax+16]
+       jne     undefined_coff_public
+       mov     cl,[eax+11]
+       or      cl,cl
+       jz      public_constant
+       test    [format_flags],8
+       jnz     check_64bit_public_symbol
+       cmp     cl,2
+       je      public_symbol_type_ok
+       jmp     invalid_use_of_symbol
+      undefined_coff_public:
+       mov     [error_info],eax
+       jmp     undefined_symbol
+      check_64bit_public_symbol:
+       cmp     cl,4
+       jne     invalid_use_of_symbol
+      public_symbol_type_ok:
+       mov     ecx,[eax+20]
+       cmp     byte [ecx],80h
+       je      alias_symbol
+       cmp     byte [ecx],0
+       jne     invalid_use_of_symbol
+       mov     cx,[ecx+1Eh]
+       mov     [ebx+0Ch],cx
+      public_symbol_section_ok:
+       movzx   ecx,byte [eax+9]
+       shr     cl,1
+       and     cl,1
+       neg     ecx
+       cmp     ecx,[eax+4]
+       jne     value_out_of_range
+       xor     ecx,[eax]
+       js      value_out_of_range
+       mov     eax,[eax]
+       mov     [ebx+8],eax
+       mov     al,2
+       cmp     byte [esi],0C0h
+       je      store_symbol_class
+       inc     al
+       cmp     byte [esi],0C1h
+       je      store_symbol_class
+       mov     al,105
+      store_symbol_class:
+       mov     byte [ebx+10h],al
+       add     esi,10h
+       add     ebx,12h
+       jmp     make_symbols_table
+      alias_symbol:
+       bt      [format_flags],0
+       jnc     invalid_use_of_symbol
+       mov     ecx,[eax]
+       or      ecx,[eax+4]
+       jnz     invalid_use_of_symbol
+       mov     byte [ebx+10h],69h
+       mov     byte [ebx+11h],1
+       add     ebx,12h
+       mov     ecx,[eax+20]
+       mov     ecx,[ecx]
+       shr     ecx,8
+       mov     [ebx],ecx
+       mov     byte [ebx+4],3
+       add     esi,10h
+       add     ebx,12h
+       jmp     make_symbols_table
+      public_constant:
+       mov     word [ebx+0Ch],0FFFFh
+       jmp     public_symbol_section_ok
+      symbols_table_ok:
+       mov     eax,edi
+       sub     eax,edx
+       mov     [edx],eax
+       sub     edi,[code_start]
+       mov     [code_size],edi
+       and     [written_size],0
+       mov     edx,[output_file]
+       call    create
+       jc      write_failed
+       mov     edx,[free_additional_memory]
+       pop     ecx
+       add     [written_size],ecx
+       call    write
+       jc      write_failed
+       jmp     write_output
+      store_symbol_name:
+       push    esi
+       mov     esi,[esi+4]
+       or      esi,esi
+       jz      default_name
+       lods    dword [esi]
+       mov     ecx,eax
+       cmp     ecx,8
+       ja      add_string
+       push    edi
+       mov     edi,ebx
+       rep     movs byte [edi],[esi]
+       pop     edi esi
+       ret
+      default_name:
+       mov     dword [ebx],'.fla'
+       mov     dword [ebx+4],'t'
+       pop     esi
+       ret
+      add_string:
+       mov     eax,edi
+       sub     eax,edx
+       mov     [ebx+4],eax
+       inc     ecx
+       rep     movs byte [edi],[esi]
+       pop     esi
+       ret
+
+format_elf:
+       test    [format_flags],8
+       jnz     format_elf64
+       mov     edx,edi
+       mov     ecx,34h shr 2
+       lea     eax,[edi+ecx*4]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     dword [edx],7Fh + 'ELF' shl 8
+       mov     al,1
+       mov     [edx+4],al
+       mov     [edx+5],al
+       mov     [edx+6],al
+       mov     [edx+14h],al
+       mov     byte [edx+12h],3
+       mov     byte [edx+28h],34h
+       mov     byte [edx+2Eh],28h
+       mov     [code_type],32
+       mov     byte [edx+10h],2
+       cmp     word [esi],1D19h
+       je      format_elf_exe
+       mov     byte [edx+10h],3
+       cmp     word [esi],021Eh
+       je      format_elf_exe
+      elf_header_ok:
+       mov     byte [edx+10h],1
+       mov     eax,[additional_memory]
+       mov     [symbols_stream],eax
+       mov     ebx,eax
+       add     eax,20h
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],eax
+       xor     eax,eax
+       mov     [current_section],ebx
+       mov     [number_of_sections],eax
+       mov     [ebx],al
+       mov     [ebx+4],eax
+       mov     [ebx+8],edi
+       mov     al,111b
+       mov     [ebx+14h],eax
+       mov     al,4
+       mov     [ebx+10h],eax
+       mov     edx,ebx
+       call    init_addressing_space
+       xchg    edx,ebx
+       mov     [edx+14h],ebx
+       mov     byte [edx+9],2
+       test    [format_flags],8
+       jz      format_defined
+       mov     byte [edx+9],4
+       mov     byte [ebx+10h],8
+       jmp     format_defined
+      format_elf64:
+       mov     edx,edi
+       mov     ecx,40h shr 2
+       lea     eax,[edi+ecx*4]
+       cmp     eax,[tagged_blocks]
+       jae     out_of_memory
+       xor     eax,eax
+       rep     stos dword [edi]
+       mov     dword [edx],7Fh + 'ELF' shl 8
+       mov     al,1
+       mov     [edx+5],al
+       mov     [edx+6],al
+       mov     [edx+14h],al
+       mov     byte [edx+4],2
+       mov     byte [edx+12h],62
+       mov     byte [edx+34h],40h
+       mov     byte [edx+3Ah],40h
+       mov     [code_type],64
+       mov     byte [edx+10h],2
+       cmp     word [esi],1D19h
+       je      format_elf64_exe
+       mov     byte [edx+10h],3
+       cmp     word [esi],021Eh
+       je      format_elf64_exe
+       jmp     elf_header_ok
+elf_section:
+       bt      [format_flags],0
+       jc      illegal_instruction
+       call    close_coff_section
+       mov     ebx,[free_additional_memory]
+       lea     eax,[ebx+20h]
+       cmp     eax,[structures_buffer]
+       jae     out_of_memory
+       mov     [free_additional_memory],eax
+       mov     [current_section],ebx
+       inc     word [number_of_sections]
+       jz      format_limitations_exceeded
+       xor     eax,eax
+       mov     [ebx],al
+       mov     [ebx+8],edi
+       mov     [ebx+10h],eax
+       mov     al,10b
+       mov     [ebx+14h],eax
+       mov     edx,ebx
+       call    create_addressing_space
+       xchg    edx,ebx
+       mov     [edx+14h],ebx
+       mov     byte [edx+9],2
+       test    [format_flags],8
+       jz      elf_labels_type_ok
+       mov     byte [edx+9],4
+      elf_labels_type_ok:
+       lods    word [esi]
+       cmp     ax,'('
+       jne     invalid_argument
+       mov     [ebx+4],esi
+       mov     ecx,[esi]
+       lea     esi,[esi+4+ecx+1]
+      elf_section_flags:
+       cmp     byte [esi],8Ch
+       je      elf_section_alignment
+       cmp     byte [esi],19h
+       jne     elf_section_settings_ok
+       inc     esi
+       lods    byte [esi]
+       sub     al,28
+       xor     al,11b
+       test    al,not 10b
+       jnz     invalid_argument
+       mov     cl,al
+       mov     al,1
+       shl     al,cl
+       test    byte [ebx+14h],al
+       jnz     setting_already_specified
+       or      byte [ebx+14h],al
+       jmp     elf_section_flags
+      elf_section_alignment:
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    ebx
+       call    get_count_value
+       pop     ebx
+       mov     edx,eax
+       dec     edx
+       test    eax,edx
+       jnz     invalid_value
+       or      eax,eax
+       jz      invalid_value
+       xchg    [ebx+10h],eax
+       or      eax,eax
+       jnz     setting_already_specified
+       jmp     elf_section_flags
+      elf_section_settings_ok:
+       cmp     dword [ebx+10h],0
+       jne     instruction_assembled
+       mov     dword [ebx+10h],4
+       test    [format_flags],8
+       jz      instruction_assembled
+       mov     byte [ebx+10h],8
+       jmp     instruction_assembled
+mark_elf_relocation:
+       test    [format_flags],1
+       jnz     invalid_use_of_symbol
+       push    ebx
+       mov     ebx,[addressing_space]
+       cmp     [value_type],3
+       je      elf_relocation_relative
+       cmp     [value_type],7
+       je      elf_relocation_relative
+       push    eax
+       cmp     [value_type],5
+       je      elf_gotoff_relocation
+       ja      invalid_use_of_symbol
+       mov     al,1                    ; R_386_32 / R_AMD64_64
+       test    [format_flags],8
+       jz      coff_relocation
+       cmp     [value_type],4
+       je      coff_relocation
+       mov     al,11                   ; R_AMD64_32S
+       jmp     coff_relocation
+      elf_gotoff_relocation:
+       test    [format_flags],8
+       jnz     invalid_use_of_symbol
+       mov     al,9                    ; R_386_GOTOFF
+       jmp     coff_relocation
+      elf_relocation_relative:
+       cmp     byte [ebx+9],0
+       je      invalid_use_of_symbol
+       mov     ebx,[current_section]
+       mov     ebx,[ebx+8]
+       sub     ebx,edi
+       sub     eax,ebx
+       push    eax
+       mov     al,2                    ; R_386_PC32 / R_AMD64_PC32
+       cmp     [value_type],3
+       je      coff_relocation
+       mov     al,4                    ; R_386_PLT32 / R_AMD64_PLT32
+       jmp     coff_relocation
+close_elf:
+       bt      [format_flags],0
+       jc      close_elf_exe
+       call    close_coff_section
+       cmp     [next_pass_needed],0
+       je      elf_closed
+       mov     eax,[symbols_stream]
+       mov     [free_additional_memory],eax
+      elf_closed:
+       ret
+elf_formatter:
+       mov     ecx,edi
+       sub     ecx,[code_start]
+       neg     ecx
+       and     ecx,111b
+       test    [format_flags],8
+       jnz     align_elf_structures
+       and     ecx,11b
+      align_elf_structures:
+       xor     al,al
+       rep     stos byte [edi]
+       push    edi
+       call    prepare_default_section
+       mov     esi,[symbols_stream]
+       mov     edi,[free_additional_memory]
+       xor     eax,eax
+       mov     ecx,4
+       rep     stos dword [edi]
+       test    [format_flags],8
+       jz      find_first_section
+       mov     ecx,2
+       rep     stos dword [edi]
+      find_first_section:
+       mov     al,[esi]
+       or      al,al
+       jz      first_section_found
+       cmp     al,0C0h
+       jb      skip_other_symbol
+       add     esi,4
+      skip_other_symbol:
+       add     esi,0Ch
+       jmp     find_first_section
+      first_section_found:
+       mov     ebx,esi
+       mov     ebp,esi
+       add     esi,20h
+       xor     ecx,ecx
+       xor     edx,edx
+      find_next_section:
+       cmp     esi,[free_additional_memory]
+       je      make_section_symbol
+       mov     al,[esi]
+       or      al,al
+       jz      make_section_symbol
+       cmp     al,0C0h
+       jae     skip_public
+       cmp     al,80h
+       jae     skip_extrn
+       or      byte [ebx+14h],40h
+      skip_extrn:
+       add     esi,0Ch
+       jmp     find_next_section
+      skip_public:
+       add     esi,10h
+       jmp     find_next_section
+      make_section_symbol:
+       mov     eax,edi
+       xchg    eax,[ebx+4]
+       stos    dword [edi]
+       test    [format_flags],8
+       jnz     elf64_section_symbol
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       call    store_section_index
+       jmp     section_symbol_ok
+      store_section_index:
+       inc     ecx
+       mov     eax,ecx
+       shl     eax,8
+       mov     [ebx],eax
+       inc     dx
+       jz      format_limitations_exceeded
+       mov     eax,edx
+       shl     eax,16
+       mov     al,3
+       test    byte [ebx+14h],40h
+       jz      section_index_ok
+       or      ah,-1
+       inc     dx
+       jz      format_limitations_exceeded
+      section_index_ok:
+       stos    dword [edi]
+       ret
+      elf64_section_symbol:
+       call    store_section_index
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       stos    dword [edi]
+       stos    dword [edi]
+      section_symbol_ok:
+       mov     ebx,esi
+       add     esi,20h
+       cmp     ebx,[free_additional_memory]
+       jne     find_next_section
+       inc     dx
+       jz      format_limitations_exceeded
+       mov     [current_section],edx
+       mov     esi,[symbols_stream]
+      find_other_symbols:
+       cmp     esi,[free_additional_memory]
+       je      elf_symbol_table_ok
+       mov     al,[esi]
+       or      al,al
+       jz      skip_section
+       cmp     al,0C0h
+       jae     make_public_symbol
+       cmp     al,80h
+       jae     make_extrn_symbol
+       add     esi,0Ch
+       jmp     find_other_symbols
+      skip_section:
+       add     esi,20h
+       jmp     find_other_symbols
+      make_public_symbol:
+       mov     eax,[esi+0Ch]
+       mov     [current_line],eax
+       cmp     byte [esi],0C0h
+       jne     invalid_argument
+       mov     ebx,[esi+8]
+       test    byte [ebx+8],1
+       jz      undefined_public
+       mov     ax,[current_pass]
+       cmp     ax,[ebx+16]
+       jne     undefined_public
+       mov     dl,[ebx+11]
+       or      dl,dl
+       jz      public_absolute
+       mov     eax,[ebx+20]
+       cmp     byte [eax],0
+       jne     invalid_use_of_symbol
+       mov     eax,[eax+4]
+       test    [format_flags],8
+       jnz     elf64_public
+       cmp     dl,2
+       jne     invalid_use_of_symbol
+       mov     dx,[eax+0Eh]
+       jmp     section_for_public_ok
+      undefined_public:
+       mov     [error_info],ebx
+       jmp     undefined_symbol
+      elf64_public:
+       cmp     dl,4
+       jne     invalid_use_of_symbol
+       mov     dx,[eax+6]
+       jmp     section_for_public_ok
+      public_absolute:
+       mov     dx,0FFF1h
+      section_for_public_ok:
+       mov     eax,[esi+4]
+       stos    dword [edi]
+       test    [format_flags],8
+       jnz     elf64_public_symbol
+       movzx   eax,byte [ebx+9]
+       shr     al,1
+       and     al,1
+       neg     eax
+       cmp     eax,[ebx+4]
+       jne     value_out_of_range
+       xor     eax,[ebx]
+       js      value_out_of_range
+       mov     eax,[ebx]
+       stos    dword [edi]
+       xor     eax,eax
+       mov     al,[ebx+10]
+       stos    dword [edi]
+       mov     eax,edx
+       shl     eax,16
+       mov     al,10h
+       cmp     byte [ebx+10],0
+       je      elf_public_function
+       or      al,1
+       jmp     store_elf_public_info
+      elf_public_function:
+       or      al,2
+      store_elf_public_info:
+       stos    dword [edi]
+       jmp     public_symbol_ok
+      elf64_public_symbol:
+       mov     eax,edx
+       shl     eax,16
+       mov     al,10h
+       cmp     byte [ebx+10],0
+       je      elf64_public_function
+       or      al,1
+       jmp     store_elf64_public_info
+      elf64_public_function:
+       or      al,2
+      store_elf64_public_info:
+       stos    dword [edi]
+       mov     al,[ebx+9]
+       shl     eax,31-1
+       xor     eax,[ebx+4]
+       js      value_out_of_range
+       mov     eax,[ebx]
+       stos    dword [edi]
+       mov     eax,[ebx+4]
+       stos    dword [edi]
+       mov     al,[ebx+10]
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+      public_symbol_ok:
+       inc     ecx
+       mov     eax,ecx
+       shl     eax,8
+       mov     al,0C0h
+       mov     [esi],eax
+       add     esi,10h
+       jmp     find_other_symbols
+      make_extrn_symbol:
+       mov     eax,[esi+4]
+       stos    dword [edi]
+       test    [format_flags],8
+       jnz     elf64_extrn_symbol
+       xor     eax,eax
+       stos    dword [edi]
+       mov     eax,[esi+8]
+       stos    dword [edi]
+       mov     eax,10h
+       stos    dword [edi]
+       jmp     extrn_symbol_ok
+      elf64_extrn_symbol:
+       mov     eax,10h
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     eax,[esi+8]
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+      extrn_symbol_ok:
+       inc     ecx
+       mov     eax,ecx
+       shl     eax,8
+       mov     al,80h
+       mov     [esi],eax
+       add     esi,0Ch
+       jmp     find_other_symbols
+      elf_symbol_table_ok:
+       mov     edx,edi
+       mov     ebx,[free_additional_memory]
+       xor     al,al
+       stos    byte [edi]
+       add     edi,16
+       mov     [edx+1],edx
+       add     ebx,10h
+       test    [format_flags],8
+       jz      make_string_table
+       add     ebx,8
+      make_string_table:
+       cmp     ebx,edx
+       je      elf_string_table_ok
+       test    [format_flags],8
+       jnz     make_elf64_string
+       cmp     byte [ebx+0Dh],0
+       je      rel_prefix_ok
+       mov     byte [ebx+0Dh],0
+       mov     eax,'.rel'
+       stos    dword [edi]
+      rel_prefix_ok:
+       mov     esi,edi
+       sub     esi,edx
+       xchg    esi,[ebx]
+       add     ebx,10h
+      make_elf_string:
+       or      esi,esi
+       jz      default_string
+       lods    dword [esi]
+       mov     ecx,eax
+       rep     movs byte [edi],[esi]
+       xor     al,al
+       stos    byte [edi]
+       jmp     make_string_table
+      make_elf64_string:
+       cmp     byte [ebx+5],0
+       je      elf64_rel_prefix_ok
+       mov     byte [ebx+5],0
+       mov     eax,'.rel'
+       stos    dword [edi]
+       mov     al,'a'
+       stos    byte [edi]
+      elf64_rel_prefix_ok:
+       mov     esi,edi
+       sub     esi,edx
+       xchg    esi,[ebx]
+       add     ebx,18h
+       jmp     make_elf_string
+      default_string:
+       mov     eax,'.fla'
+       stos    dword [edi]
+       mov     ax,'t'
+       stos    word [edi]
+       jmp     make_string_table
+      elf_string_table_ok:
+       mov     [edx+1+8],edi
+       mov     ebx,[code_start]
+       mov     eax,edi
+       sub     eax,[free_additional_memory]
+       xor     ecx,ecx
+       sub     ecx,eax
+       test    [format_flags],8
+       jnz     finish_elf64_header
+       and     ecx,11b
+       add     eax,ecx
+       mov     [ebx+20h],eax
+       mov     eax,[current_section]
+       inc     ax
+       jz      format_limitations_exceeded
+       mov     [ebx+32h],ax
+       inc     ax
+       jz      format_limitations_exceeded
+       mov     [ebx+30h],ax
+       jmp     elf_header_finished
+      finish_elf64_header:
+       and     ecx,111b
+       add     eax,ecx
+       mov     [ebx+28h],eax
+       mov     eax,[current_section]
+       inc     ax
+       jz      format_limitations_exceeded
+       mov     [ebx+3Eh],ax
+       inc     ax
+       jz      format_limitations_exceeded
+       mov     [ebx+3Ch],ax
+      elf_header_finished:
+       xor     eax,eax
+       add     ecx,10*4
+       rep     stos byte [edi]
+       test    [format_flags],8
+       jz      elf_null_section_ok
+       mov     ecx,6*4
+       rep     stos byte [edi]
+      elf_null_section_ok:
+       mov     esi,ebp
+       xor     ecx,ecx
+      make_section_entry:
+       mov     ebx,edi
+       mov     eax,[esi+4]
+       mov     eax,[eax]
+       stos    dword [edi]
+       mov     eax,1
+       cmp     dword [esi+0Ch],0
+       je      bss_section
+       test    byte [esi+14h],80h
+       jz      section_type_ok
+      bss_section:
+       mov     al,8
+      section_type_ok:
+       stos    dword [edi]
+       mov     eax,[esi+14h]
+       and     al,3Fh
+       call    store_elf_machine_word
+       xor     eax,eax
+       call    store_elf_machine_word
+       mov     eax,[esi+8]
+       mov     [image_base],eax
+       sub     eax,[code_start]
+       call    store_elf_machine_word
+       mov     eax,[esi+0Ch]
+       call    store_elf_machine_word
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     eax,[esi+10h]
+       call    store_elf_machine_word
+       xor     eax,eax
+       call    store_elf_machine_word
+       inc     ecx
+       add     esi,20h
+       xchg    edi,[esp]
+       mov     ebp,edi
+      convert_relocations:
+       cmp     esi,[free_additional_memory]
+       je      relocations_converted
+       mov     al,[esi]
+       or      al,al
+       jz      relocations_converted
+       cmp     al,80h
+       jb      make_relocation_entry
+       cmp     al,0C0h
+       jb      relocation_entry_ok
+       add     esi,10h
+       jmp     convert_relocations
+      make_relocation_entry:
+       test    [format_flags],8
+       jnz     make_elf64_relocation_entry
+       mov     eax,[esi+4]
+       stos    dword [edi]
+       mov     eax,[esi+8]
+       mov     eax,[eax]
+       mov     al,[esi]
+       stos    dword [edi]
+       jmp     relocation_entry_ok
+      make_elf64_relocation_entry:
+       mov     eax,[esi+4]
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       movzx   eax,byte [esi]
+       stos    dword [edi]
+       mov     eax,[esi+8]
+       mov     eax,[eax]
+       shr     eax,8
+       stos    dword [edi]
+       xor     eax,eax
+       push    edx
+       mov     edx,[esi+4]
+       add     edx,[image_base]
+       xchg    eax,[edx]
+       stos    dword [edi]
+       cmp     byte [esi],1
+       je      addend_64bit
+       pop     edx
+       sar     eax,31
+       stos    dword [edi]
+       jmp     relocation_entry_ok
+      addend_64bit:
+       xor     eax,eax
+       xchg    eax,[edx+4]
+       stos    dword [edi]
+       pop     edx
+      relocation_entry_ok:
+       add     esi,0Ch
+       jmp     convert_relocations
+      store_elf_machine_word:
+       stos    dword [edi]
+       test    [format_flags],8
+       jz      elf_machine_word_ok
+       and     dword [edi],0
+       add     edi,4
+      elf_machine_word_ok:
+       ret
+      relocations_converted:
+       cmp     edi,ebp
+       xchg    edi,[esp]
+       je      rel_section_ok
+       mov     eax,[ebx]
+       sub     eax,4
+       test    [format_flags],8
+       jz      store_relocations_name_offset
+       dec     eax
+      store_relocations_name_offset:
+       stos    dword [edi]
+       test    [format_flags],8
+       jnz     rela_section
+       mov     eax,9
+       jmp     store_relocations_type
+      rela_section:
+       mov     eax,4
+      store_relocations_type:
+       stos    dword [edi]
+       xor     al,al
+       call    store_elf_machine_word
+       call    store_elf_machine_word
+       mov     eax,ebp
+       sub     eax,[code_start]
+       call    store_elf_machine_word
+       mov     eax,[esp]
+       sub     eax,ebp
+       call    store_elf_machine_word
+       mov     eax,[current_section]
+       stos    dword [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       inc     ecx
+       test    [format_flags],8
+       jnz     finish_elf64_rela_section
+       mov     eax,4
+       stos    dword [edi]
+       mov     al,8
+       stos    dword [edi]
+       jmp     rel_section_ok
+      finish_elf64_rela_section:
+       mov     eax,8
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+       mov     al,24
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+      rel_section_ok:
+       cmp     esi,[free_additional_memory]
+       jne     make_section_entry
+       pop     eax
+       mov     ebx,[code_start]
+       sub     eax,ebx
+       mov     [code_size],eax
+       mov     ecx,20h
+       test    [format_flags],8
+       jz      adjust_elf_section_headers_offset
+       mov     ecx,28h
+      adjust_elf_section_headers_offset:
+       add     [ebx+ecx],eax
+       mov     eax,1
+       stos    dword [edi]
+       mov     al,2
+       stos    dword [edi]
+       xor     al,al
+       call    store_elf_machine_word
+       call    store_elf_machine_word
+       mov     eax,[code_size]
+       call    store_elf_machine_word
+       mov     eax,[edx+1]
+       sub     eax,[free_additional_memory]
+       call    store_elf_machine_word
+       mov     eax,[current_section]
+       inc     eax
+       stos    dword [edi]
+       mov     eax,[number_of_sections]
+       inc     eax
+       stos    dword [edi]
+       test    [format_flags],8
+       jnz     finish_elf64_sym_section
+       mov     eax,4
+       stos    dword [edi]
+       mov     al,10h
+       stos    dword [edi]
+       jmp     sym_section_ok
+      finish_elf64_sym_section:
+       mov     eax,8
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+       mov     al,18h
+       stos    dword [edi]
+       xor     al,al
+       stos    dword [edi]
+      sym_section_ok:
+       mov     al,1+8
+       stos    dword [edi]
+       mov     al,3
+       stos    dword [edi]
+       xor     al,al
+       call    store_elf_machine_word
+       call    store_elf_machine_word
+       mov     eax,[edx+1]
+       sub     eax,[free_additional_memory]
+       add     eax,[code_size]
+       call    store_elf_machine_word
+       mov     eax,[edx+1+8]
+       sub     eax,[edx+1]
+       call    store_elf_machine_word
+       xor     eax,eax
+       stos    dword [edi]
+       stos    dword [edi]
+       mov     al,1
+       call    store_elf_machine_word
+       xor     eax,eax
+       call    store_elf_machine_word
+       mov     eax,'tab'
+       mov     dword [edx+1],'.sym'
+       mov     [edx+1+4],eax
+       mov     dword [edx+1+8],'.str'
+       mov     [edx+1+8+4],eax
+       mov     [resource_data],edx
+       mov     [written_size],0
+       mov     edx,[output_file]
+       call    create
+       jc      write_failed
+       call    write_code
+       mov     ecx,edi
+       mov     edx,[free_additional_memory]
+       sub     ecx,edx
+       add     [written_size],ecx
+       call    write
+       jc      write_failed
+       jmp     output_written
+
+format_elf_exe:
+       add     esi,2
+       or      [format_flags],1
+       cmp     byte [esi],'('
+       jne     elf_exe_brand_ok
+       inc     esi
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    edx
+       call    get_byte_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       pop     edx
+       mov     [edx+7],al
+      elf_exe_brand_ok:
+       mov     [image_base],8048000h
+       cmp     byte [esi],80h
+       jne     elf_exe_base_ok
+       lods    word [esi]
+       cmp     ah,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    edx
+       call    get_dword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     [image_base],eax
+       pop     edx
+      elf_exe_base_ok:
+       mov     byte [edx+2Ah],20h
+       mov     ebx,edi
+       mov     ecx,20h shr 2
+       cmp     [current_pass],0
+       je      init_elf_segments
+       imul    ecx,[number_of_sections]
+      init_elf_segments:
+       xor     eax,eax
+       rep     stos dword [edi]
+       and     [number_of_sections],0
+       mov     byte [ebx],1
+       mov     word [ebx+1Ch],1000h
+       mov     byte [ebx+18h],111b
+       mov     ebp,[image_base]
+       and     dword [ebx+4],0
+       mov     [ebx+8],ebp
+       mov     [ebx+0Ch],ebp
+       mov     eax,edi
+       sub     eax,[code_start]
+       add     eax,ebp
+       mov     [edx+18h],eax
+       and     [image_base_high],0
+      elf_exe_addressing_setup:
+       call    init_addressing_space
+       call    setup_elf_exe_labels_type
+       mov     eax,[code_start]
+       xor     edx,edx
+       xor     cl,cl
+       sub     eax,[image_base]
+       sbb     edx,[image_base_high]
+       sbb     cl,0
+       mov     [ebx],eax
+       mov     [ebx+4],edx
+       mov     [ebx+8],cl
+       mov     [symbols_stream],edi
+       jmp     format_defined
+      format_elf64_exe:
+       add     esi,2
+       or      [format_flags],1
+       cmp     byte [esi],'('
+       jne     elf64_exe_brand_ok
+       inc     esi
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    edx
+       call    get_byte_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       pop     edx
+       mov     [edx+7],al
+      elf64_exe_brand_ok:
+       mov     [image_base],400000h
+       and     [image_base_high],0
+       cmp     byte [esi],80h
+       jne     elf64_exe_base_ok
+       lods    word [esi]
+       cmp     ah,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       push    edx
+       call    get_qword_value
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     [image_base],eax
+       mov     [image_base_high],edx
+       pop     edx
+      elf64_exe_base_ok:
+       mov     byte [edx+36h],38h
+       mov     ebx,edi
+       mov     ecx,38h shr 2
+       cmp     [current_pass],0
+       je      init_elf64_segments
+       imul    ecx,[number_of_sections]
+      init_elf64_segments:
+       xor     eax,eax
+       rep     stos dword [edi]
+       and     [number_of_sections],0
+       mov     byte [ebx],1
+       mov     word [ebx+30h],1000h
+       mov     byte [ebx+4],111b
+       mov     ebp,[image_base]
+       mov     ecx,[image_base_high]
+       and     dword [ebx+8],0
+       mov     [ebx+10h],ebp
+       mov     [ebx+10h+4],ecx
+       mov     [ebx+18h],ebp
+       mov     [ebx+18h+4],ecx
+       mov     eax,edi
+       sub     eax,[code_start]
+       add     eax,ebp
+       adc     ecx,0
+       mov     [edx+18h],eax
+       mov     [edx+18h+4],ecx
+       jmp     elf_exe_addressing_setup
+      setup_elf_exe_labels_type:
+       mov     eax,[code_start]
+       cmp     byte [eax+10h],3
+       jne     elf_exe_labels_type_ok
+       mov     byte [ebx+9],2
+       test    [format_flags],8
+       jz      elf_exe_labels_type_ok
+       mov     byte [ebx+9],4
+      elf_exe_labels_type_ok:
+       ret
+elf_entry:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_argument
+       cmp     byte [esi],'.'
+       je      invalid_value
+       test    [format_flags],8
+       jnz     elf64_entry
+       call    get_dword_value
+       mov     edx,[code_start]
+       mov     [edx+18h],eax
+       jmp     instruction_assembled
+      elf64_entry:
+       call    get_qword_value
+       mov     ebx,[code_start]
+       mov     [ebx+18h],eax
+       mov     [ebx+1Ch],edx
+       jmp     instruction_assembled
+elf_segment:
+       bt      [format_flags],0
+       jnc     illegal_instruction
+       test    [format_flags],8
+       jnz     elf64_segment
+       call    close_elf_segment
+       push    eax
+       call    create_addressing_space
+       call    setup_elf_exe_labels_type
+       mov     ebp,ebx
+       mov     ebx,[number_of_sections]
+       shl     ebx,5
+       add     ebx,[code_start]
+       add     ebx,34h
+       cmp     ebx,[symbols_stream]
+       jb      new_elf_segment
+       mov     ebx,[symbols_stream]
+       sub     ebx,20h
+       or      [next_pass_needed],-1
+      new_elf_segment:
+       mov     byte [ebx],1
+       and     dword [ebx+18h],0
+       mov     word [ebx+1Ch],1000h
+      elf_segment_flags:
+       cmp     byte [esi],1Eh
+       je      elf_segment_type
+       cmp     byte [esi],19h
+       jne     elf_segment_flags_ok
+       lods    word [esi]
+       sub     ah,28
+       jbe     invalid_argument
+       cmp     ah,1
+       je      mark_elf_segment_flag
+       cmp     ah,3
+       ja      invalid_argument
+       xor     ah,1
+       cmp     ah,2
+       je      mark_elf_segment_flag
+       inc     ah
+      mark_elf_segment_flag:
+       test    [ebx+18h],ah
+       jnz     setting_already_specified
+       or      [ebx+18h],ah
+       jmp     elf_segment_flags
+      elf_segment_type:
+       cmp     byte [ebx],1
+       jne     setting_already_specified
+       lods    word [esi]
+       mov     ecx,[number_of_sections]
+       jecxz   elf_segment_type_ok
+       mov     edx,[code_start]
+       add     edx,34h
+      scan_elf_segment_types:
+       cmp     edx,[symbols_stream]
+       jae     elf_segment_type_ok
+       cmp     [edx],ah
+       je      data_already_defined
+       add     edx,20h
+       loop    scan_elf_segment_types
+      elf_segment_type_ok:
+       mov     [ebx],ah
+       mov     word [ebx+1Ch],1
+       cmp     ah,50h
+       jb      elf_segment_flags
+       or      dword [ebx],6474E500h
+       jmp     elf_segment_flags
+      elf_segment_flags_ok:
+       pop     edx
+       cmp     byte [ebx],1
+       jne     no_elf_segment_merging
+       cmp     [merge_segment],0
+       jne     merge_elf_segment
+      no_elf_segment_merging:
+       mov     eax,edi
+       sub     eax,[code_start]
+       mov     [ebx+4],eax
+       and     eax,0FFFh
+       add     eax,edx
+       mov     [ebx+8],eax
+       mov     [ebx+0Ch],eax
+       xor     edx,edx
+      elf_segment_addressing_setup:
+       xor     cl,cl
+       not     eax
+       not     edx
+       not     cl
+       add     eax,1
+       adc     edx,0
+       adc     cl,0
+       add     eax,edi
+       adc     edx,0
+       adc     cl,0
+       mov     [ds:ebp],eax
+       mov     [ds:ebp+4],edx
+       mov     [ds:ebp+8],cl
+       inc     [number_of_sections]
+       jmp     instruction_assembled
+      merge_elf_segment:
+       xor     ecx,ecx
+       xchg    ecx,[merge_segment]
+       cmp     ecx,-1
+       je      merge_elf_header
+       mov     eax,[ecx+8]
+       mov     ecx,[ecx+4]
+      elf_segment_separated_base:
+       mov     [ebx+8],eax
+       mov     [ebx+0Ch],eax
+       mov     [ebx+4],ecx
+       sub     eax,ecx
+       add     eax,edi
+       sub     eax,[code_start]
+       xor     edx,edx
+       jmp     elf_segment_addressing_setup
+      merge_elf_header:
+       mov     eax,[image_base]
+       xor     ecx,ecx
+       jmp     elf_segment_separated_base
+      close_elf_segment:
+       cmp     [number_of_sections],0
+       jne     finish_elf_segment
+       cmp     edi,[symbols_stream]
+       jne     first_elf_segment_ok
+       or      [merge_segment],-1
+       mov     eax,[image_base]
+       ret
+      first_elf_segment_ok:
+       and     [merge_segment],0
+       inc     [number_of_sections]
+      finish_elf_segment:
+       mov     ebx,[number_of_sections]
+       dec     ebx
+       shl     ebx,5
+       add     ebx,[code_start]
+       add     ebx,34h
+       mov     eax,edi
+       sub     eax,[code_start]
+       sub     eax,[ebx+4]
+       mov     edx,edi
+       cmp     edi,[undefined_data_end]
+       jne     elf_segment_size_ok
+       cmp     byte [ebx],1
+       jne     elf_segment_size_ok
+       mov     edi,[undefined_data_start]
+      elf_segment_size_ok:
+       mov     [ebx+14h],eax
+       add     eax,edi
+       sub     eax,edx
+       mov     [ebx+10h],eax
+       and     [undefined_data_end],0
+       mov     eax,[ebx+8]
+       cmp     byte [ebx],1
+       je      elf_segment_position_move_and_align
+       cmp     [merge_segment],0
+       jne     elf_segment_position_move
+       cmp     byte [ebx],4
+       je      elf_segment_position_ok
+       cmp     byte [ebx],51h
+       je      elf_segment_position_ok
+       mov     [merge_segment],ebx
+      elf_segment_position_move:
+       add     eax,[ebx+14h]
+       jmp     elf_segment_position_ok
+      elf_segment_position_move_and_align:
+       add     eax,[ebx+14h]
+       add     eax,0FFFh
+      elf_segment_position_ok:
+       and     eax,not 0FFFh
+       ret
+      elf64_segment:
+       call    close_elf64_segment
+       push    eax edx
+       call    create_addressing_space
+       call    setup_elf_exe_labels_type
+       mov     ebp,ebx
+       mov     ebx,[number_of_sections]
+       imul    ebx,38h
+       add     ebx,[code_start]
+       add     ebx,40h
+       cmp     ebx,[symbols_stream]
+       jb      new_elf64_segment
+       or      [next_pass_needed],-1
+      new_elf64_segment:
+       mov     byte [ebx],1
+       and     dword [ebx+4],0
+       mov     word [ebx+30h],1000h
+      elf64_segment_flags:
+       cmp     byte [esi],1Eh
+       je      elf64_segment_type
+       cmp     byte [esi],19h
+       jne     elf64_segment_flags_ok
+       lods    word [esi]
+       sub     ah,28
+       jbe     invalid_argument
+       cmp     ah,1
+       je      mark_elf64_segment_flag
+       cmp     ah,3
+       ja      invalid_argument
+       xor     ah,1
+       cmp     ah,2
+       je      mark_elf64_segment_flag
+       inc     ah
+      mark_elf64_segment_flag:
+       test    [ebx+4],ah
+       jnz     setting_already_specified
+       or      [ebx+4],ah
+       jmp     elf64_segment_flags
+      elf64_segment_type:
+       cmp     byte [ebx],1
+       jne     setting_already_specified
+       lods    word [esi]
+       mov     ecx,[number_of_sections]
+       jecxz   elf64_segment_type_ok
+       mov     edx,[code_start]
+       add     edx,40h
+      scan_elf64_segment_types:
+       cmp     edx,[symbols_stream]
+       jae     elf64_segment_type_ok
+       cmp     [edx],ah
+       je      data_already_defined
+       add     edx,38h
+       loop    scan_elf64_segment_types
+      elf64_segment_type_ok:
+       mov     [ebx],ah
+       mov     word [ebx+30h],1
+       cmp     ah,50h
+       jb      elf64_segment_flags
+       or      dword [ebx],6474E500h
+       jmp     elf64_segment_flags
+      elf64_segment_flags_ok:
+       pop     edx eax
+       cmp     byte [ebx],1
+       jne     no_elf64_segment_merging
+       cmp     [merge_segment],0
+       jne     merge_elf64_segment
+      no_elf64_segment_merging:
+       mov     ecx,edi
+       sub     ecx,[code_start]
+       mov     [ebx+8],ecx
+       and     ecx,0FFFh
+       add     eax,ecx
+       adc     edx,0
+       mov     [ebx+10h],eax
+       mov     [ebx+10h+4],edx
+       mov     [ebx+18h],eax
+       mov     [ebx+18h+4],edx
+       jmp     elf_segment_addressing_setup
+      merge_elf64_segment:
+       xor     ecx,ecx
+       xchg    ecx,[merge_segment]
+       cmp     ecx,-1
+       je      merge_elf64_header
+       mov     eax,[ecx+10h]
+       mov     edx,[ecx+10h+4]
+       mov     ecx,[ecx+8]
+      elf64_segment_separated_base:
+       mov     [ebx+10h],eax
+       mov     [ebx+10h+4],edx
+       mov     [ebx+18h],eax
+       mov     [ebx+18h+4],edx
+       mov     [ebx+8],ecx
+       neg     ecx
+       add     ecx,edi
+       sub     ecx,[code_start]
+       add     eax,ecx
+       adc     edx,0
+       jmp     elf_segment_addressing_setup
+      merge_elf64_header:
+       mov     eax,[image_base]
+       mov     edx,[image_base_high]
+       xor     ecx,ecx
+       jmp     elf64_segment_separated_base
+      close_elf64_segment:
+       cmp     [number_of_sections],0
+       jne     finish_elf64_segment
+       cmp     edi,[symbols_stream]
+       jne     first_elf64_segment_ok
+       or      [merge_segment],-1
+       mov     eax,[image_base]
+       mov     edx,[image_base_high]
+       ret
+      first_elf64_segment_ok:
+       and     [merge_segment],0
+       inc     [number_of_sections]
+      finish_elf64_segment:
+       mov     ebx,[number_of_sections]
+       dec     ebx
+       imul    ebx,38h
+       add     ebx,[code_start]
+       add     ebx,40h
+       mov     eax,edi
+       sub     eax,[code_start]
+       sub     eax,[ebx+8]
+       mov     edx,edi
+       cmp     edi,[undefined_data_end]
+       jne     elf64_segment_size_ok
+       cmp     byte [ebx],1
+       jne     elf64_segment_size_ok
+       mov     edi,[undefined_data_start]
+      elf64_segment_size_ok:
+       mov     [ebx+28h],eax
+       add     eax,edi
+       sub     eax,edx
+       mov     [ebx+20h],eax
+       and     [undefined_data_end],0
+       mov     eax,[ebx+10h]
+       mov     edx,[ebx+10h+4]
+       cmp     byte [ebx],1
+       je      elf64_segment_position_move_and_align
+       cmp     [merge_segment],0
+       jne     elf64_segment_position_move
+       cmp     byte [ebx],4
+       je      elf64_segment_position_ok
+       cmp     byte [ebx],51h
+       je      elf64_segment_position_ok
+       mov     [merge_segment],ebx
+      elf64_segment_position_move:
+       add     eax,[ebx+28h]
+       adc     edx,0
+       jmp     elf64_segment_position_ok
+      elf64_segment_position_move_and_align:
+       add     eax,[ebx+28h]
+       adc     edx,0
+       add     eax,0FFFh
+       adc     edx,0
+      elf64_segment_position_ok:
+       and     eax,not 0FFFh
+       ret
+close_elf_exe:
+       test    [format_flags],8
+       jnz     close_elf64_exe
+       call    close_elf_segment
+       mov     edx,[code_start]
+       mov     eax,[number_of_sections]
+       mov     byte [edx+1Ch],34h
+       mov     [edx+2Ch],ax
+       shl     eax,5
+       add     eax,edx
+       add     eax,34h
+       cmp     eax,[symbols_stream]
+       je      elf_exe_ok
+       or      [next_pass_needed],-1
+      elf_exe_ok:
+       ret
+      close_elf64_exe:
+       call    close_elf64_segment
+       mov     edx,[code_start]
+       mov     eax,[number_of_sections]
+       mov     byte [edx+20h],40h
+       mov     [edx+38h],ax
+       imul    eax,38h
+       add     eax,edx
+       add     eax,40h
+       cmp     eax,[symbols_stream]
+       je      elf64_exe_ok
+       or      [next_pass_needed],-1
+      elf64_exe_ok:
+       ret
diff --git a/source/linux/x64/modes.inc b/source/linux/x64/modes.inc
new file mode 100644 (file)
index 0000000..5e681f9
--- /dev/null
@@ -0,0 +1,186 @@
+
+; flat assembler interface for Linux x64
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+esp equ +rsp
+
+macro pushD [arg]
+{
+       common
+               local offset,total
+               offset = 0
+               lea rsp,[rsp-total]
+       forward
+               offset = offset + 4
+               if arg eqtype eax
+                       mov dword [rsp+total-offset],arg
+               else
+                       mov r8d,dword arg
+                       mov [rsp+total-offset],r8d
+               end if
+       common
+               total = offset
+}
+
+macro popD [arg]
+{
+       common
+               local offset
+               offset = 0
+       forward
+               if arg eqtype [mem]
+                       mov r8d,[rsp+offset]
+                       mov dword arg,r8d
+               else
+                       mov arg,dword [rsp+offset]
+               end if
+               offset = offset + 4
+       common
+               lea rsp,[rsp+offset]
+}
+
+macro add dest,src
+{
+       if dest eq esp
+               add rsp,src
+       else
+               add dest,src
+       end if
+}
+
+macro mov dest,src
+{
+       if src eq esp
+               mov dest,ESP
+       else
+               mov dest,src
+       end if
+}
+
+macro cmp dest,src
+{
+       if dest eq esp
+               cmp ESP,src
+       else
+               cmp dest,src
+       end if
+}
+
+macro use32
+{
+
+       macro push args
+       \{
+               local list,arg,status
+               define list
+               define arg
+               irps sym, args \\{
+                       define status
+                       match =dword, sym \\\{
+                               define status :
+                       \\\}
+                       match [any, status arg sym \\\{
+                               define arg [any
+                               match [mem], arg \\\\{
+                                       match previous, list \\\\\{ define list previous,[mem] \\\\\}
+                                       match , list \\\\\{ define list [mem] \\\\\}
+                                       define arg
+                               \\\\}
+                               define status :
+                       \\\}
+                       match [, status arg sym \\\{
+                               define arg [
+                               define status :
+                       \\\}
+                       match , status \\\{
+                               match previous, list \\\\{ define list previous,sym \\\\}
+                               match , list \\\\{ define list sym \\\\}
+                       \\\}
+               \\}
+               match arg, list \\{ pushD arg \\}
+       \}
+
+       macro pop args
+       \{
+               local list,arg,status
+               define list
+               define arg
+               irps sym, args \\{
+                       define status
+                       match =dword, sym \\\{
+                               define status :
+                       \\\}
+                       match [any, status arg sym \\\{
+                               define arg [any
+                               match [mem], arg \\\\{
+                                       match previous, list \\\\\{ define list previous,[mem] \\\\\}
+                                       match , list \\\\\{ define list [mem] \\\\\}
+                                       define arg
+                               \\\\}
+                               define status :
+                       \\\}
+                       match [, status arg sym \\\{
+                               define arg [
+                               define status :
+                       \\\}
+                       match , status \\\{
+                               match previous, list \\\\{ define list previous,sym \\\\}
+                               match , list \\\\{ define list sym \\\\}
+                       \\\}
+               \\}
+               match arg, list \\{ popD arg \\}
+       \}
+
+       macro jmp arg
+       \{
+               if arg eq near eax
+                       jmp near rax
+               else if arg eq near edx
+                       jmp near rdx
+               else if arg eqtype [mem]
+                       mov r8d,arg
+                       jmp near r8
+               else
+                       jmp arg
+               end if
+       \}
+
+       macro call arg
+       \{
+               if 1
+               match =near =dword [mem], arg \\{
+                       mov r8d,[mem]
+                       call near r8
+               else
+               \\}
+                       call arg
+               end if
+       \}
+
+       macro salc              ; for fasm's core it does not need to preserve flags
+       \{
+               setc al
+               neg al
+       \}
+
+       macro jcxz target       ; for fasm's core it does not need to preserve flags
+       \{
+               test cx,cx
+               jz target
+       \}
+
+       use64
+
+}
+
+macro use16
+{
+
+       purge push,pop,jmp,call,salc,jcxz
+
+       use16
+
+}
+
+use32
diff --git a/source/linux/x64/system.inc b/source/linux/x64/system.inc
new file mode 100644 (file)
index 0000000..fd7a00e
--- /dev/null
@@ -0,0 +1,548 @@
+
+; flat assembler interface for Linux x64
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+O_ACCMODE  = 0003o
+O_RDONLY   = 0000o
+O_WRONLY   = 0001o
+O_RDWR    = 0002o
+O_CREAT    = 0100o
+O_EXCL    = 0200o
+O_NOCTTY   = 0400o
+O_TRUNC    = 1000o
+O_APPEND   = 2000o
+O_NONBLOCK = 4000o
+
+S_ISUID    = 4000o
+S_ISGID    = 2000o
+S_ISVTX    = 1000o
+S_IRUSR    = 0400o
+S_IWUSR    = 0200o
+S_IXUSR    = 0100o
+S_IRGRP    = 0040o
+S_IWGRP    = 0020o
+S_IXGRP    = 0010o
+S_IROTH    = 0004o
+S_IWOTH    = 0002o
+S_IXOTH    = 0001o
+
+init_memory:
+       mov     eax,esp
+       and     eax,not 0FFFh
+       add     eax,1000h-10000h
+       mov     [stack_limit],eax
+       xor     edi,edi
+       mov     eax,12
+       syscall
+       mov     ecx,[memory_setting]
+       shl     ecx,10
+       jnz     allocate_memory
+       mov     ecx,1000000h
+      allocate_memory:
+       mov     r9d,eax
+       cmp     rax,r9
+       jne     high_brk
+       mov     [additional_memory],eax
+       lea     edi,[eax+ecx]
+       mov     eax,12
+       syscall
+       mov     r9d,eax
+       cmp     rax,r9
+       jne     no_low_memory
+       mov     [memory_end],eax
+       sub     eax,[additional_memory]
+       shr     eax,2
+       add     eax,[additional_memory]
+       mov     [additional_memory_end],eax
+       mov     [memory_start],eax
+       ret
+      high_brk:
+       xor     r9d,r9d
+       or      r8,-1
+       mov     r10d,62h                ; MAP_PRIVATE + MAP_ANONYMOUS + MAP_32BIT
+       mov     edx,3                   ; PROT_READ + PROT_WRITE
+       mov     esi,ecx
+       xor     edi,edi
+       mov     eax,9                   ; sys_mmap
+       syscall
+       cmp     eax,-1
+       je      mmap_with_hint
+       mov     r9d,eax
+       cmp     rax,r9
+       jne     mmap_unusable
+       add     r9d,esi
+       jnc     mmap_ok
+      mmap_unusable:
+       mov     rdi,rax
+       mov     eax,11                  ; sys_munmap
+       syscall
+      mmap_with_hint:
+       mov     r10d,22h                ; MAP_PRIVATE + MAP_ANONYMOUS
+       mov     edx,3                   ; PROT_READ + PROT_WRITE
+       mov     edi,480000h
+       mov     eax,9                   ; sys_mmap
+       syscall
+       cmp     eax,-1
+       je      no_low_memory
+       mov     r9d,eax
+       cmp     rax,r9
+       jne     no_low_memory
+       add     r9d,esi
+       jnc     mmap_ok
+      no_low_memory:
+       mov     esi,lf
+       call    display_string
+       push    _no_low_memory
+       jmp     fatal_error
+      mmap_ok:
+       mov     [additional_memory],eax
+       lea     edi,[eax+esi]
+       mov     [memory_end],edi
+       shr     esi,2
+       add     eax,esi
+       mov     [additional_memory_end],eax
+       mov     [memory_start],eax
+       ret
+
+exit_program:
+       movzx   edi,al
+       mov     eax,60
+       syscall
+
+get_environment_variable:
+       mov     ecx,esi
+       mov     rbx,[environment]
+      next_variable:
+       mov     rsi,[rbx]
+       test    rsi,rsi
+       jz      no_environment_variable
+       add     rbx,8
+      compare_variable_names:
+       mov     edx,ecx
+      compare_character:
+       lodsb
+       mov     ah,[edx]
+       inc     edx
+       cmp     al,'='
+       je      end_of_variable_name
+       or      ah,ah
+       jz      next_variable
+       sub     ah,al
+       jz      compare_character
+       cmp     ah,20h
+       jne     next_variable
+       cmp     al,41h
+       jb      next_variable
+       cmp     al,5Ah
+       jna     compare_character
+       jmp     next_variable
+      no_environment_variable:
+       ret
+      end_of_variable_name:
+       or      ah,ah
+       jnz     next_variable
+      copy_variable_value:
+       lodsb
+       cmp     edi,[memory_end]
+       jae     out_of_memory
+       stosb
+       or      al,al
+       jnz     copy_variable_value
+       dec     edi
+       ret
+
+open:
+       mov     r12d,esi
+       mov     r13d,edi
+       call    adapt_path
+       mov     eax,2
+       mov     edi,buffer
+       mov     esi,O_RDONLY
+       xor     edx,edx
+       syscall
+       mov     esi,r12d
+       mov     edi,r13d
+       test    eax,eax
+       js      file_error
+       mov     ebx,eax
+       clc
+       ret
+    adapt_path:
+       mov     esi,edx
+       mov     edi,buffer
+      copy_path:
+       lods    byte [esi]
+       cmp     al,'\'
+       jne     path_char_ok
+       mov     al,'/'
+      path_char_ok:
+       stos    byte [edi]
+       or      al,al
+       jnz     copy_path
+       cmp     edi,buffer+1000h
+       ja      out_of_memory
+       ret
+create:
+       mov     r12d,esi
+       mov     r13d,edi
+       mov     r15d,edx
+       call    adapt_path
+       mov     edi,buffer
+       mov     esi,O_CREAT+O_TRUNC+O_WRONLY
+       mov     edx,S_IRUSR+S_IWUSR+S_IRGRP+S_IROTH
+       cmp     r15d,[output_file]
+       jne     do_create
+       cmp     [output_format],5
+       jne     do_create
+       bt      [format_flags],0
+       jnc     do_create
+       or      edx,S_IXUSR+S_IXGRP+S_IXOTH
+      do_create:
+       mov     eax,2
+       syscall
+       mov     esi,r12d
+       mov     edi,r13d
+       test    eax,eax
+       js      file_error
+       mov     ebx,eax
+       clc
+       ret
+close:
+       mov     r13d,edi
+       mov     edi,ebx
+       mov     eax,3
+       syscall
+       mov     edi,r13d
+       ret
+read:
+       mov     r12d,esi
+       mov     r13d,edi
+       mov     eax,0
+       mov     edi,ebx
+       mov     esi,edx
+       mov     edx,ecx
+       syscall
+       mov     ecx,edx
+       mov     edx,esi
+       mov     esi,r12d
+       mov     edi,r13d
+       test    eax,eax
+       js      file_error
+       cmp     eax,ecx
+       jne     file_error
+       clc
+       ret
+    file_error:
+       stc
+       ret
+write:
+       mov     r12d,esi
+       mov     r13d,edi
+       mov     eax,1
+       mov     edi,ebx
+       mov     esi,edx
+       mov     edx,ecx
+       syscall
+       mov     ecx,edx
+       mov     edx,esi
+       mov     esi,r12d
+       mov     edi,r13d
+       test    eax,eax
+       js      file_error
+       clc
+       ret
+lseek:
+       mov     r12d,esi
+       mov     r13d,edi
+       mov     edi,ebx
+       mov     esi,edx
+       xor     edx,edx
+       mov     dl,al
+       mov     eax,8
+       syscall
+       mov     esi,r12d
+       mov     edi,r13d
+       cmp     eax,-1
+       je      file_error
+       clc
+       ret
+
+display_string:
+       mov     edi,esi
+       mov     edx,esi
+       or      ecx,-1
+       xor     al,al
+       repne   scasb
+       neg     ecx
+       sub     ecx,2
+       mov     eax,1
+       mov     edi,[con_handle]
+       mov     esi,edx
+       mov     edx,ecx
+       syscall
+       ret
+display_character:
+       mov     r12d,esi
+       mov     r13d,edi
+       mov     [character],dl
+       mov     eax,1
+       mov     edi,[con_handle]
+       mov     esi,character
+       mov     edx,1
+       syscall
+       mov     esi,r12d
+       mov     edi,r13d
+       ret
+display_number:
+       mov     r14d,ebx
+       mov     ecx,1000000000
+       xor     edx,edx
+       xor     bl,bl
+      display_loop:
+       div     ecx
+       mov     r15d,edx
+       cmp     ecx,1
+       je      display_digit
+       or      bl,bl
+       jnz     display_digit
+       or      al,al
+       jz      digit_ok
+       not     bl
+      display_digit:
+       mov     dl,al
+       add     dl,30h
+       mov     r10d,ecx
+       call    display_character
+       mov     ecx,r10d
+      digit_ok:
+       mov     eax,ecx
+       xor     edx,edx
+       mov     ecx,10
+       div     ecx
+       mov     ecx,eax
+       mov     eax,r15d
+       or      ecx,ecx
+       jnz     display_loop
+       mov     ebx,r14d
+       ret
+
+display_user_messages:
+       mov     [displayed_count],0
+       call    show_display_buffer
+       cmp     [displayed_count],0
+       je      line_break_ok
+       cmp     [last_displayed],0Ah
+       je      line_break_ok
+       mov     dl,0Ah
+       call    display_character
+      line_break_ok:
+       ret
+display_block:
+       jecxz   block_displayed
+       add     [displayed_count],ecx
+       mov     al,[esi+ecx-1]
+       mov     [last_displayed],al
+       mov     r13d,edi
+       mov     eax,1
+       mov     edi,[con_handle]
+       mov     edx,ecx
+       syscall
+       mov     edi,r13d
+      block_displayed:
+       ret
+
+fatal_error:
+       mov     [con_handle],2
+       mov     esi,error_prefix
+       call    display_string
+       pop     esi
+       call    display_string
+       mov     esi,error_suffix
+       call    display_string
+       mov     al,0FFh
+       jmp     exit_program
+assembler_error:
+       mov     [con_handle],2
+       call    display_user_messages
+       mov     ebx,[current_line]
+       test    ebx,ebx
+       jz      display_error_message
+       push    dword 0
+      get_error_lines:
+       mov     eax,[ebx]
+       cmp     byte [eax],0
+       je      get_next_error_line
+       push    ebx
+       test    byte [ebx+7],80h
+       jz      display_error_line
+       mov     edx,ebx
+      find_definition_origin:
+       mov     edx,[edx+12]
+       test    byte [edx+7],80h
+       jnz     find_definition_origin
+       push    edx
+      get_next_error_line:
+       mov     ebx,[ebx+8]
+       jmp     get_error_lines
+      display_error_line:
+       mov     esi,[ebx]
+       call    display_string
+       mov     esi,line_number_start
+       call    display_string
+       mov     eax,[ebx+4]
+       and     eax,7FFFFFFFh
+       call    display_number
+       mov     dl,']'
+       call    display_character
+       pop     esi
+       cmp     ebx,esi
+       je      line_number_ok
+       mov     dl,20h
+       call    display_character
+       push    esi
+       mov     esi,[esi]
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    display_block
+       mov     esi,line_number_start
+       call    display_string
+       pop     esi
+       mov     eax,[esi+4]
+       and     eax,7FFFFFFFh
+       call    display_number
+       mov     dl,']'
+       call    display_character
+      line_number_ok:
+       mov     esi,line_data_start
+       call    display_string
+       mov     esi,ebx
+       mov     edx,[esi]
+       call    open
+       mov     al,2
+       xor     edx,edx
+       call    lseek
+       mov     edx,[esi+8]
+       sub     eax,edx
+       jz      line_data_displayed
+       push    eax
+       xor     al,al
+       call    lseek
+       mov     ecx,[esp]
+       mov     edx,[additional_memory]
+       lea     eax,[edx+ecx]
+       cmp     eax,[additional_memory_end]
+       ja      out_of_memory
+       call    read
+       call    close
+       pop     ecx
+       mov     esi,[additional_memory]
+      get_line_data:
+       mov     al,[esi]
+       cmp     al,0Ah
+       je      display_line_data
+       cmp     al,0Dh
+       je      display_line_data
+       cmp     al,1Ah
+       je      display_line_data
+       or      al,al
+       jz      display_line_data
+       inc     esi
+       loop    get_line_data
+      display_line_data:
+       mov     ecx,esi
+       mov     esi,[additional_memory]
+       sub     ecx,esi
+       call    display_block
+      line_data_displayed:
+       mov     esi,lf
+       call    display_string
+       pop     ebx
+       or      ebx,ebx
+       jnz     display_error_line
+       cmp     [preprocessing_done],0
+       je      display_error_message
+       mov     esi,preprocessed_instruction_prefix
+       call    display_string
+       mov     esi,[current_line]
+       add     esi,16
+       mov     edi,[additional_memory]
+       xor     dl,dl
+      convert_instruction:
+       lodsb
+       cmp     al,1Ah
+       je      copy_symbol
+       cmp     al,22h
+       je      copy_symbol
+       cmp     al,3Bh
+       je      instruction_converted
+       stosb
+       or      al,al
+       jz      instruction_converted
+       xor     dl,dl
+       jmp     convert_instruction
+      copy_symbol:
+       or      dl,dl
+       jz      space_ok
+       mov     byte [edi],20h
+       inc     edi
+      space_ok:
+       cmp     al,22h
+       je      quoted
+       lodsb
+       movzx   ecx,al
+       rep     movsb
+       or      dl,-1
+       jmp     convert_instruction
+      quoted:
+       mov     al,27h
+       stosb
+       lodsd
+       mov     ecx,eax
+       jecxz   quoted_copied
+      copy_quoted:
+       lodsb
+       stosb
+       cmp     al,27h
+       jne     quote_ok
+       stosb
+      quote_ok:
+       loop    copy_quoted
+      quoted_copied:
+       mov     al,27h
+       stosb
+       or      dl,-1
+       jmp     convert_instruction
+      instruction_converted:
+       xor     al,al
+       stosb
+       mov     esi,[additional_memory]
+       call    display_string
+       mov     esi,lf
+       call    display_string
+      display_error_message:
+       mov     esi,error_prefix
+       call    display_string
+       pop     esi
+       call    display_string
+       mov     esi,error_suffix
+       call    display_string
+       mov     al,2
+       jmp     exit_program
+
+make_timestamp:
+       mov     r13d,edi
+       mov     eax,201
+       mov     edi,timestamp
+       syscall
+       mov     eax,dword [timestamp]
+       mov     edx,dword [timestamp+4]
+       mov     edi,r13d
+       ret
+
+error_prefix db 'error: ',0
+error_suffix db '.'
+lf db 0xA,0
+line_number_start db ' [',0
+line_data_start db ':',0xA,0
+preprocessed_instruction_prefix db 'processed: ',0
diff --git a/source/messages.inc b/source/messages.inc
new file mode 100644 (file)
index 0000000..2180421
--- /dev/null
@@ -0,0 +1,51 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+_out_of_memory db 'out of memory',0
+_stack_overflow db 'out of stack space',0
+_main_file_not_found db 'source file not found',0
+_code_cannot_be_generated db 'code cannot be generated',0
+_format_limitations_exceeded db 'format limitations exceeded',0
+_invalid_definition db 'invalid definition provided',0
+_write_failed db 'write failed',0
+_file_not_found db 'file not found',0
+_error_reading_file db 'error reading file',0
+_invalid_file_format db 'invalid file format',0
+_invalid_macro_arguments db 'invalid macro arguments',0
+_incomplete_macro db 'incomplete macro',0
+_unexpected_characters db 'unexpected characters',0
+_invalid_argument db 'invalid argument',0
+_illegal_instruction db 'illegal instruction',0
+_invalid_operand db 'invalid operand',0
+_invalid_operand_size db 'invalid size of operand',0
+_operand_size_not_specified db 'operand size not specified',0
+_operand_sizes_do_not_match db 'operand sizes do not match',0
+_invalid_address_size db 'invalid size of address value',0
+_address_sizes_do_not_agree db 'address sizes do not agree',0
+_disallowed_combination_of_registers db 'disallowed combination of registers',0
+_long_immediate_not_encodable db 'not encodable with long immediate',0
+_relative_jump_out_of_range db 'relative jump out of range',0
+_invalid_expression db 'invalid expression',0
+_invalid_address db 'invalid address',0
+_invalid_value db 'invalid value',0
+_value_out_of_range db 'value out of range',0
+_undefined_symbol db 'undefined symbol',0
+_symbol_out_of_scope_1 db 'symbol',0
+_symbol_out_of_scope_2 db 'out of scope',0
+_invalid_use_of_symbol db 'invalid use of symbol',0
+_name_too_long db 'name too long',0
+_invalid_name db 'invalid name',0
+_reserved_word_used_as_symbol db 'reserved word used as symbol',0
+_symbol_already_defined db 'symbol already defined',0
+_missing_end_quote db 'missing end quote',0
+_missing_end_directive db 'missing end directive',0
+_unexpected_instruction db 'unexpected instruction',0
+_extra_characters_on_line db 'extra characters on line',0
+_section_not_aligned_enough db 'section is not aligned enough',0
+_setting_already_specified db 'setting already specified',0
+_data_already_defined db 'data already defined',0
+_too_many_repeats db 'too many repeats',0
+_invoked_error db 'error directive encountered in source file',0
+_assertion_failed db 'assertion failed',0
diff --git a/source/parser.inc b/source/parser.inc
new file mode 100644 (file)
index 0000000..a4b66b0
--- /dev/null
@@ -0,0 +1,1470 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+parser:
+       mov     eax,[memory_end]
+       mov     [labels_list],eax
+       mov     eax,[additional_memory]
+       mov     [free_additional_memory],eax
+       xor     eax,eax
+       mov     [current_locals_prefix],eax
+       mov     [anonymous_reverse],eax
+       mov     [anonymous_forward],eax
+       mov     [hash_tree],eax
+       mov     [blocks_stack],eax
+       mov     [parsed_lines],eax
+       mov     esi,[memory_start]
+       mov     edi,[source_start]
+      parser_loop:
+       mov     [current_line],esi
+       lea     eax,[edi+100h]
+       cmp     eax,[labels_list]
+       jae     out_of_memory
+       cmp     byte [esi+16],0
+       je      empty_line
+       cmp     byte [esi+16],3Bh
+       je      empty_line
+       mov     al,0Fh
+       stos    byte [edi]
+       mov     eax,esi
+       stos    dword [edi]
+       inc     [parsed_lines]
+       add     esi,16
+      parse_line:
+       mov     [formatter_symbols_allowed],0
+       mov     [decorator_symbols_allowed],0
+       cmp     byte [esi],1Ah
+       jne     empty_instruction
+       push    edi
+       add     esi,2
+       movzx   ecx,byte [esi-1]
+       cmp     byte [esi+ecx],':'
+       je      simple_label
+       cmp     byte [esi+ecx],'='
+       je      constant_label
+       call    get_instruction
+       jnc     main_instruction_identified
+       cmp     byte [esi+ecx],1Ah
+       jne     no_data_label
+       push    esi ecx
+       lea     esi,[esi+ecx+2]
+       movzx   ecx,byte [esi-1]
+       call    get_data_directive
+       jnc     data_label
+       pop     ecx esi
+      no_data_label:
+       call    get_data_directive
+       jnc     main_instruction_identified
+       pop     edi
+       sub     esi,2
+       xor     bx,bx
+       call    parse_line_contents
+       jmp     parse_next_line
+      simple_label:
+       pop     edi
+       call    identify_label
+       cmp     byte [esi+1],':'
+       je      block_label
+       mov     byte [edi],2
+       inc     edi
+       stos    dword [edi]
+       inc     esi
+       xor     al,al
+       stos    byte [edi]
+       jmp     parse_line
+      block_label:
+       mov     byte [edi],4
+       inc     edi
+       stos    dword [edi]
+       add     esi,2
+       jmp     parse_line
+      constant_label:
+       pop     edi
+       call    get_label_id
+       mov     byte [edi],3
+       inc     edi
+       stos    dword [edi]
+       xor     al,al
+       stos    byte [edi]
+       inc     esi
+       xor     bx,bx
+       call    parse_line_contents
+       jmp     parse_next_line
+      data_label:
+       pop     ecx edx
+       pop     edi
+       push    eax ebx esi
+       mov     esi,edx
+       movzx   ecx,byte [esi-1]
+       call    identify_label
+       mov     byte [edi],2
+       inc     edi
+       stos    dword [edi]
+       pop     esi ebx eax
+       stos    byte [edi]
+       push    edi
+      main_instruction_identified:
+       pop     edi
+       mov     dl,al
+       mov     al,1
+       stos    byte [edi]
+       mov     ax,bx
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       cmp     bx,if_directive-instruction_handler
+       je      parse_block
+       cmp     bx,repeat_directive-instruction_handler
+       je      parse_block
+       cmp     bx,while_directive-instruction_handler
+       je      parse_block
+       cmp     bx,end_directive-instruction_handler
+       je      parse_end_directive
+       cmp     bx,else_directive-instruction_handler
+       je      parse_else
+       cmp     bx,assert_directive-instruction_handler
+       je      parse_assert
+      common_parse:
+       call    parse_line_contents
+       jmp     parse_next_line
+      empty_instruction:
+       lods    byte [esi]
+       or      al,al
+       jz      parse_next_line
+       cmp     al,':'
+       je      invalid_name
+       dec     esi
+       mov     [parenthesis_stack],0
+       call    parse_argument
+       jmp     parse_next_line
+      empty_line:
+       add     esi,16
+      skip_rest_of_line:
+       call    skip_foreign_line
+      parse_next_line:
+       cmp     esi,[source_start]
+       jb      parser_loop
+      source_parsed:
+       cmp     [blocks_stack],0
+       je      blocks_stack_ok
+       pop     eax
+       pop     [current_line]
+       jmp     missing_end_directive
+      blocks_stack_ok:
+       xor     al,al
+       stos    byte [edi]
+       add     edi,0Fh
+       and     edi,not 0Fh
+       mov     [code_start],edi
+       ret
+      parse_block:
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       push    [current_line]
+       mov     ax,bx
+       shl     eax,16
+       push    eax
+       inc     [blocks_stack]
+       cmp     bx,if_directive-instruction_handler
+       je      parse_if
+       cmp     bx,while_directive-instruction_handler
+       je      parse_while
+       call    parse_line_contents
+       jmp     parse_next_line
+      parse_end_directive:
+       cmp     byte [esi],1Ah
+       jne     common_parse
+       push    edi
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_instruction
+       pop     edi
+       jnc     parse_end_block
+       sub     esi,2
+       jmp     common_parse
+      parse_end_block:
+       mov     dl,al
+       mov     al,1
+       stos    byte [edi]
+       mov     ax,bx
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       lods    byte [esi]
+       or      al,al
+       jnz     extra_characters_on_line
+       cmp     bx,if_directive-instruction_handler
+       je      close_parsing_block
+       cmp     bx,repeat_directive-instruction_handler
+       je      close_parsing_block
+       cmp     bx,while_directive-instruction_handler
+       je      close_parsing_block
+       jmp     parse_next_line
+      close_parsing_block:
+       cmp     [blocks_stack],0
+       je      unexpected_instruction
+       cmp     bx,[esp+2]
+       jne     unexpected_instruction
+       dec     [blocks_stack]
+       pop     eax edx
+       cmp     bx,if_directive-instruction_handler
+       jne     parse_next_line
+       test    al,1100b
+       jz      parse_next_line
+       test    al,10000b
+       jnz     parse_next_line
+       sub     edi,8
+       jmp     parse_next_line
+      parse_if:
+       push    edi
+       call    parse_line_contents
+       xor     al,al
+       stos    byte [edi]
+       xchg    esi,[esp]
+       mov     edi,esi
+       call    preevaluate_logical_expression
+       pop     esi
+       cmp     al,'0'
+       je      parse_false_condition_block
+       cmp     al,'1'
+       je      parse_true_condition_block
+       or      byte [esp],10000b
+       jmp     parse_next_line
+      parse_while:
+       push    edi
+       call    parse_line_contents
+       xor     al,al
+       stos    byte [edi]
+       xchg    esi,[esp]
+       mov     edi,esi
+       call    preevaluate_logical_expression
+       pop     esi
+       cmp     al,'0'
+       je      parse_false_condition_block
+       cmp     al,'1'
+       jne     parse_next_line
+       stos    byte [edi]
+       jmp     parse_next_line
+      parse_false_condition_block:
+       or      byte [esp],1
+       sub     edi,4
+       jmp     skip_parsing
+      parse_true_condition_block:
+       or      byte [esp],100b
+       sub     edi,4
+       jmp     parse_next_line
+      parse_else:
+       cmp     [blocks_stack],0
+       je      unexpected_instruction
+       cmp     word [esp+2],if_directive-instruction_handler
+       jne     unexpected_instruction
+       lods    byte [esi]
+       or      al,al
+       jz      parse_pure_else
+       cmp     al,1Ah
+       jne     extra_characters_on_line
+       push    edi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_instruction
+       jc      extra_characters_on_line
+       pop     edi
+       cmp     bx,if_directive-instruction_handler
+       jne     extra_characters_on_line
+       test    byte [esp],100b
+       jnz     skip_true_condition_else
+       mov     dl,al
+       mov     al,1
+       stos    byte [edi]
+       mov     ax,bx
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     parse_if
+      parse_assert:
+       push    edi
+       call    parse_line_contents
+       xor     al,al
+       stos    byte [edi]
+       xchg    esi,[esp]
+       mov     edi,esi
+       call    preevaluate_logical_expression
+       pop     esi
+       or      al,al
+       jz      parse_next_line
+       stos    byte [edi]
+       jmp     parse_next_line
+      skip_true_condition_else:
+       sub     edi,4
+       or      byte [esp],1
+       jmp     skip_parsing_contents
+      parse_pure_else:
+       bts     dword [esp],1
+       jc      unexpected_instruction
+       test    byte [esp],100b
+       jz      parse_next_line
+       sub     edi,4
+       or      byte [esp],1
+       jmp     skip_parsing
+      skip_parsing:
+       cmp     esi,[source_start]
+       jae     source_parsed
+       mov     [current_line],esi
+       add     esi,16
+      skip_parsing_line:
+       cmp     byte [esi],1Ah
+       jne     skip_parsing_contents
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       cmp     byte [esi+ecx],':'
+       je      skip_parsing_label
+       push    edi
+       call    get_instruction
+       pop     edi
+       jnc     skip_parsing_instruction
+       add     esi,ecx
+       jmp     skip_parsing_contents
+      skip_parsing_label:
+       lea     esi,[esi+ecx+1]
+       jmp     skip_parsing_line
+      skip_parsing_instruction:
+       cmp     bx,if_directive-instruction_handler
+       je      skip_parsing_block
+       cmp     bx,repeat_directive-instruction_handler
+       je      skip_parsing_block
+       cmp     bx,while_directive-instruction_handler
+       je      skip_parsing_block
+       cmp     bx,end_directive-instruction_handler
+       je      skip_parsing_end_directive
+       cmp     bx,else_directive-instruction_handler
+       je      skip_parsing_else
+      skip_parsing_contents:
+       lods    byte [esi]
+       or      al,al
+       jz      skip_parsing
+       cmp     al,1Ah
+       je      skip_parsing_symbol
+       cmp     al,3Bh
+       je      skip_parsing_symbol
+       cmp     al,22h
+       je      skip_parsing_string
+       jmp     skip_parsing_contents
+      skip_parsing_symbol:
+       lods    byte [esi]
+       movzx   eax,al
+       add     esi,eax
+       jmp     skip_parsing_contents
+      skip_parsing_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_parsing_contents
+      skip_parsing_block:
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       push    [current_line]
+       mov     ax,bx
+       shl     eax,16
+       push    eax
+       inc     [blocks_stack]
+       jmp     skip_parsing_contents
+      skip_parsing_end_directive:
+       cmp     byte [esi],1Ah
+       jne     skip_parsing_contents
+       push    edi
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_instruction
+       pop     edi
+       jnc     skip_parsing_end_block
+       add     esi,ecx
+       jmp     skip_parsing_contents
+      skip_parsing_end_block:
+       lods    byte [esi]
+       or      al,al
+       jnz     extra_characters_on_line
+       cmp     bx,if_directive-instruction_handler
+       je      close_skip_parsing_block
+       cmp     bx,repeat_directive-instruction_handler
+       je      close_skip_parsing_block
+       cmp     bx,while_directive-instruction_handler
+       je      close_skip_parsing_block
+       jmp     skip_parsing
+      close_skip_parsing_block:
+       cmp     [blocks_stack],0
+       je      unexpected_instruction
+       cmp     bx,[esp+2]
+       jne     unexpected_instruction
+       dec     [blocks_stack]
+       pop     eax edx
+       test    al,1
+       jz      skip_parsing
+       cmp     bx,if_directive-instruction_handler
+       jne     parse_next_line
+       test    al,10000b
+       jz      parse_next_line
+       mov     al,0Fh
+       stos    byte [edi]
+       mov     eax,[current_line]
+       stos    dword [edi]
+       inc     [parsed_lines]
+       mov     eax,1 + (end_directive-instruction_handler) shl 8
+       stos    dword [edi]
+       mov     eax,1 + (if_directive-instruction_handler) shl 8
+       stos    dword [edi]
+       jmp     parse_next_line
+      skip_parsing_else:
+       cmp     [blocks_stack],0
+       je      unexpected_instruction
+       cmp     word [esp+2],if_directive-instruction_handler
+       jne     unexpected_instruction
+       lods    byte [esi]
+       or      al,al
+       jz      skip_parsing_pure_else
+       cmp     al,1Ah
+       jne     extra_characters_on_line
+       push    edi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_instruction
+       jc      extra_characters_on_line
+       pop     edi
+       cmp     bx,if_directive-instruction_handler
+       jne     extra_characters_on_line
+       mov     al,[esp]
+       test    al,1
+       jz      skip_parsing_contents
+       test    al,100b
+       jnz     skip_parsing_contents
+       test    al,10000b
+       jnz     parse_else_if
+       xor     al,al
+       mov     [esp],al
+       mov     al,0Fh
+       stos    byte [edi]
+       mov     eax,[current_line]
+       stos    dword [edi]
+       inc     [parsed_lines]
+      parse_else_if:
+       mov     eax,1 + (if_directive-instruction_handler) shl 8
+       stos    dword [edi]
+       jmp     parse_if
+      skip_parsing_pure_else:
+       bts     dword [esp],1
+       jc      unexpected_instruction
+       mov     al,[esp]
+       test    al,1
+       jz      skip_parsing
+       test    al,100b
+       jnz     skip_parsing
+       and     al,not 1
+       or      al,1000b
+       mov     [esp],al
+       jmp     parse_next_line
+
+parse_line_contents:
+       mov     [parenthesis_stack],0
+      parse_instruction_arguments:
+       cmp     bx,prefix_instruction-instruction_handler
+       je      allow_embedded_instruction
+       cmp     bx,times_directive-instruction_handler
+       je      parse_times_directive
+       cmp     bx,end_directive-instruction_handler
+       je      allow_embedded_instruction
+       cmp     bx,label_directive-instruction_handler
+       je      parse_label_directive
+       cmp     bx,segment_directive-instruction_handler
+       je      parse_segment_directive
+       cmp     bx,load_directive-instruction_handler
+       je      parse_load_directive
+       cmp     bx,extrn_directive-instruction_handler
+       je      parse_extrn_directive
+       cmp     bx,public_directive-instruction_handler
+       je      parse_public_directive
+       cmp     bx,section_directive-instruction_handler
+       je      parse_formatter_argument
+       cmp     bx,format_directive-instruction_handler
+       je      parse_formatter_argument
+       cmp     bx,data_directive-instruction_handler
+       je      parse_formatter_argument
+       jmp     parse_argument
+      parse_formatter_argument:
+       or      [formatter_symbols_allowed],-1
+      parse_argument:
+       lea     eax,[edi+100h]
+       cmp     eax,[labels_list]
+       jae     out_of_memory
+       lods    byte [esi]
+       cmp     al,':'
+       je      instruction_separator
+       cmp     al,','
+       je      separator
+       cmp     al,'='
+       je      expression_comparator
+       cmp     al,'|'
+       je      separator
+       cmp     al,'&'
+       je      separator
+       cmp     al,'~'
+       je      separator
+       cmp     al,'>'
+       je      greater
+       cmp     al,'<'
+       je      less
+       cmp     al,')'
+       je      close_parenthesis
+       or      al,al
+       jz      contents_parsed
+       cmp     al,'['
+       je      address_argument
+       cmp     al,']'
+       je      separator
+       cmp     al,'{'
+       je      open_decorator
+       cmp     al,'}'
+       je      close_decorator
+       cmp     al,'#'
+       je      unallowed_character
+       cmp     al,'`'
+       je      unallowed_character
+       cmp     al,3Bh
+       je      foreign_argument
+       cmp     [decorator_symbols_allowed],0
+       je      not_a_separator
+       cmp     al,'-'
+       je      separator
+      not_a_separator:
+       dec     esi
+       cmp     al,1Ah
+       jne     expression_argument
+       push    edi
+       mov     edi,directive_operators
+       call    get_operator
+       or      al,al
+       jnz     operator_argument
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_symbol
+       jnc     symbol_argument
+       cmp     ecx,1
+       jne     check_argument
+       cmp     byte [esi],'?'
+       jne     check_argument
+       pop     edi
+       movs    byte [edi],[esi]
+       jmp     argument_parsed
+      foreign_argument:
+       dec     esi
+       call    skip_foreign_line
+       jmp     contents_parsed
+      symbol_argument:
+       pop     edi
+       stos    word [edi]
+       cmp     byte [esi],'+'
+       jne     argument_parsed
+       and     ax,0F0FFh
+       cmp     ax,6010h
+       jne     argument_parsed
+       movs    byte [edi],[esi]
+       jmp     argument_parsed
+      operator_argument:
+       pop     edi
+       cmp     al,85h
+       je      ptr_argument
+       stos    byte [edi]
+       cmp     al,8Ch
+       je      forced_expression
+       cmp     al,81h
+       je      forced_parenthesis
+       cmp     al,80h
+       je      parse_at_operator
+       cmp     al,82h
+       je      parse_from_operator
+       cmp     al,89h
+       je      parse_label_operator
+       cmp     al,0F8h
+       je      forced_expression
+       jmp     argument_parsed
+      instruction_separator:
+       stos    byte [edi]
+      allow_embedded_instruction:
+       cmp     byte [esi],1Ah
+       jne     parse_argument
+       push    edi
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_instruction
+       jnc     embedded_instruction
+       call    get_data_directive
+       jnc     embedded_instruction
+       pop     edi
+       sub     esi,2
+       jmp     parse_argument
+      embedded_instruction:
+       pop     edi
+       mov     dl,al
+       mov     al,1
+       stos    byte [edi]
+       mov     ax,bx
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     parse_instruction_arguments
+      parse_times_directive:
+       mov     al,'('
+       stos    byte [edi]
+       call    convert_expression
+       mov     al,')'
+       stos    byte [edi]
+       cmp     byte [esi],':'
+       jne     allow_embedded_instruction
+       movs    byte [edi],[esi]
+       jmp     allow_embedded_instruction
+      parse_segment_directive:
+       or      [formatter_symbols_allowed],-1
+      parse_label_directive:
+       cmp     byte [esi],1Ah
+       jne     argument_parsed
+       push    esi
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    identify_label
+       pop     ebx
+       cmp     eax,0Fh
+       je      non_label_identified
+       mov     byte [edi],2
+       inc     edi
+       stos    dword [edi]
+       xor     al,al
+       stos    byte [edi]
+       jmp     argument_parsed
+      non_label_identified:
+       mov     esi,ebx
+       jmp     argument_parsed
+      parse_load_directive:
+       cmp     byte [esi],1Ah
+       jne     argument_parsed
+       push    esi
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       call    get_label_id
+       pop     ebx
+       cmp     eax,0Fh
+       je      non_label_identified
+       mov     byte [edi],2
+       inc     edi
+       stos    dword [edi]
+       xor     al,al
+       stos    byte [edi]
+       jmp     argument_parsed
+      parse_public_directive:
+       cmp     byte [esi],1Ah
+       jne     parse_argument
+       inc     esi
+       push    esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       push    esi ecx
+       push    edi
+       or      [formatter_symbols_allowed],-1
+       call    get_symbol
+       mov     [formatter_symbols_allowed],0
+       pop     edi
+       jc      parse_public_label
+       cmp     al,1Dh
+       jne     parse_public_label
+       add     esp,12
+       stos    word [edi]
+       jmp     parse_public_directive
+      parse_public_label:
+       pop     ecx esi
+       mov     al,2
+       stos    byte [edi]
+       call    get_label_id
+       stos    dword [edi]
+       mov     ax,8600h
+       stos    word [edi]
+       pop     ebx
+       push    ebx esi edi
+       mov     edi,directive_operators
+       call    get_operator
+       pop     edi edx ebx
+       cmp     al,86h
+       je      argument_parsed
+       mov     esi,edx
+       xchg    esi,ebx
+       movzx   ecx,byte [esi]
+       inc     esi
+       mov     ax,'('
+       stos    word [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       rep     movs byte [edi],[esi]
+       xor     al,al
+       stos    byte [edi]
+       xchg    esi,ebx
+       jmp     argument_parsed
+      parse_extrn_directive:
+       cmp     byte [esi],22h
+       je      parse_quoted_extrn
+       cmp     byte [esi],1Ah
+       jne     parse_argument
+       push    esi
+       movzx   ecx,byte [esi+1]
+       add     esi,2
+       mov     ax,'('
+       stos    word [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       rep     movs byte [edi],[esi]
+       mov     ax,8600h
+       stos    word [edi]
+       pop     esi
+      parse_label_operator:
+       cmp     byte [esi],1Ah
+       jne     argument_parsed
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+       mov     al,2
+       stos    byte [edi]
+       call    get_label_id
+       stos    dword [edi]
+       xor     al,al
+       stos    byte [edi]
+       jmp     argument_parsed
+      parse_from_operator:
+       cmp     byte [esi],22h
+       je      argument_parsed
+      parse_at_operator:
+       cmp     byte [esi],':'
+       je      argument_parsed
+       jmp     forced_multipart_expression
+      parse_quoted_extrn:
+       inc     esi
+       mov     ax,'('
+       stos    word [edi]
+       lods    dword [esi]
+       mov     ecx,eax
+       stos    dword [edi]
+       rep     movs byte [edi],[esi]
+       xor     al,al
+       stos    byte [edi]
+       push    esi edi
+       mov     edi,directive_operators
+       call    get_operator
+       mov     edx,esi
+       pop     edi esi
+       cmp     al,86h
+       jne     argument_parsed
+       stos    byte [edi]
+       mov     esi,edx
+       jmp     parse_label_operator
+      ptr_argument:
+       call    parse_address
+       jmp     address_parsed
+      check_argument:
+       push    esi ecx
+       sub     esi,2
+       mov     edi,single_operand_operators
+       call    get_operator
+       pop     ecx esi
+       or      al,al
+       jnz     not_instruction
+       call    get_instruction
+       jnc     embedded_instruction
+       call    get_data_directive
+       jnc     embedded_instruction
+      not_instruction:
+       pop     edi
+       sub     esi,2
+      expression_argument:
+       cmp     byte [esi],22h
+       jne     not_string
+       mov     eax,[esi+1]
+       lea     ebx,[esi+5+eax]
+       push    ebx ecx esi edi
+       call    parse_expression
+       pop     eax edx ecx ebx
+       cmp     esi,ebx
+       jne     expression_argument_parsed
+       mov     edi,eax
+       mov     esi,edx
+      string_argument:
+       inc     esi
+       mov     ax,'('
+       stos    word [edi]
+       lods    dword [esi]
+       mov     ecx,eax
+       stos    dword [edi]
+       shr     ecx,1
+       jnc     string_movsb_ok
+       movs    byte [edi],[esi]
+      string_movsb_ok:
+       shr     ecx,1
+       jnc     string_movsw_ok
+       movs    word [edi],[esi]
+      string_movsw_ok:
+       rep     movs dword [edi],[esi]
+       xor     al,al
+       stos    byte [edi]
+       jmp     expression_argument_parsed
+      parse_expression:
+       mov     al,'('
+       stos    byte [edi]
+       call    convert_expression
+       mov     al,')'
+       stos    byte [edi]
+       ret
+      not_string:
+       cmp     byte [esi],'('
+       jne     expression
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       push    esi edi
+       inc     esi
+       mov     al,91h
+       stos    byte [edi]
+       inc     [parenthesis_stack]
+       jmp     parse_argument
+      expression_comparator:
+       stos    byte [edi]
+       jmp     forced_expression
+      greater:
+       cmp     byte [esi],'='
+       jne     separator
+       inc     esi
+       mov     al,0F2h
+       jmp     separator
+      less:
+       cmp     byte [edi-1],0F6h
+       je      separator
+       cmp     byte [esi],'>'
+       je      not_equal
+       cmp     byte [esi],'='
+       jne     separator
+       inc     esi
+       mov     al,0F3h
+       jmp     separator
+      not_equal:
+       inc     esi
+       mov     al,0F1h
+       jmp     expression_comparator
+      expression:
+       call    parse_expression
+       jmp     expression_argument_parsed
+      forced_expression:
+       xor     al,al
+       xchg    al,[formatter_symbols_allowed]
+       push    eax
+       call    parse_expression
+      forced_expression_parsed:
+       pop     eax
+       mov     [formatter_symbols_allowed],al
+       jmp     argument_parsed
+      forced_multipart_expression:
+       xor     al,al
+       xchg    al,[formatter_symbols_allowed]
+       push    eax
+       call    parse_expression
+       cmp     byte [esi],':'
+       jne     forced_expression_parsed
+       movs    byte [edi],[esi]
+       call    parse_expression
+       jmp     forced_expression_parsed
+      address_argument:
+       call    parse_address
+       lods    byte [esi]
+       cmp     al,']'
+       je      address_parsed
+       cmp     al,','
+       je      divided_address
+       dec     esi
+       mov     al,')'
+       stos    byte [edi]
+       jmp     argument_parsed
+      divided_address:
+       mov     ax,'),'
+       stos    word [edi]
+       jmp     expression
+      address_parsed:
+       mov     al,']'
+       stos    byte [edi]
+       jmp     argument_parsed
+      parse_address:
+       mov     al,'['
+       stos    byte [edi]
+       cmp     word [esi],021Ah
+       jne     convert_address
+       push    esi
+       add     esi,4
+       lea     ebx,[esi+1]
+       cmp     byte [esi],':'
+       pop     esi
+       jne     convert_address
+       add     esi,2
+       mov     ecx,2
+       push    ebx edi
+       call    get_symbol
+       pop     edi esi
+       jc      unknown_segment_prefix
+       cmp     al,10h
+       jne     unknown_segment_prefix
+       mov     al,ah
+       and     ah,11110000b
+       cmp     ah,30h
+       jne     unknown_segment_prefix
+       add     al,30h
+       stos    byte [edi]
+       jmp     convert_address
+      unknown_segment_prefix:
+       sub     esi,5
+      convert_address:
+       push    edi
+       mov     edi,address_sizes
+       call    get_operator
+       pop     edi
+       or      al,al
+       jz      convert_expression
+       add     al,70h
+       stos    byte [edi]
+       jmp     convert_expression
+      forced_parenthesis:
+       cmp     byte [esi],'('
+       jne     argument_parsed
+       inc     esi
+       mov     al,91h
+       jmp     separator
+      unallowed_character:
+       mov     al,0FFh
+       jmp     separator
+      open_decorator:
+       inc     [decorator_symbols_allowed]
+       jmp     separator
+      close_decorator:
+       dec     [decorator_symbols_allowed]
+       jmp     separator
+      close_parenthesis:
+       mov     al,92h
+      separator:
+       stos    byte [edi]
+      argument_parsed:
+       cmp     [parenthesis_stack],0
+       je      parse_argument
+       dec     [parenthesis_stack]
+       add     esp,8
+       jmp     argument_parsed
+      expression_argument_parsed:
+       cmp     [parenthesis_stack],0
+       je      parse_argument
+       cmp     byte [esi],')'
+       jne     argument_parsed
+       dec     [parenthesis_stack]
+       pop     edi esi
+       jmp     expression
+      contents_parsed:
+       cmp     [parenthesis_stack],0
+       je      contents_ok
+       dec     [parenthesis_stack]
+       add     esp,8
+       jmp     contents_parsed
+      contents_ok:
+       ret
+
+identify_label:
+       cmp     byte [esi],'.'
+       je      local_label_name
+       call    get_label_id
+       cmp     eax,10h
+       jb      label_identified
+       or      ebx,ebx
+       jz      anonymous_label_name
+       dec     ebx
+       mov     [current_locals_prefix],ebx
+      label_identified:
+       ret
+      anonymous_label_name:
+       cmp     byte [esi-1],'@'
+       je      anonymous_label_name_ok
+       mov     eax,0Fh
+      anonymous_label_name_ok:
+       ret
+      local_label_name:
+       call    get_label_id
+       ret
+
+get_operator:
+       cmp     byte [esi],1Ah
+       jne     get_simple_operator
+       mov     edx,esi
+       push    ebp
+       inc     esi
+       lods    byte [esi]
+       movzx   ebp,al
+       push    edi
+       mov     ecx,ebp
+       call    lower_case
+       pop     edi
+      check_operator:
+       mov     esi,converted
+       movzx   ecx,byte [edi]
+       jecxz   no_operator
+       inc     edi
+       mov     ebx,edi
+       add     ebx,ecx
+       cmp     ecx,ebp
+       jne     next_operator
+       repe    cmps byte [esi],[edi]
+       je      operator_found
+       jb      no_operator
+      next_operator:
+       mov     edi,ebx
+       inc     edi
+       jmp     check_operator
+      no_operator:
+       mov     esi,edx
+       mov     ecx,ebp
+       pop     ebp
+      no_simple_operator:
+       xor     al,al
+       ret
+      operator_found:
+       lea     esi,[edx+2+ebp]
+       mov     ecx,ebp
+       pop     ebp
+       mov     al,[edi]
+       ret
+      get_simple_operator:
+       mov     al,[esi]
+       cmp     al,22h
+       je      no_simple_operator
+      simple_operator:
+       cmp     byte [edi],1
+       jb      no_simple_operator
+       ja      simple_next_operator
+       cmp     al,[edi+1]
+       je      simple_operator_found
+      simple_next_operator:
+       movzx   ecx,byte [edi]
+       lea     edi,[edi+1+ecx+1]
+       jmp     simple_operator
+      simple_operator_found:
+       inc     esi
+       mov     al,[edi+2]
+       ret
+
+get_symbol:
+       push    esi
+       mov     ebp,ecx
+       call    lower_case
+       mov     ecx,ebp
+       cmp     cl,11
+       ja      no_symbol
+       sub     cl,1
+       jc      no_symbol
+       movzx   ebx,word [symbols+ecx*4]
+       add     ebx,symbols
+       movzx   edx,word [symbols+ecx*4+2]
+      scan_symbols:
+       or      edx,edx
+       jz      no_symbol
+       mov     eax,edx
+       shr     eax,1
+       lea     edi,[ebp+2]
+       imul    eax,edi
+       lea     edi,[ebx+eax]
+       mov     esi,converted
+       mov     ecx,ebp
+       repe    cmps byte [esi],[edi]
+       ja      symbols_up
+       jb      symbols_down
+       mov     ax,[edi]
+       cmp     al,18h
+       jb      symbol_ok
+       cmp     al,1Fh
+       je      decorator_symbol
+       cmp     [formatter_symbols_allowed],0
+       je      no_symbol
+      symbol_ok:
+       pop     esi
+       add     esi,ebp
+       clc
+       ret
+      decorator_symbol:
+       cmp     [decorator_symbols_allowed],0
+       jne     symbol_ok
+      no_symbol:
+       pop     esi
+       mov     ecx,ebp
+       stc
+       ret
+      symbols_down:
+       shr     edx,1
+       jmp     scan_symbols
+      symbols_up:
+       lea     ebx,[edi+ecx+2]
+       shr     edx,1
+       adc     edx,-1
+       jmp     scan_symbols
+
+get_data_directive:
+       push    esi
+       mov     ebp,ecx
+       call    lower_case
+       mov     ecx,ebp
+       cmp     cl,4
+       ja      no_instruction
+       sub     cl,2
+       jc      no_instruction
+       movzx   ebx,word [data_directives+ecx*4]
+       add     ebx,data_directives
+       movzx   edx,word [data_directives+ecx*4+2]
+       jmp     scan_instructions
+
+get_instruction:
+       push    esi
+       mov     ebp,ecx
+       call    lower_case
+       mov     ecx,ebp
+       cmp     cl,17
+       ja      no_instruction
+       sub     cl,2
+       jc      no_instruction
+       movzx   ebx,word [instructions+ecx*4]
+       add     ebx,instructions
+       movzx   edx,word [instructions+ecx*4+2]
+      scan_instructions:
+       or      edx,edx
+       jz      no_instruction
+       mov     eax,edx
+       shr     eax,1
+       lea     edi,[ebp+3]
+       imul    eax,edi
+       lea     edi,[ebx+eax]
+       mov     esi,converted
+       mov     ecx,ebp
+       repe    cmps byte [esi],[edi]
+       ja      instructions_up
+       jb      instructions_down
+       pop     esi
+       add     esi,ebp
+       mov     al,[edi]
+       mov     bx,[edi+1]
+       clc
+       ret
+      no_instruction:
+       pop     esi
+       mov     ecx,ebp
+       stc
+       ret
+      instructions_down:
+       shr     edx,1
+       jmp     scan_instructions
+      instructions_up:
+       lea     ebx,[edi+ecx+3]
+       shr     edx,1
+       adc     edx,-1
+       jmp     scan_instructions
+
+get_label_id:
+       cmp     ecx,100h
+       jae     name_too_long
+       cmp     byte [esi],'@'
+       je      anonymous_label
+       cmp     byte [esi],'.'
+       jne     standard_label
+       cmp     byte [esi+1],'.'
+       je      standard_label
+       cmp     [current_locals_prefix],0
+       je      standard_label
+       push    edi
+       mov     edi,[additional_memory_end]
+       sub     edi,2
+       sub     edi,ecx
+       push    ecx esi
+       mov     esi,[current_locals_prefix]
+       lods    byte [esi]
+       movzx   ecx,al
+       sub     edi,ecx
+       cmp     edi,[free_additional_memory]
+       jb      out_of_memory
+       mov     word [edi],0
+       add     edi,2
+       mov     ebx,edi
+       rep     movs byte [edi],[esi]
+       pop     esi ecx
+       add     al,cl
+       jc      name_too_long
+       rep     movs byte [edi],[esi]
+       pop     edi
+       push    ebx esi
+       movzx   ecx,al
+       mov     byte [ebx-1],al
+       mov     esi,ebx
+       call    get_label_id
+       pop     esi ebx
+       cmp     ebx,[eax+24]
+       jne     composed_label_id_ok
+       lea     edx,[ebx-2]
+       mov     [additional_memory_end],edx
+      composed_label_id_ok:
+       ret
+      anonymous_label:
+       cmp     ecx,2
+       jne     standard_label
+       mov     al,[esi+1]
+       mov     ebx,characters
+       xlat    byte [ebx]
+       cmp     al,'@'
+       je      new_anonymous
+       cmp     al,'b'
+       je      anonymous_back
+       cmp     al,'r'
+       je      anonymous_back
+       cmp     al,'f'
+       jne     standard_label
+       add     esi,2
+       mov     eax,[anonymous_forward]
+       or      eax,eax
+       jnz     anonymous_ok
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       call    allocate_label
+       mov     [anonymous_forward],eax
+      anonymous_ok:
+       xor     ebx,ebx
+       ret
+      anonymous_back:
+       mov     eax,[anonymous_reverse]
+       add     esi,2
+       or      eax,eax
+       jz      bogus_anonymous
+       jmp     anonymous_ok
+      bogus_anonymous:
+       call    allocate_label
+       mov     [anonymous_reverse],eax
+       jmp     anonymous_ok
+      new_anonymous:
+       add     esi,2
+       mov     eax,[anonymous_forward]
+       or      eax,eax
+       jnz     new_anonymous_ok
+       call    allocate_label
+      new_anonymous_ok:
+       mov     [anonymous_reverse],eax
+       mov     [anonymous_forward],0
+       jmp     anonymous_ok
+      standard_label:
+       cmp     byte [esi],'%'
+       je      get_predefined_id
+       cmp     byte [esi],'$'
+       je      current_address_label
+       cmp     byte [esi],'?'
+       jne     find_label
+       cmp     ecx,1
+       jne     find_label
+       inc     esi
+       mov     eax,0Fh
+       ret
+      current_address_label:
+       cmp     ecx,3
+       je      current_address_label_3_characters
+       ja      find_label
+       inc     esi
+       cmp     ecx,1
+       jbe     get_current_offset_id
+       inc     esi
+       cmp     byte [esi-1],'$'
+       je      get_org_origin_id
+       cmp     byte [esi-1],'%'
+       je      get_file_offset_id
+       sub     esi,2
+       jmp     find_label
+      get_current_offset_id:
+       xor     eax,eax
+       ret
+      get_counter_id:
+       mov     eax,1
+       ret
+      get_timestamp_id:
+       mov     eax,2
+       ret
+      get_org_origin_id:
+       mov     eax,3
+       ret
+      get_file_offset_id:
+       mov     eax,4
+       ret
+      current_address_label_3_characters:
+       cmp     word [esi+1],'%%'
+       jne     find_label
+       add     esi,3
+      get_actual_file_offset_id:
+       mov     eax,5
+       ret
+      get_predefined_id:
+       cmp     ecx,2
+       ja      find_label
+       inc     esi
+       cmp     cl,1
+       je      get_counter_id
+       lods    byte [esi]
+       mov     ebx,characters
+       xlat    [ebx]
+       cmp     al,'t'
+       je      get_timestamp_id
+       sub     esi,2
+      find_label:
+       xor     ebx,ebx
+       mov     eax,2166136261
+       mov     ebp,16777619
+      hash_label:
+       xor     al,[esi+ebx]
+       mul     ebp
+       inc     bl
+       cmp     bl,cl
+       jb      hash_label
+       mov     ebp,eax
+       shl     eax,8
+       and     ebp,0FFh shl 24
+       xor     ebp,eax
+       or      ebp,ebx
+       mov     [label_hash],ebp
+       push    edi esi
+       push    ecx
+       mov     ecx,32
+       mov     ebx,hash_tree
+      follow_tree:
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      extend_tree
+       xor     eax,eax
+       shl     ebp,1
+       adc     eax,0
+       lea     ebx,[edx+eax*4]
+       dec     ecx
+       jnz     follow_tree
+       mov     [label_leaf],ebx
+       pop     edx
+       mov     eax,[ebx]
+       or      eax,eax
+       jz      add_label
+       mov     ebx,esi
+       mov     ebp,[label_hash]
+      compare_labels:
+       mov     esi,ebx
+       mov     ecx,edx
+       mov     edi,[eax+4]
+       mov     edi,[edi+24]
+       repe    cmps byte [esi],[edi]
+       je      label_found
+       mov     eax,[eax]
+       or      eax,eax
+       jnz     compare_labels
+       jmp     add_label
+      label_found:
+       add     esp,4
+       pop     edi
+       mov     eax,[eax+4]
+       ret
+      extend_tree:
+       mov     edx,[free_additional_memory]
+       lea     eax,[edx+8]
+       cmp     eax,[additional_memory_end]
+       ja      out_of_memory
+       mov     [free_additional_memory],eax
+       xor     eax,eax
+       mov     [edx],eax
+       mov     [edx+4],eax
+       shl     ebp,1
+       adc     eax,0
+       mov     [ebx],edx
+       lea     ebx,[edx+eax*4]
+       dec     ecx
+       jnz     extend_tree
+       mov     [label_leaf],ebx
+       pop     edx
+      add_label:
+       mov     ecx,edx
+       pop     esi
+       cmp     byte [esi-2],0
+       je      label_name_ok
+       mov     al,[esi]
+       cmp     al,30h
+       jb      name_first_char_ok
+       cmp     al,39h
+       jbe     numeric_name
+      name_first_char_ok:
+       cmp     al,'$'
+       jne     check_for_reserved_word
+      numeric_name:
+       add     esi,ecx
+      reserved_word:
+       mov     eax,0Fh
+       pop     edi
+       ret
+      check_for_reserved_word:
+       call    get_instruction
+       jnc     reserved_word
+       call    get_data_directive
+       jnc     reserved_word
+       call    get_symbol
+       jnc     reserved_word
+       sub     esi,2
+       mov     edi,operators
+       call    get_operator
+       or      al,al
+       jnz     reserved_word
+       mov     edi,single_operand_operators
+       call    get_operator
+       or      al,al
+       jnz     reserved_word
+       mov     edi,directive_operators
+       call    get_operator
+       or      al,al
+       jnz     reserved_word
+       inc     esi
+       movzx   ecx,byte [esi]
+       inc     esi
+      label_name_ok:
+       mov     edx,[free_additional_memory]
+       lea     eax,[edx+8]
+       cmp     eax,[additional_memory_end]
+       ja      out_of_memory
+       mov     [free_additional_memory],eax
+       mov     ebx,esi
+       add     esi,ecx
+       mov     eax,[label_leaf]
+       mov     edi,[eax]
+       mov     [edx],edi
+       mov     [eax],edx
+       call    allocate_label
+       mov     [edx+4],eax
+       mov     [eax+24],ebx
+       pop     edi
+       ret
+      allocate_label:
+       mov     eax,[labels_list]
+       mov     ecx,LABEL_STRUCTURE_SIZE shr 2
+      initialize_label:
+       sub     eax,4
+       mov     dword [eax],0
+       loop    initialize_label
+       mov     [labels_list],eax
+       ret
+
+LABEL_STRUCTURE_SIZE = 32
diff --git a/source/preproce.inc b/source/preproce.inc
new file mode 100644 (file)
index 0000000..88327b2
--- /dev/null
@@ -0,0 +1,2983 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+preprocessor:
+       mov     edi,characters
+       xor     al,al
+      make_characters_table:
+       stosb
+       inc     al
+       jnz     make_characters_table
+       mov     esi,characters+'a'
+       mov     edi,characters+'A'
+       mov     ecx,26
+       rep     movsb
+       mov     edi,characters
+       mov     esi,symbol_characters+1
+       movzx   ecx,byte [esi-1]
+       xor     eax,eax
+      mark_symbol_characters:
+       lodsb
+       mov     byte [edi+eax],0
+       loop    mark_symbol_characters
+       mov     edi,locals_counter
+       mov     ax,1 + '0' shl 8
+       stos    word [edi]
+       mov     edi,[memory_start]
+       mov     [include_paths],edi
+       mov     esi,include_variable
+       call    get_environment_variable
+       xor     al,al
+       stos    byte [edi]
+       mov     [memory_start],edi
+       mov     eax,[additional_memory]
+       mov     [free_additional_memory],eax
+       mov     eax,[additional_memory_end]
+       mov     [labels_list],eax
+       xor     eax,eax
+       mov     [source_start],eax
+       mov     [tagged_blocks],eax
+       mov     [hash_tree],eax
+       mov     [error],eax
+       mov     [macro_status],al
+       mov     [current_line],eax
+       mov     esi,[initial_definitions]
+       test    esi,esi
+       jz      predefinitions_ok
+      process_predefinitions:
+       movzx   ecx,byte [esi]
+       test    ecx,ecx
+       jz      predefinitions_ok
+       inc     esi
+       lea     eax,[esi+ecx]
+       push    eax
+       mov     ch,10b
+       call    add_preprocessor_symbol
+       pop     esi
+       mov     edi,[memory_start]
+       mov     [edx+8],edi
+      convert_predefinition:
+       cmp     edi,[memory_end]
+       jae     out_of_memory
+       lods    byte [esi]
+       or      al,al
+       jz      predefinition_converted
+       cmp     al,20h
+       je      convert_predefinition
+       mov     ah,al
+       mov     ebx,characters
+       xlat    byte [ebx]
+       or      al,al
+       jz      predefinition_separator
+       cmp     ah,27h
+       je      predefinition_string
+       cmp     ah,22h
+       je      predefinition_string
+       mov     byte [edi],1Ah
+       scas    word [edi]
+       xchg    al,ah
+       stos    byte [edi]
+       mov     ebx,characters
+       xor     ecx,ecx
+      predefinition_symbol:
+       lods    byte [esi]
+       stos    byte [edi]
+       xlat    byte [ebx]
+       or      al,al
+       loopnzd predefinition_symbol
+       neg     ecx
+       cmp     ecx,255
+       ja      invalid_definition
+       mov     ebx,edi
+       sub     ebx,ecx
+       mov     byte [ebx-2],cl
+      found_predefinition_separator:
+       dec     edi
+       mov     ah,[esi-1]
+      predefinition_separator:
+       xchg    al,ah
+       or      al,al
+       jz      predefinition_converted
+       cmp     al,20h
+       je      convert_predefinition
+       cmp     al,3Bh
+       je      invalid_definition
+       cmp     al,5Ch
+       je      predefinition_backslash
+       stos    byte [edi]
+       jmp     convert_predefinition
+      predefinition_string:
+       mov     al,22h
+       stos    byte [edi]
+       scas    dword [edi]
+       mov     ebx,edi
+      copy_predefinition_string:
+       lods    byte [esi]
+       stos    byte [edi]
+       or      al,al
+       jz      invalid_definition
+       cmp     al,ah
+       jne     copy_predefinition_string
+       lods    byte [esi]
+       cmp     al,ah
+       je      copy_predefinition_string
+       dec     esi
+       dec     edi
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-4],eax
+       jmp     convert_predefinition
+      predefinition_backslash:
+       mov     byte [edi],0
+       lods    byte [esi]
+       or      al,al
+       jz      invalid_definition
+       cmp     al,20h
+       je      invalid_definition
+       cmp     al,3Bh
+       je      invalid_definition
+       mov     al,1Ah
+       stos    byte [edi]
+       mov     ecx,edi
+       mov     ax,5C01h
+       stos    word [edi]
+       dec     esi
+      group_predefinition_backslashes:
+       lods    byte [esi]
+       cmp     al,5Ch
+       jne     predefinition_backslashed_symbol
+       stos    byte [edi]
+       inc     byte [ecx]
+       jmp     group_predefinition_backslashes
+      predefinition_backslashed_symbol:
+       cmp     al,20h
+       je      invalid_definition
+       cmp     al,22h
+       je      invalid_definition
+       cmp     al,27h
+       je      invalid_definition
+       cmp     al,3Bh
+       je      invalid_definition
+       mov     ah,al
+       mov     ebx,characters
+       xlat    byte [ebx]
+       or      al,al
+       jz      predefinition_backslashed_symbol_character
+       mov     al,ah
+      convert_predefinition_backslashed_symbol:
+       stos    byte [edi]
+       xlat    byte [ebx]
+       or      al,al
+       jz      found_predefinition_separator
+       inc     byte [ecx]
+       jz      invalid_definition
+       lods    byte [esi]
+       jmp     convert_predefinition_backslashed_symbol
+      predefinition_backslashed_symbol_character:
+       mov     al,ah
+       stos    byte [edi]
+       inc     byte [ecx]
+       jmp     convert_predefinition
+      predefinition_converted:
+       mov     [memory_start],edi
+       sub     edi,[edx+8]
+       mov     [edx+12],edi
+       jmp     process_predefinitions
+      predefinitions_ok:
+       mov     esi,[input_file]
+       mov     edx,esi
+       call    open
+       jc      main_file_not_found
+       mov     edi,[memory_start]
+       call    preprocess_file
+       cmp     [macro_status],0
+       je      process_postponed
+       mov     eax,[error_line]
+       mov     [current_line],eax
+       jmp     incomplete_macro
+      process_postponed:
+       mov     edx,hash_tree
+       mov     ecx,32
+      find_postponed_list:
+       mov     edx,[edx]
+       or      edx,edx
+       loopnz  find_postponed_list
+       jz      preprocessing_finished
+      process_postponed_list:
+       mov     eax,[edx]
+       or      eax,eax
+       jz      preprocessing_finished
+       push    edx
+       mov     ebx,edx
+      find_earliest_postponed:
+       mov     eax,[edx]
+       or      eax,eax
+       jz      earliest_postponed_found
+       mov     ebx,edx
+       mov     edx,eax
+       jmp     find_earliest_postponed
+      earliest_postponed_found:
+       mov     [ebx],eax
+       call    use_postponed_macro
+       pop     edx
+       cmp     [macro_status],0
+       je      process_postponed_list
+       mov     eax,[error_line]
+       mov     [current_line],eax
+       jmp     incomplete_macro
+      preprocessing_finished:
+       mov     [source_start],edi
+       ret
+      use_postponed_macro:
+       lea     esi,[edi-1]
+       push    ecx esi
+       mov     [struc_name],0
+       jmp     use_macro
+
+preprocess_file:
+       push    [memory_end]
+       push    esi
+       mov     al,2
+       xor     edx,edx
+       call    lseek
+       push    eax
+       xor     al,al
+       xor     edx,edx
+       call    lseek
+       pop     ecx
+       mov     edx,[memory_end]
+       dec     edx
+       mov     byte [edx],1Ah
+       sub     edx,ecx
+       jc      out_of_memory
+       mov     esi,edx
+       cmp     edx,edi
+       jbe     out_of_memory
+       mov     [memory_end],edx
+       call    read
+       call    close
+       pop     edx
+       xor     ecx,ecx
+       mov     ebx,esi
+      preprocess_source:
+       inc     ecx
+       mov     [current_line],edi
+       mov     eax,edx
+       stos    dword [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       mov     eax,esi
+       sub     eax,ebx
+       stos    dword [edi]
+       xor     eax,eax
+       stos    dword [edi]
+       push    ebx edx
+       call    convert_line
+       call    preprocess_line
+       pop     edx ebx
+      next_line:
+       cmp     byte [esi-1],0
+       je      file_end
+       cmp     byte [esi-1],1Ah
+       jne     preprocess_source
+      file_end:
+       pop     [memory_end]
+       clc
+       ret
+
+convert_line:
+       push    ecx
+       test    [macro_status],0Fh
+       jz      convert_line_data
+       mov     ax,3Bh
+       stos    word [edi]
+      convert_line_data:
+       cmp     edi,[memory_end]
+       jae     out_of_memory
+       lods    byte [esi]
+       cmp     al,20h
+       je      convert_line_data
+       cmp     al,9
+       je      convert_line_data
+       mov     ah,al
+       mov     ebx,characters
+       xlat    byte [ebx]
+       or      al,al
+       jz      convert_separator
+       cmp     ah,27h
+       je      convert_string
+       cmp     ah,22h
+       je      convert_string
+       mov     byte [edi],1Ah
+       scas    word [edi]
+       xchg    al,ah
+       stos    byte [edi]
+       mov     ebx,characters
+       xor     ecx,ecx
+      convert_symbol:
+       lods    byte [esi]
+       stos    byte [edi]
+       xlat    byte [ebx]
+       or      al,al
+       loopnzd convert_symbol
+       neg     ecx
+       cmp     ecx,255
+       ja      name_too_long
+       mov     ebx,edi
+       sub     ebx,ecx
+       mov     byte [ebx-2],cl
+      found_separator:
+       dec     edi
+       mov     ah,[esi-1]
+      convert_separator:
+       xchg    al,ah
+       cmp     al,20h
+       jb      control_character
+       je      convert_line_data
+      symbol_character:
+       cmp     al,3Bh
+       je      ignore_comment
+       cmp     al,5Ch
+       je      backslash_character
+       stos    byte [edi]
+       jmp     convert_line_data
+      control_character:
+       cmp     al,1Ah
+       je      line_end
+       cmp     al,0Dh
+       je      cr_character
+       cmp     al,0Ah
+       je      lf_character
+       cmp     al,9
+       je      convert_line_data
+       or      al,al
+       jnz     symbol_character
+       jmp     line_end
+      lf_character:
+       lods    byte [esi]
+       cmp     al,0Dh
+       je      line_end
+       dec     esi
+       jmp     line_end
+      cr_character:
+       lods    byte [esi]
+       cmp     al,0Ah
+       je      line_end
+       dec     esi
+       jmp     line_end
+      convert_string:
+       mov     al,22h
+       stos    byte [edi]
+       scas    dword [edi]
+       mov     ebx,edi
+      copy_string:
+       lods    byte [esi]
+       stos    byte [edi]
+       cmp     al,0Ah
+       je      no_end_quote
+       cmp     al,0Dh
+       je      no_end_quote
+       or      al,al
+       jz      no_end_quote
+       cmp     al,1Ah
+       je      no_end_quote
+       cmp     al,ah
+       jne     copy_string
+       lods    byte [esi]
+       cmp     al,ah
+       je      copy_string
+       dec     esi
+       dec     edi
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-4],eax
+       jmp     convert_line_data
+      backslash_character:
+       mov     byte [edi],0
+       lods    byte [esi]
+       cmp     al,20h
+       je      concatenate_lines
+       cmp     al,9
+       je      concatenate_lines
+       cmp     al,1Ah
+       je      line_end
+       or      al,al
+       jz      line_end
+       cmp     al,0Ah
+       je      concatenate_lf
+       cmp     al,0Dh
+       je      concatenate_cr
+       cmp     al,3Bh
+       je      find_concatenated_line
+       mov     al,1Ah
+       stos    byte [edi]
+       mov     ecx,edi
+       mov     ax,5C01h
+       stos    word [edi]
+       dec     esi
+      group_backslashes:
+       lods    byte [esi]
+       cmp     al,5Ch
+       jne     backslashed_symbol
+       stos    byte [edi]
+       inc     byte [ecx]
+       jz      name_too_long
+       jmp     group_backslashes
+      no_end_quote:
+       mov     byte [ebx-5],0
+       jmp     missing_end_quote
+      backslashed_symbol:
+       cmp     al,1Ah
+       je      extra_characters_on_line
+       or      al,al
+       jz      extra_characters_on_line
+       cmp     al,0Ah
+       je      extra_characters_on_line
+       cmp     al,0Dh
+       je      extra_characters_on_line
+       cmp     al,20h
+       je      extra_characters_on_line
+       cmp     al,9
+       je      extra_characters_on_line
+       cmp     al,22h
+       je      extra_characters_on_line
+       cmp     al,27h
+       je      extra_characters_on_line
+       cmp     al,3Bh
+       je      extra_characters_on_line
+       mov     ah,al
+       mov     ebx,characters
+       xlat    byte [ebx]
+       or      al,al
+       jz      backslashed_symbol_character
+       mov     al,ah
+      convert_backslashed_symbol:
+       stos    byte [edi]
+       xlat    byte [ebx]
+       or      al,al
+       jz      found_separator
+       inc     byte [ecx]
+       jz      name_too_long
+       lods    byte [esi]
+       jmp     convert_backslashed_symbol
+      backslashed_symbol_character:
+       mov     al,ah
+       stos    byte [edi]
+       inc     byte [ecx]
+       jmp     convert_line_data
+      concatenate_lines:
+       lods    byte [esi]
+       cmp     al,20h
+       je      concatenate_lines
+       cmp     al,9
+       je      concatenate_lines
+       cmp     al,1Ah
+       je      line_end
+       or      al,al
+       jz      line_end
+       cmp     al,0Ah
+       je      concatenate_lf
+       cmp     al,0Dh
+       je      concatenate_cr
+       cmp     al,3Bh
+       jne     extra_characters_on_line
+      find_concatenated_line:
+       lods    byte [esi]
+       cmp     al,0Ah
+       je      concatenate_lf
+       cmp     al,0Dh
+       je      concatenate_cr
+       or      al,al
+       jz      concatenate_ok
+       cmp     al,1Ah
+       jne     find_concatenated_line
+       jmp     line_end
+      concatenate_lf:
+       lods    byte [esi]
+       cmp     al,0Dh
+       je      concatenate_ok
+       dec     esi
+       jmp     concatenate_ok
+      concatenate_cr:
+       lods    byte [esi]
+       cmp     al,0Ah
+       je      concatenate_ok
+       dec     esi
+      concatenate_ok:
+       inc     dword [esp]
+       jmp     convert_line_data
+      ignore_comment:
+       lods    byte [esi]
+       cmp     al,0Ah
+       je      lf_character
+       cmp     al,0Dh
+       je      cr_character
+       or      al,al
+       jz      line_end
+       cmp     al,1Ah
+       jne     ignore_comment
+      line_end:
+       xor     al,al
+       stos    byte [edi]
+       pop     ecx
+       ret
+
+lower_case:
+       mov     edi,converted
+       mov     ebx,characters
+      convert_case:
+       lods    byte [esi]
+       xlat    byte [ebx]
+       stos    byte [edi]
+       loop    convert_case
+      case_ok:
+       ret
+
+get_directive:
+       push    edi
+       mov     edx,esi
+       mov     ebp,ecx
+       call    lower_case
+       pop     edi
+      scan_directives:
+       mov     esi,converted
+       movzx   eax,byte [edi]
+       or      al,al
+       jz      no_directive
+       mov     ecx,ebp
+       inc     edi
+       mov     ebx,edi
+       add     ebx,eax
+       mov     ah,[esi]
+       cmp     ah,[edi]
+       jb      no_directive
+       ja      next_directive
+       cmp     cl,al
+       jne     next_directive
+       repe    cmps byte [esi],[edi]
+       jb      no_directive
+       je      directive_found
+      next_directive:
+       mov     edi,ebx
+       add     edi,2
+       jmp     scan_directives
+      no_directive:
+       mov     esi,edx
+       mov     ecx,ebp
+       stc
+       ret
+      directive_found:
+       call    get_directive_handler_base
+      directive_handler:
+       lea     esi,[edx+ebp]
+       movzx   ecx,word [ebx]
+       add     eax,ecx
+       clc
+       ret
+      get_directive_handler_base:
+       mov     eax,[esp]
+       ret
+
+preprocess_line:
+       mov     eax,esp
+       sub     eax,[stack_limit]
+       cmp     eax,100h
+       jb      stack_overflow
+       push    ecx esi
+      preprocess_current_line:
+       mov     esi,[current_line]
+       add     esi,16
+       cmp     word [esi],3Bh
+       jne     line_start_ok
+       add     esi,2
+      line_start_ok:
+       test    [macro_status],0F0h
+       jnz     macro_preprocessing
+       cmp     byte [esi],1Ah
+       jne     not_fix_constant
+       movzx   edx,byte [esi+1]
+       lea     edx,[esi+2+edx]
+       cmp     word [edx],031Ah
+       jne     not_fix_constant
+       mov     ebx,characters
+       movzx   eax,byte [edx+2]
+       xlat    byte [ebx]
+       ror     eax,8
+       mov     al,[edx+3]
+       xlat    byte [ebx]
+       ror     eax,8
+       mov     al,[edx+4]
+       xlat    byte [ebx]
+       ror     eax,16
+       cmp     eax,'fix'
+       je      define_fix_constant
+      not_fix_constant:
+       call    process_fix_constants
+       jmp     initial_preprocessing_ok
+      macro_preprocessing:
+       call    process_macro_operators
+      initial_preprocessing_ok:
+       mov     esi,[current_line]
+       add     esi,16
+       mov     al,[macro_status]
+       test    al,2
+       jnz     skip_macro_block
+       test    al,1
+       jnz     find_macro_block
+      preprocess_instruction:
+       mov     [current_offset],esi
+       lods    byte [esi]
+       movzx   ecx,byte [esi]
+       inc     esi
+       cmp     al,1Ah
+       jne     not_preprocessor_symbol
+       cmp     cl,3
+       jb      not_preprocessor_directive
+       push    edi
+       mov     edi,preprocessor_directives
+       call    get_directive
+       pop     edi
+       jc      not_preprocessor_directive
+       mov     byte [edx-2],3Bh
+       jmp     near eax
+      not_preprocessor_directive:
+       xor     ch,ch
+       call    get_preprocessor_symbol
+       jc      not_macro
+       mov     byte [ebx-2],3Bh
+       mov     [struc_name],0
+       jmp     use_macro
+      not_macro:
+       mov     [struc_name],esi
+       add     esi,ecx
+       lods    byte [esi]
+       cmp     al,':'
+       je      preprocess_label
+       cmp     al,1Ah
+       jne     not_preprocessor_symbol
+       lods    byte [esi]
+       cmp     al,3
+       jne     not_symbolic_constant
+       mov     ebx,characters
+       movzx   eax,byte [esi]
+       xlat    byte [ebx]
+       ror     eax,8
+       mov     al,[esi+1]
+       xlat    byte [ebx]
+       ror     eax,8
+       mov     al,[esi+2]
+       xlat    byte [ebx]
+       ror     eax,16
+       cmp     eax,'equ'
+       je      define_equ_constant
+       mov     al,3
+      not_symbolic_constant:
+       mov     ch,1
+       mov     cl,al
+       call    get_preprocessor_symbol
+       jc      not_preprocessor_symbol
+       push    edx esi
+       mov     esi,[struc_name]
+       mov     [struc_label],esi
+       sub     [struc_label],2
+       mov     cl,[esi-1]
+       mov     ch,10b
+       call    get_preprocessor_symbol
+       jc      struc_name_ok
+       test    edx,edx
+       jz      reserved_word_used_as_symbol
+       mov     ecx,[edx+12]
+       add     ecx,3
+       lea     ebx,[edi+ecx]
+       mov     ecx,edi
+       sub     ecx,[struc_label]
+       lea     esi,[edi-1]
+       lea     edi,[ebx-1]
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       mov     edi,[struc_label]
+       mov     esi,[edx+8]
+       mov     ecx,[edx+12]
+       add     [struc_name],ecx
+       add     [struc_name],3
+       call    move_data
+       mov     al,3Ah
+       stos    byte [edi]
+       mov     ax,3Bh
+       stos    word [edi]
+       mov     edi,ebx
+       pop     esi
+       add     esi,[edx+12]
+       add     esi,3
+       pop     edx
+       jmp     use_macro
+      struc_name_ok:
+       mov     edx,[struc_name]
+       movzx   eax,byte [edx-1]
+       add     edx,eax
+       push    edi
+       lea     esi,[edi-1]
+       mov     ecx,edi
+       sub     ecx,edx
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       pop     edi
+       inc     edi
+       mov     al,3Ah
+       mov     [edx],al
+       inc     al
+       mov     [edx+1],al
+       pop     esi edx
+       inc     esi
+       jmp     use_macro
+      preprocess_label:
+       dec     esi
+       sub     esi,ecx
+       lea     ebp,[esi-2]
+       mov     ch,10b
+       call    get_preprocessor_symbol
+       jnc     symbolic_constant_in_label
+       lea     esi,[esi+ecx+1]
+       cmp     byte [esi],':'
+       jne     preprocess_instruction
+       inc     esi
+       jmp     preprocess_instruction
+      symbolic_constant_in_label:
+       test    edx,edx
+       jz      reserved_word_used_as_symbol
+       mov     ebx,[edx+8]
+       mov     ecx,[edx+12]
+       add     ecx,ebx
+      check_for_broken_label:
+       cmp     ebx,ecx
+       je      label_broken
+       cmp     byte [ebx],1Ah
+       jne     label_broken
+       movzx   eax,byte [ebx+1]
+       lea     ebx,[ebx+2+eax]
+       cmp     ebx,ecx
+       je      label_constant_ok
+       cmp     byte [ebx],':'
+       jne     label_broken
+       inc     ebx
+       cmp     byte [ebx],':'
+       jne     check_for_broken_label
+       inc     ebx
+       jmp     check_for_broken_label
+      label_broken:
+       call    replace_symbolic_constant
+       jmp     line_preprocessed
+      label_constant_ok:
+       mov     ecx,edi
+       sub     ecx,esi
+       mov     edi,[edx+12]
+       add     edi,ebp
+       push    edi
+       lea     eax,[edi+ecx]
+       push    eax
+       cmp     esi,edi
+       je      replace_label
+       jb      move_rest_of_line_up
+       rep     movs byte [edi],[esi]
+       jmp     replace_label
+      move_rest_of_line_up:
+       lea     esi,[esi+ecx-1]
+       lea     edi,[edi+ecx-1]
+       std
+       rep     movs byte [edi],[esi]
+       cld
+      replace_label:
+       mov     ecx,[edx+12]
+       mov     edi,[esp+4]
+       sub     edi,ecx
+       mov     esi,[edx+8]
+       rep     movs byte [edi],[esi]
+       pop     edi esi
+       inc     esi
+       jmp     preprocess_instruction
+      not_preprocessor_symbol:
+       mov     esi,[current_offset]
+       call    process_equ_constants
+      line_preprocessed:
+       pop     esi ecx
+       ret
+
+get_preprocessor_symbol:
+       push    ebp edi esi
+       mov     ebp,ecx
+       shl     ebp,22
+       mov     al,ch
+       and     al,11b
+       movzx   ecx,cl
+       cmp     al,10b
+       jne     no_preprocessor_special_symbol
+       cmp     cl,4
+       jbe     no_preprocessor_special_symbol
+       mov     ax,'__'
+       cmp     ax,[esi]
+       jne     no_preprocessor_special_symbol
+       cmp     ax,[esi+ecx-2]
+       jne     no_preprocessor_special_symbol
+       add     esi,2
+       sub     ecx,4
+       push    ebp
+       mov     edi,preprocessor_special_symbols
+       call    get_directive
+       pop     ebp
+       jc      preprocessor_special_symbol_not_recognized
+       add     esi,2
+       xor     edx,edx
+       jmp     preprocessor_symbol_found
+      preprocessor_special_symbol_not_recognized:
+       add     ecx,4
+       sub     esi,2
+      no_preprocessor_special_symbol:
+       mov     ebx,hash_tree
+       mov     edi,10
+      follow_hashes_roots:
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      preprocessor_symbol_not_found
+       xor     eax,eax
+       shl     ebp,1
+       adc     eax,0
+       lea     ebx,[edx+eax*4]
+       dec     edi
+       jnz     follow_hashes_roots
+       mov     edi,ebx
+       call    calculate_hash
+       mov     ebp,eax
+       and     ebp,3FFh
+       shl     ebp,10
+       xor     ebp,eax
+       mov     ebx,edi
+       mov     edi,22
+      follow_hashes_tree:
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      preprocessor_symbol_not_found
+       xor     eax,eax
+       shl     ebp,1
+       adc     eax,0
+       lea     ebx,[edx+eax*4]
+       dec     edi
+       jnz     follow_hashes_tree
+       mov     al,cl
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      preprocessor_symbol_not_found
+      compare_with_preprocessor_symbol:
+       mov     edi,[edx+4]
+       cmp     edi,1
+       jbe     next_equal_hash
+       repe    cmps byte [esi],[edi]
+       je      preprocessor_symbol_found
+       mov     cl,al
+       mov     esi,[esp]
+      next_equal_hash:
+       mov     edx,[edx]
+       or      edx,edx
+       jnz     compare_with_preprocessor_symbol
+      preprocessor_symbol_not_found:
+       pop     esi edi ebp
+       stc
+       ret
+      preprocessor_symbol_found:
+       pop     ebx edi ebp
+       clc
+       ret
+      calculate_hash:
+       xor     ebx,ebx
+       mov     eax,2166136261
+       mov     ebp,16777619
+      fnv1a_hash:
+       xor     al,[esi+ebx]
+       mul     ebp
+       inc     bl
+       cmp     bl,cl
+       jb      fnv1a_hash
+       ret
+add_preprocessor_symbol:
+       push    edi esi
+       xor     eax,eax
+       or      cl,cl
+       jz      reshape_hash
+       cmp     ch,11b
+       je      preprocessor_symbol_name_ok
+       push    ecx
+       movzx   ecx,cl
+       mov     edi,preprocessor_directives
+       call    get_directive
+       jnc     reserved_word_used_as_symbol
+       pop     ecx
+      preprocessor_symbol_name_ok:
+       call    calculate_hash
+      reshape_hash:
+       mov     ebp,eax
+       and     ebp,3FFh
+       shr     eax,10
+       xor     ebp,eax
+       shl     ecx,22
+       or      ebp,ecx
+       mov     ebx,hash_tree
+       mov     ecx,32
+      find_leave_for_symbol:
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      extend_hashes_tree
+       xor     eax,eax
+       rol     ebp,1
+       adc     eax,0
+       lea     ebx,[edx+eax*4]
+       dec     ecx
+       jnz     find_leave_for_symbol
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      add_symbol_entry
+       shr     ebp,30
+       cmp     ebp,11b
+       je      reuse_symbol_entry
+       cmp     dword [edx+4],0
+       jne     add_symbol_entry
+      find_entry_to_reuse:
+       mov     edi,[edx]
+       or      edi,edi
+       jz      reuse_symbol_entry
+       cmp     dword [edi+4],0
+       jne     reuse_symbol_entry
+       mov     edx,edi
+       jmp     find_entry_to_reuse
+      add_symbol_entry:
+       mov     eax,edx
+       mov     edx,[labels_list]
+       sub     edx,16
+       cmp     edx,[free_additional_memory]
+       jb      out_of_memory
+       mov     [labels_list],edx
+       mov     [edx],eax
+       mov     [ebx],edx
+      reuse_symbol_entry:
+       pop     esi edi
+       mov     [edx+4],esi
+       ret
+      extend_hashes_tree:
+       mov     edx,[labels_list]
+       sub     edx,8
+       cmp     edx,[free_additional_memory]
+       jb      out_of_memory
+       mov     [labels_list],edx
+       xor     eax,eax
+       mov     [edx],eax
+       mov     [edx+4],eax
+       shl     ebp,1
+       adc     eax,0
+       mov     [ebx],edx
+       lea     ebx,[edx+eax*4]
+       dec     ecx
+       jnz     extend_hashes_tree
+       mov     edx,[labels_list]
+       sub     edx,16
+       cmp     edx,[free_additional_memory]
+       jb      out_of_memory
+       mov     [labels_list],edx
+       mov     dword [edx],0
+       mov     [ebx],edx
+       pop     esi edi
+       mov     [edx+4],esi
+       ret
+
+define_fix_constant:
+       add     edx,5
+       add     esi,2
+       push    edx
+       mov     ch,11b
+       jmp     define_preprocessor_constant
+define_equ_constant:
+       add     esi,3
+       push    esi
+       call    process_equ_constants
+       mov     esi,[struc_name]
+       mov     ch,10b
+      define_preprocessor_constant:
+       mov     byte [esi-2],3Bh
+       mov     cl,[esi-1]
+       call    add_preprocessor_symbol
+       pop     ebx
+       mov     ecx,edi
+       dec     ecx
+       sub     ecx,ebx
+       mov     [edx+8],ebx
+       mov     [edx+12],ecx
+       jmp     line_preprocessed
+define_symbolic_constant:
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_name
+       lods    byte [esi]
+       mov     cl,al
+       mov     ch,10b
+       call    add_preprocessor_symbol
+       movzx   eax,byte [esi-1]
+       add     esi,eax
+       lea     ecx,[edi-1]
+       sub     ecx,esi
+       mov     [edx+8],esi
+       mov     [edx+12],ecx
+       jmp     line_preprocessed
+
+define_struc:
+       mov     ch,1
+       jmp     make_macro
+define_macro:
+       xor     ch,ch
+      make_macro:
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_name
+       lods    byte [esi]
+       mov     cl,al
+       call    add_preprocessor_symbol
+       mov     eax,[current_line]
+       mov     [edx+12],eax
+       movzx   eax,byte [esi-1]
+       add     esi,eax
+       mov     [edx+8],esi
+       mov     al,[macro_status]
+       and     al,0F0h
+       or      al,1
+       mov     [macro_status],al
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       xor     ebp,ebp
+       lods    byte [esi]
+       or      al,al
+       jz      line_preprocessed
+       cmp     al,'{'
+       je      found_macro_block
+       dec     esi
+      skip_macro_arguments:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      skip_macro_argument
+       cmp     al,'['
+       jne     invalid_macro_arguments
+       or      ebp,-1
+       jz      invalid_macro_arguments
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_macro_arguments
+      skip_macro_argument:
+       movzx   eax,byte [esi]
+       inc     esi
+       add     esi,eax
+       lods    byte [esi]
+       cmp     al,':'
+       je      macro_argument_with_default_value
+       cmp     al,'='
+       je      macro_argument_with_default_value
+       cmp     al,'*'
+       jne     macro_argument_end
+       lods    byte [esi]
+      macro_argument_end:
+       cmp     al,','
+       je      skip_macro_arguments
+       cmp     al,'&'
+       je      macro_arguments_finisher
+       cmp     al,']'
+       jne     end_macro_arguments
+       not     ebp
+      macro_arguments_finisher:
+       lods    byte [esi]
+      end_macro_arguments:
+       or      ebp,ebp
+       jnz     invalid_macro_arguments
+       or      al,al
+       jz      line_preprocessed
+       cmp     al,'{'
+       je      found_macro_block
+       jmp     invalid_macro_arguments
+      macro_argument_with_default_value:
+       or      [skip_default_argument_value],-1
+       call    skip_macro_argument_value
+       inc     esi
+       jmp     macro_argument_end
+      skip_macro_argument_value:
+       cmp     byte [esi],'<'
+       jne     simple_argument
+       mov     ecx,1
+       inc     esi
+      enclosed_argument:
+       lods    byte [esi]
+       or      al,al
+       jz      invalid_macro_arguments
+       cmp     al,1Ah
+       je      enclosed_symbol
+       cmp     al,22h
+       je      enclosed_string
+       cmp     al,'>'
+       je      enclosed_argument_end
+       cmp     al,'<'
+       jne     enclosed_argument
+       inc     ecx
+       jmp     enclosed_argument
+      enclosed_symbol:
+       movzx   eax,byte [esi]
+       inc     esi
+       add     esi,eax
+       jmp     enclosed_argument
+      enclosed_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     enclosed_argument
+      enclosed_argument_end:
+       loop    enclosed_argument
+       lods    byte [esi]
+       or      al,al
+       jz      argument_value_end
+       cmp     al,','
+       je      argument_value_end
+       cmp     [skip_default_argument_value],0
+       je      invalid_macro_arguments
+       cmp     al,'{'
+       je      argument_value_end
+       cmp     al,'&'
+       je      argument_value_end
+       or      ebp,ebp
+       jz      invalid_macro_arguments
+       cmp     al,']'
+       je      argument_value_end
+       jmp     invalid_macro_arguments
+      simple_argument:
+       lods    byte [esi]
+       or      al,al
+       jz      argument_value_end
+       cmp     al,','
+       je      argument_value_end
+       cmp     al,22h
+       je      argument_string
+       cmp     al,1Ah
+       je      argument_symbol
+       cmp     [skip_default_argument_value],0
+       je      simple_argument
+       cmp     al,'{'
+       je      argument_value_end
+       cmp     al,'&'
+       je      argument_value_end
+       or      ebp,ebp
+       jz      simple_argument
+       cmp     al,']'
+       je      argument_value_end
+      argument_symbol:
+       movzx   eax,byte [esi]
+       inc     esi
+       add     esi,eax
+       jmp     simple_argument
+      argument_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     simple_argument
+      argument_value_end:
+       dec     esi
+       ret
+      find_macro_block:
+       add     esi,2
+       lods    byte [esi]
+       or      al,al
+       jz      line_preprocessed
+       cmp     al,'{'
+       jne     unexpected_characters
+      found_macro_block:
+       or      [macro_status],2
+      skip_macro_block:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      skip_macro_symbol
+       cmp     al,3Bh
+       je      skip_macro_symbol
+       cmp     al,22h
+       je      skip_macro_string
+       or      al,al
+       jz      line_preprocessed
+       cmp     al,'}'
+       jne     skip_macro_block
+       mov     al,[macro_status]
+       and     [macro_status],0F0h
+       test    al,8
+       jnz     use_instant_macro
+       cmp     byte [esi],0
+       je      line_preprocessed
+       mov     ecx,edi
+       sub     ecx,esi
+       mov     edx,esi
+       lea     esi,[esi+ecx-1]
+       lea     edi,[edi+1+16]
+       mov     ebx,edi
+       dec     edi
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       mov     edi,edx
+       xor     al,al
+       stos    byte [edi]
+       mov     esi,[current_line]
+       mov     [current_line],edi
+       mov     ecx,4
+       rep     movs dword [edi],[esi]
+       mov     edi,ebx
+       jmp     initial_preprocessing_ok
+      skip_macro_symbol:
+       movzx   eax,byte [esi]
+       inc     esi
+       add     esi,eax
+       jmp     skip_macro_block
+      skip_macro_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_macro_block
+postpone_directive:
+       push    esi
+       mov     esi,edx
+       xor     ecx,ecx
+       call    add_preprocessor_symbol
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [edx+12],eax
+       pop     esi
+       mov     [edx+8],esi
+       mov     al,[macro_status]
+       and     al,0F0h
+       or      al,1
+       mov     [macro_status],al
+       lods    byte [esi]
+       or      al,al
+       jz      line_preprocessed
+       cmp     al,'{'
+       jne     unexpected_characters
+       jmp     found_macro_block
+rept_directive:
+       mov     [base_code],0
+       jmp     define_instant_macro
+irp_directive:
+       mov     [base_code],1
+       jmp     define_instant_macro
+irps_directive:
+       mov     [base_code],2
+       jmp     define_instant_macro
+irpv_directive:
+       mov     [base_code],3
+       jmp     define_instant_macro
+match_directive:
+       mov     [base_code],10h
+define_instant_macro:
+       mov     al,[macro_status]
+       and     al,0F0h
+       or      al,8+1
+       mov     [macro_status],al
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [instant_macro_start],esi
+       cmp     [base_code],10h
+       je      prepare_match
+      skip_parameters:
+       lods    byte [esi]
+       or      al,al
+       jz      parameters_skipped
+       cmp     al,'{'
+       je      parameters_skipped
+       cmp     al,22h
+       je      skip_quoted_parameter
+       cmp     al,1Ah
+       jne     skip_parameters
+       lods    byte [esi]
+       movzx   eax,al
+       add     esi,eax
+       jmp     skip_parameters
+      skip_quoted_parameter:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_parameters
+      parameters_skipped:
+       dec     esi
+       mov     [parameters_end],esi
+       lods    byte [esi]
+       cmp     al,'{'
+       je      found_macro_block
+       or      al,al
+       jnz     invalid_macro_arguments
+       jmp     line_preprocessed
+prepare_match:
+       call    skip_pattern
+       mov     [value_type],80h+10b
+       call    process_symbolic_constants
+       jmp     parameters_skipped
+      skip_pattern:
+       lods    byte [esi]
+       or      al,al
+       jz      invalid_macro_arguments
+       cmp     al,','
+       je      pattern_skipped
+       cmp     al,22h
+       je      skip_quoted_string_in_pattern
+       cmp     al,1Ah
+       je      skip_symbol_in_pattern
+       cmp     al,'='
+       jne     skip_pattern
+       mov     al,[esi]
+       cmp     al,1Ah
+       je      skip_pattern
+       cmp     al,22h
+       je      skip_pattern
+       inc     esi
+       jmp     skip_pattern
+      skip_symbol_in_pattern:
+       lods    byte [esi]
+       movzx   eax,al
+       add     esi,eax
+       jmp     skip_pattern
+      skip_quoted_string_in_pattern:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_pattern
+      pattern_skipped:
+       ret
+
+purge_macro:
+       xor     ch,ch
+       jmp     restore_preprocessor_symbol
+purge_struc:
+       mov     ch,1
+       jmp     restore_preprocessor_symbol
+restore_equ_constant:
+       mov     ch,10b
+      restore_preprocessor_symbol:
+       push    ecx
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_name
+       lods    byte [esi]
+       mov     cl,al
+       call    get_preprocessor_symbol
+       jc      no_symbol_to_restore
+       test    edx,edx
+       jz      symbol_restored
+       mov     dword [edx+4],0
+       jmp     symbol_restored
+      no_symbol_to_restore:
+       add     esi,ecx
+      symbol_restored:
+       pop     ecx
+       lods    byte [esi]
+       cmp     al,','
+       je      restore_preprocessor_symbol
+       or      al,al
+       jnz     extra_characters_on_line
+       jmp     line_preprocessed
+
+process_fix_constants:
+       mov     [value_type],11b
+       jmp     process_symbolic_constants
+process_equ_constants:
+       mov     [value_type],10b
+      process_symbolic_constants:
+       mov     ebp,esi
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      check_symbol
+       cmp     al,22h
+       je      ignore_string
+       cmp     al,'{'
+       je      check_brace
+       or      al,al
+       jnz     process_symbolic_constants
+       ret
+      ignore_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     process_symbolic_constants
+      check_brace:
+       test    [value_type],80h
+       jz      process_symbolic_constants
+       ret
+      no_replacing:
+       movzx   ecx,byte [esi-1]
+       add     esi,ecx
+       jmp     process_symbolic_constants
+      check_symbol:
+       mov     cl,[esi]
+       inc     esi
+       mov     ch,[value_type]
+       call    get_preprocessor_symbol
+       jc      no_replacing
+       mov     [current_section],edi
+      replace_symbolic_constant:
+       test    edx,edx
+       jz      replace_special_symbolic_constant
+       mov     ecx,[edx+12]
+       mov     edx,[edx+8]
+       xchg    esi,edx
+       call    move_data
+       mov     esi,edx
+      process_after_replaced:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      symbol_after_replaced
+       stos    byte [edi]
+       cmp     al,22h
+       je      string_after_replaced
+       cmp     al,'{'
+       je      brace_after_replaced
+       or      al,al
+       jnz     process_after_replaced
+       mov     ecx,edi
+       sub     ecx,esi
+       mov     edi,ebp
+       call    move_data
+       mov     esi,edi
+       ret
+      move_data:
+       lea     eax,[edi+ecx]
+       cmp     eax,[memory_end]
+       jae     out_of_memory
+       shr     ecx,1
+       jnc     movsb_ok
+       movs    byte [edi],[esi]
+      movsb_ok:
+       shr     ecx,1
+       jnc     movsw_ok
+       movs    word [edi],[esi]
+      movsw_ok:
+       rep     movs dword [edi],[esi]
+       ret
+      string_after_replaced:
+       lods    dword [esi]
+       stos    dword [edi]
+       mov     ecx,eax
+       call    move_data
+       jmp     process_after_replaced
+      brace_after_replaced:
+       test    [value_type],80h
+       jz      process_after_replaced
+       mov     edx,edi
+       mov     ecx,[current_section]
+       sub     edx,ecx
+       sub     ecx,esi
+       rep     movs byte [edi],[esi]
+       mov     ecx,edi
+       sub     ecx,esi
+       mov     edi,ebp
+       call    move_data
+       lea     esi,[ebp+edx]
+       ret
+      symbol_after_replaced:
+       mov     cl,[esi]
+       inc     esi
+       mov     ch,[value_type]
+       call    get_preprocessor_symbol
+       jnc     replace_symbolic_constant
+       movzx   ecx,byte [esi-1]
+       mov     al,1Ah
+       mov     ah,cl
+       stos    word [edi]
+       call    move_data
+       jmp     process_after_replaced
+      replace_special_symbolic_constant:
+       jmp     near eax
+    preprocessed_file_value:
+       call    get_current_line_from_file
+       test    ebx,ebx
+       jz      process_after_replaced
+       push    esi edi
+       mov     esi,[ebx]
+       mov     edi,esi
+       xor     al,al
+       or      ecx,-1
+       repne   scas byte [edi]
+       add     ecx,2
+       neg     ecx
+       pop     edi
+       lea     eax,[edi+1+4+ecx]
+       cmp     eax,[memory_end]
+       ja      out_of_memory
+       mov     al,22h
+       stos    byte [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       rep     movs byte [edi],[esi]
+       pop     esi
+       jmp     process_after_replaced
+    preprocessed_line_value:
+       call    get_current_line_from_file
+       test    ebx,ebx
+       jz      process_after_replaced
+       lea     eax,[edi+1+4+20]
+       cmp     eax,[memory_end]
+       ja      out_of_memory
+       mov     ecx,[ebx+4]
+       call    store_number_symbol
+       jmp     process_after_replaced
+    get_current_line_from_file:
+       mov     ebx,[current_line]
+      find_line_from_file:
+       test    ebx,ebx
+       jz      line_from_file_found
+       test    byte [ebx+7],80h
+       jz      line_from_file_found
+       mov     ebx,[ebx+8]
+       jmp     find_line_from_file
+      line_from_file_found:
+       ret
+
+process_macro_operators:
+       xor     dl,dl
+       mov     ebp,edi
+      before_macro_operators:
+       mov     edi,esi
+       lods    byte [esi]
+       cmp     al,'`'
+       je      symbol_conversion
+       cmp     al,'#'
+       je      concatenation
+       cmp     al,1Ah
+       je      symbol_before_macro_operators
+       cmp     al,3Bh
+       je      no_more_macro_operators
+       cmp     al,22h
+       je      string_before_macro_operators
+       xor     dl,dl
+       or      al,al
+       jnz     before_macro_operators
+       mov     edi,esi
+       ret
+      no_more_macro_operators:
+       mov     edi,ebp
+       ret
+      symbol_before_macro_operators:
+       mov     dl,1Ah
+       mov     ebx,esi
+       lods    byte [esi]
+       movzx   ecx,al
+       jecxz   symbol_before_macro_operators_ok
+       mov     edi,esi
+       cmp     byte [esi],'\'
+       je      escaped_symbol
+      symbol_before_macro_operators_ok:
+       add     esi,ecx
+       jmp     before_macro_operators
+      string_before_macro_operators:
+       mov     dl,22h
+       mov     ebx,esi
+       lods    dword [esi]
+       add     esi,eax
+       jmp     before_macro_operators
+      escaped_symbol:
+       dec     byte [edi-1]
+       dec     ecx
+       inc     esi
+       cmp     ecx,1
+       rep     movs byte [edi],[esi]
+       jne     after_macro_operators
+       mov     al,[esi-1]
+       mov     ecx,ebx
+       mov     ebx,characters
+       xlat    byte [ebx]
+       mov     ebx,ecx
+       or      al,al
+       jnz     after_macro_operators
+       sub     edi,3
+       mov     al,[esi-1]
+       stos    byte [edi]
+       xor     dl,dl
+       jmp     after_macro_operators
+      reduce_symbol_conversion:
+       inc     esi
+      symbol_conversion:
+       mov     edx,esi
+       mov     al,[esi]
+       cmp     al,1Ah
+       jne     symbol_character_conversion
+       lods    word [esi]
+       movzx   ecx,ah
+       lea     ebx,[edi+3]
+       jecxz   convert_to_quoted_string
+       cmp     byte [esi],'\'
+       jne     convert_to_quoted_string
+       inc     esi
+       dec     ecx
+       dec     ebx
+       jmp     convert_to_quoted_string
+      symbol_character_conversion:
+       cmp     al,22h
+       je      after_macro_operators
+       cmp     al,'`'
+       je      reduce_symbol_conversion
+       lea     ebx,[edi+5]
+       xor     ecx,ecx
+       or      al,al
+       jz      convert_to_quoted_string
+       cmp     al,'#'
+       je      convert_to_quoted_string
+       inc     ecx
+      convert_to_quoted_string:
+       sub     ebx,edx
+       ja      shift_line_data
+       mov     al,22h
+       mov     dl,al
+       stos    byte [edi]
+       mov     ebx,edi
+       mov     eax,ecx
+       stos    dword [edi]
+       rep     movs byte [edi],[esi]
+       cmp     edi,esi
+       je      before_macro_operators
+       jmp     after_macro_operators
+      shift_line_data:
+       push    ecx
+       mov     edx,esi
+       lea     esi,[ebp-1]
+       add     ebp,ebx
+       lea     edi,[ebp-1]
+       lea     ecx,[esi+1]
+       sub     ecx,edx
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       pop     eax
+       sub     edi,3
+       mov     dl,22h
+       mov     [edi-1],dl
+       mov     ebx,edi
+       mov     [edi],eax
+       lea     esi,[edi+4+eax]
+       jmp     before_macro_operators
+      concatenation:
+       cmp     dl,1Ah
+       je      symbol_concatenation
+       cmp     dl,22h
+       je      string_concatenation
+      no_concatenation:
+       cmp     esi,edi
+       je      before_macro_operators
+       jmp     after_macro_operators
+      symbol_concatenation:
+       cmp     byte [esi],1Ah
+       jne     no_concatenation
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       jecxz   do_symbol_concatenation
+       cmp     byte [esi],'\'
+       je      concatenate_escaped_symbol
+      do_symbol_concatenation:
+       add     [ebx],cl
+       jc      name_too_long
+       rep     movs byte [edi],[esi]
+       jmp     after_macro_operators
+      concatenate_escaped_symbol:
+       inc     esi
+       dec     ecx
+       jz      do_symbol_concatenation
+       movzx   eax,byte [esi]
+       cmp     byte [characters+eax],0
+       jne     do_symbol_concatenation
+       sub     esi,3
+       jmp     no_concatenation
+      string_concatenation:
+       cmp     byte [esi],22h
+       je      do_string_concatenation
+       cmp     byte [esi],'`'
+       jne     no_concatenation
+      concatenate_converted_symbol:
+       inc     esi
+       mov     al,[esi]
+       cmp     al,'`'
+       je      concatenate_converted_symbol
+       cmp     al,22h
+       je      do_string_concatenation
+       cmp     al,1Ah
+       jne     concatenate_converted_symbol_character
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       jecxz   finish_concatenating_converted_symbol
+       cmp     byte [esi],'\'
+       jne     finish_concatenating_converted_symbol
+       inc     esi
+       dec     ecx
+      finish_concatenating_converted_symbol:
+       add     [ebx],ecx
+       rep     movs byte [edi],[esi]
+       jmp     after_macro_operators
+      concatenate_converted_symbol_character:
+       or      al,al
+       jz      after_macro_operators
+       cmp     al,'#'
+       je      after_macro_operators
+       inc     dword [ebx]
+       movs    byte [edi],[esi]
+       jmp     after_macro_operators
+      do_string_concatenation:
+       inc     esi
+       lods    dword [esi]
+       mov     ecx,eax
+       add     [ebx],eax
+       rep     movs byte [edi],[esi]
+      after_macro_operators:
+       lods    byte [esi]
+       cmp     al,'`'
+       je      symbol_conversion
+       cmp     al,'#'
+       je      concatenation
+       stos    byte [edi]
+       cmp     al,1Ah
+       je      symbol_after_macro_operators
+       cmp     al,3Bh
+       je      no_more_macro_operators
+       cmp     al,22h
+       je      string_after_macro_operators
+       xor     dl,dl
+       or      al,al
+       jnz     after_macro_operators
+       ret
+      symbol_after_macro_operators:
+       mov     dl,1Ah
+       mov     ebx,edi
+       lods    byte [esi]
+       stos    byte [edi]
+       movzx   ecx,al
+       jecxz   symbol_after_macro_operatorss_ok
+       cmp     byte [esi],'\'
+       je      escaped_symbol
+      symbol_after_macro_operatorss_ok:
+       rep     movs byte [edi],[esi]
+       jmp     after_macro_operators
+      string_after_macro_operators:
+       mov     dl,22h
+       mov     ebx,edi
+       lods    dword [esi]
+       stos    dword [edi]
+       mov     ecx,eax
+       rep     movs byte [edi],[esi]
+       jmp     after_macro_operators
+
+use_macro:
+       push    [free_additional_memory]
+       push    [macro_symbols]
+       mov     [macro_symbols],0
+       push    [counter_limit]
+       push    dword [edx+4]
+       mov     dword [edx+4],1
+       push    edx
+       mov     ebx,esi
+       mov     esi,[edx+8]
+       mov     eax,[edx+12]
+       mov     [macro_line],eax
+       mov     [counter_limit],0
+       xor     ebp,ebp
+      process_macro_arguments:
+       mov     al,[esi]
+       or      al,al
+       jz      arguments_end
+       cmp     al,'{'
+       je      arguments_end
+       inc     esi
+       cmp     al,'['
+       jne     get_macro_arguments
+       mov     ebp,esi
+       inc     esi
+       inc     [counter_limit]
+      get_macro_arguments:
+       call    get_macro_argument
+       lods    byte [esi]
+       cmp     al,','
+       je      next_argument
+       cmp     al,']'
+       je      next_arguments_group
+       cmp     al,'&'
+       je      arguments_end
+       dec     esi
+       jmp     arguments_end
+      next_argument:
+       cmp     byte [ebx],','
+       jne     process_macro_arguments
+       inc     ebx
+       jmp     process_macro_arguments
+      next_arguments_group:
+       cmp     byte [ebx],','
+       jne     arguments_end
+       inc     ebx
+       inc     [counter_limit]
+       mov     esi,ebp
+       jmp     process_macro_arguments
+      get_macro_argument:
+       lods    byte [esi]
+       movzx   ecx,al
+       mov     eax,[counter_limit]
+       call    add_macro_symbol
+       add     esi,ecx
+       xor     eax,eax
+       mov     [default_argument_value],eax
+       cmp     byte [esi],'*'
+       je      required_value
+       cmp     byte [esi],':'
+       je      get_default_value
+       cmp     byte [esi],'='
+       jne     default_value_ok
+      get_default_value:
+       inc     esi
+       mov     [default_argument_value],esi
+       or      [skip_default_argument_value],-1
+       call    skip_macro_argument_value
+       jmp     default_value_ok
+      required_value:
+       inc     esi
+       or      [default_argument_value],-1
+      default_value_ok:
+       xchg    esi,ebx
+       mov     [edx+12],esi
+       mov     [skip_default_argument_value],0
+       cmp     byte [ebx],'&'
+       je      greedy_macro_argument
+       call    skip_macro_argument_value
+       call    finish_macro_argument
+       jmp     got_macro_argument
+      greedy_macro_argument:
+       call    skip_foreign_line
+       dec     esi
+       mov     eax,[edx+12]
+       mov     ecx,esi
+       sub     ecx,eax
+       mov     [edx+8],ecx
+      got_macro_argument:
+       xchg    esi,ebx
+       cmp     dword [edx+8],0
+       jne     macro_argument_ok
+       mov     eax,[default_argument_value]
+       or      eax,eax
+       jz      macro_argument_ok
+       cmp     eax,-1
+       je      invalid_macro_arguments
+       mov     [edx+12],eax
+       call    finish_macro_argument
+      macro_argument_ok:
+       ret
+      finish_macro_argument:
+       mov     eax,[edx+12]
+       mov     ecx,esi
+       sub     ecx,eax
+       cmp     byte [eax],'<'
+       jne     argument_value_length_ok
+       inc     dword [edx+12]
+       sub     ecx,2
+       or      ecx,80000000h
+      argument_value_length_ok:
+       mov     [edx+8],ecx
+       ret
+      arguments_end:
+       cmp     byte [ebx],0
+       jne     invalid_macro_arguments
+       mov     eax,[esp+4]
+       dec     eax
+       call    process_macro
+       pop     edx
+       pop     dword [edx+4]
+       pop     [counter_limit]
+       pop     [macro_symbols]
+       pop     [free_additional_memory]
+       jmp     line_preprocessed
+use_instant_macro:
+       push    edi
+       push    [current_line]
+       push    esi
+       mov     eax,[error_line]
+       mov     [current_line],eax
+       mov     [macro_line],eax
+       mov     esi,[instant_macro_start]
+       cmp     [base_code],10h
+       jae     do_match
+       cmp     [base_code],0
+       jne     do_irp
+       call    precalculate_value
+       cmp     eax,0
+       jl      value_out_of_range
+       push    [free_additional_memory]
+       push    [macro_symbols]
+       mov     [macro_symbols],0
+       push    [counter_limit]
+       mov     [struc_name],0
+       mov     [counter_limit],eax
+       lods    byte [esi]
+       or      al,al
+       jz      rept_counters_ok
+       cmp     al,'{'
+       je      rept_counters_ok
+       cmp     al,1Ah
+       jne     invalid_macro_arguments
+      add_rept_counter:
+       lods    byte [esi]
+       movzx   ecx,al
+       xor     eax,eax
+       call    add_macro_symbol
+       add     esi,ecx
+       xor     eax,eax
+       mov     dword [edx+12],eax
+       inc     eax
+       mov     dword [edx+8],eax
+       lods    byte [esi]
+       cmp     al,':'
+       jne     rept_counter_added
+       push    edx
+       call    precalculate_value
+       mov     edx,eax
+       add     edx,[counter_limit]
+       jo      value_out_of_range
+       pop     edx
+       mov     dword [edx+8],eax
+       lods    byte [esi]
+      rept_counter_added:
+       cmp     al,','
+       jne     rept_counters_ok
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_macro_arguments
+       jmp     add_rept_counter
+      rept_counters_ok:
+       dec     esi
+       cmp     [counter_limit],0
+       je      instant_macro_finish
+      instant_macro_parameters_ok:
+       xor     eax,eax
+       call    process_macro
+      instant_macro_finish:
+       pop     [counter_limit]
+       pop     [macro_symbols]
+       pop     [free_additional_memory]
+      instant_macro_done:
+       pop     ebx esi edx
+       cmp     byte [ebx],0
+       je      line_preprocessed
+       mov     [current_line],edi
+       mov     ecx,4
+       rep     movs dword [edi],[esi]
+       test    [macro_status],0Fh
+       jz      instant_macro_attached_line
+       mov     ax,3Bh
+       stos    word [edi]
+      instant_macro_attached_line:
+       mov     esi,ebx
+       sub     edx,ebx
+       mov     ecx,edx
+       call    move_data
+       jmp     initial_preprocessing_ok
+      precalculate_value:
+       push    edi
+       call    convert_expression
+       mov     al,')'
+       stosb
+       push    esi
+       mov     esi,[esp+4]
+       mov     [error_line],0
+       mov     [value_size],0
+       call    calculate_expression
+       cmp     [error_line],0
+       je      value_precalculated
+       jmp     [error]
+      value_precalculated:
+       mov     eax,[edi]
+       mov     ecx,[edi+4]
+       cdq
+       cmp     edx,ecx
+       jne     value_out_of_range
+       cmp     dl,[edi+13]
+       jne     value_out_of_range
+       pop     esi edi
+       ret
+do_irp:
+       cmp     byte [esi],1Ah
+       jne     invalid_macro_arguments
+       movzx   eax,byte [esi+1]
+       lea     esi,[esi+2+eax]
+       lods    byte [esi]
+       cmp     [base_code],1
+       ja      irps_name_ok
+       cmp     al,':'
+       je      irp_with_default_value
+       cmp     al,'='
+       je      irp_with_default_value
+       cmp     al,'*'
+       jne     irp_name_ok
+       lods    byte [esi]
+      irp_name_ok:
+       cmp     al,','
+       jne     invalid_macro_arguments
+       jmp     irp_parameters_start
+      irp_with_default_value:
+       xor     ebp,ebp
+       or      [skip_default_argument_value],-1
+       call    skip_macro_argument_value
+       cmp     byte [esi],','
+       jne     invalid_macro_arguments
+       inc     esi
+       jmp     irp_parameters_start
+      irps_name_ok:
+       cmp     al,','
+       jne     invalid_macro_arguments
+       cmp     [base_code],3
+       je      irp_parameters_start
+       mov     al,[esi]
+       or      al,al
+       jz      instant_macro_done
+       cmp     al,'{'
+       je      instant_macro_done
+      irp_parameters_start:
+       xor     eax,eax
+       push    [free_additional_memory]
+       push    [macro_symbols]
+       mov     [macro_symbols],eax
+       push    [counter_limit]
+       mov     [counter_limit],eax
+       mov     [struc_name],eax
+       cmp     [base_code],3
+       je      get_irpv_parameter
+       mov     ebx,esi
+       cmp     [base_code],2
+       je      get_irps_parameter
+       mov     edx,[parameters_end]
+       mov     al,[edx]
+       push    eax
+       mov     byte [edx],0
+      get_irp_parameter:
+       inc     [counter_limit]
+       mov     esi,[instant_macro_start]
+       inc     esi
+       call    get_macro_argument
+       cmp     byte [ebx],','
+       jne     irp_parameters_end
+       inc     ebx
+       jmp     get_irp_parameter
+      irp_parameters_end:
+       mov     esi,ebx
+       pop     eax
+       mov     [esi],al
+       jmp     instant_macro_parameters_ok
+      get_irps_parameter:
+       mov     esi,[instant_macro_start]
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       inc     [counter_limit]
+       mov     eax,[counter_limit]
+       call    add_macro_symbol
+       mov     [edx+12],ebx
+       cmp     byte [ebx],1Ah
+       je      irps_symbol
+       cmp     byte [ebx],22h
+       je      irps_quoted_string
+       mov     eax,1
+       jmp     irps_parameter_ok
+      irps_quoted_string:
+       mov     eax,[ebx+1]
+       add     eax,1+4
+       jmp     irps_parameter_ok
+      irps_symbol:
+       movzx   eax,byte [ebx+1]
+       add     eax,1+1
+      irps_parameter_ok:
+       mov     [edx+8],eax
+       add     ebx,eax
+       cmp     byte [ebx],0
+       je      irps_parameters_end
+       cmp     byte [ebx],'{'
+       jne     get_irps_parameter
+      irps_parameters_end:
+       mov     esi,ebx
+       jmp     instant_macro_parameters_ok
+      get_irpv_parameter:
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_macro_arguments
+       lods    byte [esi]
+       mov     ebp,esi
+       mov     cl,al
+       mov     ch,10b
+       call    get_preprocessor_symbol
+       jc      instant_macro_finish
+       test    edx,edx
+       jz      invalid_use_of_symbol
+       push    edx
+      mark_variable_value:
+       inc     [counter_limit]
+       mov     [edx+4],ebp
+      next_variable_value:
+       mov     edx,[edx]
+       or      edx,edx
+       jz      variable_values_marked
+       mov     eax,[edx+4]
+       cmp     eax,1
+       jbe     next_variable_value
+       mov     esi,ebp
+       movzx   ecx,byte [esi-1]
+       xchg    edi,eax
+       repe    cmps byte [esi],[edi]
+       xchg    edi,eax
+       je      mark_variable_value
+       jmp     next_variable_value
+      variable_values_marked:
+       pop     edx
+       push    [counter_limit]
+      add_irpv_value:
+       push    edx
+       mov     esi,[instant_macro_start]
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       mov     eax,[esp+4]
+       call    add_macro_symbol
+       mov     ebx,edx
+       pop     edx
+       mov     ecx,[edx+12]
+       mov     eax,[edx+8]
+       mov     [ebx+12],eax
+       mov     [ebx+8],ecx
+      collect_next_variable_value:
+       mov     edx,[edx]
+       or      edx,edx
+       jz      variable_values_collected
+       cmp     ebp,[edx+4]
+       jne     collect_next_variable_value
+       dec     dword [esp]
+       jnz     add_irpv_value
+      variable_values_collected:
+       pop     eax
+       mov     esi,ebp
+       movzx   ecx,byte [esi-1]
+       add     esi,ecx
+       cmp     byte [esi],0
+       je      instant_macro_parameters_ok
+       cmp     byte [esi],'{'
+       jne     invalid_macro_arguments
+       jmp     instant_macro_parameters_ok
+
+do_match:
+       mov     ebx,esi
+       call    skip_pattern
+       call    exact_match
+       mov     edx,edi
+       mov     al,[ebx]
+       cmp     al,1Ah
+       je      free_match
+       cmp     al,','
+       jne     instant_macro_done
+       cmp     esi,[parameters_end]
+       je      matched_pattern
+       jmp     instant_macro_done
+      free_match:
+       add     edx,12
+       cmp     edx,[memory_end]
+       ja      out_of_memory
+       mov     [edx-12],ebx
+       mov     [edx-8],esi
+       call    skip_match_element
+       jc      try_different_matching
+       mov     [edx-4],esi
+       movzx   eax,byte [ebx+1]
+       lea     ebx,[ebx+2+eax]
+       cmp     byte [ebx],1Ah
+       je      free_match
+      find_exact_match:
+       call    exact_match
+       cmp     esi,[parameters_end]
+       je      end_matching
+       cmp     byte [ebx],1Ah
+       je      free_match
+       mov     ebx,[edx-12]
+       movzx   eax,byte [ebx+1]
+       lea     ebx,[ebx+2+eax]
+       mov     esi,[edx-4]
+       jmp     match_more_elements
+      try_different_matching:
+       sub     edx,12
+       cmp     edx,edi
+       je      instant_macro_done
+       mov     ebx,[edx-12]
+       movzx   eax,byte [ebx+1]
+       lea     ebx,[ebx+2+eax]
+       cmp     byte [ebx],1Ah
+       je      try_different_matching
+       mov     esi,[edx-4]
+      match_more_elements:
+       call    skip_match_element
+       jc      try_different_matching
+       mov     [edx-4],esi
+       jmp     find_exact_match
+      skip_match_element:
+       cmp     esi,[parameters_end]
+       je      cannot_match
+       mov     al,[esi]
+       cmp     al,1Ah
+       je      skip_match_symbol
+       cmp     al,22h
+       je      skip_match_quoted_string
+       add     esi,1
+       ret
+      skip_match_quoted_string:
+       mov     eax,[esi+1]
+       add     esi,5
+       jmp     skip_match_ok
+      skip_match_symbol:
+       movzx   eax,byte [esi+1]
+       add     esi,2
+      skip_match_ok:
+       add     esi,eax
+       ret
+      cannot_match:
+       stc
+       ret
+      exact_match:
+       cmp     esi,[parameters_end]
+       je      exact_match_complete
+       mov     ah,[esi]
+       mov     al,[ebx]
+       cmp     al,','
+       je      exact_match_complete
+       cmp     al,1Ah
+       je      exact_match_complete
+       cmp     al,'='
+       je      match_verbatim
+       call    match_elements
+       je      exact_match
+      exact_match_complete:
+       ret
+      match_verbatim:
+       inc     ebx
+       call    match_elements
+       je      exact_match
+       dec     ebx
+       ret
+      match_elements:
+       mov     al,[ebx]
+       cmp     al,1Ah
+       je      match_symbols
+       cmp     al,22h
+       je      match_quoted_strings
+       cmp     al,ah
+       je      symbol_characters_matched
+       ret
+      symbol_characters_matched:
+       lea     ebx,[ebx+1]
+       lea     esi,[esi+1]
+       ret
+      match_quoted_strings:
+       mov     ecx,[ebx+1]
+       add     ecx,5
+       jmp     compare_elements
+      match_symbols:
+       movzx   ecx,byte [ebx+1]
+       add     ecx,2
+      compare_elements:
+       mov     eax,esi
+       mov     ebp,edi
+       mov     edi,ebx
+       repe    cmps byte [esi],[edi]
+       jne     elements_mismatch
+       mov     ebx,edi
+       mov     edi,ebp
+       ret
+      elements_mismatch:
+       mov     esi,eax
+       mov     edi,ebp
+       ret
+      end_matching:
+       cmp     byte [ebx],','
+       jne     instant_macro_done
+      matched_pattern:
+       xor     eax,eax
+       push    [free_additional_memory]
+       push    [macro_symbols]
+       mov     [macro_symbols],eax
+       push    [counter_limit]
+       mov     [counter_limit],eax
+       mov     [struc_name],eax
+       push    esi edi edx
+      add_matched_symbol:
+       cmp     edi,[esp]
+       je      matched_symbols_ok
+       mov     esi,[edi]
+       inc     esi
+       lods    byte [esi]
+       movzx   ecx,al
+       xor     eax,eax
+       call    add_macro_symbol
+       mov     eax,[edi+4]
+       mov     dword [edx+12],eax
+       mov     ecx,[edi+8]
+       sub     ecx,eax
+       mov     dword [edx+8],ecx
+       add     edi,12
+       jmp     add_matched_symbol
+      matched_symbols_ok:
+       pop     edx edi esi
+       jmp     instant_macro_parameters_ok
+
+process_macro:
+       push    dword [macro_status]
+       or      [macro_status],10h
+       push    [counter]
+       push    [macro_block]
+       push    [macro_block_line]
+       push    [macro_block_line_number]
+       push    [struc_label]
+       push    [struc_name]
+       push    eax
+       push    [current_line]
+       lods    byte [esi]
+       cmp     al,'{'
+       je      macro_instructions_start
+       or      al,al
+       jnz     unexpected_characters
+      find_macro_instructions:
+       mov     [macro_line],esi
+       add     esi,16+2
+       lods    byte [esi]
+       or      al,al
+       jz      find_macro_instructions
+       cmp     al,'{'
+       je      macro_instructions_start
+       cmp     al,3Bh
+       jne     unexpected_characters
+       call    skip_foreign_symbol
+       jmp     find_macro_instructions
+      macro_instructions_start:
+       mov     ecx,80000000h
+       mov     [macro_block],esi
+       mov     eax,[macro_line]
+       mov     [macro_block_line],eax
+       mov     [macro_block_line_number],ecx
+       xor     eax,eax
+       mov     [counter],eax
+       cmp     [counter_limit],eax
+       je      process_macro_line
+       inc     [counter]
+      process_macro_line:
+       lods    byte [esi]
+       or      al,al
+       jz      process_next_line
+       cmp     al,'}'
+       je      macro_block_processed
+       dec     esi
+       mov     [current_line],edi
+       lea     eax,[edi+10h]
+       cmp     eax,[memory_end]
+       jae     out_of_memory
+       mov     eax,[esp+4]
+       or      eax,eax
+       jz      instant_macro_line_header
+       stos    dword [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       mov     eax,[esp]
+       stos    dword [edi]
+       mov     eax,[macro_line]
+       stos    dword [edi]
+       jmp     macro_line_header_ok
+      instant_macro_line_header:
+       mov     eax,[esp]
+       add     eax,16
+      find_defining_directive:
+       inc     eax
+       cmp     byte [eax-1],3Bh
+       je      defining_directive_ok
+       cmp     byte [eax-1],1Ah
+       jne     find_defining_directive
+       push    eax
+       movzx   eax,byte [eax]
+       inc     eax
+       add     [esp],eax
+       pop     eax
+       jmp     find_defining_directive
+      defining_directive_ok:
+       stos    dword [edi]
+       mov     eax,ecx
+       stos    dword [edi]
+       mov     eax,[macro_line]
+       stos    dword [edi]
+       stos    dword [edi]
+      macro_line_header_ok:
+       or      [macro_status],20h
+       push    ebx ecx
+       test    [macro_status],0Fh
+       jz      process_macro_line_element
+       mov     ax,3Bh
+       stos    word [edi]
+      process_macro_line_element:
+       lea     eax,[edi+100h]
+       cmp     eax,[memory_end]
+       jae     out_of_memory
+       lods    byte [esi]
+       cmp     al,'}'
+       je      macro_line_processed
+       or      al,al
+       jz      macro_line_processed
+       cmp     al,1Ah
+       je      process_macro_symbol
+       cmp     al,3Bh
+       je      macro_foreign_line
+       and     [macro_status],not 20h
+       stos    byte [edi]
+       cmp     al,22h
+       jne     process_macro_line_element
+      copy_macro_string:
+       mov     ecx,[esi]
+       add     ecx,4
+       call    move_data
+       jmp     process_macro_line_element
+      process_macro_symbol:
+       push    esi edi
+       test    [macro_status],20h
+       jz      not_macro_directive
+       movzx   ecx,byte [esi]
+       inc     esi
+       mov     edi,macro_directives
+       call    get_directive
+       jnc     process_macro_directive
+       dec     esi
+       jmp     not_macro_directive
+      process_macro_directive:
+       mov     edx,eax
+       pop     edi eax
+       mov     byte [edi],0
+       inc     edi
+       pop     ecx ebx
+       jmp     near edx
+      not_macro_directive:
+       and     [macro_status],not 20h
+       movzx   ecx,byte [esi]
+       inc     esi
+       mov     eax,[counter]
+       call    get_macro_symbol
+       jnc     group_macro_symbol
+       xor     eax,eax
+       cmp     [counter],eax
+       je      multiple_macro_symbol_values
+       call    get_macro_symbol
+       jc      not_macro_symbol
+      replace_macro_symbol:
+       pop     edi eax
+       mov     ecx,[edx+8]
+       mov     edx,[edx+12]
+       or      edx,edx
+       jz      replace_macro_counter
+       and     ecx,not 80000000h
+       xchg    esi,edx
+       call    move_data
+       mov     esi,edx
+       jmp     process_macro_line_element
+      group_macro_symbol:
+       xor     eax,eax
+       cmp     [counter],eax
+       je      replace_macro_symbol
+       push    esi edx
+       sub     esi,ecx
+       call    get_macro_symbol
+       mov     ebx,edx
+       pop     edx esi
+       jc      replace_macro_symbol
+       cmp     edx,ebx
+       ja      replace_macro_symbol
+       mov     edx,ebx
+       jmp     replace_macro_symbol
+      multiple_macro_symbol_values:
+       inc     eax
+       push    eax
+       call    get_macro_symbol
+       pop     eax
+       jc      not_macro_symbol
+       pop     edi
+       push    ecx
+       mov     ecx,[edx+8]
+       mov     edx,[edx+12]
+       xchg    esi,edx
+       btr     ecx,31
+       jc      enclose_macro_symbol_value
+       rep     movs byte [edi],[esi]
+       jmp     macro_symbol_value_ok
+      enclose_macro_symbol_value:
+       mov     byte [edi],'<'
+       inc     edi
+       rep     movs byte [edi],[esi]
+       mov     byte [edi],'>'
+       inc     edi
+      macro_symbol_value_ok:
+       cmp     eax,[counter_limit]
+       je      multiple_macro_symbol_values_ok
+       mov     byte [edi],','
+       inc     edi
+       mov     esi,edx
+       pop     ecx
+       push    edi
+       sub     esi,ecx
+       jmp     multiple_macro_symbol_values
+      multiple_macro_symbol_values_ok:
+       pop     ecx eax
+       mov     esi,edx
+       jmp     process_macro_line_element
+      replace_macro_counter:
+       mov     eax,[counter]
+       and     eax,not 80000000h
+       jz      group_macro_counter
+       add     ecx,eax
+       dec     ecx
+       call    store_number_symbol
+       jmp     process_macro_line_element
+      group_macro_counter:
+       mov     edx,ecx
+       xor     ecx,ecx
+      multiple_macro_counter_values:
+       push    ecx edx
+       add     ecx,edx
+       call    store_number_symbol
+       pop     edx ecx
+       inc     ecx
+       cmp     ecx,[counter_limit]
+       je      process_macro_line_element
+       mov     byte [edi],','
+       inc     edi
+       jmp     multiple_macro_counter_values
+      store_number_symbol:
+       cmp     ecx,0
+       jge     numer_symbol_sign_ok
+       neg     ecx
+       mov     al,'-'
+       stos    byte [edi]
+      numer_symbol_sign_ok:
+       mov     ax,1Ah
+       stos    word [edi]
+       push    edi
+       mov     eax,ecx
+       mov     ecx,1000000000
+       xor     edx,edx
+       xor     bl,bl
+      store_number_digits:
+       div     ecx
+       push    edx
+       or      bl,bl
+       jnz     store_number_digit
+       cmp     ecx,1
+       je      store_number_digit
+       or      al,al
+       jz      number_digit_ok
+       not     bl
+      store_number_digit:
+       add     al,30h
+       stos    byte [edi]
+      number_digit_ok:
+       mov     eax,ecx
+       xor     edx,edx
+       mov     ecx,10
+       div     ecx
+       mov     ecx,eax
+       pop     eax
+       or      ecx,ecx
+       jnz     store_number_digits
+       pop     ebx
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-1],al
+       ret
+      not_macro_symbol:
+       pop     edi esi
+       mov     al,1Ah
+       stos    byte [edi]
+       mov     al,[esi]
+       inc     esi
+       stos    byte [edi]
+       cmp     byte [esi],'.'
+       jne     copy_raw_symbol
+       mov     ebx,[esp+8+8]
+       or      ebx,ebx
+       jz      copy_raw_symbol
+       cmp     al,1
+       je      copy_struc_name
+       xchg    esi,ebx
+       movzx   ecx,byte [esi-1]
+       add     [edi-1],cl
+       jc      name_too_long
+       rep     movs byte [edi],[esi]
+       xchg    esi,ebx
+      copy_raw_symbol:
+       movzx   ecx,al
+       rep     movs byte [edi],[esi]
+       jmp     process_macro_line_element
+      copy_struc_name:
+       inc     esi
+       xchg    esi,ebx
+       movzx   ecx,byte [esi-1]
+       mov     [edi-1],cl
+       rep     movs byte [edi],[esi]
+       xchg    esi,ebx
+       mov     eax,[esp+8+12]
+       cmp     byte [eax],3Bh
+       je      process_macro_line_element
+       cmp     byte [eax],1Ah
+       jne     disable_replaced_struc_name
+       mov     byte [eax],3Bh
+       jmp     process_macro_line_element
+      disable_replaced_struc_name:
+       mov     ebx,[esp+8+8]
+       push    esi edi
+       lea     edi,[ebx-3]
+       lea     esi,[edi-2]
+       lea     ecx,[esi+1]
+       sub     ecx,eax
+       std
+       rep     movs byte [edi],[esi]
+       cld
+       mov     word [eax],3Bh
+       pop     edi esi
+       jmp     process_macro_line_element
+      skip_foreign_symbol:
+       lods    byte [esi]
+       movzx   eax,al
+       add     esi,eax
+      skip_foreign_line:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      skip_foreign_symbol
+       cmp     al,3Bh
+       je      skip_foreign_symbol
+       cmp     al,22h
+       je      skip_foreign_string
+       or      al,al
+       jnz     skip_foreign_line
+       ret
+      skip_foreign_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_foreign_line
+      macro_foreign_line:
+       call    skip_foreign_symbol
+      macro_line_processed:
+       mov     byte [edi],0
+       inc     edi
+       push    eax
+       call    preprocess_line
+       pop     eax
+       pop     ecx ebx
+       cmp     al,'}'
+       je      macro_block_processed
+      process_next_line:
+       inc     ecx
+       mov     [macro_line],esi
+       add     esi,16+2
+       jmp     process_macro_line
+      macro_block_processed:
+       call    close_macro_block
+       jc      process_macro_line
+       pop     [current_line]
+       add     esp,12
+       pop     [macro_block_line_number]
+       pop     [macro_block_line]
+       pop     [macro_block]
+       pop     [counter]
+       pop     eax
+       and     al,0F0h
+       and     [macro_status],0Fh
+       or      [macro_status],al
+       ret
+
+local_symbols:
+       lods    byte [esi]
+       cmp     al,1Ah
+       jne     invalid_argument
+       mov     byte [edi-1],3Bh
+       xor     al,al
+       stos    byte [edi]
+      make_local_symbol:
+       push    ecx
+       lods    byte [esi]
+       movzx   ecx,al
+       mov     eax,[counter]
+       call    add_macro_symbol
+       mov     [edx+12],edi
+       movzx   eax,[locals_counter]
+       add     eax,ecx
+       inc     eax
+       cmp     eax,100h
+       jae     name_too_long
+       lea     ebp,[edi+2+eax]
+       cmp     ebp,[memory_end]
+       jae     out_of_memory
+       mov     ah,al
+       mov     al,1Ah
+       stos    word [edi]
+       rep     movs byte [edi],[esi]
+       mov     al,'?'
+       stos    byte [edi]
+       push    esi
+       mov     esi,locals_counter+1
+       movzx   ecx,[locals_counter]
+       rep     movs byte [edi],[esi]
+       pop     esi
+       mov     eax,edi
+       sub     eax,[edx+12]
+       mov     [edx+8],eax
+       xor     al,al
+       stos    byte [edi]
+       mov     eax,locals_counter
+       movzx   ecx,byte [eax]
+      counter_loop:
+       inc     byte [eax+ecx]
+       cmp     byte [eax+ecx],'9'+1
+       jb      counter_ok
+       jne     letter_digit
+       mov     byte [eax+ecx],'A'
+       jmp     counter_ok
+      letter_digit:
+       cmp     byte [eax+ecx],'Z'+1
+       jb      counter_ok
+       jne     small_letter_digit
+       mov     byte [eax+ecx],'a'
+       jmp     counter_ok
+      small_letter_digit:
+       cmp     byte [eax+ecx],'z'+1
+       jb      counter_ok
+       mov     byte [eax+ecx],'0'
+       loop    counter_loop
+       inc     byte [eax]
+       movzx   ecx,byte [eax]
+       mov     byte [eax+ecx],'0'
+      counter_ok:
+       pop     ecx
+       lods    byte [esi]
+       cmp     al,'}'
+       je      macro_block_processed
+       or      al,al
+       jz      process_next_line
+       cmp     al,','
+       jne     extra_characters_on_line
+       dec     edi
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      make_local_symbol
+       jmp     invalid_argument
+common_block:
+       call    close_macro_block
+       jc      process_macro_line
+       mov     [counter],0
+       jmp     new_macro_block
+forward_block:
+       cmp     [counter_limit],0
+       je      common_block
+       call    close_macro_block
+       jc      process_macro_line
+       mov     [counter],1
+       jmp     new_macro_block
+reverse_block:
+       cmp     [counter_limit],0
+       je      common_block
+       call    close_macro_block
+       jc      process_macro_line
+       mov     eax,[counter_limit]
+       or      eax,80000000h
+       mov     [counter],eax
+      new_macro_block:
+       mov     [macro_block],esi
+       mov     eax,[macro_line]
+       mov     [macro_block_line],eax
+       mov     [macro_block_line_number],ecx
+       jmp     process_macro_line
+close_macro_block:
+       cmp     esi,[macro_block]
+       je      block_closed
+       cmp     [counter],0
+       je      block_closed
+       jl      reverse_counter
+       mov     eax,[counter]
+       cmp     eax,[counter_limit]
+       je      block_closed
+       inc     [counter]
+       jmp     continue_block
+      reverse_counter:
+       mov     eax,[counter]
+       dec     eax
+       cmp     eax,80000000h
+       je      block_closed
+       mov     [counter],eax
+      continue_block:
+       mov     esi,[macro_block]
+       mov     eax,[macro_block_line]
+       mov     [macro_line],eax
+       mov     ecx,[macro_block_line_number]
+       stc
+       ret
+      block_closed:
+       clc
+       ret
+get_macro_symbol:
+       push    ecx
+       call    find_macro_symbol_leaf
+       jc      macro_symbol_not_found
+       mov     edx,[ebx]
+       mov     ebx,esi
+      try_macro_symbol:
+       or      edx,edx
+       jz      macro_symbol_not_found
+       mov     ecx,[esp]
+       mov     edi,[edx+4]
+       repe    cmps byte [esi],[edi]
+       je      macro_symbol_found
+       mov     esi,ebx
+       mov     edx,[edx]
+       jmp     try_macro_symbol
+      macro_symbol_found:
+       pop     ecx
+       clc
+       ret
+      macro_symbol_not_found:
+       pop     ecx
+       stc
+       ret
+      find_macro_symbol_leaf:
+       shl     eax,8
+       mov     al,cl
+       mov     ebp,eax
+       mov     ebx,macro_symbols
+      follow_macro_symbols_tree:
+       mov     edx,[ebx]
+       or      edx,edx
+       jz      no_such_macro_symbol
+       xor     eax,eax
+       shr     ebp,1
+       adc     eax,0
+       lea     ebx,[edx+eax*4]
+       or      ebp,ebp
+       jnz     follow_macro_symbols_tree
+       add     ebx,8
+       clc
+       ret
+      no_such_macro_symbol:
+       stc
+       ret
+add_macro_symbol:
+       push    ebx ebp
+       call    find_macro_symbol_leaf
+       jc      extend_macro_symbol_tree
+       mov     eax,[ebx]
+      make_macro_symbol:
+       mov     edx,[free_additional_memory]
+       add     edx,16
+       cmp     edx,[labels_list]
+       ja      out_of_memory
+       xchg    edx,[free_additional_memory]
+       mov     [ebx],edx
+       mov     [edx],eax
+       mov     [edx+4],esi
+       pop     ebp ebx
+       ret
+      extend_macro_symbol_tree:
+       mov     edx,[free_additional_memory]
+       add     edx,16
+       cmp     edx,[labels_list]
+       ja      out_of_memory
+       xchg    edx,[free_additional_memory]
+       xor     eax,eax
+       mov     [edx],eax
+       mov     [edx+4],eax
+       mov     [edx+8],eax
+       mov     [edx+12],eax
+       shr     ebp,1
+       adc     eax,0
+       mov     [ebx],edx
+       lea     ebx,[edx+eax*4]
+       or      ebp,ebp
+       jnz     extend_macro_symbol_tree
+       add     ebx,8
+       xor     eax,eax
+       jmp     make_macro_symbol
+
+include_file:
+       lods    byte [esi]
+       cmp     al,22h
+       jne     invalid_argument
+       lods    dword [esi]
+       cmp     byte [esi+eax],0
+       jne     extra_characters_on_line
+       push    esi
+       push    edi
+       mov     ebx,[current_line]
+      find_current_file_path:
+       mov     esi,[ebx]
+       test    byte [ebx+7],80h
+       jz      copy_current_file_path
+       mov     ebx,[ebx+8]
+       jmp     find_current_file_path
+      copy_current_file_path:
+       lods    byte [esi]
+       stos    byte [edi]
+       or      al,al
+       jnz     copy_current_file_path
+      cut_current_file_name:
+       cmp     edi,[esp]
+       je      current_file_path_ok
+       cmp     byte [edi-1],'\'
+       je      current_file_path_ok
+       cmp     byte [edi-1],'/'
+       je      current_file_path_ok
+       dec     edi
+       jmp     cut_current_file_name
+      current_file_path_ok:
+       mov     esi,[esp+4]
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       jnc     include_path_ok
+       mov     ebp,[include_paths]
+      try_include_directories:
+       mov     edi,esi
+       mov     esi,ebp
+       cmp     byte [esi],0
+       je      try_in_current_directory
+       push    ebp
+       push    edi
+       call    get_include_directory
+       mov     [esp+4],esi
+       mov     esi,[esp+8]
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       pop     ebp
+       jnc     include_path_ok
+       jmp     try_include_directories
+       mov     edi,esi
+      try_in_current_directory:
+       mov     esi,[esp]
+       push    edi
+       call    expand_path
+       pop     edx
+       mov     esi,edx
+       call    open
+       jc      file_not_found
+      include_path_ok:
+       mov     edi,[esp]
+      copy_preprocessed_path:
+       lods    byte [esi]
+       stos    byte [edi]
+       or      al,al
+       jnz     copy_preprocessed_path
+       pop     esi
+       lea     ecx,[edi-1]
+       sub     ecx,esi
+       mov     [esi-4],ecx
+       push    dword [macro_status]
+       and     [macro_status],0Fh
+       call    preprocess_file
+       pop     eax
+       and     al,0F0h
+       and     [macro_status],0Fh
+       or      [macro_status],al
+       jmp     line_preprocessed
diff --git a/source/symbdump.inc b/source/symbdump.inc
new file mode 100644 (file)
index 0000000..c1abdad
--- /dev/null
@@ -0,0 +1,450 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+dump_symbols:
+       mov     edi,[code_start]
+       call    setup_dump_header
+       mov     esi,[input_file]
+       call    copy_asciiz
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-40h+0Ch],eax
+       mov     esi,[output_file]
+       call    copy_asciiz
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       mov     edx,[symbols_stream]
+       mov     ebp,[free_additional_memory]
+       and     [number_of_sections],0
+       cmp     [output_format],4
+       je      prepare_strings_table
+       cmp     [output_format],5
+       jne     strings_table_ready
+       bt      [format_flags],0
+       jc      strings_table_ready
+      prepare_strings_table:
+       cmp     edx,ebp
+       je      strings_table_ready
+       mov     al,[edx]
+       test    al,al
+       jz      prepare_string
+       cmp     al,80h
+       je      prepare_string
+       add     edx,0Ch
+       cmp     al,0C0h
+       jb      prepare_strings_table
+       add     edx,4
+       jmp     prepare_strings_table
+      prepare_string:
+       mov     esi,edi
+       sub     esi,ebx
+       xchg    esi,[edx+4]
+       test    al,al
+       jz      prepare_section_string
+       or      dword [edx+4],1 shl 31
+       add     edx,0Ch
+      prepare_external_string:
+       mov     ecx,[esi]
+       add     esi,4
+       rep     movs byte [edi],[esi]
+       mov     byte [edi],0
+       inc     edi
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       jmp     prepare_strings_table
+      prepare_section_string:
+       mov     ecx,[number_of_sections]
+       mov     eax,ecx
+       inc     eax
+       mov     [number_of_sections],eax
+       xchg    eax,[edx+4]
+       shl     ecx,2
+       add     ecx,[free_additional_memory]
+       mov     [ecx],eax
+       add     edx,20h
+       test    esi,esi
+       jz      prepare_default_section_string
+       cmp     [output_format],5
+       jne     prepare_external_string
+       bt      [format_flags],0
+       jc      prepare_external_string
+       mov     esi,[esi]
+       add     esi,[resource_data]
+      copy_elf_section_name:
+       lods    byte [esi]
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       stos    byte [edi]
+       test    al,al
+       jnz     copy_elf_section_name
+       jmp     prepare_strings_table
+      prepare_default_section_string:
+       mov     eax,'.fla'
+       stos    dword [edi]
+       mov     ax,'t'
+       stos    word [edi]
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       jmp     prepare_strings_table
+      strings_table_ready:
+       mov     edx,[tagged_blocks]
+       mov     ebp,[memory_end]
+       sub     ebp,[labels_list]
+       add     ebp,edx
+      prepare_labels_dump:
+       cmp     edx,ebp
+       je      labels_dump_ok
+       mov     eax,[edx+24]
+       test    eax,eax
+       jz      label_dump_name_ok
+       cmp     eax,[memory_start]
+       jb      label_name_outside_source
+       cmp     eax,[source_start]
+       ja      label_name_outside_source
+       sub     eax,[memory_start]
+       dec     eax
+       mov     [edx+24],eax
+       jmp     label_dump_name_ok
+      label_name_outside_source:
+       mov     esi,eax
+       mov     eax,edi
+       sub     eax,ebx
+       or      eax,1 shl 31
+       mov     [edx+24],eax
+       movzx   ecx,byte [esi-1]
+       lea     eax,[edi+ecx+1]
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       rep     movsb
+       xor     al,al
+       stosb
+      label_dump_name_ok:
+       mov     eax,[edx+28]
+       test    eax,eax
+       jz      label_dump_line_ok
+       sub     eax,[memory_start]
+       mov     [edx+28],eax
+      label_dump_line_ok:
+       test    byte [edx+9],4
+       jz      convert_base_symbol_for_label
+       xor     eax,eax
+       mov     [edx],eax
+       mov     [edx+4],eax
+       jmp     base_symbol_for_label_ok
+      convert_base_symbol_for_label:
+       mov     eax,[edx+20]
+       test    eax,eax
+       jz      base_symbol_for_label_ok
+       cmp     eax,[symbols_stream]
+       mov     eax,[eax+4]
+       jae     base_symbol_for_label_ok
+       xor     eax,eax
+      base_symbol_for_label_ok:
+       mov     [edx+20],eax
+       mov     ax,[current_pass]
+       cmp     ax,[edx+16]
+       je      label_defined_flag_ok
+       and     byte [edx+8],not 1
+      label_defined_flag_ok:
+       cmp     ax,[edx+18]
+       je      label_used_flag_ok
+       and     byte [edx+8],not 8
+      label_used_flag_ok:
+       add     edx,LABEL_STRUCTURE_SIZE
+       jmp     prepare_labels_dump
+      labels_dump_ok:
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-40h+14h],eax
+       add     eax,40h
+       mov     [ebx-40h+18h],eax
+       mov     ecx,[memory_end]
+       sub     ecx,[labels_list]
+       mov     [ebx-40h+1Ch],ecx
+       add     eax,ecx
+       mov     [ebx-40h+20h],eax
+       mov     ecx,[source_start]
+       sub     ecx,[memory_start]
+       mov     [ebx-40h+24h],ecx
+       add     eax,ecx
+       mov     [ebx-40h+28h],eax
+       mov     eax,[number_of_sections]
+       shl     eax,2
+       mov     [ebx-40h+34h],eax
+       call    prepare_preprocessed_source
+       mov     esi,[labels_list]
+       mov     ebp,edi
+      make_lines_dump:
+       cmp     esi,[tagged_blocks]
+       je      lines_dump_ok
+       mov     eax,[esi-4]
+       mov     ecx,[esi-8]
+       sub     esi,8
+       sub     esi,ecx
+       cmp     eax,1
+       je      process_line_dump
+       cmp     eax,2
+       jne     make_lines_dump
+       add     dword [ebx-40h+3Ch],8
+       jmp     make_lines_dump
+      process_line_dump:
+       push    ebx
+       mov     ebx,[esi+8]
+       mov     eax,[esi+4]
+       sub     eax,[code_start]
+       add     eax,[headers_size]
+       test    byte [ebx+0Ah],1
+       jz      store_offset
+       xor     eax,eax
+      store_offset:
+       stos    dword [edi]
+       mov     eax,[esi]
+       sub     eax,[memory_start]
+       stos    dword [edi]
+       mov     eax,[esi+4]
+       xor     edx,edx
+       xor     cl,cl
+       sub     eax,[ebx]
+       sbb     edx,[ebx+4]
+       sbb     cl,[ebx+8]
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       mov     eax,[ebx+10h]
+       stos    dword [edi]
+       mov     eax,[ebx+14h]
+       test    eax,eax
+       jz      base_symbol_for_line_ok
+       cmp     eax,[symbols_stream]
+       mov     eax,[eax+4]
+       jae     base_symbol_for_line_ok
+       xor     eax,eax
+      base_symbol_for_line_ok:
+       stos    dword [edi]
+       mov     al,[ebx+9]
+       stos    byte [edi]
+       mov     al,[esi+10h]
+       stos    byte [edi]
+       mov     al,[ebx+0Ah]
+       and     al,1
+       stos    byte [edi]
+       mov     al,cl
+       stos    byte [edi]
+       pop     ebx
+       cmp     edi,[tagged_blocks]
+       jae     out_of_memory
+       mov     eax,edi
+       sub     eax,1Ch
+       sub     eax,ebp
+       mov     [esi],eax
+       jmp     make_lines_dump
+      lines_dump_ok:
+       mov     edx,edi
+       mov     eax,[current_offset]
+       sub     eax,[code_start]
+       add     eax,[headers_size]
+       stos    dword [edi]
+       mov     ecx,edi
+       sub     ecx,ebx
+       sub     ecx,[ebx-40h+14h]
+       mov     [ebx-40h+2Ch],ecx
+       add     ecx,[ebx-40h+28h]
+       mov     [ebx-40h+30h],ecx
+       add     ecx,[ebx-40h+34h]
+       mov     [ebx-40h+38h],ecx
+      find_inexisting_offsets:
+       sub     edx,1Ch
+       cmp     edx,ebp
+       jb      write_symbols
+       test    byte [edx+1Ah],1
+       jnz     find_inexisting_offsets
+       cmp     eax,[edx]
+       jb      correct_inexisting_offset
+       mov     eax,[edx]
+       jmp     find_inexisting_offsets
+      correct_inexisting_offset:
+       and     dword [edx],0
+       or      byte [edx+1Ah],2
+       jmp     find_inexisting_offsets
+      write_symbols:
+       mov     edx,[symbols_file]
+       call    create
+       jc      write_failed
+       mov     edx,[code_start]
+       mov     ecx,[edx+14h]
+       add     ecx,40h
+       call    write
+       jc      write_failed
+       mov     edx,[tagged_blocks]
+       mov     ecx,[memory_end]
+       sub     ecx,[labels_list]
+       call    write
+       jc      write_failed
+       mov     edx,[memory_start]
+       mov     ecx,[source_start]
+       sub     ecx,edx
+       call    write
+       jc      write_failed
+       mov     edx,ebp
+       mov     ecx,edi
+       sub     ecx,edx
+       call    write
+       jc      write_failed
+       mov     edx,[free_additional_memory]
+       mov     ecx,[number_of_sections]
+       shl     ecx,2
+       call    write
+       jc      write_failed
+       mov     esi,[labels_list]
+       mov     edi,[memory_start]
+      make_references_dump:
+       cmp     esi,[tagged_blocks]
+       je      references_dump_ok
+       mov     eax,[esi-4]
+       mov     ecx,[esi-8]
+       sub     esi,8
+       sub     esi,ecx
+       cmp     eax,2
+       je      dump_reference
+       cmp     eax,1
+       jne     make_references_dump
+       mov     edx,[esi]
+       jmp     make_references_dump
+      dump_reference:
+       mov     eax,[memory_end]
+       sub     eax,[esi]
+       sub     eax,LABEL_STRUCTURE_SIZE
+       stosd
+       mov     eax,edx
+       stosd
+       cmp     edi,[tagged_blocks]
+       jb      make_references_dump
+       jmp     out_of_memory
+      references_dump_ok:
+       mov     edx,[memory_start]
+       mov     ecx,edi
+       sub     ecx,edx
+       call    write
+       jc      write_failed
+       call    close
+       ret
+      setup_dump_header:
+       xor     eax,eax
+       mov     ecx,40h shr 2
+       rep     stos dword [edi]
+       mov     ebx,edi
+       mov     dword [ebx-40h],'fas'+1Ah shl 24
+       mov     dword [ebx-40h+4],VERSION_MAJOR + VERSION_MINOR shl 8 + 40h shl 16
+       mov     dword [ebx-40h+10h],40h
+       ret
+prepare_preprocessed_source:
+       mov     esi,[memory_start]
+       mov     ebp,[source_start]
+       test    ebp,ebp
+       jnz     prepare_preprocessed_line
+       mov     ebp,[current_line]
+       inc     ebp
+      prepare_preprocessed_line:
+       cmp     esi,ebp
+       jae     preprocessed_source_ok
+       mov     eax,[memory_start]
+       mov     edx,[input_file]
+       cmp     [esi],edx
+       jne     line_not_from_main_input
+       mov     [esi],eax
+      line_not_from_main_input:
+       sub     [esi],eax
+       test    byte [esi+7],1 shl 7
+       jz      prepare_next_preprocessed_line
+       sub     [esi+8],eax
+       sub     [esi+12],eax
+      prepare_next_preprocessed_line:
+       call    skip_preprocessed_line
+       jmp     prepare_preprocessed_line
+      preprocessed_source_ok:
+       ret
+      skip_preprocessed_line:
+       add     esi,16
+      skip_preprocessed_line_content:
+       lods    byte [esi]
+       cmp     al,1Ah
+       je      skip_preprocessed_symbol
+       cmp     al,3Bh
+       je      skip_preprocessed_symbol
+       cmp     al,22h
+       je      skip_preprocessed_string
+       or      al,al
+       jnz     skip_preprocessed_line_content
+       ret
+      skip_preprocessed_string:
+       lods    dword [esi]
+       add     esi,eax
+       jmp     skip_preprocessed_line_content
+      skip_preprocessed_symbol:
+       lods    byte [esi]
+       movzx   eax,al
+       add     esi,eax
+       jmp     skip_preprocessed_line_content
+restore_preprocessed_source:
+       mov     esi,[memory_start]
+       mov     ebp,[source_start]
+       test    ebp,ebp
+       jnz     restore_preprocessed_line
+       mov     ebp,[current_line]
+       inc     ebp
+      restore_preprocessed_line:
+       cmp     esi,ebp
+       jae     preprocessed_source_restored
+       mov     eax,[memory_start]
+       add     [esi],eax
+       cmp     [esi],eax
+       jne     preprocessed_line_source_restored
+       mov     edx,[input_file]
+       mov     [esi],edx
+      preprocessed_line_source_restored:
+       test    byte [esi+7],1 shl 7
+       jz      restore_next_preprocessed_line
+       add     [esi+8],eax
+       add     [esi+12],eax
+      restore_next_preprocessed_line:
+       call    skip_preprocessed_line
+       jmp     restore_preprocessed_line
+      preprocessed_source_restored:
+       ret
+dump_preprocessed_source:
+       mov     edi,[free_additional_memory]
+       call    setup_dump_header
+       mov     esi,[input_file]
+       call    copy_asciiz
+       cmp     edi,[additional_memory_end]
+       jae     out_of_memory
+       mov     eax,edi
+       sub     eax,ebx
+       dec     eax
+       mov     [ebx-40h+0Ch],eax
+       mov     eax,edi
+       sub     eax,ebx
+       mov     [ebx-40h+14h],eax
+       add     eax,40h
+       mov     [ebx-40h+20h],eax
+       call    prepare_preprocessed_source
+       sub     esi,[memory_start]
+       mov     [ebx-40h+24h],esi
+       mov     edx,[symbols_file]
+       call    create
+       jc      write_failed
+       mov     edx,[free_additional_memory]
+       mov     ecx,[edx+14h]
+       add     ecx,40h
+       call    write
+       jc      write_failed
+       mov     edx,[memory_start]
+       mov     ecx,esi
+       call    write
+       jc      write_failed
+       call    close
+       ret
diff --git a/source/tables.inc b/source/tables.inc
new file mode 100644 (file)
index 0000000..bc104a0
--- /dev/null
@@ -0,0 +1,4393 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+include_variable db 'INCLUDE',0
+
+symbol_characters db 27
+ db 9,0Ah,0Dh,1Ah,20h,'+-/*=<>()[]{}:,|&~#`;\'
+
+preprocessor_directives:
+ db 6,'define'
+ dw define_symbolic_constant-directive_handler
+ db 7,'include'
+ dw include_file-directive_handler
+ db 3,'irp'
+ dw irp_directive-directive_handler
+ db 4,'irps'
+ dw irps_directive-directive_handler
+ db 4,'irpv'
+ dw irpv_directive-directive_handler
+ db 5,'macro'
+ dw define_macro-directive_handler
+ db 5,'match'
+ dw match_directive-directive_handler
+ db 8,'postpone'
+ dw postpone_directive-directive_handler
+ db 5,'purge'
+ dw purge_macro-directive_handler
+ db 4,'rept'
+ dw rept_directive-directive_handler
+ db 7,'restore'
+ dw restore_equ_constant-directive_handler
+ db 7,'restruc'
+ dw purge_struc-directive_handler
+ db 5,'struc'
+ dw define_struc-directive_handler
+ db 0
+
+macro_directives:
+ db 6,'common'
+ dw common_block-directive_handler
+ db 7,'forward'
+ dw forward_block-directive_handler
+ db 5,'local'
+ dw local_symbols-directive_handler
+ db 7,'reverse'
+ dw reverse_block-directive_handler
+ db 0
+
+preprocessor_special_symbols:
+ db 4,'file'
+ dw preprocessed_file_value-directive_handler
+ db 4,'line'
+ dw preprocessed_line_value-directive_handler
+ db 0
+
+operators:
+ db 1,'+',80h
+ db 1,'-',81h
+ db 1,'*',90h
+ db 1,'/',91h
+ db 3,'and',0B0h
+ db 3,'mod',0A0h
+ db 2,'or',0B1h
+ db 3,'shl',0C0h
+ db 3,'shr',0C1h
+ db 3,'xor',0B2h
+ db 0
+
+single_operand_operators:
+ db 1,'+',82h
+ db 1,'-',83h
+ db 3,'bsf',0E0h
+ db 3,'bsr',0E1h
+ db 3,'not',0D0h
+ db 3,'plt',0F1h
+ db 3,'rva',0F0h
+ db 0
+
+directive_operators:
+ db 5,'align',8Ch
+ db 2,'as',86h
+ db 2,'at',80h
+ db 7,'defined',88h
+ db 8,'definite',8Ah
+ db 3,'dup',81h
+ db 2,'eq',0F0h
+ db 6,'eqtype',0F7h
+ db 4,'from',82h
+ db 2,'in',0F6h
+ db 2,'on',84h
+ db 3,'ptr',85h
+ db 10,'relativeto',0F8h
+ db 4,'used',89h
+ db 0
+
+address_sizes:
+ db 4,'byte',1
+ db 5,'dword',4
+ db 5,'qword',8
+ db 4,'word',2
+ db 0
+
+symbols:
+ dw symbols_1-symbols,(symbols_2-symbols_1)/(1+2)
+ dw symbols_2-symbols,(symbols_3-symbols_2)/(2+2)
+ dw symbols_3-symbols,(symbols_4-symbols_3)/(3+2)
+ dw symbols_4-symbols,(symbols_5-symbols_4)/(4+2)
+ dw symbols_5-symbols,(symbols_6-symbols_5)/(5+2)
+ dw symbols_6-symbols,(symbols_7-symbols_6)/(6+2)
+ dw symbols_7-symbols,(symbols_8-symbols_7)/(7+2)
+ dw symbols_8-symbols,(symbols_9-symbols_8)/(8+2)
+ dw symbols_9-symbols,(symbols_10-symbols_9)/(9+2)
+ dw symbols_10-symbols,(symbols_11-symbols_10)/(10+2)
+ dw symbols_11-symbols,(symbols_end-symbols_11)/(11+2)
+
+symbols_1:
+ db 'z',1Fh,0
+symbols_2:
+ db 'ah',10h,04h
+ db 'al',10h,10h
+ db 'ax',10h,20h
+ db 'bh',10h,07h
+ db 'bl',10h,13h
+ db 'bp',10h,25h
+ db 'bx',10h,23h
+ db 'ch',10h,05h
+ db 'cl',10h,11h
+ db 'cs',10h,32h
+ db 'cx',10h,21h
+ db 'dh',10h,06h
+ db 'di',10h,27h
+ db 'dl',10h,12h
+ db 'ds',10h,34h
+ db 'dx',10h,22h
+ db 'es',10h,31h
+ db 'fs',10h,35h
+ db 'gs',10h,36h
+ db 'k0',14h,50h
+ db 'k1',14h,51h
+ db 'k2',14h,52h
+ db 'k3',14h,53h
+ db 'k4',14h,54h
+ db 'k5',14h,55h
+ db 'k6',14h,56h
+ db 'k7',14h,57h
+ db 'ms',1Ch,41h
+ db 'mz',18h,20h
+ db 'nx',1Bh,83h
+ db 'pe',18h,30h
+ db 'r8',10h,88h
+ db 'r9',10h,89h
+ db 'rd',1Fh,21h
+ db 'rn',1Fh,20h
+ db 'ru',1Fh,22h
+ db 'rz',1Fh,23h
+ db 'si',10h,26h
+ db 'sp',10h,24h
+ db 'ss',10h,33h
+ db 'st',10h,0A0h
+symbols_3:
+ db 'bpl',10h,15h
+ db 'cr0',14h,00h
+ db 'cr1',14h,01h
+ db 'cr2',14h,02h
+ db 'cr3',14h,03h
+ db 'cr4',14h,04h
+ db 'cr5',14h,05h
+ db 'cr6',14h,06h
+ db 'cr7',14h,07h
+ db 'cr8',14h,08h
+ db 'cr9',14h,09h
+ db 'dil',10h,17h
+ db 'dll',1Bh,80h
+ db 'dr0',14h,10h
+ db 'dr1',14h,11h
+ db 'dr2',14h,12h
+ db 'dr3',14h,13h
+ db 'dr4',14h,14h
+ db 'dr5',14h,15h
+ db 'dr6',14h,16h
+ db 'dr7',14h,17h
+ db 'dr8',14h,18h
+ db 'dr9',14h,19h
+ db 'eax',10h,40h
+ db 'ebp',10h,45h
+ db 'ebx',10h,43h
+ db 'ecx',10h,41h
+ db 'edi',10h,47h
+ db 'edx',10h,42h
+ db 'efi',1Bh,10
+ db 'eip',10h,94h
+ db 'elf',18h,50h
+ db 'esi',10h,46h
+ db 'esp',10h,44h
+ db 'far',12h,3
+ db 'gui',1Bh,2
+ db 'mm0',10h,0B0h
+ db 'mm1',10h,0B1h
+ db 'mm2',10h,0B2h
+ db 'mm3',10h,0B3h
+ db 'mm4',10h,0B4h
+ db 'mm5',10h,0B5h
+ db 'mm6',10h,0B6h
+ db 'mm7',10h,0B7h
+ db 'r10',10h,8Ah
+ db 'r11',10h,8Bh
+ db 'r12',10h,8Ch
+ db 'r13',10h,8Dh
+ db 'r14',10h,8Eh
+ db 'r15',10h,8Fh
+ db 'r8b',10h,18h
+ db 'r8d',10h,48h
+ db 'r8l',10h,18h
+ db 'r8w',10h,28h
+ db 'r9b',10h,19h
+ db 'r9d',10h,49h
+ db 'r9l',10h,19h
+ db 'r9w',10h,29h
+ db 'rax',10h,80h
+ db 'rbp',10h,85h
+ db 'rbx',10h,83h
+ db 'rcx',10h,81h
+ db 'rdi',10h,87h
+ db 'rdx',10h,82h
+ db 'rip',10h,98h
+ db 'rsi',10h,86h
+ db 'rsp',10h,84h
+ db 'sae',1Fh,30h
+ db 'sil',10h,16h
+ db 'spl',10h,14h
+ db 'st0',10h,0A0h
+ db 'st1',10h,0A1h
+ db 'st2',10h,0A2h
+ db 'st3',10h,0A3h
+ db 'st4',10h,0A4h
+ db 'st5',10h,0A5h
+ db 'st6',10h,0A6h
+ db 'st7',10h,0A7h
+ db 'tr0',14h,40h
+ db 'tr1',14h,41h
+ db 'tr2',14h,42h
+ db 'tr3',14h,43h
+ db 'tr4',14h,44h
+ db 'tr5',14h,45h
+ db 'tr6',14h,46h
+ db 'tr7',14h,47h
+ db 'wdm',1Bh,81h
+symbols_4:
+ db '1to2',1Fh,11h
+ db '1to4',1Fh,12h
+ db '1to8',1Fh,13h
+ db 'bnd0',14h,60h
+ db 'bnd1',14h,61h
+ db 'bnd2',14h,62h
+ db 'bnd3',14h,63h
+ db 'byte',11h,1
+ db 'code',19h,5
+ db 'coff',18h,40h
+ db 'cr10',14h,0Ah
+ db 'cr11',14h,0Bh
+ db 'cr12',14h,0Ch
+ db 'cr13',14h,0Dh
+ db 'cr14',14h,0Eh
+ db 'cr15',14h,0Fh
+ db 'data',19h,6
+ db 'dr10',14h,1Ah
+ db 'dr11',14h,1Bh
+ db 'dr12',14h,1Ch
+ db 'dr13',14h,1Dh
+ db 'dr14',14h,1Eh
+ db 'dr15',14h,1Fh
+ db 'ms64',1Ch,49h
+ db 'near',12h,2
+ db 'note',1Eh,4
+ db 'pe64',18h,3Ch
+ db 'r10b',10h,1Ah
+ db 'r10d',10h,4Ah
+ db 'r10l',10h,1Ah
+ db 'r10w',10h,2Ah
+ db 'r11b',10h,1Bh
+ db 'r11d',10h,4Bh
+ db 'r11l',10h,1Bh
+ db 'r11w',10h,2Bh
+ db 'r12b',10h,1Ch
+ db 'r12d',10h,4Ch
+ db 'r12l',10h,1Ch
+ db 'r12w',10h,2Ch
+ db 'r13b',10h,1Dh
+ db 'r13d',10h,4Dh
+ db 'r13l',10h,1Dh
+ db 'r13w',10h,2Dh
+ db 'r14b',10h,1Eh
+ db 'r14d',10h,4Eh
+ db 'r14l',10h,1Eh
+ db 'r14w',10h,2Eh
+ db 'r15b',10h,1Fh
+ db 'r15d',10h,4Fh
+ db 'r15l',10h,1Fh
+ db 'r15w',10h,2Fh
+ db 'word',11h,2
+ db 'xmm0',10h,0C0h
+ db 'xmm1',10h,0C1h
+ db 'xmm2',10h,0C2h
+ db 'xmm3',10h,0C3h
+ db 'xmm4',10h,0C4h
+ db 'xmm5',10h,0C5h
+ db 'xmm6',10h,0C6h
+ db 'xmm7',10h,0C7h
+ db 'xmm8',10h,0C8h
+ db 'xmm9',10h,0C9h
+ db 'ymm0',10h,0E0h
+ db 'ymm1',10h,0E1h
+ db 'ymm2',10h,0E2h
+ db 'ymm3',10h,0E3h
+ db 'ymm4',10h,0E4h
+ db 'ymm5',10h,0E5h
+ db 'ymm6',10h,0E6h
+ db 'ymm7',10h,0E7h
+ db 'ymm8',10h,0E8h
+ db 'ymm9',10h,0E9h
+ db 'zmm0',10h,60h
+ db 'zmm1',10h,61h
+ db 'zmm2',10h,62h
+ db 'zmm3',10h,63h
+ db 'zmm4',10h,64h
+ db 'zmm5',10h,65h
+ db 'zmm6',10h,66h
+ db 'zmm7',10h,67h
+ db 'zmm8',10h,68h
+ db 'zmm9',10h,69h
+symbols_5:
+ db '1to16',1Fh,14h
+ db 'dword',11h,4
+ db 'elf64',18h,58h
+ db 'fword',11h,6
+ db 'large',1Bh,82h
+ db 'pword',11h,6
+ db 'qword',11h,8
+ db 'short',12h,1
+ db 'tbyte',11h,0Ah
+ db 'tword',11h,0Ah
+ db 'use16',13h,16
+ db 'use32',13h,32
+ db 'use64',13h,64
+ db 'xmm10',10h,0CAh
+ db 'xmm11',10h,0CBh
+ db 'xmm12',10h,0CCh
+ db 'xmm13',10h,0CDh
+ db 'xmm14',10h,0CEh
+ db 'xmm15',10h,0CFh
+ db 'xmm16',10h,0D0h
+ db 'xmm17',10h,0D1h
+ db 'xmm18',10h,0D2h
+ db 'xmm19',10h,0D3h
+ db 'xmm20',10h,0D4h
+ db 'xmm21',10h,0D5h
+ db 'xmm22',10h,0D6h
+ db 'xmm23',10h,0D7h
+ db 'xmm24',10h,0D8h
+ db 'xmm25',10h,0D9h
+ db 'xmm26',10h,0DAh
+ db 'xmm27',10h,0DBh
+ db 'xmm28',10h,0DCh
+ db 'xmm29',10h,0DDh
+ db 'xmm30',10h,0DEh
+ db 'xmm31',10h,0DFh
+ db 'xword',11h,16
+ db 'ymm10',10h,0EAh
+ db 'ymm11',10h,0EBh
+ db 'ymm12',10h,0ECh
+ db 'ymm13',10h,0EDh
+ db 'ymm14',10h,0EEh
+ db 'ymm15',10h,0EFh
+ db 'ymm16',10h,0F0h
+ db 'ymm17',10h,0F1h
+ db 'ymm18',10h,0F2h
+ db 'ymm19',10h,0F3h
+ db 'ymm20',10h,0F4h
+ db 'ymm21',10h,0F5h
+ db 'ymm22',10h,0F6h
+ db 'ymm23',10h,0F7h
+ db 'ymm24',10h,0F8h
+ db 'ymm25',10h,0F9h
+ db 'ymm26',10h,0FAh
+ db 'ymm27',10h,0FBh
+ db 'ymm28',10h,0FCh
+ db 'ymm29',10h,0FDh
+ db 'ymm30',10h,0FEh
+ db 'ymm31',10h,0FFh
+ db 'yword',11h,32
+ db 'zmm10',10h,6Ah
+ db 'zmm11',10h,6Bh
+ db 'zmm12',10h,6Ch
+ db 'zmm13',10h,6Dh
+ db 'zmm14',10h,6Eh
+ db 'zmm15',10h,6Fh
+ db 'zmm16',10h,70h
+ db 'zmm17',10h,71h
+ db 'zmm18',10h,72h
+ db 'zmm19',10h,73h
+ db 'zmm20',10h,74h
+ db 'zmm21',10h,75h
+ db 'zmm22',10h,76h
+ db 'zmm23',10h,77h
+ db 'zmm24',10h,78h
+ db 'zmm25',10h,79h
+ db 'zmm26',10h,7Ah
+ db 'zmm27',10h,7Bh
+ db 'zmm28',10h,7Ch
+ db 'zmm29',10h,7Dh
+ db 'zmm30',10h,7Eh
+ db 'zmm31',10h,7Fh
+ db 'zword',11h,64
+symbols_6:
+ db 'binary',18h,10h
+ db 'dqword',11h,16
+ db 'export',1Ah,0
+ db 'fixups',1Ah,5
+ db 'import',1Ah,1
+ db 'native',1Bh,1
+ db 'qqword',11h,32
+ db 'static',1Dh,1
+symbols_7:
+ db 'console',1Bh,3
+ db 'dqqword',11h,64
+ db 'dynamic',1Eh,2
+ db 'efiboot',1Bh,11
+symbols_8:
+ db 'gnurelro',1Eh,52h
+ db 'gnustack',1Eh,51h
+ db 'linkinfo',19h,9
+ db 'readable',19h,30
+ db 'resource',1Ah,2
+ db 'writable',19h,31
+symbols_9:
+ db 'shareable',19h,28
+ db 'writeable',19h,31
+symbols_10:
+ db 'efiruntime',1Bh,12
+ db 'executable',19h,29
+ db 'gnuehframe',1Eh,50h
+ db 'linkremove',19h,11
+symbols_11:
+ db 'discardable',19h,25
+ db 'interpreter',1Eh,3
+ db 'notpageable',19h,27
+symbols_end:
+
+instructions:
+ dw instructions_2-instructions,(instructions_3-instructions_2)/(2+3)
+ dw instructions_3-instructions,(instructions_4-instructions_3)/(3+3)
+ dw instructions_4-instructions,(instructions_5-instructions_4)/(4+3)
+ dw instructions_5-instructions,(instructions_6-instructions_5)/(5+3)
+ dw instructions_6-instructions,(instructions_7-instructions_6)/(6+3)
+ dw instructions_7-instructions,(instructions_8-instructions_7)/(7+3)
+ dw instructions_8-instructions,(instructions_9-instructions_8)/(8+3)
+ dw instructions_9-instructions,(instructions_10-instructions_9)/(9+3)
+ dw instructions_10-instructions,(instructions_11-instructions_10)/(10+3)
+ dw instructions_11-instructions,(instructions_12-instructions_11)/(11+3)
+ dw instructions_12-instructions,(instructions_13-instructions_12)/(12+3)
+ dw instructions_13-instructions,(instructions_14-instructions_13)/(13+3)
+ dw instructions_14-instructions,(instructions_15-instructions_14)/(14+3)
+ dw instructions_15-instructions,(instructions_16-instructions_15)/(15+3)
+ dw instructions_16-instructions,(instructions_17-instructions_16)/(16+3)
+ dw instructions_17-instructions,(instructions_end-instructions_17)/(17+3)
+
+instructions_2:
+ db 'bt',4
+ dw bt_instruction-instruction_handler
+ db 'if',0
+ dw if_directive-instruction_handler
+ db 'in',0
+ dw in_instruction-instruction_handler
+ db 'ja',77h
+ dw conditional_jump-instruction_handler
+ db 'jb',72h
+ dw conditional_jump-instruction_handler
+ db 'jc',72h
+ dw conditional_jump-instruction_handler
+ db 'je',74h
+ dw conditional_jump-instruction_handler
+ db 'jg',7Fh
+ dw conditional_jump-instruction_handler
+ db 'jl',7Ch
+ dw conditional_jump-instruction_handler
+ db 'jo',70h
+ dw conditional_jump-instruction_handler
+ db 'jp',7Ah
+ dw conditional_jump-instruction_handler
+ db 'js',78h
+ dw conditional_jump-instruction_handler
+ db 'jz',74h
+ dw conditional_jump-instruction_handler
+ db 'or',08h
+ dw basic_instruction-instruction_handler
+instructions_3:
+ db 'aaa',37h
+ dw simple_instruction_except64-instruction_handler
+ db 'aad',0D5h
+ dw aa_instruction-instruction_handler
+ db 'aam',0D4h
+ dw aa_instruction-instruction_handler
+ db 'aas',3Fh
+ dw simple_instruction_except64-instruction_handler
+ db 'adc',10h
+ dw basic_instruction-instruction_handler
+ db 'add',00h
+ dw basic_instruction-instruction_handler
+ db 'and',20h
+ dw basic_instruction-instruction_handler
+ db 'bnd',0F2h
+ dw bnd_prefix_instruction-instruction_handler
+ db 'bsf',0BCh
+ dw bs_instruction-instruction_handler
+ db 'bsr',0BDh
+ dw bs_instruction-instruction_handler
+ db 'btc',7
+ dw bt_instruction-instruction_handler
+ db 'btr',6
+ dw bt_instruction-instruction_handler
+ db 'bts',5
+ dw bt_instruction-instruction_handler
+ db 'cbw',98h
+ dw simple_instruction_16bit-instruction_handler
+ db 'cdq',99h
+ dw simple_instruction_32bit-instruction_handler
+ db 'clc',0F8h
+ dw simple_instruction-instruction_handler
+ db 'cld',0FCh
+ dw simple_instruction-instruction_handler
+ db 'cli',0FAh
+ dw simple_instruction-instruction_handler
+ db 'cmc',0F5h
+ dw simple_instruction-instruction_handler
+ db 'cmp',38h
+ dw basic_instruction-instruction_handler
+ db 'cqo',99h
+ dw simple_instruction_64bit-instruction_handler
+ db 'cwd',99h
+ dw simple_instruction_16bit-instruction_handler
+ db 'daa',27h
+ dw simple_instruction_except64-instruction_handler
+ db 'das',2Fh
+ dw simple_instruction_except64-instruction_handler
+ db 'dec',1
+ dw inc_instruction-instruction_handler
+ db 'div',6
+ dw single_operand_instruction-instruction_handler
+ db 'end',0
+ dw end_directive-instruction_handler
+ db 'err',0
+ dw err_directive-instruction_handler
+ db 'fld',0
+ dw fld_instruction-instruction_handler
+ db 'fst',2
+ dw fld_instruction-instruction_handler
+ db 'hlt',0F4h
+ dw simple_instruction-instruction_handler
+ db 'inc',0
+ dw inc_instruction-instruction_handler
+ db 'ins',6Ch
+ dw ins_instruction-instruction_handler
+ db 'int',0CDh
+ dw int_instruction-instruction_handler
+ db 'jae',73h
+ dw conditional_jump-instruction_handler
+ db 'jbe',76h
+ dw conditional_jump-instruction_handler
+ db 'jge',7Dh
+ dw conditional_jump-instruction_handler
+ db 'jle',7Eh
+ dw conditional_jump-instruction_handler
+ db 'jmp',0
+ dw jmp_instruction-instruction_handler
+ db 'jna',76h
+ dw conditional_jump-instruction_handler
+ db 'jnb',73h
+ dw conditional_jump-instruction_handler
+ db 'jnc',73h
+ dw conditional_jump-instruction_handler
+ db 'jne',75h
+ dw conditional_jump-instruction_handler
+ db 'jng',7Eh
+ dw conditional_jump-instruction_handler
+ db 'jnl',7Dh
+ dw conditional_jump-instruction_handler
+ db 'jno',71h
+ dw conditional_jump-instruction_handler
+ db 'jnp',7Bh
+ dw conditional_jump-instruction_handler
+ db 'jns',79h
+ dw conditional_jump-instruction_handler
+ db 'jnz',75h
+ dw conditional_jump-instruction_handler
+ db 'jpe',7Ah
+ dw conditional_jump-instruction_handler
+ db 'jpo',7Bh
+ dw conditional_jump-instruction_handler
+ db 'lar',2
+ dw lar_instruction-instruction_handler
+ db 'lds',3
+ dw ls_instruction-instruction_handler
+ db 'lea',0
+ dw lea_instruction-instruction_handler
+ db 'les',0
+ dw ls_instruction-instruction_handler
+ db 'lfs',4
+ dw ls_instruction-instruction_handler
+ db 'lgs',5
+ dw ls_instruction-instruction_handler
+ db 'lsl',3
+ dw lar_instruction-instruction_handler
+ db 'lss',2
+ dw ls_instruction-instruction_handler
+ db 'ltr',3
+ dw pm_word_instruction-instruction_handler
+ db 'mov',0
+ dw mov_instruction-instruction_handler
+ db 'mul',4
+ dw single_operand_instruction-instruction_handler
+ db 'neg',3
+ dw single_operand_instruction-instruction_handler
+ db 'nop',90h
+ dw nop_instruction-instruction_handler
+ db 'not',2
+ dw single_operand_instruction-instruction_handler
+ db 'org',0
+ dw org_directive-instruction_handler
+ db 'out',0
+ dw out_instruction-instruction_handler
+ db 'pop',0
+ dw pop_instruction-instruction_handler
+ db 'por',0EBh
+ dw basic_mmx_instruction-instruction_handler
+ db 'rcl',2
+ dw sh_instruction-instruction_handler
+ db 'rcr',3
+ dw sh_instruction-instruction_handler
+ db 'rep',0F3h
+ dw prefix_instruction-instruction_handler
+ db 'ret',0C2h
+ dw ret_instruction-instruction_handler
+ db 'rol',0
+ dw sh_instruction-instruction_handler
+ db 'ror',1
+ dw sh_instruction-instruction_handler
+ db 'rsm',0AAh
+ dw simple_extended_instruction-instruction_handler
+ db 'sal',4
+ dw sh_instruction-instruction_handler
+ db 'sar',7
+ dw sh_instruction-instruction_handler
+ db 'sbb',18h
+ dw basic_instruction-instruction_handler
+ db 'shl',4
+ dw sh_instruction-instruction_handler
+ db 'shr',5
+ dw sh_instruction-instruction_handler
+ db 'stc',0F9h
+ dw simple_instruction-instruction_handler
+ db 'std',0FDh
+ dw simple_instruction-instruction_handler
+ db 'sti',0FBh
+ dw simple_instruction-instruction_handler
+ db 'str',1
+ dw pm_store_word_instruction-instruction_handler
+ db 'sub',28h
+ dw basic_instruction-instruction_handler
+ db 'ud0',0FFh
+ dw ud_instruction-instruction_handler
+ db 'ud1',0B9h
+ dw ud_instruction-instruction_handler
+ db 'ud2',0Bh
+ dw simple_extended_instruction-instruction_handler
+ db 'xor',30h
+ dw basic_instruction-instruction_handler
+instructions_4:
+ db 'adcx',66h
+ dw adx_instruction-instruction_handler
+ db 'adox',0F3h
+ dw adx_instruction-instruction_handler
+ db 'andn',0F2h
+ dw andn_instruction-instruction_handler
+ db 'arpl',0
+ dw arpl_instruction-instruction_handler
+ db 'blci',26h
+ dw tbm_instruction-instruction_handler
+ db 'blcs',13h
+ dw tbm_instruction-instruction_handler
+ db 'blsi',3
+ dw bmi_instruction-instruction_handler
+ db 'blsr',1
+ dw bmi_instruction-instruction_handler
+ db 'bzhi',0F5h
+ dw bzhi_instruction-instruction_handler
+ db 'call',0
+ dw call_instruction-instruction_handler
+ db 'cdqe',98h
+ dw simple_instruction_64bit-instruction_handler
+ db 'clac',0CAh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'clgi',0DDh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'clts',6
+ dw simple_extended_instruction-instruction_handler
+ db 'clwb',6
+ dw clflushopt_instruction-instruction_handler
+ db 'cmps',0A6h
+ dw cmps_instruction-instruction_handler
+ db 'cwde',98h
+ dw simple_instruction_32bit-instruction_handler
+ db 'data',0
+ dw data_directive-instruction_handler
+ db 'dppd',41h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'dpps',40h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'else',0
+ dw else_directive-instruction_handler
+ db 'emms',77h
+ dw simple_extended_instruction-instruction_handler
+ db 'fabs',100001b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fadd',0
+ dw basic_fpu_instruction-instruction_handler
+ db 'fbld',4
+ dw fbld_instruction-instruction_handler
+ db 'fchs',100000b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fcom',2
+ dw basic_fpu_instruction-instruction_handler
+ db 'fcos',111111b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fdiv',6
+ dw basic_fpu_instruction-instruction_handler
+ db 'feni',0E0h
+ dw finit_instruction-instruction_handler
+ db 'fild',0
+ dw fild_instruction-instruction_handler
+ db 'fist',2
+ dw fild_instruction-instruction_handler
+ db 'fld1',101000b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fldz',101110b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fmul',1
+ dw basic_fpu_instruction-instruction_handler
+ db 'fnop',010000b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fsin',111110b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fstp',3
+ dw fld_instruction-instruction_handler
+ db 'fsub',4
+ dw basic_fpu_instruction-instruction_handler
+ db 'ftst',100100b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fxam',100101b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fxch',0
+ dw fxch_instruction-instruction_handler
+ db 'heap',0
+ dw heap_directive-instruction_handler
+ db 'idiv',7
+ dw single_operand_instruction-instruction_handler
+ db 'imul',0
+ dw imul_instruction-instruction_handler
+ db 'insb',6Ch
+ dw simple_instruction-instruction_handler
+ db 'insd',6Dh
+ dw simple_instruction_32bit-instruction_handler
+ db 'insw',6Dh
+ dw simple_instruction_16bit-instruction_handler
+ db 'int1',0F1h
+ dw simple_instruction-instruction_handler
+ db 'int3',0CCh
+ dw simple_instruction-instruction_handler
+ db 'into',0CEh
+ dw simple_instruction_except64-instruction_handler
+ db 'invd',8
+ dw simple_extended_instruction-instruction_handler
+ db 'iret',0CFh
+ dw iret_instruction-instruction_handler
+ db 'jcxz',0E3h
+ dw loop_instruction_16bit-instruction_handler
+ db 'jnae',72h
+ dw conditional_jump-instruction_handler
+ db 'jnbe',77h
+ dw conditional_jump-instruction_handler
+ db 'jnge',7Ch
+ dw conditional_jump-instruction_handler
+ db 'jnle',7Fh
+ dw conditional_jump-instruction_handler
+ db 'korb',45h
+ dw mask_instruction_b-instruction_handler
+ db 'kord',45h
+ dw mask_instruction_d-instruction_handler
+ db 'korq',45h
+ dw mask_instruction_q-instruction_handler
+ db 'korw',45h
+ dw mask_instruction_w-instruction_handler
+ db 'lahf',9Fh
+ dw simple_instruction-instruction_handler
+ db 'lgdt',2
+ dw lgdt_instruction-instruction_handler
+ db 'lidt',3
+ dw lgdt_instruction-instruction_handler
+ db 'lldt',2
+ dw pm_word_instruction-instruction_handler
+ db 'lmsw',16h
+ dw pm_word_instruction-instruction_handler
+ db 'load',0
+ dw load_directive-instruction_handler
+ db 'lock',0F0h
+ dw prefix_instruction-instruction_handler
+ db 'lods',0ACh
+ dw lods_instruction-instruction_handler
+ db 'loop',0E2h
+ dw loop_instruction-instruction_handler
+ db 'movd',0
+ dw movd_instruction-instruction_handler
+ db 'movq',0
+ dw movq_instruction-instruction_handler
+ db 'movs',0A4h
+ dw movs_instruction-instruction_handler
+ db 'mulx',0F6h
+ dw pdep_instruction-instruction_handler
+ db 'orpd',56h
+ dw sse_pd_instruction-instruction_handler
+ db 'orps',56h
+ dw sse_ps_instruction-instruction_handler
+ db 'outs',6Eh
+ dw outs_instruction-instruction_handler
+ db 'pand',0DBh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pdep',0F5h
+ dw pdep_instruction-instruction_handler
+ db 'pext',0F5h
+ dw pext_instruction-instruction_handler
+ db 'popa',61h
+ dw simple_instruction_except64-instruction_handler
+ db 'popd',4
+ dw pop_instruction-instruction_handler
+ db 'popf',9Dh
+ dw simple_instruction-instruction_handler
+ db 'popq',8
+ dw pop_instruction-instruction_handler
+ db 'popw',2
+ dw pop_instruction-instruction_handler
+ db 'push',0
+ dw push_instruction-instruction_handler
+ db 'pxor',0EFh
+ dw basic_mmx_instruction-instruction_handler
+ db 'repe',0F3h
+ dw prefix_instruction-instruction_handler
+ db 'repz',0F3h
+ dw prefix_instruction-instruction_handler
+ db 'retd',0C2h
+ dw ret_instruction_32bit_except64-instruction_handler
+ db 'retf',0CAh
+ dw retf_instruction-instruction_handler
+ db 'retn',0C2h
+ dw ret_instruction-instruction_handler
+ db 'retq',0C2h
+ dw ret_instruction_only64-instruction_handler
+ db 'retw',0C2h
+ dw ret_instruction_16bit-instruction_handler
+ db 'rorx',0F0h
+ dw rorx_instruction-instruction_handler
+ db 'sahf',9Eh
+ dw simple_instruction-instruction_handler
+ db 'salc',0D6h
+ dw simple_instruction_except64-instruction_handler
+ db 'sarx',0F7h
+ dw sarx_instruction-instruction_handler
+ db 'scas',0AEh
+ dw stos_instruction-instruction_handler
+ db 'seta',97h
+ dw set_instruction-instruction_handler
+ db 'setb',92h
+ dw set_instruction-instruction_handler
+ db 'setc',92h
+ dw set_instruction-instruction_handler
+ db 'sete',94h
+ dw set_instruction-instruction_handler
+ db 'setg',9Fh
+ dw set_instruction-instruction_handler
+ db 'setl',9Ch
+ dw set_instruction-instruction_handler
+ db 'seto',90h
+ dw set_instruction-instruction_handler
+ db 'setp',9Ah
+ dw set_instruction-instruction_handler
+ db 'sets',98h
+ dw set_instruction-instruction_handler
+ db 'setz',94h
+ dw set_instruction-instruction_handler
+ db 'sgdt',0
+ dw lgdt_instruction-instruction_handler
+ db 'shld',0A4h
+ dw shd_instruction-instruction_handler
+ db 'shlx',0F7h
+ dw shlx_instruction-instruction_handler
+ db 'shrd',0ACh
+ dw shd_instruction-instruction_handler
+ db 'shrx',0F7h
+ dw shrx_instruction-instruction_handler
+ db 'sidt',1
+ dw lgdt_instruction-instruction_handler
+ db 'sldt',0
+ dw pm_store_word_instruction-instruction_handler
+ db 'smsw',14h
+ dw pm_store_word_instruction-instruction_handler
+ db 'stac',0CBh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'stgi',0DCh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'stos',0AAh
+ dw stos_instruction-instruction_handler
+ db 'test',0
+ dw test_instruction-instruction_handler
+ db 'verr',4
+ dw pm_word_instruction-instruction_handler
+ db 'verw',5
+ dw pm_word_instruction-instruction_handler
+ db 'vpor',0EBh
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'wait',9Bh
+ dw simple_instruction-instruction_handler
+ db 'xadd',0C0h
+ dw basic_486_instruction-instruction_handler
+ db 'xchg',0
+ dw xchg_instruction-instruction_handler
+ db 'xend',0D5h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'xlat',0D7h
+ dw xlat_instruction-instruction_handler
+instructions_5:
+ db 'addpd',58h
+ dw sse_pd_instruction-instruction_handler
+ db 'addps',58h
+ dw sse_ps_instruction-instruction_handler
+ db 'addsd',58h
+ dw sse_sd_instruction-instruction_handler
+ db 'addss',58h
+ dw sse_ss_instruction-instruction_handler
+ db 'align',0
+ dw align_directive-instruction_handler
+ db 'andpd',54h
+ dw sse_pd_instruction-instruction_handler
+ db 'andps',54h
+ dw sse_ps_instruction-instruction_handler
+ db 'bextr',0F7h
+ dw bextr_instruction-instruction_handler
+ db 'blcic',15h
+ dw tbm_instruction-instruction_handler
+ db 'blsic',16h
+ dw tbm_instruction-instruction_handler
+ db 'bndcl',1Ah
+ dw bndcl_instruction-instruction_handler
+ db 'bndcn',1Bh
+ dw bndcu_instruction-instruction_handler
+ db 'bndcu',1Ah
+ dw bndcu_instruction-instruction_handler
+ db 'bndmk',1Bh
+ dw bndmk_instruction-instruction_handler
+ db 'bound',0
+ dw bound_instruction-instruction_handler
+ db 'break',0
+ dw break_directive-instruction_handler
+ db 'bswap',0
+ dw bswap_instruction-instruction_handler
+ db 'cmova',47h
+ dw bs_instruction-instruction_handler
+ db 'cmovb',42h
+ dw bs_instruction-instruction_handler
+ db 'cmovc',42h
+ dw bs_instruction-instruction_handler
+ db 'cmove',44h
+ dw bs_instruction-instruction_handler
+ db 'cmovg',4Fh
+ dw bs_instruction-instruction_handler
+ db 'cmovl',4Ch
+ dw bs_instruction-instruction_handler
+ db 'cmovo',40h
+ dw bs_instruction-instruction_handler
+ db 'cmovp',4Ah
+ dw bs_instruction-instruction_handler
+ db 'cmovs',48h
+ dw bs_instruction-instruction_handler
+ db 'cmovz',44h
+ dw bs_instruction-instruction_handler
+ db 'cmppd',-1
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpps',-1
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpsb',0A6h
+ dw simple_instruction-instruction_handler
+ db 'cmpsd',-1
+ dw cmpsd_instruction-instruction_handler
+ db 'cmpsq',0A7h
+ dw simple_instruction_64bit-instruction_handler
+ db 'cmpss',-1
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpsw',0A7h
+ dw simple_instruction_16bit-instruction_handler
+ db 'cpuid',0A2h
+ dw simple_extended_instruction-instruction_handler
+ db 'crc32',0
+ dw crc32_instruction-instruction_handler
+ db 'divpd',5Eh
+ dw sse_pd_instruction-instruction_handler
+ db 'divps',5Eh
+ dw sse_ps_instruction-instruction_handler
+ db 'divsd',5Eh
+ dw sse_sd_instruction-instruction_handler
+ db 'divss',5Eh
+ dw sse_ss_instruction-instruction_handler
+ db 'enter',0
+ dw enter_instruction-instruction_handler
+ db 'entry',0
+ dw entry_directive-instruction_handler
+ db 'extrn',0
+ dw extrn_directive-instruction_handler
+ db 'extrq',0
+ dw extrq_instruction-instruction_handler
+ db 'f2xm1',110000b
+ dw simple_fpu_instruction-instruction_handler
+ db 'faddp',0
+ dw faddp_instruction-instruction_handler
+ db 'fbstp',6
+ dw fbld_instruction-instruction_handler
+ db 'fclex',0E2h
+ dw finit_instruction-instruction_handler
+ db 'fcomi',0F0h
+ dw fcomi_instruction-instruction_handler
+ db 'fcomp',3
+ dw basic_fpu_instruction-instruction_handler
+ db 'fdisi',0E1h
+ dw finit_instruction-instruction_handler
+ db 'fdivp',7
+ dw faddp_instruction-instruction_handler
+ db 'fdivr',7
+ dw basic_fpu_instruction-instruction_handler
+ db 'femms',0Eh
+ dw simple_extended_instruction-instruction_handler
+ db 'ffree',0
+ dw ffree_instruction-instruction_handler
+ db 'fiadd',0
+ dw fi_instruction-instruction_handler
+ db 'ficom',2
+ dw fi_instruction-instruction_handler
+ db 'fidiv',6
+ dw fi_instruction-instruction_handler
+ db 'fimul',1
+ dw fi_instruction-instruction_handler
+ db 'finit',0E3h
+ dw finit_instruction-instruction_handler
+ db 'fistp',3
+ dw fild_instruction-instruction_handler
+ db 'fisub',4
+ dw fi_instruction-instruction_handler
+ db 'fldcw',5
+ dw fldcw_instruction-instruction_handler
+ db 'fldpi',101011b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fmulp',1
+ dw faddp_instruction-instruction_handler
+ db 'fneni',0E0h
+ dw fninit_instruction-instruction_handler
+ db 'fprem',111000b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fptan',110010b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fsave',6
+ dw fsave_instruction-instruction_handler
+ db 'fsqrt',111010b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fstcw',7
+ dw fstcw_instruction-instruction_handler
+ db 'fstsw',0
+ dw fstsw_instruction-instruction_handler
+ db 'fsubp',5
+ dw faddp_instruction-instruction_handler
+ db 'fsubr',5
+ dw basic_fpu_instruction-instruction_handler
+ db 'fucom',4
+ dw ffree_instruction-instruction_handler
+ db 'fwait',9Bh
+ dw simple_instruction-instruction_handler
+ db 'fyl2x',110001b
+ dw simple_fpu_instruction-instruction_handler
+ db 'icebp',0F1h
+ dw simple_instruction-instruction_handler
+ db 'iretd',0CFh
+ dw simple_instruction_32bit-instruction_handler
+ db 'iretq',0CFh
+ dw simple_instruction_64bit-instruction_handler
+ db 'iretw',0CFh
+ dw simple_instruction_16bit-instruction_handler
+ db 'jecxz',0E3h
+ dw loop_instruction_32bit-instruction_handler
+ db 'jrcxz',0E3h
+ dw loop_instruction_64bit-instruction_handler
+ db 'kaddb',4Ah
+ dw mask_instruction_b-instruction_handler
+ db 'kaddd',4Ah
+ dw mask_instruction_d-instruction_handler
+ db 'kaddq',4Ah
+ dw mask_instruction_q-instruction_handler
+ db 'kaddw',4Ah
+ dw mask_instruction_w-instruction_handler
+ db 'kandb',41h
+ dw mask_instruction_b-instruction_handler
+ db 'kandd',41h
+ dw mask_instruction_d-instruction_handler
+ db 'kandq',41h
+ dw mask_instruction_q-instruction_handler
+ db 'kandw',41h
+ dw mask_instruction_w-instruction_handler
+ db 'kmovb',1
+ dw kmov_instruction-instruction_handler
+ db 'kmovd',4
+ dw kmov_instruction-instruction_handler
+ db 'kmovq',8
+ dw kmov_instruction-instruction_handler
+ db 'kmovw',2
+ dw kmov_instruction-instruction_handler
+ db 'knotb',44h
+ dw mask_instruction_single_source_b-instruction_handler
+ db 'knotd',44h
+ dw mask_instruction_single_source_d-instruction_handler
+ db 'knotq',44h
+ dw mask_instruction_single_source_q-instruction_handler
+ db 'knotw',44h
+ dw mask_instruction_single_source_w-instruction_handler
+ db 'kxorb',47h
+ dw mask_instruction_b-instruction_handler
+ db 'kxord',47h
+ dw mask_instruction_d-instruction_handler
+ db 'kxorq',47h
+ dw mask_instruction_q-instruction_handler
+ db 'kxorw',47h
+ dw mask_instruction_w-instruction_handler
+ db 'label',0
+ dw label_directive-instruction_handler
+ db 'lddqu',0
+ dw lddqu_instruction-instruction_handler
+ db 'leave',0C9h
+ dw simple_instruction-instruction_handler
+ db 'lodsb',0ACh
+ dw simple_instruction-instruction_handler
+ db 'lodsd',0ADh
+ dw simple_instruction_32bit-instruction_handler
+ db 'lodsq',0ADh
+ dw simple_instruction_64bit-instruction_handler
+ db 'lodsw',0ADh
+ dw simple_instruction_16bit-instruction_handler
+ db 'loopd',0E2h
+ dw loop_instruction_32bit-instruction_handler
+ db 'loope',0E1h
+ dw loop_instruction-instruction_handler
+ db 'loopq',0E2h
+ dw loop_instruction_64bit-instruction_handler
+ db 'loopw',0E2h
+ dw loop_instruction_16bit-instruction_handler
+ db 'loopz',0E1h
+ dw loop_instruction-instruction_handler
+ db 'lzcnt',0BDh
+ dw popcnt_instruction-instruction_handler
+ db 'maxpd',5Fh
+ dw sse_pd_instruction-instruction_handler
+ db 'maxps',5Fh
+ dw sse_ps_instruction-instruction_handler
+ db 'maxsd',5Fh
+ dw sse_sd_instruction-instruction_handler
+ db 'maxss',5Fh
+ dw sse_ss_instruction-instruction_handler
+ db 'minpd',5Dh
+ dw sse_pd_instruction-instruction_handler
+ db 'minps',5Dh
+ dw sse_ps_instruction-instruction_handler
+ db 'minsd',5Dh
+ dw sse_sd_instruction-instruction_handler
+ db 'minss',5Dh
+ dw sse_ss_instruction-instruction_handler
+ db 'movbe',0F0h
+ dw movbe_instruction-instruction_handler
+ db 'movsb',0A4h
+ dw simple_instruction-instruction_handler
+ db 'movsd',0
+ dw movsd_instruction-instruction_handler
+ db 'movsq',0A5h
+ dw simple_instruction_64bit-instruction_handler
+ db 'movss',0
+ dw movss_instruction-instruction_handler
+ db 'movsw',0A5h
+ dw simple_instruction_16bit-instruction_handler
+ db 'movsx',0BEh
+ dw movx_instruction-instruction_handler
+ db 'movzx',0B6h
+ dw movx_instruction-instruction_handler
+ db 'mulpd',59h
+ dw sse_pd_instruction-instruction_handler
+ db 'mulps',59h
+ dw sse_ps_instruction-instruction_handler
+ db 'mulsd',59h
+ dw sse_sd_instruction-instruction_handler
+ db 'mulss',59h
+ dw sse_ss_instruction-instruction_handler
+ db 'mwait',0C9h
+ dw monitor_instruction-instruction_handler
+ db 'outsb',6Eh
+ dw simple_instruction-instruction_handler
+ db 'outsd',6Fh
+ dw simple_instruction_32bit-instruction_handler
+ db 'outsw',6Fh
+ dw simple_instruction_16bit-instruction_handler
+ db 'pabsb',1Ch
+ dw ssse3_instruction-instruction_handler
+ db 'pabsd',1Eh
+ dw ssse3_instruction-instruction_handler
+ db 'pabsw',1Dh
+ dw ssse3_instruction-instruction_handler
+ db 'paddb',0FCh
+ dw basic_mmx_instruction-instruction_handler
+ db 'paddd',0FEh
+ dw basic_mmx_instruction-instruction_handler
+ db 'paddq',0D4h
+ dw basic_mmx_instruction-instruction_handler
+ db 'paddw',0FDh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pandn',0DFh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pause',0
+ dw pause_instruction-instruction_handler
+ db 'pavgb',0E0h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pavgw',0E3h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pf2id',1Dh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pf2iw',1Ch
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfacc',0AEh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfadd',9Eh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfmax',0A4h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfmin',94h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfmul',0B4h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfrcp',96h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfsub',9Ah
+ dw amd3dnow_instruction-instruction_handler
+ db 'pi2fd',0Dh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pi2fw',0Ch
+ dw amd3dnow_instruction-instruction_handler
+ db 'popad',61h
+ dw simple_instruction_32bit_except64-instruction_handler
+ db 'popaw',61h
+ dw simple_instruction_16bit_except64-instruction_handler
+ db 'popfd',9Dh
+ dw simple_instruction_32bit_except64-instruction_handler
+ db 'popfq',9Dh
+ dw simple_instruction_only64-instruction_handler
+ db 'popfw',9Dh
+ dw simple_instruction_16bit-instruction_handler
+ db 'pslld',0F2h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psllq',0F3h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psllw',0F1h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psrad',0E2h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psraw',0E1h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psrld',0D2h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psrlq',0D3h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psrlw',0D1h
+ dw mmx_bit_shift_instruction-instruction_handler
+ db 'psubb',0F8h
+ dw basic_mmx_instruction-instruction_handler
+ db 'psubd',0FAh
+ dw basic_mmx_instruction-instruction_handler
+ db 'psubq',0FBh
+ dw basic_mmx_instruction-instruction_handler
+ db 'psubw',0F9h
+ dw basic_mmx_instruction-instruction_handler
+ db 'ptest',17h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pusha',60h
+ dw simple_instruction_except64-instruction_handler
+ db 'pushd',4
+ dw push_instruction-instruction_handler
+ db 'pushf',9Ch
+ dw simple_instruction-instruction_handler
+ db 'pushq',8
+ dw push_instruction-instruction_handler
+ db 'pushw',2
+ dw push_instruction-instruction_handler
+ db 'rcpps',53h
+ dw sse_ps_instruction-instruction_handler
+ db 'rcpss',53h
+ dw sse_ss_instruction-instruction_handler
+ db 'rdmsr',32h
+ dw simple_extended_instruction-instruction_handler
+ db 'rdpid',7
+ dw rdpid_instruction-instruction_handler
+ db 'rdpmc',33h
+ dw simple_extended_instruction-instruction_handler
+ db 'rdpru',0FDh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'rdtsc',31h
+ dw simple_extended_instruction-instruction_handler
+ db 'repne',0F2h
+ dw prefix_instruction-instruction_handler
+ db 'repnz',0F2h
+ dw prefix_instruction-instruction_handler
+ db 'retfd',0CAh
+ dw retf_instruction_32bit-instruction_handler
+ db 'retfq',0CAh
+ dw retf_instruction_64bit-instruction_handler
+ db 'retfw',0CAh
+ dw retf_instruction_16bit-instruction_handler
+ db 'retnd',0C2h
+ dw ret_instruction_32bit_except64-instruction_handler
+ db 'retnq',0C2h
+ dw ret_instruction_only64-instruction_handler
+ db 'retnw',0C2h
+ dw ret_instruction_16bit-instruction_handler
+ db 'scasb',0AEh
+ dw simple_instruction-instruction_handler
+ db 'scasd',0AFh
+ dw simple_instruction_32bit-instruction_handler
+ db 'scasq',0AFh
+ dw simple_instruction_64bit-instruction_handler
+ db 'scasw',0AFh
+ dw simple_instruction_16bit-instruction_handler
+ db 'setae',93h
+ dw set_instruction-instruction_handler
+ db 'setbe',96h
+ dw set_instruction-instruction_handler
+ db 'setge',9Dh
+ dw set_instruction-instruction_handler
+ db 'setle',9Eh
+ dw set_instruction-instruction_handler
+ db 'setna',96h
+ dw set_instruction-instruction_handler
+ db 'setnb',93h
+ dw set_instruction-instruction_handler
+ db 'setnc',93h
+ dw set_instruction-instruction_handler
+ db 'setne',95h
+ dw set_instruction-instruction_handler
+ db 'setng',9Eh
+ dw set_instruction-instruction_handler
+ db 'setnl',9Dh
+ dw set_instruction-instruction_handler
+ db 'setno',91h
+ dw set_instruction-instruction_handler
+ db 'setnp',9Bh
+ dw set_instruction-instruction_handler
+ db 'setns',99h
+ dw set_instruction-instruction_handler
+ db 'setnz',95h
+ dw set_instruction-instruction_handler
+ db 'setpe',9Ah
+ dw set_instruction-instruction_handler
+ db 'setpo',9Bh
+ dw set_instruction-instruction_handler
+ db 'stack',0
+ dw stack_directive-instruction_handler
+ db 'store',0
+ dw store_directive-instruction_handler
+ db 'stosb',0AAh
+ dw simple_instruction-instruction_handler
+ db 'stosd',0ABh
+ dw simple_instruction_32bit-instruction_handler
+ db 'stosq',0ABh
+ dw simple_instruction_64bit-instruction_handler
+ db 'stosw',0ABh
+ dw simple_instruction_16bit-instruction_handler
+ db 'subpd',5Ch
+ dw sse_pd_instruction-instruction_handler
+ db 'subps',5Ch
+ dw sse_ps_instruction-instruction_handler
+ db 'subsd',5Ch
+ dw sse_sd_instruction-instruction_handler
+ db 'subss',5Ch
+ dw sse_ss_instruction-instruction_handler
+ db 'times',0
+ dw times_directive-instruction_handler
+ db 'tzcnt',0BCh
+ dw popcnt_instruction-instruction_handler
+ db 'tzmsk',14h
+ dw tbm_instruction-instruction_handler
+ db 'vdppd',41h
+ dw avx_128bit_instruction_3a_imm8_noevex-instruction_handler
+ db 'vdpps',40h
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vmovd',0
+ dw avx_movd_instruction-instruction_handler
+ db 'vmovq',0
+ dw avx_movq_instruction-instruction_handler
+ db 'vmrun',0D8h
+ dw simple_svm_instruction-instruction_handler
+ db 'vmxon',6
+ dw vmxon_instruction-instruction_handler
+ db 'vorpd',56h
+ dw avx_pd_instruction-instruction_handler
+ db 'vorps',56h
+ dw avx_ps_instruction-instruction_handler
+ db 'vpand',0DBh
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'vpord',0EBh
+ dw avx_d_instruction_evex-instruction_handler
+ db 'vporq',0EBh
+ dw avx_q_instruction_evex-instruction_handler
+ db 'vpxor',0EFh
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'while',0
+ dw while_directive-instruction_handler
+ db 'wrmsr',30h
+ dw simple_extended_instruction-instruction_handler
+ db 'wrssd',0F6h
+ dw wrssd_instruction-instruction_handler
+ db 'wrssq',0F6h
+ dw wrssq_instruction-instruction_handler
+ db 'xlatb',0D7h
+ dw simple_instruction-instruction_handler
+ db 'xorpd',57h
+ dw sse_pd_instruction-instruction_handler
+ db 'xorps',57h
+ dw sse_ps_instruction-instruction_handler
+ db 'xsave',100b
+ dw fxsave_instruction-instruction_handler
+ db 'xtest',0D6h
+ dw simple_instruction_0f_01-instruction_handler
+instructions_6:
+ db 'aesdec',0DEh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'aesenc',0DCh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'aesimc',0DBh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'andnpd',55h
+ dw sse_pd_instruction-instruction_handler
+ db 'andnps',55h
+ dw sse_ps_instruction-instruction_handler
+ db 'assert',0
+ dw assert_directive-instruction_handler
+ db 'blcmsk',21h
+ dw tbm_instruction-instruction_handler
+ db 'blsmsk',2
+ dw bmi_instruction-instruction_handler
+ db 'bndldx',1Ah
+ dw bndldx_instruction-instruction_handler
+ db 'bndmov',1Ah
+ dw bndmov_instruction-instruction_handler
+ db 'bndstx',1Bh
+ dw bndstx_instruction-instruction_handler
+ db 'clzero',0
+ dw clzero_instruction-instruction_handler
+ db 'cmovae',43h
+ dw bs_instruction-instruction_handler
+ db 'cmovbe',46h
+ dw bs_instruction-instruction_handler
+ db 'cmovge',4Dh
+ dw bs_instruction-instruction_handler
+ db 'cmovle',4Eh
+ dw bs_instruction-instruction_handler
+ db 'cmovna',46h
+ dw bs_instruction-instruction_handler
+ db 'cmovnb',43h
+ dw bs_instruction-instruction_handler
+ db 'cmovnc',43h
+ dw bs_instruction-instruction_handler
+ db 'cmovne',45h
+ dw bs_instruction-instruction_handler
+ db 'cmovng',4Eh
+ dw bs_instruction-instruction_handler
+ db 'cmovnl',4Dh
+ dw bs_instruction-instruction_handler
+ db 'cmovno',41h
+ dw bs_instruction-instruction_handler
+ db 'cmovnp',4Bh
+ dw bs_instruction-instruction_handler
+ db 'cmovns',49h
+ dw bs_instruction-instruction_handler
+ db 'cmovnz',45h
+ dw bs_instruction-instruction_handler
+ db 'cmovpe',4Ah
+ dw bs_instruction-instruction_handler
+ db 'cmovpo',4Bh
+ dw bs_instruction-instruction_handler
+ db 'comisd',2Fh
+ dw comisd_instruction-instruction_handler
+ db 'comiss',2Fh
+ dw comiss_instruction-instruction_handler
+ db 'fcmovb',0C0h
+ dw fcmov_instruction-instruction_handler
+ db 'fcmove',0C8h
+ dw fcmov_instruction-instruction_handler
+ db 'fcmovu',0D8h
+ dw fcmov_instruction-instruction_handler
+ db 'fcomip',0F0h
+ dw fcomip_instruction-instruction_handler
+ db 'fcompp',0
+ dw fcompp_instruction-instruction_handler
+ db 'fdivrp',6
+ dw faddp_instruction-instruction_handler
+ db 'ffreep',0
+ dw ffreep_instruction-instruction_handler
+ db 'ficomp',3
+ dw fi_instruction-instruction_handler
+ db 'fidivr',7
+ dw fi_instruction-instruction_handler
+ db 'fisttp',1
+ dw fild_instruction-instruction_handler
+ db 'fisubr',5
+ dw fi_instruction-instruction_handler
+ db 'fldenv',4
+ dw fldenv_instruction-instruction_handler
+ db 'fldl2e',101010b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fldl2t',101001b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fldlg2',101100b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fldln2',101101b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fnclex',0E2h
+ dw fninit_instruction-instruction_handler
+ db 'fndisi',0E1h
+ dw fninit_instruction-instruction_handler
+ db 'fninit',0E3h
+ dw fninit_instruction-instruction_handler
+ db 'fnsave',6
+ dw fnsave_instruction-instruction_handler
+ db 'fnstcw',7
+ dw fldcw_instruction-instruction_handler
+ db 'fnstsw',0
+ dw fnstsw_instruction-instruction_handler
+ db 'format',0
+ dw format_directive-instruction_handler
+ db 'fpatan',110011b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fprem1',110101b
+ dw simple_fpu_instruction-instruction_handler
+ db 'frstor',4
+ dw fnsave_instruction-instruction_handler
+ db 'frstpm',0E5h
+ dw fninit_instruction-instruction_handler
+ db 'fsaved',6
+ dw fsave_instruction_32bit-instruction_handler
+ db 'fsavew',6
+ dw fsave_instruction_16bit-instruction_handler
+ db 'fscale',111101b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fsetpm',0E4h
+ dw fninit_instruction-instruction_handler
+ db 'fstenv',6
+ dw fstenv_instruction-instruction_handler
+ db 'fsubrp',4
+ dw faddp_instruction-instruction_handler
+ db 'fucomi',0E8h
+ dw fcomi_instruction-instruction_handler
+ db 'fucomp',5
+ dw ffree_instruction-instruction_handler
+ db 'fxsave',0
+ dw fxsave_instruction-instruction_handler
+ db 'getsec',37h
+ dw simple_extended_instruction-instruction_handler
+ db 'haddpd',07Ch
+ dw sse_pd_instruction-instruction_handler
+ db 'haddps',07Ch
+ dw cvtpd2dq_instruction-instruction_handler
+ db 'hsubpd',07Dh
+ dw sse_pd_instruction-instruction_handler
+ db 'hsubps',07Dh
+ dw cvtpd2dq_instruction-instruction_handler
+ db 'invept',80h
+ dw vmx_inv_instruction-instruction_handler
+ db 'invlpg',0
+ dw invlpg_instruction-instruction_handler
+ db 'kandnb',42h
+ dw mask_instruction_b-instruction_handler
+ db 'kandnd',42h
+ dw mask_instruction_d-instruction_handler
+ db 'kandnq',42h
+ dw mask_instruction_q-instruction_handler
+ db 'kandnw',42h
+ dw mask_instruction_w-instruction_handler
+ db 'ktestb',99h
+ dw mask_instruction_single_source_b-instruction_handler
+ db 'ktestd',99h
+ dw mask_instruction_single_source_d-instruction_handler
+ db 'ktestq',99h
+ dw mask_instruction_single_source_q-instruction_handler
+ db 'ktestw',99h
+ dw mask_instruction_single_source_w-instruction_handler
+ db 'kxnorb',46h
+ dw mask_instruction_b-instruction_handler
+ db 'kxnord',46h
+ dw mask_instruction_d-instruction_handler
+ db 'kxnorq',46h
+ dw mask_instruction_q-instruction_handler
+ db 'kxnorw',46h
+ dw mask_instruction_w-instruction_handler
+ db 'lfence',0E8h
+ dw fence_instruction-instruction_handler
+ db 'llwpcb',0
+ dw llwpcb_instruction-instruction_handler
+ db 'looped',0E1h
+ dw loop_instruction_32bit-instruction_handler
+ db 'loopeq',0E1h
+ dw loop_instruction_64bit-instruction_handler
+ db 'loopew',0E1h
+ dw loop_instruction_16bit-instruction_handler
+ db 'loopne',0E0h
+ dw loop_instruction-instruction_handler
+ db 'loopnz',0E0h
+ dw loop_instruction-instruction_handler
+ db 'loopzd',0E1h
+ dw loop_instruction_32bit-instruction_handler
+ db 'loopzq',0E1h
+ dw loop_instruction_64bit-instruction_handler
+ db 'loopzw',0E1h
+ dw loop_instruction_16bit-instruction_handler
+ db 'lwpins',0
+ dw lwpins_instruction-instruction_handler
+ db 'lwpval',1
+ dw lwpins_instruction-instruction_handler
+ db 'mfence',0F0h
+ dw fence_instruction-instruction_handler
+ db 'movapd',28h
+ dw movpd_instruction-instruction_handler
+ db 'movaps',28h
+ dw movps_instruction-instruction_handler
+ db 'movdqa',66h
+ dw movdq_instruction-instruction_handler
+ db 'movdqu',0F3h
+ dw movdq_instruction-instruction_handler
+ db 'movhpd',16h
+ dw movlpd_instruction-instruction_handler
+ db 'movhps',16h
+ dw movlps_instruction-instruction_handler
+ db 'movlpd',12h
+ dw movlpd_instruction-instruction_handler
+ db 'movlps',12h
+ dw movlps_instruction-instruction_handler
+ db 'movnti',0C3h
+ dw movnti_instruction-instruction_handler
+ db 'movntq',0E7h
+ dw movntq_instruction-instruction_handler
+ db 'movsxd',63h
+ dw movsxd_instruction-instruction_handler
+ db 'movupd',10h
+ dw movpd_instruction-instruction_handler
+ db 'movups',10h
+ dw movps_instruction-instruction_handler
+ db 'mwaitx',0FBh
+ dw monitor_instruction-instruction_handler
+ db 'paddsb',0ECh
+ dw basic_mmx_instruction-instruction_handler
+ db 'paddsw',0EDh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pextrb',14h
+ dw pextrb_instruction-instruction_handler
+ db 'pextrd',16h
+ dw pextrd_instruction-instruction_handler
+ db 'pextrq',16h
+ dw pextrq_instruction-instruction_handler
+ db 'pextrw',15h
+ dw pextrw_instruction-instruction_handler
+ db 'pfnacc',8Ah
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfsubr',0AAh
+ dw amd3dnow_instruction-instruction_handler
+ db 'phaddd',2
+ dw ssse3_instruction-instruction_handler
+ db 'phaddw',1
+ dw ssse3_instruction-instruction_handler
+ db 'phsubd',6
+ dw ssse3_instruction-instruction_handler
+ db 'phsubw',5
+ dw ssse3_instruction-instruction_handler
+ db 'pinsrb',20h
+ dw pinsrb_instruction-instruction_handler
+ db 'pinsrd',22h
+ dw pinsrd_instruction-instruction_handler
+ db 'pinsrq',22h
+ dw pinsrq_instruction-instruction_handler
+ db 'pinsrw',0C4h
+ dw pinsrw_instruction-instruction_handler
+ db 'pmaxsb',3Ch
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmaxsd',3Dh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmaxsw',0EEh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pmaxub',0DEh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pmaxud',3Fh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmaxuw',3Eh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pminsb',38h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pminsd',39h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pminsw',0EAh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pminub',0DAh
+ dw basic_mmx_instruction-instruction_handler
+ db 'pminud',3Bh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pminuw',3Ah
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmuldq',28h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmulhw',0E5h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pmulld',40h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pmullw',0D5h
+ dw basic_mmx_instruction-instruction_handler
+ db 'popcnt',0B8h
+ dw popcnt_instruction-instruction_handler
+ db 'psadbw',0F6h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pshufb',0
+ dw ssse3_instruction-instruction_handler
+ db 'pshufd',66h
+ dw pshufd_instruction-instruction_handler
+ db 'pshufw',0
+ dw pshufw_instruction-instruction_handler
+ db 'psignb',8
+ dw ssse3_instruction-instruction_handler
+ db 'psignd',0Ah
+ dw ssse3_instruction-instruction_handler
+ db 'psignw',9
+ dw ssse3_instruction-instruction_handler
+ db 'pslldq',111b
+ dw pslldq_instruction-instruction_handler
+ db 'psmash',0FFh
+ dw simple_instruction_f3_0f_01-instruction_handler
+ db 'psrldq',011b
+ dw pslldq_instruction-instruction_handler
+ db 'psubsb',0E8h
+ dw basic_mmx_instruction-instruction_handler
+ db 'psubsw',0E9h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pswapd',0BBh
+ dw amd3dnow_instruction-instruction_handler
+ db 'public',0
+ dw public_directive-instruction_handler
+ db 'pushad',60h
+ dw simple_instruction_32bit_except64-instruction_handler
+ db 'pushaw',60h
+ dw simple_instruction_16bit_except64-instruction_handler
+ db 'pushfd',9Ch
+ dw simple_instruction_32bit_except64-instruction_handler
+ db 'pushfq',9Ch
+ dw simple_instruction_only64-instruction_handler
+ db 'pushfw',9Ch
+ dw simple_instruction_16bit-instruction_handler
+ db 'rdmsrq',32h
+ dw simple_extended_instruction_64bit-instruction_handler
+ db 'rdpkru',0EEh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'rdrand',110b
+ dw rdrand_instruction-instruction_handler
+ db 'rdseed',111b
+ dw rdrand_instruction-instruction_handler
+ db 'rdsspd',1
+ dw rdsspd_instruction-instruction_handler
+ db 'rdsspq',1
+ dw rdsspq_instruction-instruction_handler
+ db 'rdtscp',0F9h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'repeat',0
+ dw repeat_directive-instruction_handler
+ db 'setalc',0D6h
+ dw simple_instruction_except64-instruction_handler
+ db 'setnae',92h
+ dw set_instruction-instruction_handler
+ db 'setnbe',97h
+ dw set_instruction-instruction_handler
+ db 'setnge',9Ch
+ dw set_instruction-instruction_handler
+ db 'setnle',9Fh
+ dw set_instruction-instruction_handler
+ db 'sfence',0F8h
+ dw fence_instruction-instruction_handler
+ db 'shufpd',0C6h
+ dw sse_pd_instruction_imm8-instruction_handler
+ db 'shufps',0C6h
+ dw sse_ps_instruction_imm8-instruction_handler
+ db 'skinit',0
+ dw skinit_instruction-instruction_handler
+ db 'slwpcb',1
+ dw llwpcb_instruction-instruction_handler
+ db 'sqrtpd',51h
+ dw sse_pd_instruction-instruction_handler
+ db 'sqrtps',51h
+ dw sse_ps_instruction-instruction_handler
+ db 'sqrtsd',51h
+ dw sse_sd_instruction-instruction_handler
+ db 'sqrtss',51h
+ dw sse_ss_instruction-instruction_handler
+ db 'swapgs',0F8h
+ dw swapgs_instruction-instruction_handler
+ db 'sysret',07h
+ dw simple_extended_instruction-instruction_handler
+ db 't1mskc',17h
+ dw tbm_instruction-instruction_handler
+ db 'tpause',66h
+ dw tpause_instruction-instruction_handler
+ db 'umwait',0F2h
+ dw tpause_instruction-instruction_handler
+ db 'vaddpd',58h
+ dw avx_pd_instruction_er-instruction_handler
+ db 'vaddps',58h
+ dw avx_ps_instruction_er-instruction_handler
+ db 'vaddsd',58h
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vaddss',58h
+ dw avx_ss_instruction_er-instruction_handler
+ db 'vandpd',54h
+ dw avx_pd_instruction-instruction_handler
+ db 'vandps',54h
+ dw avx_ps_instruction-instruction_handler
+ db 'vcmppd',-1
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpps',-1
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpsd',-1
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpss',-1
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vdivpd',5Eh
+ dw avx_pd_instruction_er-instruction_handler
+ db 'vdivps',5Eh
+ dw avx_ps_instruction_er-instruction_handler
+ db 'vdivsd',5Eh
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vdivss',5Eh
+ dw avx_ss_instruction_er-instruction_handler
+ db 'vlddqu',0F0h
+ dw avx_lddqu_instruction-instruction_handler
+ db 'vmaxpd',5Fh
+ dw avx_pd_instruction_sae-instruction_handler
+ db 'vmaxps',5Fh
+ dw avx_ps_instruction_sae-instruction_handler
+ db 'vmaxsd',5Fh
+ dw avx_sd_instruction_sae-instruction_handler
+ db 'vmaxss',5Fh
+ dw avx_ss_instruction_sae-instruction_handler
+ db 'vmcall',0C1h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vmfunc',0D4h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vminpd',5Dh
+ dw avx_pd_instruction_sae-instruction_handler
+ db 'vminps',5Dh
+ dw avx_ps_instruction_sae-instruction_handler
+ db 'vminsd',5Dh
+ dw avx_sd_instruction_sae-instruction_handler
+ db 'vminss',5Dh
+ dw avx_ss_instruction_sae-instruction_handler
+ db 'vmload',0DAh
+ dw simple_svm_instruction-instruction_handler
+ db 'vmovsd',0
+ dw avx_movsd_instruction-instruction_handler
+ db 'vmovss',0
+ dw avx_movss_instruction-instruction_handler
+ db 'vmread',0
+ dw vmread_instruction-instruction_handler
+ db 'vmsave',0DBh
+ dw simple_svm_instruction-instruction_handler
+ db 'vmulpd',59h
+ dw avx_pd_instruction_er-instruction_handler
+ db 'vmulps',59h
+ dw avx_ps_instruction_er-instruction_handler
+ db 'vmulsd',59h
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vmulss',59h
+ dw avx_ss_instruction_er-instruction_handler
+ db 'vmxoff',0C4h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vpabsb',1Ch
+ dw avx_single_source_bw_instruction_38-instruction_handler
+ db 'vpabsd',1Eh
+ dw avx_single_source_d_instruction_38-instruction_handler
+ db 'vpabsq',1Fh
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vpabsw',1Dh
+ dw avx_single_source_bw_instruction_38-instruction_handler
+ db 'vpaddb',0FCh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpaddd',0FEh
+ dw avx_d_instruction-instruction_handler
+ db 'vpaddq',0D4h
+ dw avx_q_instruction-instruction_handler
+ db 'vpaddw',0FDh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpandd',0DBh
+ dw avx_d_instruction_evex-instruction_handler
+ db 'vpandn',0DFh
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'vpandq',0DBh
+ dw avx_q_instruction_evex-instruction_handler
+ db 'vpavgb',0E0h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpavgw',0E3h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpcmov',0A2h
+ dw vpcmov_instruction-instruction_handler
+ db 'vpcmpb',-1
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpd',-1
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpq',-1
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmpw',-1
+ dw avx512_cmp_w_instruction-instruction_handler
+ db 'vpcomb',-1
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomd',-1
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomq',-1
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomw',-1
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpermb',8Dh
+ dw avx_bw_instruction_38_evex-instruction_handler
+ db 'vpermd',36h
+ dw avx_permd_instruction-instruction_handler
+ db 'vpermq',0
+ dw avx_permq_instruction-instruction_handler
+ db 'vpermw',8Dh
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpperm',0A3h
+ dw xop_128bit_instruction-instruction_handler
+ db 'vprold',1
+ dw avx512_rotate_d_instruction-instruction_handler
+ db 'vprolq',1
+ dw avx512_rotate_q_instruction-instruction_handler
+ db 'vprord',0
+ dw avx512_rotate_d_instruction-instruction_handler
+ db 'vprorq',0
+ dw avx512_rotate_q_instruction-instruction_handler
+ db 'vprotb',90h
+ dw xop_shift_instruction-instruction_handler
+ db 'vprotd',92h
+ dw xop_shift_instruction-instruction_handler
+ db 'vprotq',93h
+ dw xop_shift_instruction-instruction_handler
+ db 'vprotw',91h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshab',98h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshad',9Ah
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshaq',9Bh
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshaw',99h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshlb',94h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshld',96h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshlq',97h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpshlw',95h
+ dw xop_shift_instruction-instruction_handler
+ db 'vpslld',0F2h
+ dw avx_shift_d_instruction-instruction_handler
+ db 'vpsllq',0F3h
+ dw avx_shift_q_instruction-instruction_handler
+ db 'vpsllw',0F1h
+ dw avx_shift_bw_instruction-instruction_handler
+ db 'vpsrad',0E2h
+ dw avx_shift_d_instruction-instruction_handler
+ db 'vpsraq',0E2h
+ dw avx_shift_q_instruction_evex-instruction_handler
+ db 'vpsraw',0E1h
+ dw avx_shift_bw_instruction-instruction_handler
+ db 'vpsrld',0D2h
+ dw avx_shift_d_instruction-instruction_handler
+ db 'vpsrlq',0D3h
+ dw avx_shift_q_instruction-instruction_handler
+ db 'vpsrlw',0D1h
+ dw avx_shift_bw_instruction-instruction_handler
+ db 'vpsubb',0F8h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpsubd',0FAh
+ dw avx_d_instruction-instruction_handler
+ db 'vpsubq',0FBh
+ dw avx_q_instruction-instruction_handler
+ db 'vpsubw',0F9h
+ dw avx_bw_instruction-instruction_handler
+ db 'vptest',17h
+ dw avx_single_source_instruction_38_noevex-instruction_handler
+ db 'vpxord',0EFh
+ dw avx_d_instruction_evex-instruction_handler
+ db 'vpxorq',0EFh
+ dw avx_q_instruction_evex-instruction_handler
+ db 'vrcpps',53h
+ dw avx_single_source_ps_instruction_noevex-instruction_handler
+ db 'vrcpss',53h
+ dw avx_ss_instruction_noevex-instruction_handler
+ db 'vsubpd',5Ch
+ dw avx_pd_instruction_er-instruction_handler
+ db 'vsubps',5Ch
+ dw avx_ps_instruction_er-instruction_handler
+ db 'vsubsd',5Ch
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vsubss',5Ch
+ dw avx_ss_instruction_er-instruction_handler
+ db 'vxorpd',57h
+ dw avx_pd_instruction-instruction_handler
+ db 'vxorps',57h
+ dw avx_ps_instruction-instruction_handler
+ db 'wbinvd',9
+ dw simple_extended_instruction-instruction_handler
+ db 'wrmsrq',30h
+ dw simple_extended_instruction_64bit-instruction_handler
+ db 'wrpkru',0EFh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'wrussd',0F5h
+ dw wrussd_instruction-instruction_handler
+ db 'wrussq',0F5h
+ dw wrussq_instruction-instruction_handler
+ db 'xabort',0
+ dw xabort_instruction-instruction_handler
+ db 'xbegin',0
+ dw xbegin_instruction-instruction_handler
+ db 'xgetbv',0D0h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'xrstor',101b
+ dw fxsave_instruction-instruction_handler
+ db 'xsavec',4
+ dw xsaves_instruction-instruction_handler
+ db 'xsaves',5
+ dw xsaves_instruction-instruction_handler
+ db 'xsetbv',0D1h
+ dw simple_instruction_0f_01-instruction_handler
+instructions_7:
+ db 'blcfill',11h
+ dw tbm_instruction-instruction_handler
+ db 'blendpd',0Dh
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'blendps',0Ch
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'blsfill',12h
+ dw tbm_instruction-instruction_handler
+ db 'clflush',111b
+ dw clflush_instruction-instruction_handler
+ db 'cmovnae',42h
+ dw bs_instruction-instruction_handler
+ db 'cmovnbe',47h
+ dw bs_instruction-instruction_handler
+ db 'cmovnge',4Ch
+ dw bs_instruction-instruction_handler
+ db 'cmovnle',4Fh
+ dw bs_instruction-instruction_handler
+ db 'cmpeqpd',0
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpeqps',0
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpeqsd',0
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpeqss',0
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmplepd',2
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpleps',2
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmplesd',2
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpless',2
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpltpd',1
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpltps',1
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpltsd',1
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpltss',1
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpxchg',0B0h
+ dw basic_486_instruction-instruction_handler
+ db 'display',0
+ dw display_directive-instruction_handler
+ db 'endbr32',0FBh
+ dw endbr_instruction-instruction_handler
+ db 'endbr64',0FAh
+ dw endbr_instruction-instruction_handler
+ db 'fcmovbe',0D0h
+ dw fcmov_instruction-instruction_handler
+ db 'fcmovnb',0C0h
+ dw fcomi_instruction-instruction_handler
+ db 'fcmovne',0C8h
+ dw fcomi_instruction-instruction_handler
+ db 'fcmovnu',0D8h
+ dw fcomi_instruction-instruction_handler
+ db 'fdecstp',110110b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fincstp',110111b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fldenvd',4
+ dw fldenv_instruction_32bit-instruction_handler
+ db 'fldenvw',4
+ dw fldenv_instruction_16bit-instruction_handler
+ db 'fnsaved',6
+ dw fnsave_instruction_32bit-instruction_handler
+ db 'fnsavew',6
+ dw fnsave_instruction_16bit-instruction_handler
+ db 'fnstenv',6
+ dw fldenv_instruction-instruction_handler
+ db 'frndint',111100b
+ dw simple_fpu_instruction-instruction_handler
+ db 'frstord',4
+ dw fnsave_instruction_32bit-instruction_handler
+ db 'frstorw',4
+ dw fnsave_instruction_16bit-instruction_handler
+ db 'fsincos',111011b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fstenvd',6
+ dw fstenv_instruction_32bit-instruction_handler
+ db 'fstenvw',6
+ dw fstenv_instruction_16bit-instruction_handler
+ db 'fucomip',0E8h
+ dw fcomip_instruction-instruction_handler
+ db 'fucompp',0
+ dw fucompp_instruction-instruction_handler
+ db 'fxrstor',1
+ dw fxsave_instruction-instruction_handler
+ db 'fxtract',110100b
+ dw simple_fpu_instruction-instruction_handler
+ db 'fyl2xp1',111001b
+ dw simple_fpu_instruction-instruction_handler
+ db 'incsspd',5
+ dw incsspd_instruction-instruction_handler
+ db 'incsspq',5
+ dw incsspq_instruction-instruction_handler
+ db 'insertq',0
+ dw insertq_instruction-instruction_handler
+ db 'invlpga',0DFh
+ dw invlpga_instruction-instruction_handler
+ db 'invlpgb',0FEh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'invpcid',82h
+ dw vmx_inv_instruction-instruction_handler
+ db 'invvpid',81h
+ dw vmx_inv_instruction-instruction_handler
+ db 'ldmxcsr',10b
+ dw stmxcsr_instruction-instruction_handler
+ db 'loopned',0E0h
+ dw loop_instruction_32bit-instruction_handler
+ db 'loopneq',0E0h
+ dw loop_instruction_64bit-instruction_handler
+ db 'loopnew',0E0h
+ dw loop_instruction_16bit-instruction_handler
+ db 'loopnzd',0E0h
+ dw loop_instruction_32bit-instruction_handler
+ db 'loopnzq',0E0h
+ dw loop_instruction_64bit-instruction_handler
+ db 'loopnzw',0E0h
+ dw loop_instruction_16bit-instruction_handler
+ db 'mcommit',0FAh
+ dw simple_instruction_f3_0f_01-instruction_handler
+ db 'monitor',0C8h
+ dw monitor_instruction-instruction_handler
+ db 'movddup',12h
+ dw sse_sd_instruction-instruction_handler
+ db 'movdiri',0F9h
+ dw movdiri_instruction-instruction_handler
+ db 'movdq2q',0
+ dw movdq2q_instruction-instruction_handler
+ db 'movhlps',12h
+ dw movhlps_instruction-instruction_handler
+ db 'movlhps',16h
+ dw movhlps_instruction-instruction_handler
+ db 'movntdq',0E7h
+ dw movntpd_instruction-instruction_handler
+ db 'movntpd',2Bh
+ dw movntpd_instruction-instruction_handler
+ db 'movntps',2Bh
+ dw movntps_instruction-instruction_handler
+ db 'movntsd',2Bh
+ dw movntsd_instruction-instruction_handler
+ db 'movntss',2Bh
+ dw movntss_instruction-instruction_handler
+ db 'movq2dq',0
+ dw movq2dq_instruction-instruction_handler
+ db 'mpsadbw',42h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'paddusb',0DCh
+ dw basic_mmx_instruction-instruction_handler
+ db 'paddusw',0DDh
+ dw basic_mmx_instruction-instruction_handler
+ db 'palignr',0
+ dw palignr_instruction-instruction_handler
+ db 'pavgusb',0BFh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pblendw',0Eh
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'pcmpeqb',74h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcmpeqd',76h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcmpeqq',29h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pcmpeqw',75h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcmpgtb',64h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcmpgtd',66h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcmpgtq',37h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'pcmpgtw',65h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pcommit',0F8h
+ dw pcommit_instruction-instruction_handler
+ db 'pconfig',0C5h
+ dw pconfig_instruction-instruction_handler
+ db 'pfcmpeq',0B0h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfcmpge',90h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfcmpgt',0A0h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfpnacc',8Eh
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfrsqrt',97h
+ dw amd3dnow_instruction-instruction_handler
+ db 'phaddsw',3
+ dw ssse3_instruction-instruction_handler
+ db 'phsubsw',7
+ dw ssse3_instruction-instruction_handler
+ db 'pmaddwd',0F5h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pmulhrw',0B7h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pmulhuw',0E4h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pmuludq',0F4h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pshufhw',0F3h
+ dw pshufd_instruction-instruction_handler
+ db 'pshuflw',0F2h
+ dw pshufd_instruction-instruction_handler
+ db 'psubusb',0D8h
+ dw basic_mmx_instruction-instruction_handler
+ db 'psubusw',0D9h
+ dw basic_mmx_instruction-instruction_handler
+ db 'ptwrite',4
+ dw ptwrite_instruction-instruction_handler
+ db 'roundpd',9
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'roundps',8
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'roundsd',0Bh
+ dw sse4_sd_instruction_66_3a_imm8-instruction_handler
+ db 'roundss',0Ah
+ dw sse4_ss_instruction_66_3a_imm8-instruction_handler
+ db 'rsqrtps',52h
+ dw sse_ps_instruction-instruction_handler
+ db 'rsqrtss',52h
+ dw sse_ss_instruction-instruction_handler
+ db 'section',0
+ dw section_directive-instruction_handler
+ db 'segment',0
+ dw segment_directive-instruction_handler
+ db 'stmxcsr',11b
+ dw stmxcsr_instruction-instruction_handler
+ db 'syscall',05h
+ dw simple_extended_instruction-instruction_handler
+ db 'sysexit',35h
+ dw simple_extended_instruction-instruction_handler
+ db 'sysretq',07h
+ dw simple_extended_instruction_64bit-instruction_handler
+ db 'tlbsync',0FFh
+ dw simple_instruction_0f_01-instruction_handler
+ db 'ucomisd',2Eh
+ dw comisd_instruction-instruction_handler
+ db 'ucomiss',2Eh
+ dw comiss_instruction-instruction_handler
+ db 'vaesdec',0DEh
+ dw avx_instruction_38_nomask-instruction_handler
+ db 'vaesenc',0DCh
+ dw avx_instruction_38_nomask-instruction_handler
+ db 'vaesimc',0DBh
+ dw avx_single_source_128bit_instruction_38_noevex-instruction_handler
+ db 'valignd',3
+ dw avx_d_instruction_3a_imm8_evex-instruction_handler
+ db 'valignq',3
+ dw avx_q_instruction_3a_imm8_evex-instruction_handler
+ db 'vandnpd',55h
+ dw avx_pd_instruction-instruction_handler
+ db 'vandnps',55h
+ dw avx_ps_instruction-instruction_handler
+ db 'vcomisd',2Fh
+ dw avx_comisd_instruction-instruction_handler
+ db 'vcomiss',2Fh
+ dw avx_comiss_instruction-instruction_handler
+ db 'vexp2pd',0C8h
+ dw avx512_exp2pd_instruction-instruction_handler
+ db 'vexp2ps',0C8h
+ dw avx512_exp2ps_instruction-instruction_handler
+ db 'vfrczpd',81h
+ dw xop_single_source_instruction-instruction_handler
+ db 'vfrczps',80h
+ dw xop_single_source_instruction-instruction_handler
+ db 'vfrczsd',83h
+ dw xop_single_source_sd_instruction-instruction_handler
+ db 'vfrczss',82h
+ dw xop_single_source_ss_instruction-instruction_handler
+ db 'vhaddpd',07Ch
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'vhaddps',07Ch
+ dw avx_ps_instruction_noevex-instruction_handler
+ db 'vhsubpd',07Dh
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'vhsubps',07Dh
+ dw avx_ps_instruction_noevex-instruction_handler
+ db 'virtual',0
+ dw virtual_directive-instruction_handler
+ db 'vmclear',6
+ dw vmclear_instruction-instruction_handler
+ db 'vmmcall',0D9h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vmovapd',28h
+ dw avx_movpd_instruction-instruction_handler
+ db 'vmovaps',28h
+ dw avx_movps_instruction-instruction_handler
+ db 'vmovdqa',6Fh
+ dw avx_movdqa_instruction-instruction_handler
+ db 'vmovdqu',6Fh
+ dw avx_movdqu_instruction-instruction_handler
+ db 'vmovhpd',16h
+ dw avx_movlpd_instruction-instruction_handler
+ db 'vmovhps',16h
+ dw avx_movlps_instruction-instruction_handler
+ db 'vmovlpd',12h
+ dw avx_movlpd_instruction-instruction_handler
+ db 'vmovlps',12h
+ dw avx_movlps_instruction-instruction_handler
+ db 'vmovupd',10h
+ dw avx_movpd_instruction-instruction_handler
+ db 'vmovups',10h
+ dw avx_movps_instruction-instruction_handler
+ db 'vmptrld',6
+ dw vmx_instruction-instruction_handler
+ db 'vmptrst',7
+ dw vmx_instruction-instruction_handler
+ db 'vmwrite',0
+ dw vmwrite_instruction-instruction_handler
+ db 'vpaddsb',0ECh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpaddsw',0EDh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpandnd',0DFh
+ dw avx_d_instruction_evex-instruction_handler
+ db 'vpandnq',0DFh
+ dw avx_q_instruction_evex-instruction_handler
+ db 'vpcmpub',-1
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpud',-1
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpuq',-1
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpuw',-1
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcomub',-1
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomud',-1
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomuq',-1
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomuw',-1
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpermpd',1
+ dw avx_permq_instruction-instruction_handler
+ db 'vpermps',16h
+ dw avx_permd_instruction-instruction_handler
+ db 'vpextrb',14h
+ dw avx_extract_b_instruction-instruction_handler
+ db 'vpextrd',16h
+ dw avx_extract_d_instruction-instruction_handler
+ db 'vpextrq',16h
+ dw avx_extract_q_instruction-instruction_handler
+ db 'vpextrw',15h
+ dw avx_extract_w_instruction-instruction_handler
+ db 'vphaddd',2
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vphaddw',1
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vphsubd',6
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vphsubw',5
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vpinsrb',20h
+ dw avx_pinsrb_instruction-instruction_handler
+ db 'vpinsrd',22h
+ dw avx_pinsrd_instruction-instruction_handler
+ db 'vpinsrq',22h
+ dw avx_pinsrq_instruction-instruction_handler
+ db 'vpinsrw',0C4h
+ dw avx_pinsrw_instruction-instruction_handler
+ db 'vpmaxsb',3Ch
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpmaxsd',3Dh
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpmaxsq',3Dh
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpmaxsw',0EEh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpmaxub',0DEh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpmaxud',3Fh
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpmaxuq',3Fh
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpmaxuw',3Eh
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpminsb',38h
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpminsd',39h
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpminsq',39h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpminsw',0EAh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpminub',0DAh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpminud',3Bh
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpminuq',3Bh
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpminuw',3Ah
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpmovdb',31h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovdw',33h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovqb',32h
+ dw avx512_pmovqb_instruction-instruction_handler
+ db 'vpmovqd',35h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovqw',34h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovwb',30h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmuldq',28h
+ dw avx_q_instruction_38-instruction_handler
+ db 'vpmulhw',0E5h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpmulld',40h
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpmullq',40h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpmullw',0D5h
+ dw avx_bw_instruction-instruction_handler
+ db 'vprolvd',15h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vprolvq',15h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vprorvd',14h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vprorvq',14h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpsadbw',0F6h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpshldd',71h
+ dw avx_d_instruction_3a_imm8_evex-instruction_handler
+ db 'vpshldq',71h
+ dw avx_q_instruction_3a_imm8_evex-instruction_handler
+ db 'vpshldw',70h
+ dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
+ db 'vpshrdd',73h
+ dw avx_d_instruction_3a_imm8_evex-instruction_handler
+ db 'vpshrdq',73h
+ dw avx_q_instruction_3a_imm8_evex-instruction_handler
+ db 'vpshrdw',72h
+ dw avx_bw_instruction_3a_imm8_w1_evex-instruction_handler
+ db 'vpshufb',0
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpshufd',70h
+ dw avx_single_source_d_instruction_imm8-instruction_handler
+ db 'vpsignb',8
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vpsignd',0Ah
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vpsignw',9
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vpslldq',111b
+ dw avx_shift_dq_instruction-instruction_handler
+ db 'vpsllvd',47h
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpsllvq',47h
+ dw avx_q_instruction_38_w1-instruction_handler
+ db 'vpsllvw',12h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpsravd',46h
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpsravq',46h
+ dw avx_q_instruction_38_w1_evex-instruction_handler
+ db 'vpsravw',11h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpsrldq',011b
+ dw avx_shift_dq_instruction-instruction_handler
+ db 'vpsrlvd',45h
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpsrlvq',45h
+ dw avx_q_instruction_38_w1-instruction_handler
+ db 'vpsrlvw',10h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpsubsb',0E8h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpsubsw',0E9h
+ dw avx_bw_instruction-instruction_handler
+ db 'vshufpd',0C6h
+ dw avx_pd_instruction_imm8-instruction_handler
+ db 'vshufps',0C6h
+ dw avx_ps_instruction_imm8-instruction_handler
+ db 'vsqrtpd',51h
+ dw avx_single_source_pd_instruction_er-instruction_handler
+ db 'vsqrtps',51h
+ dw avx_single_source_ps_instruction_er-instruction_handler
+ db 'vsqrtsd',51h
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vsqrtss',51h
+ dw avx_ss_instruction_er-instruction_handler
+ db 'vtestpd',0Fh
+ dw avx_single_source_instruction_38_noevex-instruction_handler
+ db 'vtestps',0Eh
+ dw avx_single_source_instruction_38_noevex-instruction_handler
+ db 'xrstors',3
+ dw xsaves_instruction-instruction_handler
+ db 'xsave64',100b
+ dw fxsave_instruction_64bit-instruction_handler
+instructions_8:
+ db 'addsubpd',0D0h
+ dw sse_pd_instruction-instruction_handler
+ db 'addsubps',0D0h
+ dw cvtpd2dq_instruction-instruction_handler
+ db 'blendvpd',15h
+ dw sse4_instruction_66_38_xmm0-instruction_handler
+ db 'blendvps',14h
+ dw sse4_instruction_66_38_xmm0-instruction_handler
+ db 'cldemote',0
+ dw cldemote_instruction-instruction_handler
+ db 'clrssbsy',6
+ dw clrssbsy_instruction-instruction_handler
+ db 'cmpneqpd',4
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpneqps',4
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpneqsd',4
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpneqss',4
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpnlepd',6
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpnleps',6
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpnlesd',6
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpnless',6
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpnltpd',5
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpnltps',5
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpnltsd',5
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpnltss',5
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpordpd',7
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpordps',7
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpordsd',7
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpordss',7
+ dw cmp_ss_instruction-instruction_handler
+ db 'cvtdq2pd',0E6h
+ dw cvtdq2pd_instruction-instruction_handler
+ db 'cvtdq2ps',5Bh
+ dw sse_ps_instruction-instruction_handler
+ db 'cvtpd2dq',0E6h
+ dw cvtpd2dq_instruction-instruction_handler
+ db 'cvtpd2pi',2Dh
+ dw cvtpd2pi_instruction-instruction_handler
+ db 'cvtpd2ps',5Ah
+ dw sse_pd_instruction-instruction_handler
+ db 'cvtpi2pd',2Ah
+ dw cvtpi2pd_instruction-instruction_handler
+ db 'cvtpi2ps',2Ah
+ dw cvtpi2ps_instruction-instruction_handler
+ db 'cvtps2dq',5Bh
+ dw sse_pd_instruction-instruction_handler
+ db 'cvtps2pd',5Ah
+ dw cvtps2pd_instruction-instruction_handler
+ db 'cvtps2pi',2Dh
+ dw cvtps2pi_instruction-instruction_handler
+ db 'cvtsd2si',2Dh
+ dw cvtsd2si_instruction-instruction_handler
+ db 'cvtsd2ss',5Ah
+ dw sse_sd_instruction-instruction_handler
+ db 'cvtsi2sd',2Ah
+ dw cvtsi2sd_instruction-instruction_handler
+ db 'cvtsi2ss',2Ah
+ dw cvtsi2ss_instruction-instruction_handler
+ db 'cvtss2sd',5Ah
+ dw sse_ss_instruction-instruction_handler
+ db 'cvtss2si',2Dh
+ dw cvtss2si_instruction-instruction_handler
+ db 'fcmovnbe',0D0h
+ dw fcomi_instruction-instruction_handler
+ db 'fnstenvd',6
+ dw fldenv_instruction_32bit-instruction_handler
+ db 'fnstenvw',6
+ dw fldenv_instruction_16bit-instruction_handler
+ db 'fxsave64',0
+ dw fxsave_instruction_64bit-instruction_handler
+ db 'insertps',21h
+ dw insertps_instruction-instruction_handler
+ db 'kortestb',98h
+ dw mask_instruction_single_source_b-instruction_handler
+ db 'kortestd',98h
+ dw mask_instruction_single_source_d-instruction_handler
+ db 'kortestq',98h
+ dw mask_instruction_single_source_q-instruction_handler
+ db 'kortestw',98h
+ dw mask_instruction_single_source_w-instruction_handler
+ db 'kshiftlb',32h
+ dw mask_shift_instruction_d-instruction_handler
+ db 'kshiftld',33h
+ dw mask_shift_instruction_d-instruction_handler
+ db 'kshiftlq',33h
+ dw mask_shift_instruction_q-instruction_handler
+ db 'kshiftlw',32h
+ dw mask_shift_instruction_q-instruction_handler
+ db 'kshiftrb',30h
+ dw mask_shift_instruction_d-instruction_handler
+ db 'kshiftrd',31h
+ dw mask_shift_instruction_d-instruction_handler
+ db 'kshiftrq',31h
+ dw mask_shift_instruction_q-instruction_handler
+ db 'kshiftrw',30h
+ dw mask_shift_instruction_q-instruction_handler
+ db 'kunpckbw',4Bh
+ dw mask_instruction_b-instruction_handler
+ db 'kunpckdq',4Bh
+ dw mask_instruction_q-instruction_handler
+ db 'kunpckwd',4Bh
+ dw mask_instruction_w-instruction_handler
+ db 'maskmovq',0
+ dw maskmovq_instruction-instruction_handler
+ db 'monitorx',0FAh
+ dw monitor_instruction-instruction_handler
+ db 'movmskpd',0
+ dw movmskpd_instruction-instruction_handler
+ db 'movmskps',0
+ dw movmskps_instruction-instruction_handler
+ db 'movntdqa',2Ah
+ dw movntdqa_instruction-instruction_handler
+ db 'movshdup',16h
+ dw movshdup_instruction-instruction_handler
+ db 'movsldup',12h
+ dw movshdup_instruction-instruction_handler
+ db 'packssdw',6Bh
+ dw basic_mmx_instruction-instruction_handler
+ db 'packsswb',63h
+ dw basic_mmx_instruction-instruction_handler
+ db 'packusdw',2Bh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'packuswb',67h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pblendvb',10h
+ dw sse4_instruction_66_38_xmm0-instruction_handler
+ db 'pfrcpit1',0A6h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfrcpit2',0B6h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pfrsqit1',0A7h
+ dw amd3dnow_instruction-instruction_handler
+ db 'pmovmskb',0D7h
+ dw pmovmskb_instruction-instruction_handler
+ db 'pmovsxbd',21h
+ dw pmovsxbd_instruction-instruction_handler
+ db 'pmovsxbq',22h
+ dw pmovsxbq_instruction-instruction_handler
+ db 'pmovsxbw',20h
+ dw pmovsxbw_instruction-instruction_handler
+ db 'pmovsxdq',25h
+ dw pmovsxdq_instruction-instruction_handler
+ db 'pmovsxwd',23h
+ dw pmovsxwd_instruction-instruction_handler
+ db 'pmovsxwq',24h
+ dw pmovsxwq_instruction-instruction_handler
+ db 'pmovzxbd',31h
+ dw pmovsxbd_instruction-instruction_handler
+ db 'pmovzxbq',32h
+ dw pmovsxbq_instruction-instruction_handler
+ db 'pmovzxbw',30h
+ dw pmovsxbw_instruction-instruction_handler
+ db 'pmovzxdq',35h
+ dw pmovsxdq_instruction-instruction_handler
+ db 'pmovzxwd',33h
+ dw pmovsxwd_instruction-instruction_handler
+ db 'pmovzxwq',34h
+ dw pmovsxwq_instruction-instruction_handler
+ db 'pmulhrsw',0Bh
+ dw ssse3_instruction-instruction_handler
+ db 'prefetch',0
+ dw amd_prefetch_instruction-instruction_handler
+ db 'rdfsbase',0
+ dw rdfsbase_instruction-instruction_handler
+ db 'rdgsbase',1
+ dw rdfsbase_instruction-instruction_handler
+ db 'rstorssp',5
+ dw rstorssp_instruction-instruction_handler
+ db 'setssbsy',0E8h
+ dw setssbsy_instruction-instruction_handler
+ db 'sha1msg1',0C9h
+ dw sse4_instruction_38-instruction_handler
+ db 'sha1msg2',0CAh
+ dw sse4_instruction_38-instruction_handler
+ db 'sysenter',34h
+ dw simple_extended_instruction-instruction_handler
+ db 'sysexitq',35h
+ dw simple_extended_instruction_64bit-instruction_handler
+ db 'umonitor',0
+ dw umonitor_instruction-instruction_handler
+ db 'unpckhpd',15h
+ dw sse_pd_instruction-instruction_handler
+ db 'unpckhps',15h
+ dw sse_ps_instruction-instruction_handler
+ db 'unpcklpd',14h
+ dw sse_pd_instruction-instruction_handler
+ db 'unpcklps',14h
+ dw sse_ps_instruction-instruction_handler
+ db 'vblendpd',0Dh
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vblendps',0Ch
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vcmpeqpd',0
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpeqps',0
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpeqsd',0
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpeqss',0
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpgepd',0Dh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpgeps',0Dh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpgesd',0Dh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpgess',0Dh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpgtpd',0Eh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpgtps',0Eh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpgtsd',0Eh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpgtss',0Eh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmplepd',2
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpleps',2
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmplesd',2
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpless',2
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpltpd',1
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpltps',1
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpltsd',1
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpltss',1
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vfmaddpd',69h
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmaddps',68h
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmaddsd',6Bh
+ dw fma4_instruction_sd-instruction_handler
+ db 'vfmaddss',6Ah
+ dw fma4_instruction_ss-instruction_handler
+ db 'vfmsubpd',6Dh
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmsubps',6Ch
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmsubsd',6Fh
+ dw fma4_instruction_sd-instruction_handler
+ db 'vfmsubss',6Eh
+ dw fma4_instruction_ss-instruction_handler
+ db 'vldmxcsr',10b
+ dw vstmxcsr_instruction-instruction_handler
+ db 'vmlaunch',0C2h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vmovddup',12h
+ dw avx_movddup_instruction-instruction_handler
+ db 'vmovdqu8',6Fh
+ dw avx512_movdqu8_instruction-instruction_handler
+ db 'vmovhlps',12h
+ dw avx_movhlps_instruction-instruction_handler
+ db 'vmovlhps',16h
+ dw avx_movhlps_instruction-instruction_handler
+ db 'vmovntdq',0E7h
+ dw avx_movntdq_instruction-instruction_handler
+ db 'vmovntpd',2Bh
+ dw avx_movntpd_instruction-instruction_handler
+ db 'vmovntps',2Bh
+ dw avx_movntps_instruction-instruction_handler
+ db 'vmpsadbw',42h
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vmresume',0C3h
+ dw simple_instruction_0f_01-instruction_handler
+ db 'vpaddusb',0DCh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpaddusw',0DDh
+ dw avx_bw_instruction-instruction_handler
+ db 'vpalignr',0Fh
+ dw avx_pi_instruction_3a_imm8-instruction_handler
+ db 'vpblendd',2
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpblendw',0Eh
+ dw avx_pi_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpcmpeqb',74h
+ dw avx_cmpeqb_instruction-instruction_handler
+ db 'vpcmpeqd',76h
+ dw avx_cmpeqd_instruction-instruction_handler
+ db 'vpcmpeqq',29h
+ dw avx_cmpeqq_instruction-instruction_handler
+ db 'vpcmpeqw',75h
+ dw avx_cmpeqb_instruction-instruction_handler
+ db 'vpcmpgtb',64h
+ dw avx_cmpeqb_instruction-instruction_handler
+ db 'vpcmpgtd',66h
+ dw avx_cmpeqd_instruction-instruction_handler
+ db 'vpcmpgtq',37h
+ dw avx_cmpeqq_instruction-instruction_handler
+ db 'vpcmpgtw',65h
+ dw avx_cmpeqb_instruction-instruction_handler
+ db 'vpcmpleb',2
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpled',2
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpleq',2
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmplew',2
+ dw avx512_cmp_w_instruction-instruction_handler
+ db 'vpcmpltb',1
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpltd',1
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpltq',1
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmpltw',1
+ dw avx512_cmp_w_instruction-instruction_handler
+ db 'vpcomeqb',4
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomeqd',4
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomeqq',4
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomeqw',4
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpcomgeb',3
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomged',3
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomgeq',3
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomgew',3
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpcomgtb',2
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomgtd',2
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomgtq',2
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomgtw',2
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpcomleb',1
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomled',1
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomleq',1
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomlew',1
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpcomltb',0
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomltd',0
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomltq',0
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomltw',0
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpdpbusd',50h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpdpwssd',52h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpermi2b',75h
+ dw avx_bw_instruction_38_evex-instruction_handler
+ db 'vpermi2d',76h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpermi2q',76h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpermi2w',75h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpermt2b',7Dh
+ dw avx_bw_instruction_38_evex-instruction_handler
+ db 'vpermt2d',7Eh
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpermt2q',7Eh
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpermt2w',7Dh
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vphaddbd',0C2h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddbq',0C3h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddbw',0C1h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphadddq',0CBh
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddsw',3
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vphaddwd',0C6h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddwq',0C7h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphsubbw',0E1h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphsubdq',0E3h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphsubsw',7
+ dw avx_pi_instruction_38_noevex-instruction_handler
+ db 'vphsubwd',0E2h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vplzcntd',44h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vplzcntq',44h
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vpmacsdd',9Eh
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacswd',96h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacsww',95h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmaddwd',0F5h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpmovb2m',29h
+ dw avx512_pmov_2m_instruction-instruction_handler
+ db 'vpmovd2m',39h
+ dw avx512_pmov_2m_instruction-instruction_handler
+ db 'vpmovm2b',28h
+ dw avx512_pmov_m2_instruction-instruction_handler
+ db 'vpmovm2d',38h
+ dw avx512_pmov_m2_instruction-instruction_handler
+ db 'vpmovm2q',38h
+ dw avx512_pmov_m2_instruction_w1-instruction_handler
+ db 'vpmovm2w',28h
+ dw avx512_pmov_m2_instruction_w1-instruction_handler
+ db 'vpmovq2m',39h
+ dw avx512_pmov_2m_instruction_w1-instruction_handler
+ db 'vpmovsdb',21h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovsdw',23h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovsqb',22h
+ dw avx512_pmovqb_instruction-instruction_handler
+ db 'vpmovsqd',25h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovsqw',24h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovswb',20h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovw2m',29h
+ dw avx512_pmov_2m_instruction_w1-instruction_handler
+ db 'vpmulhuw',0E4h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpmuludq',0F4h
+ dw avx_q_instruction-instruction_handler
+ db 'vpopcntb',54h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vpopcntd',55h
+ dw avx512_single_source_ps_instruction-instruction_handler
+ db 'vpopcntq',55h
+ dw avx512_single_source_pd_instruction-instruction_handler
+ db 'vpopcntw',54h
+ dw avx_single_source_d_instruction_38_evex_w1-instruction_handler
+ db 'vpshldvd',71h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpshldvq',71h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpshldvw',70h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpshrdvd',73h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpshrdvq',73h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpshrdvw',72
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpshufhw',0F3h
+ dw avx_pshuf_w_instruction-instruction_handler
+ db 'vpshuflw',0F2h
+ dw avx_pshuf_w_instruction-instruction_handler
+ db 'vpsubusb',0D8h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpsubusw',0D9h
+ dw avx_bw_instruction-instruction_handler
+ db 'vptestmb',26h
+ dw avx512_ptestmb_instruction-instruction_handler
+ db 'vptestmd',27h
+ dw avx512_ptestmd_instruction-instruction_handler
+ db 'vptestmq',27h
+ dw avx512_ptestmq_instruction-instruction_handler
+ db 'vptestmw',26h
+ dw avx512_ptestmw_instruction-instruction_handler
+ db 'vrangepd',50h
+ dw avx512_pd_instruction_sae_imm8-instruction_handler
+ db 'vrangeps',50h
+ dw avx512_ps_instruction_sae_imm8-instruction_handler
+ db 'vrangesd',51h
+ dw avx512_sd_instruction_sae_imm8-instruction_handler
+ db 'vrangess',51h
+ dw avx512_ss_instruction_sae_imm8-instruction_handler
+ db 'vrcp14pd',4Ch
+ dw avx512_single_source_pd_instruction-instruction_handler
+ db 'vrcp14ps',4Ch
+ dw avx512_single_source_ps_instruction-instruction_handler
+ db 'vrcp14sd',4Dh
+ dw avx512_sd_instruction-instruction_handler
+ db 'vrcp14ss',4Dh
+ dw avx512_ss_instruction-instruction_handler
+ db 'vrcp28pd',0CAh
+ dw avx512_exp2pd_instruction-instruction_handler
+ db 'vrcp28ps',0CAh
+ dw avx512_exp2ps_instruction-instruction_handler
+ db 'vrcp28sd',0CBh
+ dw avx512_sd_instruction_sae-instruction_handler
+ db 'vrcp28ss',0CBh
+ dw avx512_ss_instruction_sae-instruction_handler
+ db 'vroundpd',9
+ dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
+ db 'vroundps',8
+ dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler
+ db 'vroundsd',0Bh
+ dw avx_sd_instruction_3a_imm8_noevex-instruction_handler
+ db 'vroundss',0Ah
+ dw avx_ss_instruction_3a_imm8_noevex-instruction_handler
+ db 'vrsqrtps',52h
+ dw avx_single_source_ps_instruction_noevex-instruction_handler
+ db 'vrsqrtss',52h
+ dw avx_ss_instruction_noevex-instruction_handler
+ db 'vstmxcsr',11b
+ dw vstmxcsr_instruction-instruction_handler
+ db 'vucomisd',2Eh
+ dw avx_comisd_instruction-instruction_handler
+ db 'vucomiss',2Eh
+ dw avx_comiss_instruction-instruction_handler
+ db 'vzeroall',77h
+ dw vzeroall_instruction-instruction_handler
+ db 'wbnoinvd',9
+ dw simple_extended_instruction_f3-instruction_handler
+ db 'wrfsbase',2
+ dw rdfsbase_instruction-instruction_handler
+ db 'wrgsbase',3
+ dw rdfsbase_instruction-instruction_handler
+ db 'xacquire',0F2h
+ dw prefix_instruction-instruction_handler
+ db 'xrelease',0F3h
+ dw prefix_instruction-instruction_handler
+ db 'xrstor64',101b
+ dw fxsave_instruction_64bit-instruction_handler
+ db 'xsavec64',4
+ dw xsaves_instruction_64bit-instruction_handler
+ db 'xsaveopt',110b
+ dw fxsave_instruction-instruction_handler
+ db 'xsaves64',5
+ dw xsaves_instruction_64bit-instruction_handler
+instructions_9:
+ db 'cmpxchg8b',8
+ dw cmpxchgx_instruction-instruction_handler
+ db 'cvttpd2dq',0E6h
+ dw sse_pd_instruction-instruction_handler
+ db 'cvttpd2pi',2Ch
+ dw cvtpd2pi_instruction-instruction_handler
+ db 'cvttps2dq',5Bh
+ dw movshdup_instruction-instruction_handler
+ db 'cvttps2pi',2Ch
+ dw cvtps2pi_instruction-instruction_handler
+ db 'cvttsd2si',2Ch
+ dw cvtsd2si_instruction-instruction_handler
+ db 'cvttss2si',2Ch
+ dw cvtss2si_instruction-instruction_handler
+ db 'extractps',17h
+ dw extractps_instruction-instruction_handler
+ db 'fxrstor64',1
+ dw fxsave_instruction_64bit-instruction_handler
+ db 'gf2p8mulb',0CFh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'movdir64b',0F8h
+ dw movdir64b_instruction-instruction_handler
+ db 'pclmulqdq',-1
+ dw pclmulqdq_instruction-instruction_handler
+ db 'pcmpestri',61h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'pcmpestrm',60h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'pcmpistri',63h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'pcmpistrm',62h
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'pmaddubsw',4
+ dw ssse3_instruction-instruction_handler
+ db 'prefetchw',1
+ dw amd_prefetch_instruction-instruction_handler
+ db 'punpckhbw',68h
+ dw basic_mmx_instruction-instruction_handler
+ db 'punpckhdq',6Ah
+ dw basic_mmx_instruction-instruction_handler
+ db 'punpckhwd',69h
+ dw basic_mmx_instruction-instruction_handler
+ db 'punpcklbw',60h
+ dw basic_mmx_instruction-instruction_handler
+ db 'punpckldq',62h
+ dw basic_mmx_instruction-instruction_handler
+ db 'punpcklwd',61h
+ dw basic_mmx_instruction-instruction_handler
+ db 'pvalidate',0FFh
+ dw simple_instruction_f2_0f_01-instruction_handler
+ db 'rmpadjust',0FEh
+ dw simple_instruction_f3_0f_01-instruction_handler
+ db 'rmpupdate',0FEh
+ dw simple_instruction_f2_0f_01-instruction_handler
+ db 'sha1nexte',0C8h
+ dw sse4_instruction_38-instruction_handler
+ db 'sha1rnds4',0CCh
+ dw sse4_instruction_3a_imm8-instruction_handler
+ db 'useavx256',0
+ dw set_evex_mode-instruction_handler
+ db 'useavx512',1
+ dw set_evex_mode-instruction_handler
+ db 'vaddsubpd',0D0h
+ dw avx_pd_instruction_noevex-instruction_handler
+ db 'vaddsubps',0D0h
+ dw avx_ps_instruction_noevex-instruction_handler
+ db 'vblendmpd',65h
+ dw avx_pd_instruction_38_evex-instruction_handler
+ db 'vblendmps',65h
+ dw avx_ps_instruction_66_38_evex-instruction_handler
+ db 'vblendvpd',4Bh
+ dw avx_triple_source_instruction_3a_noevex-instruction_handler
+ db 'vblendvps',4Ah
+ dw avx_triple_source_instruction_3a_noevex-instruction_handler
+ db 'vcmpneqpd',4
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpneqps',4
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpneqsd',4
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpneqss',4
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpngepd',9
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpngeps',9
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpngesd',9
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpngess',9
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpngtpd',0Ah
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpngtps',0Ah
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpngtsd',0Ah
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpngtss',0Ah
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpnlepd',6
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpnleps',6
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpnlesd',6
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpnless',6
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpnltpd',5
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpnltps',5
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpnltsd',5
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpnltss',5
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpordpd',7
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpordps',7
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpordsd',7
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpordss',7
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcvtdq2pd',0E6h
+ dw avx_cvtdq2pd_instruction-instruction_handler
+ db 'vcvtdq2ps',5Bh
+ dw avx_single_source_ps_instruction_er-instruction_handler
+ db 'vcvtpd2dq',0E6h
+ dw avx_cvtpd2dq_instruction-instruction_handler
+ db 'vcvtpd2ps',5Ah
+ dw avx_cvtpd2ps_instruction-instruction_handler
+ db 'vcvtpd2qq',7Bh
+ dw avx_single_source_pd_instruction_er_evex-instruction_handler
+ db 'vcvtph2ps',13h
+ dw avx_cvtph2ps_instruction-instruction_handler
+ db 'vcvtps2dq',5Bh
+ dw avx_cvtps2dq_instruction-instruction_handler
+ db 'vcvtps2pd',5Ah
+ dw avx_cvtps2pd_instruction-instruction_handler
+ db 'vcvtps2ph',1Dh
+ dw avx_cvtps2ph_instruction-instruction_handler
+ db 'vcvtps2qq',7Bh
+ dw avx_cvtps2qq_instruction-instruction_handler
+ db 'vcvtqq2pd',0E6h
+ dw avx_cvtqq2pd_instruction-instruction_handler
+ db 'vcvtqq2ps',5Bh
+ dw avx_cvtpd2udq_instruction-instruction_handler
+ db 'vcvtsd2si',2Dh
+ dw avx_cvtsd2si_instruction-instruction_handler
+ db 'vcvtsd2ss',5Ah
+ dw avx_sd_instruction_er-instruction_handler
+ db 'vcvtsi2sd',2Ah
+ dw avx_cvtsi2sd_instruction-instruction_handler
+ db 'vcvtsi2ss',2Ah
+ dw avx_cvtsi2ss_instruction-instruction_handler
+ db 'vcvtss2sd',5Ah
+ dw avx_ss_instruction_sae-instruction_handler
+ db 'vcvtss2si',2Dh
+ dw avx_cvtss2si_instruction-instruction_handler
+ db 'vdbpsadbw',42h
+ dw avx_bw_instruction_3a_imm8_evex-instruction_handler
+ db 'vexpandpd',88h
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vexpandps',88h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vfnmaddpd',79h
+ dw fma4_instruction_p-instruction_handler
+ db 'vfnmaddps',78h
+ dw fma4_instruction_p-instruction_handler
+ db 'vfnmaddsd',7Bh
+ dw fma4_instruction_sd-instruction_handler
+ db 'vfnmaddss',7Ah
+ dw fma4_instruction_ss-instruction_handler
+ db 'vfnmsubpd',7Dh
+ dw fma4_instruction_p-instruction_handler
+ db 'vfnmsubps',7Ch
+ dw fma4_instruction_p-instruction_handler
+ db 'vfnmsubsd',7Fh
+ dw fma4_instruction_sd-instruction_handler
+ db 'vfnmsubss',7Eh
+ dw fma4_instruction_ss-instruction_handler
+ db 'vgetexppd',42h
+ dw avx512_single_source_pd_instruction_sae-instruction_handler
+ db 'vgetexpps',42h
+ dw avx512_single_source_ps_instruction_sae-instruction_handler
+ db 'vgetexpsd',43h
+ dw avx512_sd_instruction_sae-instruction_handler
+ db 'vgetexpss',43h
+ dw avx512_ss_instruction_sae-instruction_handler
+ db 'vinsertps',21h
+ dw avx_insertps_instruction-instruction_handler
+ db 'vmovdqa32',6Fh
+ dw avx512_movdqa32_instruction-instruction_handler
+ db 'vmovdqa64',6Fh
+ dw avx512_movdqa64_instruction-instruction_handler
+ db 'vmovdqu16',6Fh
+ dw avx512_movdqu16_instruction-instruction_handler
+ db 'vmovdqu32',6Fh
+ dw avx512_movdqu32_instruction-instruction_handler
+ db 'vmovdqu64',6Fh
+ dw avx512_movdqu64_instruction-instruction_handler
+ db 'vmovmskpd',0
+ dw avx_movmskpd_instruction-instruction_handler
+ db 'vmovmskps',0
+ dw avx_movmskps_instruction-instruction_handler
+ db 'vmovntdqa',2Ah
+ dw avx_movntdqa_instruction-instruction_handler
+ db 'vmovshdup',16h
+ dw avx_movshdup_instruction-instruction_handler
+ db 'vmovsldup',12h
+ dw avx_movshdup_instruction-instruction_handler
+ db 'vp4dpwssd',52h
+ dw avx512_4vnniw_instruction-instruction_handler
+ db 'vpackssdw',6Bh
+ dw avx_d_instruction-instruction_handler
+ db 'vpacksswb',63h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpackusdw',2Bh
+ dw avx_d_instruction_38-instruction_handler
+ db 'vpackuswb',67h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpblendmb',66h
+ dw avx_bw_instruction_38_evex-instruction_handler
+ db 'vpblendmd',64h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpblendmq',64h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpblendmw',66h
+ dw avx_bw_instruction_38_w1_evex-instruction_handler
+ db 'vpblendvb',4Ch
+ dw avx_triple_source_instruction_3a_noevex-instruction_handler
+ db 'vpcmpleub',2
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpleud',2
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpleuq',2
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpleuw',2
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcmpltub',1
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpltud',1
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpltuq',1
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpltuw',1
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcmpneqb',4
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpneqd',4
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpneqq',4
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmpneqw',4
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpnleb',6
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpnled',6
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpnleq',6
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmpnlew',6
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpnltb',5
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcmpnltd',5
+ dw avx512_cmp_d_instruction-instruction_handler
+ db 'vpcmpnltq',5
+ dw avx512_cmp_q_instruction-instruction_handler
+ db 'vpcmpnltw',5
+ dw avx512_cmp_b_instruction-instruction_handler
+ db 'vpcomequb',4
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomequd',4
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomequq',4
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomequw',4
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomgeub',3
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomgeud',3
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomgeuq',3
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomgeuw',3
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomgtub',2
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomgtud',2
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomgtuq',2
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomgtuw',2
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomleub',1
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomleud',1
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomleuq',1
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomleuw',1
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomltub',0
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomltud',0
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomltuq',0
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomltuw',0
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomneqb',5
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomneqd',5
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomneqq',5
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomneqw',5
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpdpbusds',51h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpdpwssds',53h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpermi2pd',77h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpermi2ps',77h
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpermilpd',5
+ dw avx_permilpd_instruction-instruction_handler
+ db 'vpermilps',4
+ dw avx_permilps_instruction-instruction_handler
+ db 'vpermt2pd',7Fh
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpermt2ps',7Fh
+ dw avx_d_instruction_38_evex-instruction_handler
+ db 'vpexpandb',62h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vpexpandd',89h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vpexpandq',89h
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vpexpandw',62h
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vphaddubd',0D2h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddubq',0D3h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddubw',0D1h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphaddudq',0DBh
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphadduwd',0D6h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vphadduwq',0D7h
+ dw xop_single_source_128bit_instruction-instruction_handler
+ db 'vpmacsdqh',9Fh
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacsdql',97h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacssdd',8Eh
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacsswd',86h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacssww',85h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmadcswd',0B6h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmovmskb',0D7h
+ dw avx_pmovmskb_instruction-instruction_handler
+ db 'vpmovsxbd',21h
+ dw avx_pmovsxbd_instruction-instruction_handler
+ db 'vpmovsxbq',22h
+ dw avx_pmovsxbq_instruction-instruction_handler
+ db 'vpmovsxbw',20h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovsxdq',25h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovsxwd',23h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovsxwq',24h
+ dw avx_pmovsxbd_instruction-instruction_handler
+ db 'vpmovusdb',11h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovusdw',13h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovusqb',12h
+ dw avx512_pmovqb_instruction-instruction_handler
+ db 'vpmovusqd',15h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovusqw',14h
+ dw avx512_pmovdb_instruction-instruction_handler
+ db 'vpmovuswb',10h
+ dw avx512_pmovwb_instruction-instruction_handler
+ db 'vpmovzxbd',31h
+ dw avx_pmovsxbd_instruction-instruction_handler
+ db 'vpmovzxbq',32h
+ dw avx_pmovsxbq_instruction-instruction_handler
+ db 'vpmovzxbw',30h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovzxdq',35h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovzxwd',33h
+ dw avx_pmovsxbw_instruction-instruction_handler
+ db 'vpmovzxwq',34h
+ dw avx_pmovsxbd_instruction-instruction_handler
+ db 'vpmulhrsw',0Bh
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vptestnmb',26h
+ dw avx512_ptestnmb_instruction-instruction_handler
+ db 'vptestnmd',27h
+ dw avx512_ptestnmd_instruction-instruction_handler
+ db 'vptestnmq',27h
+ dw avx512_ptestnmq_instruction-instruction_handler
+ db 'vptestnmw',26h
+ dw avx512_ptestnmw_instruction-instruction_handler
+ db 'vreducepd',56h
+ dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
+ db 'vreduceps',56h
+ dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
+ db 'vreducesd',57h
+ dw avx512_sd_instruction_sae_imm8-instruction_handler
+ db 'vreducess',57h
+ dw avx512_ss_instruction_sae_imm8-instruction_handler
+ db 'vscalefpd',2Ch
+ dw avx512_pd_instruction_er-instruction_handler
+ db 'vscalefps',2Ch
+ dw avx512_ps_instruction_er-instruction_handler
+ db 'vscalefsd',2Dh
+ dw avx512_sd_instruction_er-instruction_handler
+ db 'vscalefss',2Dh
+ dw avx512_ss_instruction_er-instruction_handler
+ db 'vunpckhpd',15h
+ dw avx_pd_instruction-instruction_handler
+ db 'vunpckhps',15h
+ dw avx_ps_instruction-instruction_handler
+ db 'vunpcklpd',14h
+ dw avx_pd_instruction-instruction_handler
+ db 'vunpcklps',14h
+ dw avx_ps_instruction-instruction_handler
+ db 'xrstors64',3
+ dw xsaves_instruction_64bit-instruction_handler
+instructions_10:
+ db 'aesdeclast',0DFh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'aesenclast',0DDh
+ dw sse4_instruction_66_38-instruction_handler
+ db 'clflushopt',7
+ dw clflushopt_instruction-instruction_handler
+ db 'cmpunordpd',3
+ dw cmp_pd_instruction-instruction_handler
+ db 'cmpunordps',3
+ dw cmp_ps_instruction-instruction_handler
+ db 'cmpunordsd',3
+ dw cmp_sd_instruction-instruction_handler
+ db 'cmpunordss',3
+ dw cmp_ss_instruction-instruction_handler
+ db 'cmpxchg16b',16
+ dw cmpxchgx_instruction-instruction_handler
+ db 'loadall286',5
+ dw simple_extended_instruction-instruction_handler
+ db 'loadall386',7
+ dw simple_extended_instruction-instruction_handler
+ db 'maskmovdqu',0
+ dw maskmovdqu_instruction-instruction_handler
+ db 'phminposuw',41h
+ dw sse4_instruction_66_38-instruction_handler
+ db 'prefetcht0',1
+ dw prefetch_instruction-instruction_handler
+ db 'prefetcht1',2
+ dw prefetch_instruction-instruction_handler
+ db 'prefetcht2',3
+ dw prefetch_instruction-instruction_handler
+ db 'punpckhqdq',6Dh
+ dw sse_pd_instruction-instruction_handler
+ db 'punpcklqdq',6Ch
+ dw sse_pd_instruction-instruction_handler
+ db 'sha256msg1',0CCh
+ dw sse4_instruction_38-instruction_handler
+ db 'sha256msg2',0CDh
+ dw sse4_instruction_38-instruction_handler
+ db 'vcmptruepd',0Fh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmptrueps',0Fh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmptruesd',0Fh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmptruess',0Fh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcvtpd2udq',79h
+ dw avx_cvtpd2udq_instruction-instruction_handler
+ db 'vcvtpd2uqq',79h
+ dw avx_single_source_pd_instruction_er_evex-instruction_handler
+ db 'vcvtps2udq',79h
+ dw avx_single_source_ps_instruction_er_evex-instruction_handler
+ db 'vcvtps2uqq',79h
+ dw avx_cvtps2qq_instruction-instruction_handler
+ db 'vcvtsd2usi',79h
+ dw avx_cvtsd2usi_instruction-instruction_handler
+ db 'vcvtss2usi',79h
+ dw avx_cvtss2usi_instruction-instruction_handler
+ db 'vcvttpd2dq',0E6h
+ dw avx_cvttpd2dq_instruction-instruction_handler
+ db 'vcvttpd2qq',7Ah
+ dw avx_single_source_pd_instruction_sae_evex-instruction_handler
+ db 'vcvttps2dq',5Bh
+ dw avx_cvttps2dq_instruction-instruction_handler
+ db 'vcvttps2qq',7Ah
+ dw avx_cvttps2qq_instruction-instruction_handler
+ db 'vcvttsd2si',2Ch
+ dw avx_cvttsd2si_instruction-instruction_handler
+ db 'vcvttss2si',2Ch
+ dw avx_cvttss2si_instruction-instruction_handler
+ db 'vcvtudq2pd',7Ah
+ dw avx_cvtudq2pd_instruction-instruction_handler
+ db 'vcvtudq2ps',7Ah
+ dw avx_cvtudq2ps_instruction-instruction_handler
+ db 'vcvtuqq2pd',7Ah
+ dw avx_cvtqq2pd_instruction-instruction_handler
+ db 'vcvtuqq2ps',7Ah
+ dw avx_cvtuqq2ps_instruction-instruction_handler
+ db 'vcvtusi2sd',7Bh
+ dw avx_cvtusi2sd_instruction-instruction_handler
+ db 'vcvtusi2ss',7Bh
+ dw avx_cvtusi2ss_instruction-instruction_handler
+ db 'vextractps',17h
+ dw avx_extract_d_instruction-instruction_handler
+ db 'vfpclasspd',66h
+ dw avx512_fpclasspd_instruction-instruction_handler
+ db 'vfpclassps',66h
+ dw avx512_fpclassps_instruction-instruction_handler
+ db 'vfpclasssd',67h
+ dw avx512_fpclasssd_instruction-instruction_handler
+ db 'vfpclassss',67h
+ dw avx512_fpclassss_instruction-instruction_handler
+ db 'vgatherdpd',92h
+ dw gather_pd_instruction-instruction_handler
+ db 'vgatherdps',92h
+ dw gather_ps_instruction-instruction_handler
+ db 'vgatherqpd',93h
+ dw gather_pd_instruction-instruction_handler
+ db 'vgatherqps',93h
+ dw gather_ps_instruction-instruction_handler
+ db 'vgetmantpd',26h
+ dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
+ db 'vgetmantps',26h
+ dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
+ db 'vgetmantsd',27h
+ dw avx512_sd_instruction_sae_imm8-instruction_handler
+ db 'vgetmantss',27h
+ dw avx512_ss_instruction_sae_imm8-instruction_handler
+ db 'vgf2p8mulb',0CFh
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vmaskmovpd',2Dh
+ dw avx_maskmov_instruction-instruction_handler
+ db 'vmaskmovps',2Ch
+ dw avx_maskmov_instruction-instruction_handler
+ db 'vp4dpwssds',53h
+ dw avx512_4vnniw_instruction-instruction_handler
+ db 'vpclmulqdq',-1
+ dw avx_pclmulqdq_instruction-instruction_handler
+ db 'vpcmpestri',61h
+ dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpcmpestrm',60h
+ dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpcmpistri',63h
+ dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpcmpistrm',62h
+ dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
+ db 'vpcmpnequb',4
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpnequd',4
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpnequq',4
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpnequw',4
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcmpnleub',6
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpnleud',6
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpnleuq',6
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpnleuw',6
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcmpnltub',5
+ dw avx512_cmp_ub_instruction-instruction_handler
+ db 'vpcmpnltud',5
+ dw avx512_cmp_ud_instruction-instruction_handler
+ db 'vpcmpnltuq',5
+ dw avx512_cmp_uq_instruction-instruction_handler
+ db 'vpcmpnltuw',5
+ dw avx512_cmp_uw_instruction-instruction_handler
+ db 'vpcomnequb',5
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomnequd',5
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomnequq',5
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomnequw',5
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpcomtrueb',7
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomtrued',7
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomtrueq',7
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomtruew',7
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vperm2f128',6
+ dw avx_perm2f128_instruction-instruction_handler
+ db 'vperm2i128',46h
+ dw avx_perm2f128_instruction-instruction_handler
+ db 'vpermil2pd',49h
+ dw vpermil2_instruction-instruction_handler
+ db 'vpermil2ps',48h
+ dw vpermil2_instruction-instruction_handler
+ db 'vpgatherdd',90h
+ dw gather_ps_instruction-instruction_handler
+ db 'vpgatherdq',90h
+ dw gather_pd_instruction-instruction_handler
+ db 'vpgatherqd',91h
+ dw gather_ps_instruction-instruction_handler
+ db 'vpgatherqq',91h
+ dw gather_pd_instruction-instruction_handler
+ db 'vpmacssdqh',8Fh
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmacssdql',87h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmadcsswd',0A6h
+ dw xop_triple_source_128bit_instruction-instruction_handler
+ db 'vpmaddubsw',4
+ dw avx_bw_instruction_38-instruction_handler
+ db 'vpmaskmovd',8Ch
+ dw avx_maskmov_instruction-instruction_handler
+ db 'vpmaskmovq',8Ch
+ dw avx_maskmov_w1_instruction-instruction_handler
+ db 'vpternlogd',25h
+ dw avx_d_instruction_3a_imm8_evex-instruction_handler
+ db 'vpternlogq',25h
+ dw avx_q_instruction_3a_imm8_evex-instruction_handler
+ db 'vpunpckhbw',68h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpunpckhdq',6Ah
+ dw avx_d_instruction-instruction_handler
+ db 'vpunpckhwd',69h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpunpcklbw',60h
+ dw avx_bw_instruction-instruction_handler
+ db 'vpunpckldq',62h
+ dw avx_d_instruction-instruction_handler
+ db 'vpunpcklwd',61h
+ dw avx_bw_instruction-instruction_handler
+ db 'vrsqrt14pd',4Eh
+ dw avx512_single_source_pd_instruction-instruction_handler
+ db 'vrsqrt14ps',4Eh
+ dw avx512_single_source_ps_instruction-instruction_handler
+ db 'vrsqrt14sd',4Fh
+ dw avx512_sd_instruction-instruction_handler
+ db 'vrsqrt14ss',4Fh
+ dw avx512_ss_instruction-instruction_handler
+ db 'vrsqrt28pd',0CCh
+ dw avx512_exp2pd_instruction-instruction_handler
+ db 'vrsqrt28ps',0CCh
+ dw avx512_exp2ps_instruction-instruction_handler
+ db 'vrsqrt28sd',0CDh
+ dw avx512_sd_instruction_sae-instruction_handler
+ db 'vrsqrt28ss',0CDh
+ dw avx512_ss_instruction_sae-instruction_handler
+ db 'vshuff32x4',23h
+ dw avx512_shuf_d_instruction-instruction_handler
+ db 'vshuff64x2',23h
+ dw avx512_shuf_q_instruction-instruction_handler
+ db 'vshufi32x4',43h
+ dw avx512_shuf_d_instruction-instruction_handler
+ db 'vshufi64x2',43h
+ dw avx512_shuf_q_instruction-instruction_handler
+ db 'vzeroupper',77h
+ dw vzeroupper_instruction-instruction_handler
+ db 'xsaveopt64',110b
+ dw fxsave_instruction_64bit-instruction_handler
+instructions_11:
+ db 'pclmulhqhdq',10001b
+ dw pclmulqdq_instruction-instruction_handler
+ db 'pclmullqhdq',10000b
+ dw pclmulqdq_instruction-instruction_handler
+ db 'prefetchnta',0
+ dw prefetch_instruction-instruction_handler
+ db 'prefetchwt1',2
+ dw amd_prefetch_instruction-instruction_handler
+ db 'saveprevssp',0EAh
+ dw setssbsy_instruction-instruction_handler
+ db 'sha256rnds2',0CBh
+ dw sse4_instruction_38_xmm0-instruction_handler
+ db 'vaesdeclast',0DFh
+ dw avx_instruction_38_nomask-instruction_handler
+ db 'vaesenclast',0DDh
+ dw avx_instruction_38_nomask-instruction_handler
+ db 'vcmpeq_ospd',10h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpeq_osps',10h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpeq_ossd',10h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpeq_osss',10h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpeq_uqpd',8
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpeq_uqps',8
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpeq_uqsd',8
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpeq_uqss',8
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpeq_uspd',18h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpeq_usps',18h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpeq_ussd',18h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpeq_usss',18h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpfalsepd',0Bh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpfalseps',0Bh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpfalsesd',0Bh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpfalsess',0Bh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpge_oqpd',1Dh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpge_oqps',1Dh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpge_oqsd',1Dh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpge_oqss',1Dh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpgt_oqpd',1Eh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpgt_oqps',1Eh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpgt_oqsd',1Eh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpgt_oqss',1Eh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmple_oqpd',12h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmple_oqps',12h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmple_oqsd',12h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmple_oqss',12h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmplt_oqpd',11h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmplt_oqps',11h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmplt_oqsd',11h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmplt_oqss',11h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpord_spd',17h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpord_sps',17h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpord_ssd',17h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpord_sss',17h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpunordpd',3
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpunordps',3
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpunordsd',3
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpunordss',3
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcompresspd',8Ah
+ dw avx_compress_q_instruction-instruction_handler
+ db 'vcompressps',8Ah
+ dw avx_compress_d_instruction-instruction_handler
+ db 'vcvttpd2udq',78h
+ dw avx_cvttpd2udq_instruction-instruction_handler
+ db 'vcvttpd2uqq',78h
+ dw avx_single_source_pd_instruction_sae_evex-instruction_handler
+ db 'vcvttps2udq',78h
+ dw avx_cvttps2udq_instruction-instruction_handler
+ db 'vcvttps2uqq',78h
+ dw avx_cvttps2qq_instruction-instruction_handler
+ db 'vcvttsd2usi',78h
+ dw avx_cvttsd2usi_instruction-instruction_handler
+ db 'vcvttss2usi',78h
+ dw avx_cvttss2usi_instruction-instruction_handler
+ db 'vfixupimmpd',54h
+ dw avx512_pd_instruction_sae_imm8-instruction_handler
+ db 'vfixupimmps',54h
+ dw avx512_ps_instruction_sae_imm8-instruction_handler
+ db 'vfixupimmsd',55h
+ dw avx512_sd_instruction_sae_imm8-instruction_handler
+ db 'vfixupimmss',55h
+ dw avx512_ss_instruction_sae_imm8-instruction_handler
+ db 'vfmadd132pd',98h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmadd132ps',98h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmadd132sd',99h
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmadd132ss',99h
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmadd213pd',0A8h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmadd213ps',0A8h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmadd213sd',0A9h
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmadd213ss',0A9h
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmadd231pd',0B8h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmadd231ps',0B8h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmadd231sd',0B9h
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmadd231ss',0B9h
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmaddsubpd',5Dh
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmaddsubps',5Ch
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmsub132pd',9Ah
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsub132ps',9Ah
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsub132sd',9Bh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmsub132ss',9Bh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmsub213pd',0AAh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsub213ps',0AAh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsub213sd',0ABh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmsub213ss',0ABh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmsub231pd',0BAh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsub231ps',0BAh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsub231sd',0BBh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfmsub231ss',0BBh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfmsubaddpd',5Fh
+ dw fma4_instruction_p-instruction_handler
+ db 'vfmsubaddps',5Eh
+ dw fma4_instruction_p-instruction_handler
+ db 'vinsertf128',18h
+ dw avx_insertf128_instruction-instruction_handler
+ db 'vinserti128',38h
+ dw avx_insertf128_instruction-instruction_handler
+ db 'vmaskmovdqu',0
+ dw avx_maskmovdqu_instruction-instruction_handler
+ db 'vpcomfalseb',6
+ dw xop_pcom_b_instruction-instruction_handler
+ db 'vpcomfalsed',6
+ dw xop_pcom_d_instruction-instruction_handler
+ db 'vpcomfalseq',6
+ dw xop_pcom_q_instruction-instruction_handler
+ db 'vpcomfalsew',6
+ dw xop_pcom_w_instruction-instruction_handler
+ db 'vpcompressb',63h
+ dw avx_compress_d_instruction-instruction_handler
+ db 'vpcompressd',8Bh
+ dw avx_compress_d_instruction-instruction_handler
+ db 'vpcompressq',8Bh
+ dw avx_compress_q_instruction-instruction_handler
+ db 'vpcompressw',63h
+ dw avx_compress_q_instruction-instruction_handler
+ db 'vpcomtrueub',7
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomtrueud',7
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomtrueuq',7
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomtrueuw',7
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpconflictd',0C4h
+ dw avx_single_source_d_instruction_38_evex-instruction_handler
+ db 'vpconflictq',0C4h
+ dw avx_single_source_q_instruction_38_evex-instruction_handler
+ db 'vphminposuw',41h
+ dw avx_single_source_instruction_38_noevex-instruction_handler
+ db 'vpmadd52huq',0B5h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpmadd52luq',0B4h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vpscatterdd',0A0h
+ dw scatter_ps_instruction-instruction_handler
+ db 'vpscatterdq',0A0h
+ dw scatter_pd_instruction-instruction_handler
+ db 'vpscatterqd',0A1h
+ dw scatter_ps_instruction-instruction_handler
+ db 'vpscatterqq',0A1h
+ dw scatter_pd_instruction-instruction_handler
+ db 'vpunpckhqdq',6Dh
+ dw avx_q_instruction-instruction_handler
+ db 'vpunpcklqdq',6Ch
+ dw avx_q_instruction-instruction_handler
+ db 'vrndscalepd',9
+ dw avx512_single_source_pd_instruction_sae_imm8-instruction_handler
+ db 'vrndscaleps',8
+ dw avx512_single_source_ps_instruction_sae_imm8-instruction_handler
+ db 'vrndscalesd',0Bh
+ dw avx512_sd_instruction_sae_imm8-instruction_handler
+ db 'vrndscaless',0Ah
+ dw avx512_ss_instruction_sae_imm8-instruction_handler
+ db 'vscatterdpd',0A2h
+ dw scatter_pd_instruction-instruction_handler
+ db 'vscatterdps',0A2h
+ dw scatter_ps_instruction-instruction_handler
+ db 'vscatterqpd',0A3h
+ dw scatter_pd_instruction-instruction_handler
+ db 'vscatterqps',0A3h
+ dw scatter_ps_instruction-instruction_handler
+instructions_12:
+ db 'pclmulhqhqdq',10001b
+ dw pclmulqdq_instruction-instruction_handler
+ db 'pclmulhqlqdq',1
+ dw pclmulqdq_instruction-instruction_handler
+ db 'pclmullqhqdq',10000b
+ dw pclmulqdq_instruction-instruction_handler
+ db 'pclmullqlqdq',0
+ dw pclmulqdq_instruction-instruction_handler
+ db 'vbroadcastsd',19h
+ dw avx_broadcastsd_instruction-instruction_handler
+ db 'vbroadcastss',18h
+ dw avx_broadcastss_instruction-instruction_handler
+ db 'vcmpneq_oqpd',0Ch
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpneq_oqps',0Ch
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpneq_oqsd',0Ch
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpneq_oqss',0Ch
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpneq_ospd',1Ch
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpneq_osps',1Ch
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpneq_ossd',1Ch
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpneq_osss',1Ch
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpneq_uspd',14h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpneq_usps',14h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpneq_ussd',14h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpneq_usss',14h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpnge_uqpd',19h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpnge_uqps',19h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpnge_uqsd',19h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpnge_uqss',19h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpngt_uqpd',1Ah
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpngt_uqps',1Ah
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpngt_uqsd',1Ah
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpngt_uqss',1Ah
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpnle_uqpd',16h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpnle_uqps',16h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpnle_uqsd',16h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpnle_uqss',16h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpnlt_uqpd',15h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpnlt_uqps',15h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpnlt_uqsd',15h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpnlt_uqss',15h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vextractf128',19h
+ dw avx_extractf128_instruction-instruction_handler
+ db 'vextracti128',39h
+ dw avx_extractf128_instruction-instruction_handler
+ db 'vfnmadd132pd',9Ch
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmadd132ps',9Ch
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmadd132sd',9Dh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmadd132ss',9Dh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfnmadd213pd',0ACh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmadd213ps',0ACh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmadd213sd',0ADh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmadd213ss',0ADh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfnmadd231pd',0BCh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmadd231ps',0BCh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmadd231sd',0BDh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmadd231ss',0BDh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfnmsub132pd',9Eh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmsub132ps',9Eh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmsub132sd',9Fh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmsub132ss',9Fh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfnmsub213pd',0AEh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmsub213ps',0AEh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmsub213sd',0AFh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmsub213ss',0AFh
+ dw fma_instruction_ss-instruction_handler
+ db 'vfnmsub231pd',0BEh
+ dw fma_instruction_pd-instruction_handler
+ db 'vfnmsub231ps',0BEh
+ dw fma_instruction_ps-instruction_handler
+ db 'vfnmsub231sd',0BFh
+ dw fma_instruction_sd-instruction_handler
+ db 'vfnmsub231ss',0BFh
+ dw fma_instruction_ss-instruction_handler
+ db 'vinsertf32x4',18h
+ dw avx512_insert_32x4_instruction-instruction_handler
+ db 'vinsertf32x8',1Ah
+ dw avx512_insert_32x8_instruction-instruction_handler
+ db 'vinsertf64x2',18h
+ dw avx512_insert_64x2_instruction-instruction_handler
+ db 'vinsertf64x4',1Ah
+ dw avx512_insert_64x4_instruction-instruction_handler
+ db 'vinserti32x4',38h
+ dw avx512_insert_32x4_instruction-instruction_handler
+ db 'vinserti32x8',3Ah
+ dw avx512_insert_32x8_instruction-instruction_handler
+ db 'vinserti64x2',38h
+ dw avx512_insert_64x2_instruction-instruction_handler
+ db 'vinserti64x4',3Ah
+ dw avx512_insert_64x4_instruction-instruction_handler
+ db 'vpbroadcastb',78h
+ dw avx_pbroadcastb_instruction-instruction_handler
+ db 'vpbroadcastd',58h
+ dw avx_pbroadcastd_instruction-instruction_handler
+ db 'vpbroadcastq',59h
+ dw avx_pbroadcastq_instruction-instruction_handler
+ db 'vpbroadcastw',79h
+ dw avx_pbroadcastw_instruction-instruction_handler
+ db 'vpclmulhqhdq',10001b
+ dw avx_pclmulqdq_instruction-instruction_handler
+ db 'vpclmullqhdq',10000b
+ dw avx_pclmulqdq_instruction-instruction_handler
+ db 'vpcomfalseub',6
+ dw xop_pcom_ub_instruction-instruction_handler
+ db 'vpcomfalseud',6
+ dw xop_pcom_ud_instruction-instruction_handler
+ db 'vpcomfalseuq',6
+ dw xop_pcom_uq_instruction-instruction_handler
+ db 'vpcomfalseuw',6
+ dw xop_pcom_uw_instruction-instruction_handler
+ db 'vpermilmo2pd',10b
+ dw vpermil_2pd_instruction-instruction_handler
+ db 'vpermilmo2ps',10b
+ dw vpermil_2ps_instruction-instruction_handler
+ db 'vpermilmz2pd',11b
+ dw vpermil_2pd_instruction-instruction_handler
+ db 'vpermilmz2ps',11b
+ dw vpermil_2ps_instruction-instruction_handler
+ db 'vpermiltd2pd',0
+ dw vpermil_2pd_instruction-instruction_handler
+ db 'vpermiltd2ps',0
+ dw vpermil_2ps_instruction-instruction_handler
+ db 'vpshufbitqmb',8Fh
+ dw avx512_ptestmb_instruction-instruction_handler
+instructions_13:
+ db 'gf2p8affineqb',0CEh
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'vcmptrue_uspd',1Fh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmptrue_usps',1Fh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmptrue_ussd',1Fh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmptrue_usss',1Fh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vcmpunord_spd',13h
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpunord_sps',13h
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpunord_ssd',13h
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpunord_sss',13h
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vextractf32x4',19h
+ dw avx512_extract_32x4_instruction-instruction_handler
+ db 'vextractf32x8',1Bh
+ dw avx512_extract_32x8_instruction-instruction_handler
+ db 'vextractf64x2',19h
+ dw avx512_extract_64x2_instruction-instruction_handler
+ db 'vextractf64x4',1Bh
+ dw avx512_extract_64x4_instruction-instruction_handler
+ db 'vextracti32x4',39h
+ dw avx512_extract_32x4_instruction-instruction_handler
+ db 'vextracti32x8',3Bh
+ dw avx512_extract_32x8_instruction-instruction_handler
+ db 'vextracti64x2',39h
+ dw avx512_extract_64x2_instruction-instruction_handler
+ db 'vextracti64x4',3Bh
+ dw avx512_extract_64x4_instruction-instruction_handler
+ db 'vgatherpf0dpd',1
+ dw gatherpf_dpd_instruction-instruction_handler
+ db 'vgatherpf0dps',1
+ dw gatherpf_dps_instruction-instruction_handler
+ db 'vgatherpf0qpd',1
+ dw gatherpf_qpd_instruction-instruction_handler
+ db 'vgatherpf0qps',1
+ dw gatherpf_qps_instruction-instruction_handler
+ db 'vgatherpf1dpd',2
+ dw gatherpf_dpd_instruction-instruction_handler
+ db 'vgatherpf1dps',2
+ dw gatherpf_dps_instruction-instruction_handler
+ db 'vgatherpf1qpd',2
+ dw gatherpf_qpd_instruction-instruction_handler
+ db 'vgatherpf1qps',2
+ dw gatherpf_qps_instruction-instruction_handler
+ db 'vpclmulhqlqdq',1
+ dw avx_pclmulqdq_instruction-instruction_handler
+ db 'vpclmullqlqdq',0
+ dw avx_pclmulqdq_instruction-instruction_handler
+instructions_14:
+ db 'vbroadcastf128',1Ah
+ dw avx_broadcast_128_instruction_noevex-instruction_handler
+ db 'vbroadcasti128',5Ah
+ dw avx_broadcast_128_instruction_noevex-instruction_handler
+ db 'vcmpfalse_ospd',1Bh
+ dw avx_cmp_pd_instruction-instruction_handler
+ db 'vcmpfalse_osps',1Bh
+ dw avx_cmp_ps_instruction-instruction_handler
+ db 'vcmpfalse_ossd',1Bh
+ dw avx_cmp_sd_instruction-instruction_handler
+ db 'vcmpfalse_osss',1Bh
+ dw avx_cmp_ss_instruction-instruction_handler
+ db 'vfmaddsub132pd',96h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmaddsub132ps',96h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmaddsub213pd',0A6h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmaddsub213ps',0A6h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmaddsub231pd',0B6h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmaddsub231ps',0B6h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsubadd132pd',97h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsubadd132ps',97h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsubadd213pd',0A7h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsubadd213ps',0A7h
+ dw fma_instruction_ps-instruction_handler
+ db 'vfmsubadd231pd',0B7h
+ dw fma_instruction_pd-instruction_handler
+ db 'vfmsubadd231ps',0B7h
+ dw fma_instruction_ps-instruction_handler
+ db 'vgf2p8affineqb',0CEh
+ dw avx_q_instruction_3a_imm8_w1-instruction_handler
+ db 'vpmultishiftqb',83h
+ dw avx_q_instruction_38_evex-instruction_handler
+ db 'vscatterpf0dpd',5
+ dw gatherpf_dpd_instruction-instruction_handler
+ db 'vscatterpf0dps',5
+ dw gatherpf_dps_instruction-instruction_handler
+ db 'vscatterpf0qpd',5
+ dw gatherpf_qpd_instruction-instruction_handler
+ db 'vscatterpf0qps',5
+ dw gatherpf_qps_instruction-instruction_handler
+ db 'vscatterpf1dpd',6
+ dw gatherpf_dpd_instruction-instruction_handler
+ db 'vscatterpf1dps',6
+ dw gatherpf_dps_instruction-instruction_handler
+ db 'vscatterpf1qpd',6
+ dw gatherpf_qpd_instruction-instruction_handler
+ db 'vscatterpf1qps',6
+ dw gatherpf_qps_instruction-instruction_handler
+instructions_15:
+ db 'aeskeygenassist',0DFh
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'vbroadcastf32x2',19h
+ dw avx512_broadcast_32x2_instruction-instruction_handler
+ db 'vbroadcastf32x4',1Ah
+ dw avx512_broadcast_32x4_instruction-instruction_handler
+ db 'vbroadcastf32x8',1Bh
+ dw avx512_broadcast_32x8_instruction-instruction_handler
+ db 'vbroadcastf64x2',1Ah
+ dw avx512_broadcast_64x2_instruction-instruction_handler
+ db 'vbroadcastf64x4',1Bh
+ dw avx512_broadcast_64x4_instruction-instruction_handler
+ db 'vbroadcasti32x2',59h
+ dw avx512_broadcast_32x2_instruction-instruction_handler
+ db 'vbroadcasti32x4',5Ah
+ dw avx512_broadcast_32x4_instruction-instruction_handler
+ db 'vbroadcasti32x8',5Bh
+ dw avx512_broadcast_32x8_instruction-instruction_handler
+ db 'vbroadcasti64x2',5Ah
+ dw avx512_broadcast_64x2_instruction-instruction_handler
+ db 'vbroadcasti64x4',5Bh
+ dw avx512_broadcast_64x4_instruction-instruction_handler
+ db 'vpbroadcastmb2q',2Ah
+ dw avx512_pmov_m2_instruction_w1-instruction_handler
+ db 'vpbroadcastmw2d',3Ah
+ dw avx512_pmov_m2_instruction-instruction_handler
+instructions_16:
+ db 'gf2p8affineinvqb',0CFh
+ dw sse4_instruction_66_3a_imm8-instruction_handler
+ db 'vaeskeygenassist',0DFh
+ dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler
+instructions_17:
+ db 'vgf2p8affineinvqb',0CFh
+ dw avx_q_instruction_3a_imm8_w1-instruction_handler
+instructions_end:
+
+data_directives:
+ dw data_directives_2-data_directives,(data_directives_3-data_directives_2)/(2+3)
+ dw data_directives_3-data_directives,(data_directives_4-data_directives_3)/(3+3)
+ dw data_directives_4-data_directives,(data_directives_end-data_directives_4)/(4+3)
+
+data_directives_2:
+ db 'db',1
+ dw data_bytes-instruction_handler
+ db 'dd',4
+ dw data_dwords-instruction_handler
+ db 'df',6
+ dw data_pwords-instruction_handler
+ db 'dp',6
+ dw data_pwords-instruction_handler
+ db 'dq',8
+ dw data_qwords-instruction_handler
+ db 'dt',10
+ dw data_twords-instruction_handler
+ db 'du',2
+ dw data_unicode-instruction_handler
+ db 'dw',2
+ dw data_words-instruction_handler
+ db 'rb',1
+ dw reserve_bytes-instruction_handler
+ db 'rd',4
+ dw reserve_dwords-instruction_handler
+ db 'rf',6
+ dw reserve_pwords-instruction_handler
+ db 'rp',6
+ dw reserve_pwords-instruction_handler
+ db 'rq',8
+ dw reserve_qwords-instruction_handler
+ db 'rt',10
+ dw reserve_twords-instruction_handler
+ db 'rw',2
+ dw reserve_words-instruction_handler
+data_directives_3:
+data_directives_4:
+ db 'file',1
+ dw data_file-instruction_handler
+data_directives_end:
diff --git a/source/variable.inc b/source/variable.inc
new file mode 100644 (file)
index 0000000..d4f0357
--- /dev/null
@@ -0,0 +1,155 @@
+
+; flat assembler core variables
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+; Variables which have to be set up by interface:
+
+memory_start dd ?
+memory_end dd ?
+
+additional_memory dd ?
+additional_memory_end dd ?
+
+stack_limit dd ?
+
+initial_definitions dd ?
+input_file dd ?
+output_file dd ?
+symbols_file dd ?
+
+passes_limit dw ?
+
+; Internal core variables:
+
+current_pass dw ?
+
+include_paths dd ?
+free_additional_memory dd ?
+source_start dd ?
+code_start dd ?
+code_size dd ?
+real_code_size dd ?
+written_size dd ?
+headers_size dd ?
+
+current_line dd ?
+macro_line dd ?
+macro_block dd ?
+macro_block_line dd ?
+macro_block_line_number dd ?
+macro_symbols dd ?
+struc_name dd ?
+struc_label dd ?
+instant_macro_start dd ?
+parameters_end dd ?
+default_argument_value dd ?
+locals_counter rb 8
+current_locals_prefix dd ?
+anonymous_reverse dd ?
+anonymous_forward dd ?
+labels_list dd ?
+label_hash dd ?
+label_leaf dd ?
+hash_tree dd ?
+addressing_space dd ?
+undefined_data_start dd ?
+undefined_data_end dd ?
+counter dd ?
+counter_limit dd ?
+error_info dd ?
+error_line dd ?
+error dd ?
+tagged_blocks dd ?
+structures_buffer dd ?
+number_start dd ?
+current_offset dd ?
+value dq ?
+fp_value rd 8
+adjustment dq ?
+symbol_identifier dd ?
+address_symbol dd ?
+address_high dd ?
+uncompressed_displacement dd ?
+format_flags dd ?
+resolver_flags dd ?
+symbols_stream dd ?
+number_of_relocations dd ?
+number_of_sections dd ?
+stub_size dd ?
+stub_file dd ?
+current_section dd ?
+machine dw ?
+subsystem dw ?
+subsystem_version dd ?
+image_base dd ?
+image_base_high dd ?
+merge_segment dd ?
+resource_data dd ?
+resource_size dd ?
+actual_fixups_size dd ?
+reserved_fixups dd ?
+reserved_fixups_size dd ?
+last_fixup_base dd ?
+last_fixup_header dd ?
+parenthesis_stack dd ?
+blocks_stack dd ?
+parsed_lines dd ?
+logical_value_parentheses dd ?
+file_extension dd ?
+
+operand_size db ?
+operand_flags db ?
+operand_prefix db ?
+rex_prefix db ?
+opcode_prefix db ?
+vex_required db ?
+vex_register db ?
+immediate_size db ?
+mask_register db ?
+broadcast_size db ?
+rounding_mode db ?
+
+base_code db ?
+extended_code db ?
+supplemental_code db ?
+postbyte_register db ?
+segment_register db ?
+xop_opcode_map db ?
+
+mmx_size db ?
+jump_type db ?
+push_size db ?
+value_size db ?
+address_size db ?
+label_size db ?
+size_declared db ?
+address_size_declared db ?
+displacement_compression db ?
+
+value_undefined db ?
+value_constant db ?
+value_type db ?
+value_sign db ?
+fp_sign db ?
+fp_format db ?
+address_sign db ?
+address_register db ?
+compare_type db ?
+logical_value_wrapping db ?
+next_pass_needed db ?
+output_format db ?
+code_type db ?
+adjustment_sign db ?
+evex_mode db ?
+
+macro_status db ?
+skip_default_argument_value db ?
+prefix_flags db ?
+formatter_symbols_allowed db ?
+decorator_symbols_allowed db ?
+free_address_range db ?
+
+characters rb 100h
+converted rb 100h
+message rb 180h
diff --git a/source/version.inc b/source/version.inc
new file mode 100644 (file)
index 0000000..7006d4c
--- /dev/null
@@ -0,0 +1,39 @@
+
+; flat assembler  version 1.73
+; Copyright (c) 1999-2023, Tomasz Grysztar.
+; All rights reserved.
+;
+; This programs is free for commercial and non-commercial use as long as
+; the following conditions are adhered to.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions are
+; met:
+;
+; 1. Redistributions of source code must retain the above copyright notice,
+;    this list of conditions and the following disclaimer.
+; 2. Redistributions in binary form must reproduce the above copyright
+;    notice, this list of conditions and the following disclaimer in the
+;    documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+; PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR
+; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+; EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+; PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+; LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+; NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+;
+; The licence and distribution terms for any publically available
+; version or derivative of this code cannot be changed. i.e. this code
+; cannot simply be copied and put under another distribution licence
+; (including the GNU Public Licence).
+
+VERSION_STRING equ "1.73.32"
+
+VERSION_MAJOR = 1
+VERSION_MINOR = 73
diff --git a/source/x86_64.inc b/source/x86_64.inc
new file mode 100644 (file)
index 0000000..bfb9327
--- /dev/null
@@ -0,0 +1,7391 @@
+
+; flat assembler core
+; Copyright (c) 1999-2022, Tomasz Grysztar.
+; All rights reserved.
+
+simple_instruction_except64:
+       cmp     [code_type],64
+       je      illegal_instruction
+simple_instruction:
+       stos    byte [edi]
+       jmp     instruction_assembled
+simple_instruction_only64:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     simple_instruction
+simple_instruction_16bit_except64:
+       cmp     [code_type],64
+       je      illegal_instruction
+simple_instruction_16bit:
+       cmp     [code_type],16
+       jne     size_prefix
+       stos    byte [edi]
+       jmp     instruction_assembled
+      size_prefix:
+       mov     ah,al
+       mov     al,66h
+       stos    word [edi]
+       jmp     instruction_assembled
+simple_instruction_32bit_except64:
+       cmp     [code_type],64
+       je      illegal_instruction
+simple_instruction_32bit:
+       cmp     [code_type],16
+       je      size_prefix
+       stos    byte [edi]
+       jmp     instruction_assembled
+iret_instruction:
+       cmp     [code_type],64
+       jne     simple_instruction
+simple_instruction_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       mov     ah,al
+       mov     al,48h
+       stos    word [edi]
+       jmp     instruction_assembled
+simple_extended_instruction_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       mov     byte [edi],48h
+       inc     edi
+simple_extended_instruction:
+       mov     ah,al
+       mov     al,0Fh
+       stos    word [edi]
+       jmp     instruction_assembled
+simple_extended_instruction_f3:
+       mov     byte [edi],0F3h
+       inc     edi
+       jmp     simple_extended_instruction
+prefix_instruction:
+       stos    byte [edi]
+       or      [prefix_flags],1
+       jmp     continue_line
+segment_prefix:
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,3
+       jne     illegal_instruction
+       and     al,1111b
+       mov     [segment_register],al
+       call    store_segment_prefix
+       or      [prefix_flags],1
+       jmp     continue_line
+bnd_prefix_instruction:
+       stos    byte [edi]
+       or      [prefix_flags],1 + 10h
+       jmp     continue_line
+int_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     ah,1
+       ja      invalid_operand_size
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       test    eax,eax
+       jns     int_imm_ok
+       call    recoverable_overflow
+      int_imm_ok:
+       mov     ah,al
+       mov     al,0CDh
+       stos    word [edi]
+       jmp     instruction_assembled
+aa_instruction:
+       cmp     [code_type],64
+       je      illegal_instruction
+       push    eax
+       mov     bl,10
+       cmp     byte [esi],'('
+       jne     aa_store
+       inc     esi
+       xor     al,al
+       xchg    al,[operand_size]
+       cmp     al,1
+       ja      invalid_operand_size
+       call    get_byte_value
+       mov     bl,al
+      aa_store:
+       cmp     [operand_size],0
+       jne     invalid_operand
+       pop     eax
+       mov     ah,bl
+       stos    word [edi]
+       jmp     instruction_assembled
+
+basic_instruction:
+       mov     [base_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      basic_reg
+       cmp     al,'['
+       jne     invalid_operand
+      basic_mem:
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      basic_mem_imm
+       cmp     al,10h
+       jne     invalid_operand
+      basic_mem_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     al,ah
+       cmp     al,1
+       je      instruction_ready
+       call    operand_autodetect
+       inc     [base_code]
+      instruction_ready:
+       call    store_instruction
+       jmp     instruction_assembled
+      basic_mem_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       jb      basic_mem_imm_nosize
+       je      basic_mem_imm_8bit
+       cmp     al,2
+       je      basic_mem_imm_16bit
+       cmp     al,4
+       je      basic_mem_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      basic_mem_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     basic_mem_imm_32bit_ok
+      basic_mem_imm_nosize:
+       call    recoverable_unknown_size
+      basic_mem_imm_8bit:
+       call    get_byte_value
+       mov     byte [value],al
+       mov     al,[base_code]
+       shr     al,3
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     [base_code],80h
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      basic_mem_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     word [value],ax
+       mov     al,[base_code]
+       shr     al,3
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       cmp     [value_type],0
+       jne     basic_mem_imm_16bit_store
+       cmp     [size_declared],0
+       jne     basic_mem_imm_16bit_store
+       cmp     word [value],80h
+       jb      basic_mem_simm_8bit
+       cmp     word [value],-80h
+       jae     basic_mem_simm_8bit
+      basic_mem_imm_16bit_store:
+       mov     [base_code],81h
+       call    store_instruction_with_imm16
+       jmp     instruction_assembled
+      basic_mem_simm_8bit:
+       mov     [base_code],83h
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      basic_mem_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      basic_mem_imm_32bit_ok:
+       mov     dword [value],eax
+       mov     al,[base_code]
+       shr     al,3
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       cmp     [value_type],0
+       jne     basic_mem_imm_32bit_store
+       cmp     [size_declared],0
+       jne     basic_mem_imm_32bit_store
+       cmp     dword [value],80h
+       jb      basic_mem_simm_8bit
+       cmp     dword [value],-80h
+       jae     basic_mem_simm_8bit
+      basic_mem_imm_32bit_store:
+       mov     [base_code],81h
+       call    store_instruction_with_imm32
+       jmp     instruction_assembled
+      get_simm32:
+       call    get_qword_value
+       mov     ecx,edx
+       cdq
+       cmp     ecx,edx
+       je      simm32_range_ok
+       call    recoverable_overflow
+      simm32_range_ok:
+       cmp     [value_type],4
+       jne     get_simm32_ok
+       mov     [value_type],2
+      get_simm32_ok:
+       ret
+      basic_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      basic_reg_reg
+       cmp     al,'('
+       je      basic_reg_imm
+       cmp     al,'['
+       jne     invalid_operand
+      basic_reg_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      basic_reg_mem_8bit
+       call    operand_autodetect
+       add     [base_code],3
+       jmp     instruction_ready
+      basic_reg_mem_8bit:
+       add     [base_code],2
+       jmp     instruction_ready
+      basic_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],al
+       mov     al,ah
+       cmp     al,1
+       je      nomem_instruction_ready
+       call    operand_autodetect
+       inc     [base_code]
+      nomem_instruction_ready:
+       call    store_nomem_instruction
+       jmp     instruction_assembled
+      basic_reg_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       je      basic_reg_imm_8bit
+       cmp     al,2
+       je      basic_reg_imm_16bit
+       cmp     al,4
+       je      basic_reg_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      basic_reg_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     basic_reg_imm_32bit_ok
+      basic_reg_imm_8bit:
+       call    get_byte_value
+       mov     dl,al
+       mov     bl,[base_code]
+       shr     bl,3
+       xchg    bl,[postbyte_register]
+       or      bl,bl
+       jz      basic_al_imm
+       mov     [base_code],80h
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      basic_al_imm:
+       mov     al,[base_code]
+       add     al,4
+       stos    byte [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      basic_reg_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     dx,ax
+       mov     bl,[base_code]
+       shr     bl,3
+       xchg    bl,[postbyte_register]
+       cmp     [value_type],0
+       jne     basic_reg_imm_16bit_store
+       cmp     [size_declared],0
+       jne     basic_reg_imm_16bit_store
+       cmp     dx,80h
+       jb      basic_reg_simm_8bit
+       cmp     dx,-80h
+       jae     basic_reg_simm_8bit
+      basic_reg_imm_16bit_store:
+       or      bl,bl
+       jz      basic_ax_imm
+       mov     [base_code],81h
+       call    store_nomem_instruction
+      basic_store_imm_16bit:
+       mov     ax,dx
+       call    mark_relocation
+       stos    word [edi]
+       jmp     instruction_assembled
+      basic_reg_simm_8bit:
+       mov     [base_code],83h
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      basic_ax_imm:
+       add     [base_code],5
+       call    store_classic_instruction_code
+       jmp     basic_store_imm_16bit
+      basic_reg_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      basic_reg_imm_32bit_ok:
+       mov     edx,eax
+       mov     bl,[base_code]
+       shr     bl,3
+       xchg    bl,[postbyte_register]
+       cmp     [value_type],0
+       jne     basic_reg_imm_32bit_store
+       cmp     [size_declared],0
+       jne     basic_reg_imm_32bit_store
+       cmp     edx,80h
+       jb      basic_reg_simm_8bit
+       cmp     edx,-80h
+       jae     basic_reg_simm_8bit
+      basic_reg_imm_32bit_store:
+       or      bl,bl
+       jz      basic_eax_imm
+       mov     [base_code],81h
+       call    store_nomem_instruction
+      basic_store_imm_32bit:
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      basic_eax_imm:
+       add     [base_code],5
+       call    store_classic_instruction_code
+       jmp     basic_store_imm_32bit
+      recoverable_unknown_size:
+       cmp     [error_line],0
+       jne     ignore_unknown_size
+       push    [current_line]
+       pop     [error_line]
+       mov     [error],operand_size_not_specified
+      ignore_unknown_size:
+       ret
+single_operand_instruction:
+       mov     [base_code],0F6h
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      single_reg
+       cmp     al,'['
+       jne     invalid_operand
+      single_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      single_mem_8bit
+       jb      single_mem_nosize
+       call    operand_autodetect
+       inc     [base_code]
+       jmp     instruction_ready
+      single_mem_nosize:
+       call    recoverable_unknown_size
+      single_mem_8bit:
+       jmp     instruction_ready
+      single_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       cmp     al,1
+       je      single_reg_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      single_reg_8bit:
+       jmp     nomem_instruction_ready
+mov_instruction:
+       mov     [base_code],88h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      mov_reg
+       cmp     al,14h
+       je      mov_creg
+       cmp     al,'['
+       jne     invalid_operand
+      mov_mem:
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      mov_mem_imm
+       cmp     al,10h
+       jne     invalid_operand
+      mov_mem_reg:
+       lods    byte [esi]
+       cmp     al,30h
+       jb      mov_mem_general_reg
+       cmp     al,40h
+       jb      mov_mem_sreg
+      mov_mem_general_reg:
+       call    convert_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       cmp     ah,1
+       je      mov_mem_reg_8bit
+       inc     [base_code]
+       mov     al,ah
+       call    operand_autodetect
+       mov     al,[postbyte_register]
+       or      al,bl
+       or      al,bh
+       jz      mov_mem_ax
+       jmp     instruction_ready
+      mov_mem_reg_8bit:
+       or      al,bl
+       or      al,bh
+       jnz     instruction_ready
+      mov_mem_al:
+       test    ch,22h
+       jnz     mov_mem_address16_al
+       test    ch,44h
+       jnz     mov_mem_address32_al
+       test    ch,not 88h
+       jnz     invalid_address_size
+       call    check_mov_address64
+       cmp     al,0
+       jg      mov_mem_address64_al
+       jl      instruction_ready
+       cmp     [code_type],16
+       jne     mov_mem_address32_al
+       cmp     edx,10000h
+       jb      mov_mem_address16_al
+      mov_mem_address32_al:
+       call    store_segment_prefix_if_necessary
+       call    address_32bit_prefix
+       mov     [base_code],0A2h
+      store_mov_address32:
+       call    store_classic_instruction_code
+       call    store_address_32bit_value
+       jmp     instruction_assembled
+      mov_mem_address16_al:
+       call    store_segment_prefix_if_necessary
+       call    address_16bit_prefix
+       mov     [base_code],0A2h
+      store_mov_address16:
+       cmp     [code_type],64
+       je      invalid_address
+       call    store_classic_instruction_code
+       mov     eax,edx
+       stos    word [edi]
+       cmp     edx,10000h
+       jge     value_out_of_range
+       jmp     instruction_assembled
+      check_mov_address64:
+       cmp     [code_type],64
+       jne     no_address64
+       test    ch,88h
+       jnz     address64_required
+       mov     eax,[address_high]
+       or      eax,eax
+       jz      no_address64
+       bt      edx,31
+       adc     eax,0
+       jz      address64_simm32
+      address64_required:
+       mov     al,1
+       ret
+      address64_simm32:
+       mov     al,-1
+       ret
+      no_address64:
+       test    ch,08h
+       jnz     invalid_address_size
+       xor     al,al
+       ret
+      mov_mem_address64_al:
+       call    store_segment_prefix_if_necessary
+       mov     [base_code],0A2h
+      store_mov_address64:
+       call    store_classic_instruction_code
+       call    store_address_64bit_value
+       jmp     instruction_assembled
+      mov_mem_ax:
+       test    ch,22h
+       jnz     mov_mem_address16_ax
+       test    ch,44h
+       jnz     mov_mem_address32_ax
+       test    ch,not 88h
+       jnz     invalid_address_size
+       call    check_mov_address64
+       cmp     al,0
+       jg      mov_mem_address64_ax
+       jl      instruction_ready
+       cmp     [code_type],16
+       jne     mov_mem_address32_ax
+       cmp     edx,10000h
+       jb      mov_mem_address16_ax
+      mov_mem_address32_ax:
+       call    store_segment_prefix_if_necessary
+       call    address_32bit_prefix
+       mov     [base_code],0A3h
+       jmp     store_mov_address32
+      mov_mem_address16_ax:
+       call    store_segment_prefix_if_necessary
+       call    address_16bit_prefix
+       mov     [base_code],0A3h
+       jmp     store_mov_address16
+      mov_mem_address64_ax:
+       call    store_segment_prefix_if_necessary
+       mov     [base_code],0A3h
+       jmp     store_mov_address64
+      mov_mem_sreg:
+       sub     al,31h
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     ah,[operand_size]
+       or      ah,ah
+       jz      mov_mem_sreg_store
+       cmp     ah,2
+       jne     invalid_operand_size
+      mov_mem_sreg_store:
+       mov     [base_code],8Ch
+       jmp     instruction_ready
+      mov_mem_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       jb      mov_mem_imm_nosize
+       je      mov_mem_imm_8bit
+       cmp     al,2
+       je      mov_mem_imm_16bit
+       cmp     al,4
+       je      mov_mem_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      mov_mem_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     mov_mem_imm_32bit_store
+      mov_mem_imm_nosize:
+       call    recoverable_unknown_size
+      mov_mem_imm_8bit:
+       call    get_byte_value
+       mov     byte [value],al
+       mov     [postbyte_register],0
+       mov     [base_code],0C6h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      mov_mem_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     word [value],ax
+       mov     [postbyte_register],0
+       mov     [base_code],0C7h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm16
+       jmp     instruction_assembled
+      mov_mem_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      mov_mem_imm_32bit_store:
+       mov     dword [value],eax
+       mov     [postbyte_register],0
+       mov     [base_code],0C7h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm32
+       jmp     instruction_assembled
+      mov_reg:
+       lods    byte [esi]
+       mov     ah,al
+       sub     ah,10h
+       and     ah,al
+       test    ah,0F0h
+       jnz     mov_sreg
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      mov_reg_mem
+       cmp     al,'('
+       je      mov_reg_imm
+       cmp     al,14h
+       je      mov_reg_creg
+       cmp     al,10h
+       jne     invalid_operand
+      mov_reg_reg:
+       lods    byte [esi]
+       mov     ah,al
+       sub     ah,10h
+       and     ah,al
+       test    ah,0F0h
+       jnz     mov_reg_sreg
+       call    convert_register
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],al
+       mov     al,ah
+       cmp     al,1
+       je      mov_reg_reg_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      mov_reg_reg_8bit:
+       jmp     nomem_instruction_ready
+      mov_reg_sreg:
+       mov     bl,[postbyte_register]
+       mov     ah,al
+       and     al,1111b
+       mov     [postbyte_register],al
+       shr     ah,4
+       cmp     ah,3
+       jne     invalid_operand
+       dec     [postbyte_register]
+       cmp     [operand_size],8
+       je      mov_reg_sreg64
+       cmp     [operand_size],4
+       je      mov_reg_sreg32
+       cmp     [operand_size],2
+       jne     invalid_operand_size
+       call    operand_16bit
+       jmp     mov_reg_sreg_store
+      mov_reg_sreg64:
+       call    operand_64bit
+       jmp     mov_reg_sreg_store
+      mov_reg_sreg32:
+       call    operand_32bit
+      mov_reg_sreg_store:
+       mov     [base_code],8Ch
+       jmp     nomem_instruction_ready
+      mov_reg_creg:
+       lods    byte [esi]
+       mov     bl,al
+       shr     al,4
+       cmp     al,4
+       ja      invalid_operand
+       add     al,20h
+       mov     [extended_code],al
+       and     bl,1111b
+       xchg    bl,[postbyte_register]
+       mov     [base_code],0Fh
+       cmp     [code_type],64
+       je      mov_reg_creg_64bit
+       cmp     [operand_size],4
+       jne     invalid_operand_size
+       cmp     [postbyte_register],8
+       jne     mov_reg_creg_store
+       cmp     [extended_code],20h
+       jne     mov_reg_creg_store
+       mov     al,0F0h
+       stos    byte [edi]
+       mov     [postbyte_register],0
+      mov_reg_creg_store:
+       jmp     nomem_instruction_ready
+      mov_reg_creg_64bit:
+       cmp     [operand_size],8
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+      mov_reg_mem:
+       add     [base_code],2
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      mov_reg_mem_8bit
+       inc     [base_code]
+       call    operand_autodetect
+       mov     al,[postbyte_register]
+       or      al,bl
+       or      al,bh
+       jz      mov_ax_mem
+       jmp     instruction_ready
+      mov_reg_mem_8bit:
+       mov     al,[postbyte_register]
+       or      al,bl
+       or      al,bh
+       jz      mov_al_mem
+       jmp     instruction_ready
+      mov_al_mem:
+       test    ch,22h
+       jnz     mov_al_mem_address16
+       test    ch,44h
+       jnz     mov_al_mem_address32
+       test    ch,not 88h
+       jnz     invalid_address_size
+       call    check_mov_address64
+       cmp     al,0
+       jg      mov_al_mem_address64
+       jl      instruction_ready
+       cmp     [code_type],16
+       jne     mov_al_mem_address32
+       cmp     edx,10000h
+       jb      mov_al_mem_address16
+      mov_al_mem_address32:
+       call    store_segment_prefix_if_necessary
+       call    address_32bit_prefix
+       mov     [base_code],0A0h
+       jmp     store_mov_address32
+      mov_al_mem_address16:
+       call    store_segment_prefix_if_necessary
+       call    address_16bit_prefix
+       mov     [base_code],0A0h
+       jmp     store_mov_address16
+      mov_al_mem_address64:
+       call    store_segment_prefix_if_necessary
+       mov     [base_code],0A0h
+       jmp     store_mov_address64
+      mov_ax_mem:
+       test    ch,22h
+       jnz     mov_ax_mem_address16
+       test    ch,44h
+       jnz     mov_ax_mem_address32
+       test    ch,not 88h
+       jnz     invalid_address_size
+       call    check_mov_address64
+       cmp     al,0
+       jg      mov_ax_mem_address64
+       jl      instruction_ready
+       cmp     [code_type],16
+       jne     mov_ax_mem_address32
+       cmp     edx,10000h
+       jb      mov_ax_mem_address16
+      mov_ax_mem_address32:
+       call    store_segment_prefix_if_necessary
+       call    address_32bit_prefix
+       mov     [base_code],0A1h
+       jmp     store_mov_address32
+      mov_ax_mem_address16:
+       call    store_segment_prefix_if_necessary
+       call    address_16bit_prefix
+       mov     [base_code],0A1h
+       jmp     store_mov_address16
+      mov_ax_mem_address64:
+       call    store_segment_prefix_if_necessary
+       mov     [base_code],0A1h
+       jmp     store_mov_address64
+      mov_reg_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       je      mov_reg_imm_8bit
+       cmp     al,2
+       je      mov_reg_imm_16bit
+       cmp     al,4
+       je      mov_reg_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      mov_reg_imm_64bit:
+       call    operand_64bit
+       call    get_qword_value
+       mov     ecx,edx
+       cmp     [size_declared],0
+       jne     mov_reg_imm_64bit_store
+       cmp     [value_type],4
+       jae     mov_reg_imm_64bit_store
+       cdq
+       cmp     ecx,edx
+       je      mov_reg_64bit_imm_32bit
+      mov_reg_imm_64bit_store:
+       push    eax ecx
+       mov     al,0B8h
+       call    store_mov_reg_imm_code
+       pop     edx eax
+       call    mark_relocation
+       stos    dword [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       jmp     instruction_assembled
+      mov_reg_imm_8bit:
+       call    get_byte_value
+       mov     dl,al
+       mov     al,0B0h
+       call    store_mov_reg_imm_code
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      mov_reg_imm_16bit:
+       call    get_word_value
+       mov     dx,ax
+       call    operand_16bit
+       mov     al,0B8h
+       call    store_mov_reg_imm_code
+       mov     ax,dx
+       call    mark_relocation
+       stos    word [edi]
+       jmp     instruction_assembled
+      mov_reg_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+       mov     edx,eax
+       mov     al,0B8h
+       call    store_mov_reg_imm_code
+      mov_store_imm_32bit:
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      store_mov_reg_imm_code:
+       mov     ah,[postbyte_register]
+       test    ah,1000b
+       jz      mov_reg_imm_prefix_ok
+       or      [rex_prefix],41h
+      mov_reg_imm_prefix_ok:
+       and     ah,111b
+       add     al,ah
+       mov     [base_code],al
+       call    store_classic_instruction_code
+       ret
+      mov_reg_64bit_imm_32bit:
+       mov     edx,eax
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],0
+       mov     [base_code],0C7h
+       call    store_nomem_instruction
+       jmp     mov_store_imm_32bit
+      mov_sreg:
+       mov     ah,al
+       and     al,1111b
+       mov     [postbyte_register],al
+       shr     ah,4
+       cmp     ah,3
+       jne     invalid_operand
+       cmp     al,2
+       je      illegal_instruction
+       dec     [postbyte_register]
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      mov_sreg_mem
+       cmp     al,10h
+       jne     invalid_operand
+      mov_sreg_reg:
+       lods    byte [esi]
+       call    convert_register
+       or      ah,ah
+       jz      mov_sreg_reg_size_ok
+       cmp     ah,2
+       jne     invalid_operand_size
+       mov     bl,al
+      mov_sreg_reg_size_ok:
+       mov     [base_code],8Eh
+       jmp     nomem_instruction_ready
+      mov_sreg_mem:
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      mov_sreg_mem_size_ok
+       cmp     al,2
+       jne     invalid_operand_size
+      mov_sreg_mem_size_ok:
+       mov     [base_code],8Eh
+       jmp     instruction_ready
+      mov_creg:
+       lods    byte [esi]
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,4
+       ja      invalid_operand
+       add     ah,22h
+       mov     [extended_code],ah
+       and     al,1111b
+       mov     [postbyte_register],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     bl,al
+       cmp     [code_type],64
+       je      mov_creg_64bit
+       cmp     ah,4
+       jne     invalid_operand_size
+       cmp     [postbyte_register],8
+       jne     mov_creg_store
+       cmp     [extended_code],22h
+       jne     mov_creg_store
+       mov     al,0F0h
+       stos    byte [edi]
+       mov     [postbyte_register],0
+      mov_creg_store:
+       jmp     nomem_instruction_ready
+      mov_creg_64bit:
+       cmp     ah,8
+       je      mov_creg_store
+       jmp     invalid_operand_size
+test_instruction:
+       mov     [base_code],84h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      test_reg
+       cmp     al,'['
+       jne     invalid_operand
+      test_mem:
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      test_mem_imm
+       cmp     al,10h
+       jne     invalid_operand
+      test_mem_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     al,ah
+       cmp     al,1
+       je      test_mem_reg_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      test_mem_reg_8bit:
+       jmp     instruction_ready
+      test_mem_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       jb      test_mem_imm_nosize
+       je      test_mem_imm_8bit
+       cmp     al,2
+       je      test_mem_imm_16bit
+       cmp     al,4
+       je      test_mem_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      test_mem_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     test_mem_imm_32bit_store
+      test_mem_imm_nosize:
+       call    recoverable_unknown_size
+      test_mem_imm_8bit:
+       call    get_byte_value
+       mov     byte [value],al
+       mov     [postbyte_register],0
+       mov     [base_code],0F6h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      test_mem_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     word [value],ax
+       mov     [postbyte_register],0
+       mov     [base_code],0F7h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm16
+       jmp     instruction_assembled
+      test_mem_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      test_mem_imm_32bit_store:
+       mov     dword [value],eax
+       mov     [postbyte_register],0
+       mov     [base_code],0F7h
+       pop     ecx ebx edx
+       call    store_instruction_with_imm32
+       jmp     instruction_assembled
+      test_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      test_reg_mem
+       cmp     al,'('
+       je      test_reg_imm
+       cmp     al,10h
+       jne     invalid_operand
+      test_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],al
+       mov     al,ah
+       cmp     al,1
+       je      test_reg_reg_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      test_reg_reg_8bit:
+       jmp     nomem_instruction_ready
+      test_reg_imm:
+       mov     al,[operand_size]
+       cmp     al,1
+       je      test_reg_imm_8bit
+       cmp     al,2
+       je      test_reg_imm_16bit
+       cmp     al,4
+       je      test_reg_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      test_reg_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     test_reg_imm_32bit_store
+      test_reg_imm_8bit:
+       call    get_byte_value
+       mov     dl,al
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],0
+       mov     [base_code],0F6h
+       or      bl,bl
+       jz      test_al_imm
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      test_al_imm:
+       mov     [base_code],0A8h
+       call    store_classic_instruction_code
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      test_reg_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     dx,ax
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],0
+       mov     [base_code],0F7h
+       or      bl,bl
+       jz      test_ax_imm
+       call    store_nomem_instruction
+       mov     ax,dx
+       call    mark_relocation
+       stos    word [edi]
+       jmp     instruction_assembled
+      test_ax_imm:
+       mov     [base_code],0A9h
+       call    store_classic_instruction_code
+       mov     ax,dx
+       stos    word [edi]
+       jmp     instruction_assembled
+      test_reg_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      test_reg_imm_32bit_store:
+       mov     edx,eax
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],0
+       mov     [base_code],0F7h
+       or      bl,bl
+       jz      test_eax_imm
+       call    store_nomem_instruction
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      test_eax_imm:
+       mov     [base_code],0A9h
+       call    store_classic_instruction_code
+       mov     eax,edx
+       stos    dword [edi]
+       jmp     instruction_assembled
+      test_reg_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      test_reg_mem_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      test_reg_mem_8bit:
+       jmp     instruction_ready
+xchg_instruction:
+       mov     [base_code],86h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      xchg_reg
+       cmp     al,'['
+       jne     invalid_operand
+      xchg_mem:
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      test_mem_reg
+       jmp     invalid_operand
+      xchg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      test_reg_mem
+       cmp     al,10h
+       jne     invalid_operand
+      xchg_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       cmp     al,1
+       je      xchg_reg_reg_8bit
+       call    operand_autodetect
+       cmp     [postbyte_register],0
+       je      xchg_ax_reg
+       or      bl,bl
+       jnz     xchg_reg_reg_store
+       mov     bl,[postbyte_register]
+      xchg_ax_reg:
+       cmp     [code_type],64
+       jne     xchg_ax_reg_ok
+       cmp     ah,4
+       jne     xchg_ax_reg_ok
+       or      bl,bl
+       jz      xchg_reg_reg_store
+      xchg_ax_reg_ok:
+       test    bl,1000b
+       jz      xchg_ax_reg_store
+       or      [rex_prefix],41h
+       and     bl,111b
+      xchg_ax_reg_store:
+       add     bl,90h
+       mov     [base_code],bl
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+      xchg_reg_reg_store:
+       inc     [base_code]
+      xchg_reg_reg_8bit:
+       jmp     nomem_instruction_ready
+push_instruction:
+       mov     [push_size],al
+      push_next:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      push_reg
+       cmp     al,'('
+       je      push_imm
+       cmp     al,'['
+       jne     invalid_operand
+      push_mem:
+       call    get_address
+       mov     al,[operand_size]
+       mov     ah,[push_size]
+       cmp     al,2
+       je      push_mem_16bit
+       cmp     al,4
+       je      push_mem_32bit
+       cmp     al,8
+       je      push_mem_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     ah,2
+       je      push_mem_16bit
+       cmp     ah,4
+       je      push_mem_32bit
+       cmp     ah,8
+       je      push_mem_64bit
+       call    recoverable_unknown_size
+       jmp     push_mem_store
+      push_mem_16bit:
+       test    ah,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+       jmp     push_mem_store
+      push_mem_32bit:
+       test    ah,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     push_mem_store
+      push_mem_64bit:
+       test    ah,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+      push_mem_store:
+       mov     [base_code],0FFh
+       mov     [postbyte_register],110b
+       call    store_instruction
+       jmp     push_done
+      push_reg:
+       lods    byte [esi]
+       mov     ah,al
+       sub     ah,10h
+       and     ah,al
+       test    ah,0F0h
+       jnz     push_sreg
+       call    convert_register
+       test    al,1000b
+       jz      push_reg_ok
+       or      [rex_prefix],41h
+       and     al,111b
+      push_reg_ok:
+       add     al,50h
+       mov     [base_code],al
+       mov     al,ah
+       mov     ah,[push_size]
+       cmp     al,2
+       je      push_reg_16bit
+       cmp     al,4
+       je      push_reg_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      push_reg_64bit:
+       test    ah,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     push_reg_store
+      push_reg_32bit:
+       test    ah,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     push_reg_store
+      push_reg_16bit:
+       test    ah,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+      push_reg_store:
+       call    store_classic_instruction_code
+       jmp     push_done
+      push_sreg:
+       mov     bl,al
+       mov     dl,[operand_size]
+       mov     dh,[push_size]
+       cmp     dl,2
+       je      push_sreg16
+       cmp     dl,4
+       je      push_sreg32
+       cmp     dl,8
+       je      push_sreg64
+       or      dl,dl
+       jnz     invalid_operand_size
+       cmp     dh,2
+       je      push_sreg16
+       cmp     dh,4
+       je      push_sreg32
+       cmp     dh,8
+       je      push_sreg64
+       jmp     push_sreg_store
+      push_sreg16:
+       test    dh,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+       jmp     push_sreg_store
+      push_sreg32:
+       test    dh,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     push_sreg_store
+      push_sreg64:
+       test    dh,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+      push_sreg_store:
+       mov     al,bl
+       cmp     al,40h
+       jae     invalid_operand
+       sub     al,31h
+       jc      invalid_operand
+       cmp     al,4
+       jae     push_sreg_386
+       shl     al,3
+       add     al,6
+       mov     [base_code],al
+       cmp     [code_type],64
+       je      illegal_instruction
+       jmp     push_reg_store
+      push_sreg_386:
+       sub     al,4
+       shl     al,3
+       add     al,0A0h
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       jmp     push_reg_store
+      push_imm:
+       mov     al,[operand_size]
+       mov     ah,[push_size]
+       or      al,al
+       je      push_imm_size_ok
+       or      ah,ah
+       je      push_imm_size_ok
+       cmp     al,ah
+       jne     invalid_operand_size
+      push_imm_size_ok:
+       cmp     al,2
+       je      push_imm_16bit
+       cmp     al,4
+       je      push_imm_32bit
+       cmp     al,8
+       je      push_imm_64bit
+       cmp     ah,2
+       je      push_imm_optimized_16bit
+       cmp     ah,4
+       je      push_imm_optimized_32bit
+       cmp     ah,8
+       je      push_imm_optimized_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     [code_type],16
+       je      push_imm_optimized_16bit
+       cmp     [code_type],32
+       je      push_imm_optimized_32bit
+      push_imm_optimized_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       call    get_simm32
+       mov     edx,eax
+       cmp     [value_type],0
+       jne     push_imm_32bit_store
+       cmp     eax,-80h
+       jl      push_imm_32bit_store
+       cmp     eax,80h
+       jge     push_imm_32bit_store
+       jmp     push_imm_8bit
+      push_imm_optimized_32bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    get_dword_value
+       mov     edx,eax
+       call    operand_32bit
+       cmp     [value_type],0
+       jne     push_imm_32bit_store
+       cmp     eax,-80h
+       jl      push_imm_32bit_store
+       cmp     eax,80h
+       jge     push_imm_32bit_store
+       jmp     push_imm_8bit
+      push_imm_optimized_16bit:
+       call    get_word_value
+       mov     dx,ax
+       call    operand_16bit
+       cmp     [value_type],0
+       jne     push_imm_16bit_store
+       cmp     ax,-80h
+       jl      push_imm_16bit_store
+       cmp     ax,80h
+       jge     push_imm_16bit_store
+      push_imm_8bit:
+       mov     ah,al
+       mov     [base_code],6Ah
+       call    store_classic_instruction_code
+       mov     al,ah
+       stos    byte [edi]
+       jmp     push_done
+      push_imm_16bit:
+       call    get_word_value
+       mov     dx,ax
+       call    operand_16bit
+      push_imm_16bit_store:
+       mov     [base_code],68h
+       call    store_classic_instruction_code
+       mov     ax,dx
+       call    mark_relocation
+       stos    word [edi]
+       jmp     push_done
+      push_imm_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       call    get_simm32
+       mov     edx,eax
+       jmp     push_imm_32bit_store
+      push_imm_32bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    get_dword_value
+       mov     edx,eax
+       call    operand_32bit
+      push_imm_32bit_store:
+       mov     [base_code],68h
+       call    store_classic_instruction_code
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+      push_done:
+       lods    byte [esi]
+       dec     esi
+       cmp     al,0Fh
+       je      instruction_assembled
+       or      al,al
+       jz      instruction_assembled
+;       mov     [operand_size],0
+;       mov     [operand_flags],0
+;       mov     [operand_prefix],0
+;       mov     [rex_prefix],0
+       and     dword [operand_size],0
+       jmp     push_next
+pop_instruction:
+       mov     [push_size],al
+      pop_next:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pop_reg
+       cmp     al,'['
+       jne     invalid_operand
+      pop_mem:
+       call    get_address
+       mov     al,[operand_size]
+       mov     ah,[push_size]
+       cmp     al,2
+       je      pop_mem_16bit
+       cmp     al,4
+       je      pop_mem_32bit
+       cmp     al,8
+       je      pop_mem_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     ah,2
+       je      pop_mem_16bit
+       cmp     ah,4
+       je      pop_mem_32bit
+       cmp     ah,8
+       je      pop_mem_64bit
+       call    recoverable_unknown_size
+       jmp     pop_mem_store
+      pop_mem_16bit:
+       test    ah,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+       jmp     pop_mem_store
+      pop_mem_32bit:
+       test    ah,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     pop_mem_store
+      pop_mem_64bit:
+       test    ah,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+      pop_mem_store:
+       mov     [base_code],08Fh
+       mov     [postbyte_register],0
+       call    store_instruction
+       jmp     pop_done
+      pop_reg:
+       lods    byte [esi]
+       mov     ah,al
+       sub     ah,10h
+       and     ah,al
+       test    ah,0F0h
+       jnz     pop_sreg
+       call    convert_register
+       test    al,1000b
+       jz      pop_reg_ok
+       or      [rex_prefix],41h
+       and     al,111b
+      pop_reg_ok:
+       add     al,58h
+       mov     [base_code],al
+       mov     al,ah
+       mov     ah,[push_size]
+       cmp     al,2
+       je      pop_reg_16bit
+       cmp     al,4
+       je      pop_reg_32bit
+       cmp     al,8
+       je      pop_reg_64bit
+       jmp     invalid_operand_size
+      pop_reg_64bit:
+       test    ah,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     pop_reg_store
+      pop_reg_32bit:
+       test    ah,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     pop_reg_store
+      pop_reg_16bit:
+       test    ah,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+      pop_reg_store:
+       call    store_classic_instruction_code
+      pop_done:
+       lods    byte [esi]
+       dec     esi
+       cmp     al,0Fh
+       je      instruction_assembled
+       or      al,al
+       jz      instruction_assembled
+;       mov     [operand_size],0
+;       mov     [operand_flags],0
+;       mov     [operand_prefix],0
+;       mov     [rex_prefix],0
+       and     dword [operand_size],0
+       jmp     pop_next
+      pop_sreg:
+       mov     dl,[operand_size]
+       mov     dh,[push_size]
+       cmp     al,32h
+       je      pop_cs
+       mov     bl,al
+       cmp     dl,2
+       je      pop_sreg16
+       cmp     dl,4
+       je      pop_sreg32
+       cmp     dl,8
+       je      pop_sreg64
+       or      dl,dl
+       jnz     invalid_operand_size
+       cmp     dh,2
+       je      pop_sreg16
+       cmp     dh,4
+       je      pop_sreg32
+       cmp     dh,8
+       je      pop_sreg64
+       jmp     pop_sreg_store
+      pop_sreg16:
+       test    dh,not 2
+       jnz     invalid_operand_size
+       call    operand_16bit
+       jmp     pop_sreg_store
+      pop_sreg32:
+       test    dh,not 4
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     pop_sreg_store
+      pop_sreg64:
+       test    dh,not 8
+       jnz     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+      pop_sreg_store:
+       mov     al,bl
+       cmp     al,40h
+       jae     invalid_operand
+       sub     al,31h
+       jc      invalid_operand
+       cmp     al,4
+       jae     pop_sreg_386
+       shl     al,3
+       add     al,7
+       mov     [base_code],al
+       cmp     [code_type],64
+       je      illegal_instruction
+       jmp     pop_reg_store
+      pop_cs:
+       cmp     [code_type],16
+       jne     illegal_instruction
+       cmp     dl,2
+       je      pop_cs_store
+       or      dl,dl
+       jnz     invalid_operand_size
+       cmp     dh,2
+       je      pop_cs_store
+       or      dh,dh
+       jnz     illegal_instruction
+      pop_cs_store:
+       test    dh,not 2
+       jnz     invalid_operand_size
+       mov     al,0Fh
+       stos    byte [edi]
+       jmp     pop_done
+      pop_sreg_386:
+       sub     al,4
+       shl     al,3
+       add     al,0A1h
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       jmp     pop_reg_store
+inc_instruction:
+       mov     [base_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      inc_reg
+       cmp     al,'['
+       je      inc_mem
+       jne     invalid_operand
+      inc_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      inc_mem_8bit
+       jb      inc_mem_nosize
+       call    operand_autodetect
+       mov     al,0FFh
+       xchg    al,[base_code]
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+      inc_mem_nosize:
+       call    recoverable_unknown_size
+      inc_mem_8bit:
+       mov     al,0FEh
+       xchg    al,[base_code]
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+      inc_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,0FEh
+       xchg    al,[base_code]
+       mov     [postbyte_register],al
+       mov     al,ah
+       cmp     al,1
+       je      inc_reg_8bit
+       call    operand_autodetect
+       cmp     [code_type],64
+       je      inc_reg_long_form
+       mov     al,[postbyte_register]
+       shl     al,3
+       add     al,bl
+       add     al,40h
+       mov     [base_code],al
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+      inc_reg_long_form:
+       inc     [base_code]
+      inc_reg_8bit:
+       jmp     nomem_instruction_ready
+set_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      set_reg
+       cmp     al,'['
+       jne     invalid_operand
+      set_mem:
+       call    get_address
+       cmp     [operand_size],1
+       ja      invalid_operand_size
+       mov     [postbyte_register],0
+       jmp     instruction_ready
+      set_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,1
+       jne     invalid_operand_size
+       mov     bl,al
+       mov     [postbyte_register],0
+       jmp     nomem_instruction_ready
+arpl_instruction:
+       cmp     [code_type],64
+       je      illegal_instruction
+       mov     [base_code],63h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      arpl_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       cmp     ah,2
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      arpl_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,2
+       jne     invalid_operand_size
+       mov     bl,al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       jmp     nomem_instruction_ready
+bound_instruction:
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,2
+       je      bound_store
+       cmp     al,4
+       jne     invalid_operand_size
+      bound_store:
+       call    operand_autodetect
+       mov     [base_code],62h
+       jmp     instruction_ready
+enter_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     ah,2
+       je      enter_imm16_size_ok
+       or      ah,ah
+       jnz     invalid_operand_size
+      enter_imm16_size_ok:
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_word_value
+       cmp     [next_pass_needed],0
+       jne     enter_imm16_ok
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       test    eax,eax
+       js      value_out_of_range
+      enter_imm16_ok:
+       push    eax
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     ah,1
+       je      enter_imm8_size_ok
+       or      ah,ah
+       jnz     invalid_operand_size
+      enter_imm8_size_ok:
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       cmp     [next_pass_needed],0
+       jne     enter_imm8_ok
+       test    eax,eax
+       js      value_out_of_range
+      enter_imm8_ok:
+       mov     dl,al
+       pop     ebx
+       mov     al,0C8h
+       stos    byte [edi]
+       mov     ax,bx
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+ret_instruction_only64:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     ret_instruction
+ret_instruction_32bit_except64:
+       cmp     [code_type],64
+       je      illegal_instruction
+ret_instruction_32bit:
+       call    operand_32bit
+       jmp     ret_instruction
+ret_instruction_16bit:
+       call    operand_16bit
+       jmp     ret_instruction
+ret_instruction_64bit:
+       call    operand_64bit
+ret_instruction:
+       and     [prefix_flags],not 10h
+      ret_common:
+       mov     [base_code],al
+       lods    byte [esi]
+       dec     esi
+       or      al,al
+       jz      simple_ret
+       cmp     al,0Fh
+       je      simple_ret
+       lods    byte [esi]
+       call    get_size_operator
+       or      ah,ah
+       jz      ret_imm
+       cmp     ah,2
+       je      ret_imm
+       jmp     invalid_operand_size
+      ret_imm:
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_word_value
+       cmp     [next_pass_needed],0
+       jne     ret_imm_ok
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       test    eax,eax
+       js      value_out_of_range
+      ret_imm_ok:
+       cmp     [size_declared],0
+       jne     ret_imm_store
+       or      ax,ax
+       jz      simple_ret
+      ret_imm_store:
+       mov     dx,ax
+       call    store_classic_instruction_code
+       mov     ax,dx
+       stos    word [edi]
+       jmp     instruction_assembled
+      simple_ret:
+       inc     [base_code]
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+retf_instruction:
+       cmp     [code_type],64
+       jne     ret_common
+retf_instruction_64bit:
+       call    operand_64bit
+       jmp     ret_common
+retf_instruction_32bit:
+       call    operand_32bit
+       jmp     ret_common
+retf_instruction_16bit:
+       call    operand_16bit
+       jmp     ret_common
+lea_instruction:
+       mov     [base_code],8Dh
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       or      [operand_flags],1
+       call    get_address
+       pop     eax
+       mov     [operand_size],al
+       call    operand_autodetect
+       jmp     instruction_ready
+ls_instruction:
+       or      al,al
+       jz      les_instruction
+       cmp     al,3
+       jz      lds_instruction
+       add     al,0B0h
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       jmp     ls_code_ok
+      les_instruction:
+       mov     [base_code],0C4h
+       jmp     ls_short_code
+      lds_instruction:
+       mov     [base_code],0C5h
+      ls_short_code:
+       cmp     [code_type],64
+       je      illegal_instruction
+      ls_code_ok:
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       add     [operand_size],2
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,4
+       je      ls_16bit
+       cmp     al,6
+       je      ls_32bit
+       cmp     al,10
+       je      ls_64bit
+       jmp     invalid_operand_size
+      ls_16bit:
+       call    operand_16bit
+       jmp     instruction_ready
+      ls_32bit:
+       call    operand_32bit
+       jmp     instruction_ready
+      ls_64bit:
+       call    operand_64bit
+       jmp     instruction_ready
+sh_instruction:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      sh_reg
+       cmp     al,'['
+       jne     invalid_operand
+      sh_mem:
+       call    get_address
+       push    edx ebx ecx
+       mov     al,[operand_size]
+       push    eax
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      sh_mem_imm
+       cmp     al,10h
+       jne     invalid_operand
+      sh_mem_reg:
+       lods    byte [esi]
+       cmp     al,11h
+       jne     invalid_operand
+       pop     eax ecx ebx edx
+       cmp     al,1
+       je      sh_mem_cl_8bit
+       jb      sh_mem_cl_nosize
+       call    operand_autodetect
+       mov     [base_code],0D3h
+       jmp     instruction_ready
+      sh_mem_cl_nosize:
+       call    recoverable_unknown_size
+      sh_mem_cl_8bit:
+       mov     [base_code],0D2h
+       jmp     instruction_ready
+      sh_mem_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      sh_mem_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      sh_mem_imm_size_ok:
+       call    get_byte_value
+       mov     byte [value],al
+       pop     eax ecx ebx edx
+       cmp     al,1
+       je      sh_mem_imm_8bit
+       jb      sh_mem_imm_nosize
+       call    operand_autodetect
+       cmp     byte [value],1
+       je      sh_mem_1
+       mov     [base_code],0C1h
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      sh_mem_1:
+       mov     [base_code],0D1h
+       jmp     instruction_ready
+      sh_mem_imm_nosize:
+       call    recoverable_unknown_size
+      sh_mem_imm_8bit:
+       cmp     byte [value],1
+       je      sh_mem_1_8bit
+       mov     [base_code],0C0h
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      sh_mem_1_8bit:
+       mov     [base_code],0D0h
+       jmp     instruction_ready
+      sh_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bx,ax
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      sh_reg_imm
+       cmp     al,10h
+       jne     invalid_operand
+      sh_reg_reg:
+       lods    byte [esi]
+       cmp     al,11h
+       jne     invalid_operand
+       mov     al,bh
+       cmp     al,1
+       je      sh_reg_cl_8bit
+       call    operand_autodetect
+       mov     [base_code],0D3h
+       jmp     nomem_instruction_ready
+      sh_reg_cl_8bit:
+       mov     [base_code],0D2h
+       jmp     nomem_instruction_ready
+      sh_reg_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      sh_reg_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      sh_reg_imm_size_ok:
+       push    ebx
+       call    get_byte_value
+       mov     dl,al
+       pop     ebx
+       mov     al,bh
+       cmp     al,1
+       je      sh_reg_imm_8bit
+       call    operand_autodetect
+       cmp     dl,1
+       je      sh_reg_1
+       mov     [base_code],0C1h
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      sh_reg_1:
+       mov     [base_code],0D1h
+       jmp     nomem_instruction_ready
+      sh_reg_imm_8bit:
+       cmp     dl,1
+       je      sh_reg_1_8bit
+       mov     [base_code],0C0h
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      sh_reg_1_8bit:
+       mov     [base_code],0D0h
+       jmp     nomem_instruction_ready
+shd_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      shd_reg
+       cmp     al,'['
+       jne     invalid_operand
+      shd_mem:
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     al,ah
+       mov     [operand_size],0
+       push    eax
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      shd_mem_reg_imm
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,11h
+       jne     invalid_operand
+       pop     eax ecx ebx edx
+       call    operand_autodetect
+       inc     [extended_code]
+       jmp     instruction_ready
+      shd_mem_reg_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      shd_mem_reg_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      shd_mem_reg_imm_size_ok:
+       call    get_byte_value
+       mov     byte [value],al
+       pop     eax ecx ebx edx
+       call    operand_autodetect
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      shd_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     bl,[postbyte_register]
+       mov     [postbyte_register],al
+       mov     al,ah
+       push    eax ebx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      shd_reg_reg_imm
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,11h
+       jne     invalid_operand
+       pop     ebx eax
+       call    operand_autodetect
+       inc     [extended_code]
+       jmp     nomem_instruction_ready
+      shd_reg_reg_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      shd_reg_reg_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      shd_reg_reg_imm_size_ok:
+       call    get_byte_value
+       mov     dl,al
+       pop     ebx eax
+       call    operand_autodetect
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+movx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_register
+       mov     [postbyte_register],al
+       mov     al,ah
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movx_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     eax
+       mov     ah,[operand_size]
+       or      ah,ah
+       jz      movx_unknown_size
+       cmp     ah,al
+       jae     invalid_operand_size
+       cmp     ah,1
+       je      movx_mem_store
+       cmp     ah,2
+       jne     invalid_operand_size
+       inc     [extended_code]
+      movx_mem_store:
+       call    operand_autodetect
+       jmp     instruction_ready
+      movx_unknown_size:
+       cmp     al,2
+       je      movx_mem_store
+       call    recoverable_unknown_size
+       jmp     movx_mem_store
+      movx_reg:
+       lods    byte [esi]
+       call    convert_register
+       pop     ebx
+       xchg    bl,al
+       cmp     ah,al
+       jae     invalid_operand_size
+       cmp     ah,1
+       je      movx_reg_8bit
+       cmp     ah,2
+       je      movx_reg_16bit
+       jmp     invalid_operand_size
+      movx_reg_8bit:
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+      movx_reg_16bit:
+       call    operand_autodetect
+       inc     [extended_code]
+       jmp     nomem_instruction_ready
+movsxd_instruction:
+       mov     [base_code],al
+       call    take_register
+       mov     [postbyte_register],al
+       cmp     ah,8
+       jne     invalid_operand_size
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movsxd_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],4
+       je      movsxd_mem_store
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+      movsxd_mem_store:
+       call    operand_64bit
+       jmp     instruction_ready
+      movsxd_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     bl,al
+       call    operand_64bit
+       jmp     nomem_instruction_ready
+bt_instruction:
+       mov     [postbyte_register],al
+       shl     al,3
+       add     al,83h
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      bt_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       push    eax ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       cmp     byte [esi],'('
+       je      bt_mem_imm
+       cmp     byte [esi],11h
+       jne     bt_mem_reg
+       cmp     byte [esi+2],'('
+       je      bt_mem_imm
+      bt_mem_reg:
+       call    take_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     al,ah
+       call    operand_autodetect
+       jmp     instruction_ready
+      bt_mem_imm:
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[operand_size]
+       or      al,al
+       jz      bt_mem_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      bt_mem_imm_size_ok:
+       call    get_byte_value
+       mov     byte [value],al
+       pop     eax
+       or      al,al
+       jz      bt_mem_imm_nosize
+       call    operand_autodetect
+      bt_mem_imm_store:
+       pop     ecx ebx edx
+       mov     [extended_code],0BAh
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      bt_mem_imm_nosize:
+       call    recoverable_unknown_size
+       jmp     bt_mem_imm_store
+      bt_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       cmp     byte [esi],'('
+       je      bt_reg_imm
+       cmp     byte [esi],11h
+       jne     bt_reg_reg
+       cmp     byte [esi+2],'('
+       je      bt_reg_imm
+      bt_reg_reg:
+       call    take_register
+       mov     [postbyte_register],al
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+      bt_reg_imm:
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax ebx
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[operand_size]
+       or      al,al
+       jz      bt_reg_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      bt_reg_imm_size_ok:
+       call    get_byte_value
+       mov     byte [value],al
+       pop     ebx eax
+       call    operand_autodetect
+      bt_reg_imm_store:
+       mov     [extended_code],0BAh
+       call    store_nomem_instruction
+       mov     al,byte [value]
+       stos    byte [edi]
+       jmp     instruction_assembled
+bs_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       call    get_reg_mem
+       jc      bs_reg_reg
+       mov     al,[operand_size]
+       call    operand_autodetect
+       jmp     instruction_ready
+      bs_reg_reg:
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+      get_reg_mem:
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      get_reg_reg
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       clc
+       ret
+      get_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       stc
+       ret
+ud_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       call    get_reg_mem
+       jc      ud_reg_reg
+       cmp     [operand_size],4
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      ud_reg_reg:
+       cmp     ah,4
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+
+imul_instruction:
+       mov     [base_code],0F6h
+       mov     [postbyte_register],5
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      imul_reg
+       cmp     al,'['
+       jne     invalid_operand
+      imul_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,1
+       je      imul_mem_8bit
+       jb      imul_mem_nosize
+       call    operand_autodetect
+       inc     [base_code]
+       jmp     instruction_ready
+      imul_mem_nosize:
+       call    recoverable_unknown_size
+      imul_mem_8bit:
+       jmp     instruction_ready
+      imul_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     byte [esi],','
+       je      imul_reg_
+       mov     bl,al
+       mov     al,ah
+       cmp     al,1
+       je      imul_reg_8bit
+       call    operand_autodetect
+       inc     [base_code]
+      imul_reg_8bit:
+       jmp     nomem_instruction_ready
+      imul_reg_:
+       mov     [postbyte_register],al
+       inc     esi
+       cmp     byte [esi],'('
+       je      imul_reg_imm
+       cmp     byte [esi],11h
+       jne     imul_reg_noimm
+       cmp     byte [esi+2],'('
+       je      imul_reg_imm
+      imul_reg_noimm:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      imul_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+      imul_reg_mem:
+       call    get_address
+       push    edx ebx ecx
+       cmp     byte [esi],','
+       je      imul_reg_mem_imm
+       mov     al,[operand_size]
+       call    operand_autodetect
+       pop     ecx ebx edx
+       mov     [base_code],0Fh
+       mov     [extended_code],0AFh
+       jmp     instruction_ready
+      imul_reg_mem_imm:
+       inc     esi
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[operand_size]
+       cmp     al,2
+       je      imul_reg_mem_imm_16bit
+       cmp     al,4
+       je      imul_reg_mem_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      imul_reg_mem_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     imul_reg_mem_imm_32bit_ok
+      imul_reg_mem_imm_16bit:
+       call    operand_16bit
+       call    get_word_value
+       mov     word [value],ax
+       cmp     [value_type],0
+       jne     imul_reg_mem_imm_16bit_store
+       cmp     [size_declared],0
+       jne     imul_reg_mem_imm_16bit_store
+       cmp     ax,-80h
+       jl      imul_reg_mem_imm_16bit_store
+       cmp     ax,80h
+       jl      imul_reg_mem_imm_8bit_store
+      imul_reg_mem_imm_16bit_store:
+       pop     ecx ebx edx
+       mov     [base_code],69h
+       call    store_instruction_with_imm16
+       jmp     instruction_assembled
+      imul_reg_mem_imm_32bit:
+       call    operand_32bit
+       call    get_dword_value
+      imul_reg_mem_imm_32bit_ok:
+       mov     dword [value],eax
+       cmp     [value_type],0
+       jne     imul_reg_mem_imm_32bit_store
+       cmp     [size_declared],0
+       jne     imul_reg_mem_imm_32bit_store
+       cmp     eax,-80h
+       jl      imul_reg_mem_imm_32bit_store
+       cmp     eax,80h
+       jl      imul_reg_mem_imm_8bit_store
+      imul_reg_mem_imm_32bit_store:
+       pop     ecx ebx edx
+       mov     [base_code],69h
+       call    store_instruction_with_imm32
+       jmp     instruction_assembled
+      imul_reg_mem_imm_8bit_store:
+       pop     ecx ebx edx
+       mov     [base_code],6Bh
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      imul_reg_imm:
+       mov     bl,[postbyte_register]
+       dec     esi
+       jmp     imul_reg_reg_imm
+      imul_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       cmp     byte [esi],','
+       je      imul_reg_reg_imm
+       mov     al,ah
+       call    operand_autodetect
+       mov     [base_code],0Fh
+       mov     [extended_code],0AFh
+       jmp     nomem_instruction_ready
+      imul_reg_reg_imm:
+       inc     esi
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[operand_size]
+       cmp     al,2
+       je      imul_reg_reg_imm_16bit
+       cmp     al,4
+       je      imul_reg_reg_imm_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      imul_reg_reg_imm_64bit:
+       cmp     [size_declared],0
+       jne     long_immediate_not_encodable
+       call    operand_64bit
+       push    ebx
+       call    get_simm32
+       cmp     [value_type],4
+       jae     long_immediate_not_encodable
+       jmp     imul_reg_reg_imm_32bit_ok
+      imul_reg_reg_imm_16bit:
+       call    operand_16bit
+       push    ebx
+       call    get_word_value
+       pop     ebx
+       mov     dx,ax
+       cmp     [value_type],0
+       jne     imul_reg_reg_imm_16bit_store
+       cmp     [size_declared],0
+       jne     imul_reg_reg_imm_16bit_store
+       cmp     ax,-80h
+       jl      imul_reg_reg_imm_16bit_store
+       cmp     ax,80h
+       jl      imul_reg_reg_imm_8bit_store
+      imul_reg_reg_imm_16bit_store:
+       mov     [base_code],69h
+       call    store_nomem_instruction
+       mov     ax,dx
+       call    mark_relocation
+       stos    word [edi]
+       jmp     instruction_assembled
+      imul_reg_reg_imm_32bit:
+       call    operand_32bit
+       push    ebx
+       call    get_dword_value
+      imul_reg_reg_imm_32bit_ok:
+       pop     ebx
+       mov     edx,eax
+       cmp     [value_type],0
+       jne     imul_reg_reg_imm_32bit_store
+       cmp     [size_declared],0
+       jne     imul_reg_reg_imm_32bit_store
+       cmp     eax,-80h
+       jl      imul_reg_reg_imm_32bit_store
+       cmp     eax,80h
+       jl      imul_reg_reg_imm_8bit_store
+      imul_reg_reg_imm_32bit_store:
+       mov     [base_code],69h
+       call    store_nomem_instruction
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      imul_reg_reg_imm_8bit_store:
+       mov     [base_code],6Bh
+       call    store_nomem_instruction
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+in_instruction:
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     al,ah
+       push    eax
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      in_imm
+       cmp     al,10h
+       je      in_reg
+       jmp     invalid_operand
+      in_reg:
+       lods    byte [esi]
+       cmp     al,22h
+       jne     invalid_operand
+       pop     eax
+       cmp     al,1
+       je      in_al_dx
+       cmp     al,2
+       je      in_ax_dx
+       cmp     al,4
+       jne     invalid_operand_size
+      in_ax_dx:
+       call    operand_autodetect
+       mov     [base_code],0EDh
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+      in_al_dx:
+       mov     al,0ECh
+       stos    byte [edi]
+       jmp     instruction_assembled
+      in_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      in_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      in_imm_size_ok:
+       call    get_byte_value
+       mov     dl,al
+       pop     eax
+       cmp     al,1
+       je      in_al_imm
+       cmp     al,2
+       je      in_ax_imm
+       cmp     al,4
+       jne     invalid_operand_size
+      in_ax_imm:
+       call    operand_autodetect
+       mov     [base_code],0E5h
+       call    store_classic_instruction_code
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      in_al_imm:
+       mov     al,0E4h
+       stos    byte [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+out_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'('
+       je      out_imm
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,22h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+       mov     al,ah
+       cmp     al,1
+       je      out_dx_al
+       cmp     al,2
+       je      out_dx_ax
+       cmp     al,4
+       jne     invalid_operand_size
+      out_dx_ax:
+       call    operand_autodetect
+       mov     [base_code],0EFh
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+      out_dx_al:
+       mov     al,0EEh
+       stos    byte [edi]
+       jmp     instruction_assembled
+      out_imm:
+       mov     al,[operand_size]
+       or      al,al
+       jz      out_imm_size_ok
+       cmp     al,1
+       jne     invalid_operand_size
+      out_imm_size_ok:
+       call    get_byte_value
+       mov     dl,al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+       mov     al,ah
+       cmp     al,1
+       je      out_imm_al
+       cmp     al,2
+       je      out_imm_ax
+       cmp     al,4
+       jne     invalid_operand_size
+      out_imm_ax:
+       call    operand_autodetect
+       mov     [base_code],0E7h
+       call    store_classic_instruction_code
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+      out_imm_al:
+       mov     al,0E6h
+       stos    byte [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+
+call_instruction:
+       mov     [postbyte_register],10b
+       mov     [base_code],0E8h
+       mov     [extended_code],9Ah
+       jmp     process_jmp
+jmp_instruction:
+       mov     [postbyte_register],100b
+       mov     [base_code],0E9h
+       mov     [extended_code],0EAh
+      process_jmp:
+       lods    byte [esi]
+       call    get_jump_operator
+       test    [prefix_flags],10h
+       jz      jmp_type_ok
+       test    [jump_type],not 2
+       jnz     illegal_instruction
+       mov     [jump_type],2
+       and     [prefix_flags],not 10h
+      jmp_type_ok:
+       call    get_size_operator
+       cmp     al,'('
+       je      jmp_imm
+       mov     [base_code],0FFh
+       cmp     al,10h
+       je      jmp_reg
+       cmp     al,'['
+       jne     invalid_operand
+      jmp_mem:
+       cmp     [jump_type],1
+       je      illegal_instruction
+       call    get_address
+       mov     edx,eax
+       mov     al,[operand_size]
+       or      al,al
+       jz      jmp_mem_size_not_specified
+       cmp     al,2
+       je      jmp_mem_16bit
+       cmp     al,4
+       je      jmp_mem_32bit
+       cmp     al,6
+       je      jmp_mem_48bit
+       cmp     al,8
+       je      jmp_mem_64bit
+       cmp     al,10
+       je      jmp_mem_80bit
+       jmp     invalid_operand_size
+      jmp_mem_size_not_specified:
+       cmp     [jump_type],3
+       je      jmp_mem_far
+       cmp     [jump_type],2
+       je      jmp_mem_near
+       call    recoverable_unknown_size
+      jmp_mem_near:
+       cmp     [code_type],16
+       je      jmp_mem_16bit
+       cmp     [code_type],32
+       je      jmp_mem_near_32bit
+      jmp_mem_64bit:
+       cmp     [jump_type],3
+       je      invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     instruction_ready
+      jmp_mem_far:
+       cmp     [code_type],16
+       je      jmp_mem_far_32bit
+      jmp_mem_48bit:
+       call    operand_32bit
+      jmp_mem_far_store:
+       cmp     [jump_type],2
+       je      invalid_operand_size
+       inc     [postbyte_register]
+       jmp     instruction_ready
+      jmp_mem_80bit:
+       call    operand_64bit
+       jmp     jmp_mem_far_store
+      jmp_mem_far_32bit:
+       call    operand_16bit
+       jmp     jmp_mem_far_store
+      jmp_mem_32bit:
+       cmp     [jump_type],3
+       je      jmp_mem_far_32bit
+       cmp     [jump_type],2
+       je      jmp_mem_near_32bit
+       cmp     [code_type],16
+       je      jmp_mem_far_32bit
+      jmp_mem_near_32bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     instruction_ready
+      jmp_mem_16bit:
+       cmp     [jump_type],3
+       je      invalid_operand_size
+       call    operand_16bit
+       jmp     instruction_ready
+      jmp_reg:
+       test    [jump_type],1
+       jnz     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       cmp     al,2
+       je      jmp_reg_16bit
+       cmp     al,4
+       je      jmp_reg_32bit
+       cmp     al,8
+       jne     invalid_operand_size
+      jmp_reg_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     nomem_instruction_ready
+      jmp_reg_32bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       call    operand_32bit
+       jmp     nomem_instruction_ready
+      jmp_reg_16bit:
+       call    operand_16bit
+       jmp     nomem_instruction_ready
+      jmp_imm:
+       cmp     byte [esi],'.'
+       je      invalid_value
+       mov     ebx,esi
+       dec     esi
+       call    skip_symbol
+       xchg    esi,ebx
+       cmp     byte [ebx],':'
+       je      jmp_far
+       cmp     [jump_type],3
+       je      invalid_operand
+      jmp_near:
+       mov     al,[operand_size]
+       cmp     al,2
+       je      jmp_imm_16bit
+       cmp     al,4
+       je      jmp_imm_32bit
+       cmp     al,8
+       je      jmp_imm_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     [code_type],16
+       je      jmp_imm_16bit
+       cmp     [code_type],64
+       je      jmp_imm_64bit
+      jmp_imm_32bit:
+       cmp     [code_type],64
+       je      invalid_operand_size
+       call    get_address_dword_value
+       cmp     [code_type],16
+       jne     jmp_imm_32bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      jmp_imm_32bit_prefix_ok:
+       call    calculate_jump_offset
+       cdq
+       call    check_for_short_jump
+       jc      jmp_short
+      jmp_imm_32bit_store:
+       mov     edx,eax
+       sub     edx,3
+       jno     jmp_imm_32bit_ok
+       cmp     [code_type],64
+       je      jump_out_of_range
+      jmp_imm_32bit_ok:
+       mov     al,[base_code]
+       stos    byte [edi]
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      jmp_imm_64bit:
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       call    get_address_qword_value
+       call    calculate_jump_offset
+       mov     ecx,edx
+       cdq
+       cmp     edx,ecx
+       jne     jump_out_of_range
+       call    check_for_short_jump
+       jnc     jmp_imm_32bit_store
+      jmp_short:
+       mov     ah,al
+       mov     al,0EBh
+       stos    word [edi]
+       jmp     instruction_assembled
+      jmp_imm_16bit:
+       call    get_address_word_value
+       cmp     [code_type],16
+       je      jmp_imm_16bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      jmp_imm_16bit_prefix_ok:
+       call    calculate_jump_offset
+       cwde
+       cdq
+       call    check_for_short_jump
+       jc      jmp_short
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,eax
+       dec     edx
+       mov     al,[base_code]
+       stos    byte [edi]
+       mov     eax,edx
+       stos    word [edi]
+       jmp     instruction_assembled
+      calculate_jump_offset:
+       add     edi,2
+       mov     ebp,[addressing_space]
+       call    calculate_relative_offset
+       sub     edi,2
+       ret
+      check_for_short_jump:
+       cmp     [jump_type],1
+       je      forced_short
+       ja      no_short_jump
+       cmp     [base_code],0E8h
+       je      no_short_jump
+       cmp     [value_type],0
+       jne     no_short_jump
+       cmp     eax,80h
+       jb      short_jump
+       cmp     eax,-80h
+       jae     short_jump
+      no_short_jump:
+       clc
+       ret
+      forced_short:
+       cmp     [base_code],0E8h
+       je      illegal_instruction
+       cmp     [next_pass_needed],0
+       jne     jmp_short_value_type_ok
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+      jmp_short_value_type_ok:
+       cmp     eax,-80h
+       jae     short_jump
+       cmp     eax,80h
+       jae     jump_out_of_range
+      short_jump:
+       stc
+       ret
+      jump_out_of_range:
+       cmp     [error_line],0
+       jne     instruction_assembled
+       mov     eax,[current_line]
+       mov     [error_line],eax
+       mov     [error],relative_jump_out_of_range
+       jmp     instruction_assembled
+      jmp_far:
+       cmp     [jump_type],2
+       je      invalid_operand
+       cmp     [code_type],64
+       je      illegal_instruction
+       mov     al,[extended_code]
+       mov     [base_code],al
+       call    get_word_value
+       push    eax
+       inc     esi
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[value_type]
+       push    eax
+       push    [symbol_identifier]
+       cmp     byte [esi],'.'
+       je      invalid_value
+       mov     al,[operand_size]
+       cmp     al,4
+       je      jmp_far_16bit
+       cmp     al,6
+       je      jmp_far_32bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     [code_type],16
+       jne     jmp_far_32bit
+      jmp_far_16bit:
+       call    get_word_value
+       mov     ebx,eax
+       call    operand_16bit
+       call    store_classic_instruction_code
+       mov     ax,bx
+       call    mark_relocation
+       stos    word [edi]
+      jmp_far_segment:
+       pop     [symbol_identifier]
+       pop     eax
+       mov     [value_type],al
+       pop     eax
+       call    mark_relocation
+       stos    word [edi]
+       jmp     instruction_assembled
+      jmp_far_32bit:
+       call    get_dword_value
+       mov     ebx,eax
+       call    operand_32bit
+       call    store_classic_instruction_code
+       mov     eax,ebx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     jmp_far_segment
+conditional_jump:
+       mov     [base_code],al
+       and     [prefix_flags],not 10h
+       lods    byte [esi]
+       call    get_jump_operator
+       cmp     [jump_type],3
+       je      invalid_operand
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       cmp     byte [esi],'.'
+       je      invalid_value
+       mov     al,[operand_size]
+       cmp     al,2
+       je      conditional_jump_16bit
+       cmp     al,4
+       je      conditional_jump_32bit
+       cmp     al,8
+       je      conditional_jump_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     [code_type],16
+       je      conditional_jump_16bit
+       cmp     [code_type],64
+       je      conditional_jump_64bit
+      conditional_jump_32bit:
+       cmp     [code_type],64
+       je      invalid_operand_size
+       call    get_address_dword_value
+       cmp     [code_type],16
+       jne     conditional_jump_32bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      conditional_jump_32bit_prefix_ok:
+       call    calculate_jump_offset
+       cdq
+       call    check_for_short_jump
+       jc      conditional_jump_short
+      conditional_jump_32bit_store:
+       mov     edx,eax
+       sub     edx,4
+       jno     conditional_jump_32bit_range_ok
+       cmp     [code_type],64
+       je      jump_out_of_range
+      conditional_jump_32bit_range_ok:
+       mov     ah,[base_code]
+       add     ah,10h
+       mov     al,0Fh
+       stos    word [edi]
+       mov     eax,edx
+       call    mark_relocation
+       stos    dword [edi]
+       jmp     instruction_assembled
+      conditional_jump_64bit:
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       call    get_address_qword_value
+       call    calculate_jump_offset
+       mov     ecx,edx
+       cdq
+       cmp     edx,ecx
+       jne     jump_out_of_range
+       call    check_for_short_jump
+       jnc     conditional_jump_32bit_store
+      conditional_jump_short:
+       mov     ah,al
+       mov     al,[base_code]
+       stos    word [edi]
+       jmp     instruction_assembled
+      conditional_jump_16bit:
+       call    get_address_word_value
+       cmp     [code_type],16
+       je      conditional_jump_16bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      conditional_jump_16bit_prefix_ok:
+       call    calculate_jump_offset
+       cwde
+       cdq
+       call    check_for_short_jump
+       jc      conditional_jump_short
+       cmp     [value_type],0
+       jne     invalid_use_of_symbol
+       mov     edx,eax
+       sub     dx,2
+       mov     ah,[base_code]
+       add     ah,10h
+       mov     al,0Fh
+       stos    word [edi]
+       mov     eax,edx
+       stos    word [edi]
+       jmp     instruction_assembled
+loop_instruction_16bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       cmp     [code_type],16
+       je      loop_instruction
+       mov     [operand_prefix],67h
+       jmp     loop_instruction
+loop_instruction_32bit:
+       cmp     [code_type],32
+       je      loop_instruction
+       mov     [operand_prefix],67h
+      jmp     loop_instruction
+loop_instruction_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+loop_instruction:
+       mov     [base_code],al
+       lods    byte [esi]
+       call    get_jump_operator
+       cmp     [jump_type],1
+       ja      invalid_operand
+       call    get_size_operator
+       cmp     al,'('
+       jne     invalid_operand
+       cmp     byte [esi],'.'
+       je      invalid_value
+       mov     al,[operand_size]
+       cmp     al,2
+       je      loop_jump_16bit
+       cmp     al,4
+       je      loop_jump_32bit
+       cmp     al,8
+       je      loop_jump_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       cmp     [code_type],16
+       je      loop_jump_16bit
+       cmp     [code_type],64
+       je      loop_jump_64bit
+      loop_jump_32bit:
+       cmp     [code_type],64
+       je      invalid_operand_size
+       call    get_address_dword_value
+       cmp     [code_type],16
+       jne     loop_jump_32bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      loop_jump_32bit_prefix_ok:
+       call    loop_counter_size
+       call    calculate_jump_offset
+       cdq
+      make_loop_jump:
+       call    check_for_short_jump
+       jc      conditional_jump_short
+       scas    word [edi]
+       jmp     jump_out_of_range
+      loop_counter_size:
+       cmp     [operand_prefix],0
+       je      loop_counter_size_ok
+       push    eax
+       mov     al,[operand_prefix]
+       stos    byte [edi]
+       pop     eax
+      loop_counter_size_ok:
+       ret
+      loop_jump_64bit:
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       call    get_address_qword_value
+       call    loop_counter_size
+       call    calculate_jump_offset
+       mov     ecx,edx
+       cdq
+       cmp     edx,ecx
+       jne     jump_out_of_range
+       jmp     make_loop_jump
+      loop_jump_16bit:
+       call    get_address_word_value
+       cmp     [code_type],16
+       je      loop_jump_16bit_prefix_ok
+       mov     byte [edi],66h
+       inc     edi
+      loop_jump_16bit_prefix_ok:
+       call    loop_counter_size
+       call    calculate_jump_offset
+       cwde
+       cdq
+       jmp     make_loop_jump
+
+movs_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     [segment_register],1
+       ja      invalid_address
+       push    ebx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     edx
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       mov     al,dh
+       mov     ah,bh
+       shr     al,4
+       shr     ah,4
+       cmp     al,ah
+       jne     address_sizes_do_not_agree
+       and     bh,111b
+       and     dh,111b
+       cmp     bh,6
+       jne     invalid_address
+       cmp     dh,7
+       jne     invalid_address
+       cmp     al,2
+       je      movs_address_16bit
+       cmp     al,4
+       je      movs_address_32bit
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     movs_store
+      movs_address_32bit:
+       call    address_32bit_prefix
+       jmp     movs_store
+      movs_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      movs_store:
+       xor     ebx,ebx
+       call    store_segment_prefix_if_necessary
+       mov     al,0A4h
+      movs_check_size:
+       mov     bl,[operand_size]
+       cmp     bl,1
+       je      simple_instruction
+       inc     al
+       cmp     bl,2
+       je      simple_instruction_16bit
+       cmp     bl,4
+       je      simple_instruction_32bit
+       cmp     bl,8
+       je      simple_instruction_64bit
+       or      bl,bl
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+       jmp     simple_instruction
+lods_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     bh,26h
+       je      lods_address_16bit
+       cmp     bh,46h
+       je      lods_address_32bit
+       cmp     bh,86h
+       jne     invalid_address
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     lods_store
+      lods_address_32bit:
+       call    address_32bit_prefix
+       jmp     lods_store
+      lods_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      lods_store:
+       xor     ebx,ebx
+       call    store_segment_prefix_if_necessary
+       mov     al,0ACh
+       jmp     movs_check_size
+stos_instruction:
+       mov     [base_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     bh,27h
+       je      stos_address_16bit
+       cmp     bh,47h
+       je      stos_address_32bit
+       cmp     bh,87h
+       jne     invalid_address
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     stos_store
+      stos_address_32bit:
+       call    address_32bit_prefix
+       jmp     stos_store
+      stos_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      stos_store:
+       cmp     [segment_register],1
+       ja      invalid_address
+       mov     al,[base_code]
+       jmp     movs_check_size
+cmps_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       mov     al,[segment_register]
+       push    eax ebx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       pop     edx eax
+       cmp     [segment_register],1
+       ja      invalid_address
+       mov     [segment_register],al
+       mov     al,dh
+       mov     ah,bh
+       shr     al,4
+       shr     ah,4
+       cmp     al,ah
+       jne     address_sizes_do_not_agree
+       and     bh,111b
+       and     dh,111b
+       cmp     bh,7
+       jne     invalid_address
+       cmp     dh,6
+       jne     invalid_address
+       cmp     al,2
+       je      cmps_address_16bit
+       cmp     al,4
+       je      cmps_address_32bit
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     cmps_store
+      cmps_address_32bit:
+       call    address_32bit_prefix
+       jmp     cmps_store
+      cmps_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      cmps_store:
+       xor     ebx,ebx
+       call    store_segment_prefix_if_necessary
+       mov     al,0A6h
+       jmp     movs_check_size
+ins_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     bh,27h
+       je      ins_address_16bit
+       cmp     bh,47h
+       je      ins_address_32bit
+       cmp     bh,87h
+       jne     invalid_address
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     ins_store
+      ins_address_32bit:
+       call    address_32bit_prefix
+       jmp     ins_store
+      ins_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      ins_store:
+       cmp     [segment_register],1
+       ja      invalid_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,22h
+       jne     invalid_operand
+       mov     al,6Ch
+      ins_check_size:
+       cmp     [operand_size],8
+       jne     movs_check_size
+       jmp     invalid_operand_size
+outs_instruction:
+       lods    byte [esi]
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,22h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     bh,26h
+       je      outs_address_16bit
+       cmp     bh,46h
+       je      outs_address_32bit
+       cmp     bh,86h
+       jne     invalid_address
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     outs_store
+      outs_address_32bit:
+       call    address_32bit_prefix
+       jmp     outs_store
+      outs_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      outs_store:
+       xor     ebx,ebx
+       call    store_segment_prefix_if_necessary
+       mov     al,6Eh
+       jmp     ins_check_size
+xlat_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       or      eax,eax
+       jnz     invalid_address
+       or      bl,ch
+       jnz     invalid_address
+       cmp     bh,23h
+       je      xlat_address_16bit
+       cmp     bh,43h
+       je      xlat_address_32bit
+       cmp     bh,83h
+       jne     invalid_address
+       cmp     [code_type],64
+       jne     invalid_address_size
+       jmp     xlat_store
+      xlat_address_32bit:
+       call    address_32bit_prefix
+       jmp     xlat_store
+      xlat_address_16bit:
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+      xlat_store:
+       call    store_segment_prefix_if_necessary
+       mov     al,0D7h
+       cmp     [operand_size],1
+       jbe     simple_instruction
+       jmp     invalid_operand_size
+
+pm_word_instruction:
+       mov     ah,al
+       shr     ah,4
+       and     al,111b
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pm_reg
+      pm_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,2
+       je      pm_mem_store
+       or      al,al
+       jnz     invalid_operand_size
+      pm_mem_store:
+       jmp     instruction_ready
+      pm_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       cmp     ah,2
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+pm_store_word_instruction:
+       mov     ah,al
+       shr     ah,4
+       and     al,111b
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     pm_mem
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+lgdt_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],1
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,6
+       je      lgdt_mem_48bit
+       cmp     al,10
+       je      lgdt_mem_80bit
+       or      al,al
+       jnz     invalid_operand_size
+       jmp     lgdt_mem_store
+      lgdt_mem_80bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     lgdt_mem_store
+      lgdt_mem_48bit:
+       cmp     [code_type],64
+       je      illegal_instruction
+       cmp     [postbyte_register],2
+       jb      lgdt_mem_store
+       call    operand_32bit
+      lgdt_mem_store:
+       jmp     instruction_ready
+lar_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       xor     al,al
+       xchg    al,[operand_size]
+       call    operand_autodetect
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      lar_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      lar_reg_mem
+       cmp     al,2
+       jne     invalid_operand_size
+      lar_reg_mem:
+       jmp     instruction_ready
+      lar_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,2
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     nomem_instruction_ready
+invlpg_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],1
+       mov     [postbyte_register],7
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     instruction_ready
+simple_instruction_f2_0f_01:
+       mov     byte [edi],0F2h
+       inc     edi
+       jmp     simple_instruction_0f_01
+simple_instruction_f3_0f_01:
+       mov     byte [edi],0F3h
+       inc     edi
+       jmp     simple_instruction_0f_01
+swapgs_instruction:
+       cmp     [code_type],64
+       jne     illegal_instruction
+simple_instruction_0f_01:
+       mov     ah,al
+       mov     al,0Fh
+       stos    byte [edi]
+       mov     al,1
+       stos    word [edi]
+       jmp     instruction_assembled
+
+basic_486_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      basic_486_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     al,ah
+       cmp     al,1
+       je      basic_486_mem_reg_8bit
+       call    operand_autodetect
+       inc     [extended_code]
+      basic_486_mem_reg_8bit:
+       jmp     instruction_ready
+      basic_486_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     bl,al
+       xchg    bl,[postbyte_register]
+       mov     al,ah
+       cmp     al,1
+       je      basic_486_reg_reg_8bit
+       call    operand_autodetect
+       inc     [extended_code]
+      basic_486_reg_reg_8bit:
+       jmp     nomem_instruction_ready
+bswap_instruction:
+       call    take_register
+       test    al,1000b
+       jz      bswap_reg_code_ok
+       or      [rex_prefix],41h
+       and     al,111b
+      bswap_reg_code_ok:
+       add     al,0C8h
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       cmp     ah,8
+       je      bswap_reg64
+       cmp     ah,4
+       jne     invalid_operand_size
+       call    operand_32bit
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+      bswap_reg64:
+       call    operand_64bit
+       call    store_classic_instruction_code
+       jmp     instruction_assembled
+cmpxchgx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],0C7h
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     ah,1
+       xchg    [postbyte_register],ah
+       mov     al,[operand_size]
+       or      al,al
+       jz      cmpxchgx_size_ok
+       cmp     al,ah
+       jne     invalid_operand_size
+      cmpxchgx_size_ok:
+       cmp     ah,16
+       jne     cmpxchgx_store
+       call    operand_64bit
+      cmpxchgx_store:
+       jmp     instruction_ready
+nop_instruction:
+       mov     ah,[esi]
+       cmp     ah,10h
+       je      extended_nop
+       cmp     ah,11h
+       je      extended_nop
+       cmp     ah,'['
+       je      extended_nop
+       stos    byte [edi]
+       jmp     instruction_assembled
+      extended_nop:
+       mov     [base_code],0Fh
+       mov     [extended_code],1Fh
+       mov     [postbyte_register],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      extended_nop_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      extended_nop_store
+       call    operand_autodetect
+      extended_nop_store:
+       jmp     instruction_ready
+      extended_nop_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+
+basic_fpu_instruction:
+       mov     [postbyte_register],al
+       mov     [base_code],0D8h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      basic_fpu_streg
+       cmp     al,'['
+       je      basic_fpu_mem
+       dec     esi
+       mov     ah,[postbyte_register]
+       cmp     ah,2
+       jb      invalid_operand
+       cmp     ah,3
+       ja      invalid_operand
+       mov     bl,1
+       jmp     nomem_instruction_ready
+      basic_fpu_mem:
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,4
+       je      basic_fpu_mem_32bit
+       cmp     al,8
+       je      basic_fpu_mem_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+      basic_fpu_mem_32bit:
+       jmp     instruction_ready
+      basic_fpu_mem_64bit:
+       mov     [base_code],0DCh
+       jmp     instruction_ready
+      basic_fpu_streg:
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     bl,al
+       mov     ah,[postbyte_register]
+       cmp     ah,2
+       je      basic_fpu_single_streg
+       cmp     ah,3
+       je      basic_fpu_single_streg
+       or      al,al
+       jz      basic_fpu_st0
+       test    ah,110b
+       jz      basic_fpu_streg_st0
+       xor     [postbyte_register],1
+      basic_fpu_streg_st0:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_fpu_register
+       or      al,al
+       jnz     invalid_operand
+       mov     [base_code],0DCh
+       jmp     nomem_instruction_ready
+      basic_fpu_st0:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     bl,al
+      basic_fpu_single_streg:
+       mov     [base_code],0D8h
+       jmp     nomem_instruction_ready
+simple_fpu_instruction:
+       mov     ah,al
+       or      ah,11000000b
+       mov     al,0D9h
+       stos    word [edi]
+       jmp     instruction_assembled
+fi_instruction:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,2
+       je      fi_mem_16bit
+       cmp     al,4
+       je      fi_mem_32bit
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+      fi_mem_32bit:
+       mov     [base_code],0DAh
+       jmp     instruction_ready
+      fi_mem_16bit:
+       mov     [base_code],0DEh
+       jmp     instruction_ready
+fld_instruction:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      fld_streg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,4
+       je      fld_mem_32bit
+       cmp     al,8
+       je      fld_mem_64bit
+       cmp     al,10
+       je      fld_mem_80bit
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+      fld_mem_32bit:
+       mov     [base_code],0D9h
+       jmp     instruction_ready
+      fld_mem_64bit:
+       mov     [base_code],0DDh
+       jmp     instruction_ready
+      fld_mem_80bit:
+       mov     al,[postbyte_register]
+       cmp     al,0
+       je      fld_mem_80bit_store
+       dec     [postbyte_register]
+       cmp     al,3
+       je      fld_mem_80bit_store
+       jmp     invalid_operand_size
+      fld_mem_80bit_store:
+       add     [postbyte_register],5
+       mov     [base_code],0DBh
+       jmp     instruction_ready
+      fld_streg:
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     bl,al
+       cmp     [postbyte_register],2
+       jae     fst_streg
+       mov     [base_code],0D9h
+       jmp     nomem_instruction_ready
+      fst_streg:
+       mov     [base_code],0DDh
+       jmp     nomem_instruction_ready
+fild_instruction:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,2
+       je      fild_mem_16bit
+       cmp     al,4
+       je      fild_mem_32bit
+       cmp     al,8
+       je      fild_mem_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+      fild_mem_32bit:
+       mov     [base_code],0DBh
+       jmp     instruction_ready
+      fild_mem_16bit:
+       mov     [base_code],0DFh
+       jmp     instruction_ready
+      fild_mem_64bit:
+       mov     al,[postbyte_register]
+       cmp     al,1
+       je      fisttp_64bit_store
+       jb      fild_mem_64bit_store
+       dec     [postbyte_register]
+       cmp     al,3
+       je      fild_mem_64bit_store
+       jmp     invalid_operand_size
+      fild_mem_64bit_store:
+       add     [postbyte_register],5
+       mov     [base_code],0DFh
+       jmp     instruction_ready
+      fisttp_64bit_store:
+       mov     [base_code],0DDh
+       jmp     instruction_ready
+fbld_instruction:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      fbld_mem_80bit
+       cmp     al,10
+       je      fbld_mem_80bit
+       jmp     invalid_operand_size
+      fbld_mem_80bit:
+       mov     [base_code],0DFh
+       jmp     instruction_ready
+faddp_instruction:
+       mov     [postbyte_register],al
+       mov     [base_code],0DEh
+       mov     edx,esi
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      faddp_streg
+       mov     esi,edx
+       mov     bl,1
+       jmp     nomem_instruction_ready
+      faddp_streg:
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     bl,al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_fpu_register
+       or      al,al
+       jnz     invalid_operand
+       jmp     nomem_instruction_ready
+fcompp_instruction:
+       mov     ax,0D9DEh
+       stos    word [edi]
+       jmp     instruction_assembled
+fucompp_instruction:
+       mov     ax,0E9DAh
+       stos    word [edi]
+       jmp     instruction_assembled
+fxch_instruction:
+       mov     dx,01D9h
+       jmp     fpu_single_operand
+ffreep_instruction:
+       mov     dx,00DFh
+       jmp     fpu_single_operand
+ffree_instruction:
+       mov     dl,0DDh
+       mov     dh,al
+      fpu_single_operand:
+       mov     ebx,esi
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      fpu_streg
+       or      dh,dh
+       jz      invalid_operand
+       mov     esi,ebx
+       shl     dh,3
+       or      dh,11000001b
+       mov     ax,dx
+       stos    word [edi]
+       jmp     instruction_assembled
+      fpu_streg:
+       lods    byte [esi]
+       call    convert_fpu_register
+       shl     dh,3
+       or      dh,al
+       or      dh,11000000b
+       mov     ax,dx
+       stos    word [edi]
+       jmp     instruction_assembled
+
+fstenv_instruction:
+       mov     byte [edi],9Bh
+       inc     edi
+fldenv_instruction:
+       mov     [base_code],0D9h
+       jmp     fpu_mem
+fstenv_instruction_16bit:
+       mov     byte [edi],9Bh
+       inc     edi
+fldenv_instruction_16bit:
+       call    operand_16bit
+       jmp     fldenv_instruction
+fstenv_instruction_32bit:
+       mov     byte [edi],9Bh
+       inc     edi
+fldenv_instruction_32bit:
+       call    operand_32bit
+       jmp     fldenv_instruction
+fsave_instruction_32bit:
+       mov     byte [edi],9Bh
+       inc     edi
+fnsave_instruction_32bit:
+       call    operand_32bit
+       jmp     fnsave_instruction
+fsave_instruction_16bit:
+       mov     byte [edi],9Bh
+       inc     edi
+fnsave_instruction_16bit:
+       call    operand_16bit
+       jmp     fnsave_instruction
+fsave_instruction:
+       mov     byte [edi],9Bh
+       inc     edi
+fnsave_instruction:
+       mov     [base_code],0DDh
+      fpu_mem:
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+       jmp     instruction_ready
+fstcw_instruction:
+       mov     byte [edi],9Bh
+       inc     edi
+fldcw_instruction:
+       mov     [postbyte_register],al
+       mov     [base_code],0D9h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      fldcw_mem_16bit
+       cmp     al,2
+       je      fldcw_mem_16bit
+       jmp     invalid_operand_size
+      fldcw_mem_16bit:
+       jmp     instruction_ready
+fstsw_instruction:
+       mov     al,9Bh
+       stos    byte [edi]
+fnstsw_instruction:
+       mov     [base_code],0DDh
+       mov     [postbyte_register],7
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      fstsw_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      fstsw_mem_16bit
+       cmp     al,2
+       je      fstsw_mem_16bit
+       jmp     invalid_operand_size
+      fstsw_mem_16bit:
+       jmp     instruction_ready
+      fstsw_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ax,0200h
+       jne     invalid_operand
+       mov     ax,0E0DFh
+       stos    word [edi]
+       jmp     instruction_assembled
+finit_instruction:
+       mov     byte [edi],9Bh
+       inc     edi
+fninit_instruction:
+       mov     ah,al
+       mov     al,0DBh
+       stos    word [edi]
+       jmp     instruction_assembled
+fcmov_instruction:
+       mov     dh,0DAh
+       jmp     fcomi_streg
+fcomi_instruction:
+       mov     dh,0DBh
+       jmp     fcomi_streg
+fcomip_instruction:
+       mov     dh,0DFh
+      fcomi_streg:
+       mov     dl,al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     ah,al
+       cmp     byte [esi],','
+       je      fcomi_st0_streg
+       add     ah,dl
+       mov     al,dh
+       stos    word [edi]
+       jmp     instruction_assembled
+      fcomi_st0_streg:
+       or      ah,ah
+       jnz     invalid_operand
+       inc     esi
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_fpu_register
+       mov     ah,al
+       add     ah,dl
+       mov     al,dh
+       stos    word [edi]
+       jmp     instruction_assembled
+
+basic_mmx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+      mmx_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       call    make_mmx_prefix
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      mmx_mmreg_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+      mmx_mmreg_mem:
+       call    get_address
+       jmp     instruction_ready
+      mmx_mmreg_mmreg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+mmx_bit_shift_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       call    make_mmx_prefix
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      mmx_mmreg_mmreg
+       cmp     al,'('
+       je      mmx_ps_mmreg_imm8
+       cmp     al,'['
+       je      mmx_mmreg_mem
+       jmp     invalid_operand
+      mmx_ps_mmreg_imm8:
+       call    get_byte_value
+       mov     byte [value],al
+       test    [operand_size],not 1
+       jnz     invalid_value
+       mov     bl,[extended_code]
+       mov     al,bl
+       shr     bl,4
+       and     al,1111b
+       add     al,70h
+       mov     [extended_code],al
+       sub     bl,0Ch
+       shl     bl,1
+       xchg    bl,[postbyte_register]
+       call    store_nomem_instruction
+       mov     al,byte [value]
+       stos    byte [edi]
+       jmp     instruction_assembled
+pmovmskb_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_register
+       cmp     ah,4
+       je      pmovmskb_reg_size_ok
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       cmp     ah,8
+       jnz     invalid_operand_size
+      pmovmskb_reg_size_ok:
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       call    make_mmx_prefix
+       cmp     [extended_code],0C5h
+       je      mmx_nomem_imm8
+       jmp     nomem_instruction_ready
+      mmx_imm8:
+       push    ebx ecx edx
+       xor     cl,cl
+       xchg    cl,[operand_size]
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       test    ah,not 1
+       jnz     invalid_operand_size
+       mov     [operand_size],cl
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       mov     byte [value],al
+       pop     edx ecx ebx
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      mmx_nomem_imm8:
+       call    store_nomem_instruction
+       call    append_imm8
+       jmp     instruction_assembled
+      append_imm8:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       test    ah,not 1
+       jnz     invalid_operand_size
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       stosb
+       ret
+pinsrw_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       call    make_mmx_prefix
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pinsrw_mmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      mmx_imm8
+       cmp     [operand_size],2
+       jne     invalid_operand_size
+       jmp     mmx_imm8
+      pinsrw_mmreg_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+pshufw_instruction:
+       mov     [mmx_size],8
+       mov     [opcode_prefix],al
+       jmp     pshuf_instruction
+pshufd_instruction:
+       mov     [mmx_size],16
+       mov     [opcode_prefix],al
+      pshuf_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],70h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pshuf_mmreg_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     mmx_imm8
+      pshuf_mmreg_mmreg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+movd_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],7Eh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movd_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       test    [operand_size],not 4
+       jnz     invalid_operand_size
+       call    get_mmx_source_register
+       jmp     instruction_ready
+      movd_reg:
+       lods    byte [esi]
+       cmp     al,0B0h
+       jae     movd_mmreg
+       call    convert_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     bl,al
+       call    get_mmx_source_register
+       jmp     nomem_instruction_ready
+      movd_mmreg:
+       mov     [extended_code],6Eh
+       call    convert_mmx_register
+       mov     [postbyte_register],al
+       call    make_mmx_prefix
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movd_mmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       test    [operand_size],not 4
+       jnz     invalid_operand_size
+       jmp     instruction_ready
+      movd_mmreg_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      get_mmx_source_register:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     [postbyte_register],al
+      make_mmx_prefix:
+       cmp     [operand_size],16
+       jne     no_mmx_prefix
+       mov     [operand_prefix],66h
+      no_mmx_prefix:
+       ret
+movq_instruction:
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movq_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       test    [operand_size],not 8
+       jnz     invalid_operand_size
+       call    get_mmx_source_register
+       mov     al,7Fh
+       cmp     ah,8
+       je      movq_mem_ready
+       mov     al,0D6h
+     movq_mem_ready:
+       mov     [extended_code],al
+       jmp     instruction_ready
+     movq_reg:
+       lods    byte [esi]
+       cmp     al,0B0h
+       jae     movq_mmreg
+       call    convert_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     bl,al
+       mov     [extended_code],7Eh
+       call    operand_64bit
+       call    get_mmx_source_register
+       jmp     nomem_instruction_ready
+     movq_mmreg:
+       call    convert_mmx_register
+       mov     [postbyte_register],al
+       mov     [extended_code],6Fh
+       mov     [mmx_size],ah
+       cmp     ah,16
+       jne     movq_mmreg_
+       mov     [extended_code],7Eh
+       mov     [opcode_prefix],0F3h
+      movq_mmreg_:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movq_mmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       test    [operand_size],not 8
+       jnz     invalid_operand_size
+       jmp     instruction_ready
+      movq_mmreg_reg:
+       lods    byte [esi]
+       cmp     al,0B0h
+       jae     movq_mmreg_mmreg
+       mov     [operand_size],0
+       call    convert_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     [extended_code],6Eh
+       mov     [opcode_prefix],0
+       mov     bl,al
+       cmp     [mmx_size],16
+       jne     movq_mmreg_reg_store
+       mov     [opcode_prefix],66h
+      movq_mmreg_reg_store:
+       call    operand_64bit
+       jmp     nomem_instruction_ready
+      movq_mmreg_mmreg:
+       call    convert_mmx_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     nomem_instruction_ready
+movdq_instruction:
+       mov     [opcode_prefix],al
+       mov     [base_code],0Fh
+       mov     [extended_code],6Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movdq_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [extended_code],7Fh
+       jmp     instruction_ready
+      movdq_mmreg:
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      movdq_mmreg_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     instruction_ready
+      movdq_mmreg_mmreg:
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+lddqu_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       pop     eax
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],0F0h
+       jmp     instruction_ready
+
+movdq2q_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [mmx_size],8
+       jmp     movq2dq_
+movq2dq_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     [mmx_size],16
+      movq2dq_:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       xor     [mmx_size],8+16
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     bl,al
+       mov     [base_code],0Fh
+       mov     [extended_code],0D6h
+       jmp     nomem_instruction_ready
+
+sse_ps_instruction_imm8:
+       mov     [immediate_size],1
+sse_ps_instruction:
+       mov     [mmx_size],16
+       jmp     sse_instruction
+sse_pd_instruction_imm8:
+       mov     [immediate_size],1
+sse_pd_instruction:
+       mov     [mmx_size],16
+       mov     [opcode_prefix],66h
+       jmp     sse_instruction
+sse_ss_instruction:
+       mov     [mmx_size],4
+       mov     [opcode_prefix],0F3h
+       jmp     sse_instruction
+sse_sd_instruction:
+       mov     [mmx_size],8
+       mov     [opcode_prefix],0F2h
+       jmp     sse_instruction
+cmp_pd_instruction:
+       mov     [opcode_prefix],66h
+cmp_ps_instruction:
+       mov     [mmx_size],16
+       mov     byte [value],al
+       mov     al,0C2h
+       jmp     sse_instruction
+cmp_ss_instruction:
+       mov     [mmx_size],4
+       mov     [opcode_prefix],0F3h
+       jmp     cmp_sx_instruction
+cmpsd_instruction:
+       mov     al,0A7h
+       mov     ah,[esi]
+       or      ah,ah
+       jz      simple_instruction_32bit
+       cmp     ah,0Fh
+       je      simple_instruction_32bit
+       mov     al,-1
+cmp_sd_instruction:
+       mov     [mmx_size],8
+       mov     [opcode_prefix],0F2h
+      cmp_sx_instruction:
+       mov     byte [value],al
+       mov     al,0C2h
+       jmp     sse_instruction
+comiss_instruction:
+       mov     [mmx_size],4
+       jmp     sse_instruction
+comisd_instruction:
+       mov     [mmx_size],8
+       mov     [opcode_prefix],66h
+       jmp     sse_instruction
+cvtdq2pd_instruction:
+       mov     [opcode_prefix],0F3h
+cvtps2pd_instruction:
+       mov     [mmx_size],8
+       jmp     sse_instruction
+cvtpd2dq_instruction:
+       mov     [mmx_size],16
+       mov     [opcode_prefix],0F2h
+       jmp     sse_instruction
+movshdup_instruction:
+       mov     [mmx_size],16
+       mov     [opcode_prefix],0F3h
+sse_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+      sse_xmmreg:
+       lods    byte [esi]
+       call    convert_xmm_register
+      sse_reg:
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      sse_xmmreg_xmmreg
+      sse_reg_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      sse_mem_size_ok
+       mov     al,[mmx_size]
+       cmp     [operand_size],al
+       jne     invalid_operand_size
+      sse_mem_size_ok:
+       mov     al,[extended_code]
+       mov     ah,[supplemental_code]
+       cmp     al,0C2h
+       je      sse_cmp_mem_ok
+       cmp     ax,443Ah
+       je      sse_cmp_mem_ok
+       cmp     [immediate_size],1
+       je      mmx_imm8
+       cmp     [immediate_size],-1
+       jne     sse_ok
+       call    take_additional_xmm0
+       mov     [immediate_size],0
+      sse_ok:
+       jmp     instruction_ready
+      sse_cmp_mem_ok:
+       cmp     byte [value],-1
+       je      mmx_imm8
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      sse_xmmreg_xmmreg:
+       cmp     [operand_prefix],66h
+       jne     sse_xmmreg_xmmreg_ok
+       cmp     [extended_code],12h
+       je      invalid_operand
+       cmp     [extended_code],16h
+       je      invalid_operand
+      sse_xmmreg_xmmreg_ok:
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       mov     al,[extended_code]
+       mov     ah,[supplemental_code]
+       cmp     al,0C2h
+       je      sse_cmp_nomem_ok
+       cmp     ax,443Ah
+       je      sse_cmp_nomem_ok
+       cmp     [immediate_size],1
+       je      mmx_nomem_imm8
+       cmp     [immediate_size],-1
+       jne     sse_nomem_ok
+       call    take_additional_xmm0
+       mov     [immediate_size],0
+      sse_nomem_ok:
+       jmp     nomem_instruction_ready
+      sse_cmp_nomem_ok:
+       cmp     byte [value],-1
+       je      mmx_nomem_imm8
+       call    store_nomem_instruction
+       mov     al,byte [value]
+       stosb
+       jmp     instruction_assembled
+      take_additional_xmm0:
+       cmp     byte [esi],','
+       jne     additional_xmm0_ok
+       inc     esi
+       lods    byte [esi]
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       test    al,al
+       jnz     invalid_operand
+      additional_xmm0_ok:
+       ret
+
+pslldq_instruction:
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],73h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+movpd_instruction:
+       mov     [opcode_prefix],66h
+movps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],16
+       jmp     sse_mov_instruction
+movss_instruction:
+       mov     [mmx_size],4
+       mov     [opcode_prefix],0F3h
+       jmp     sse_movs
+movsd_instruction:
+       mov     al,0A5h
+       mov     ah,[esi]
+       or      ah,ah
+       jz      simple_instruction_32bit
+       cmp     ah,0Fh
+       je      simple_instruction_32bit
+       mov     [mmx_size],8
+       mov     [opcode_prefix],0F2h
+      sse_movs:
+       mov     [base_code],0Fh
+       mov     [extended_code],10h
+       jmp     sse_mov_instruction
+sse_mov_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      sse_xmmreg
+      sse_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       inc     [extended_code]
+       call    get_address
+       cmp     [operand_size],0
+       je      sse_mem_xmmreg
+       mov     al,[mmx_size]
+       cmp     [operand_size],al
+       jne     invalid_operand_size
+       mov     [operand_size],0
+      sse_mem_xmmreg:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+movlpd_instruction:
+       mov     [opcode_prefix],66h
+movlps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],8
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     sse_mem
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       jmp     sse_reg_mem
+movhlps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       mov     [mmx_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      sse_xmmreg_xmmreg_ok
+       jmp     invalid_operand
+maskmovq_instruction:
+       mov     cl,8
+       jmp     maskmov_instruction
+maskmovdqu_instruction:
+       mov     cl,16
+       mov     [opcode_prefix],66h
+      maskmov_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],0F7h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,cl
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+movmskpd_instruction:
+       mov     [opcode_prefix],66h
+movmskps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],50h
+       call    take_register
+       mov     [postbyte_register],al
+       cmp     ah,4
+       je      movmskps_reg_ok
+       cmp     ah,8
+       jne     invalid_operand_size
+       cmp     [code_type],64
+       jne     invalid_operand
+      movmskps_reg_ok:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      sse_xmmreg_xmmreg_ok
+       jmp     invalid_operand
+
+cvtpi2pd_instruction:
+       mov     [opcode_prefix],66h
+cvtpi2ps_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      cvtpi_xmmreg_xmmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      cvtpi_size_ok
+       cmp     [operand_size],8
+       jne     invalid_operand_size
+      cvtpi_size_ok:
+       jmp     instruction_ready
+      cvtpi_xmmreg_xmmreg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     bl,al
+       jmp     nomem_instruction_ready
+cvtsi2ss_instruction:
+       mov     [opcode_prefix],0F3h
+       jmp     cvtsi_instruction
+cvtsi2sd_instruction:
+       mov     [opcode_prefix],0F2h
+      cvtsi_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+      cvtsi_xmmreg:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      cvtsi_xmmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      cvtsi_size_ok
+       cmp     [operand_size],4
+       je      cvtsi_size_ok
+       cmp     [operand_size],8
+       jne     invalid_operand_size
+       call    operand_64bit
+      cvtsi_size_ok:
+       jmp     instruction_ready
+      cvtsi_xmmreg_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     ah,4
+       je      cvtsi_xmmreg_reg_store
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+      cvtsi_xmmreg_reg_store:
+       mov     bl,al
+       jmp     nomem_instruction_ready
+cvtps2pi_instruction:
+       mov     [mmx_size],8
+       jmp     cvtpd_instruction
+cvtpd2pi_instruction:
+       mov     [opcode_prefix],66h
+       mov     [mmx_size],16
+      cvtpd_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     [operand_size],0
+       jmp     sse_reg
+cvtss2si_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     [mmx_size],4
+       jmp     cvt2si_instruction
+cvtsd2si_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [mmx_size],8
+      cvt2si_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       call    take_register
+       mov     [operand_size],0
+       cmp     ah,4
+       je      sse_reg
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+       jmp     sse_reg
+
+ssse3_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       jmp     mmx_instruction
+palignr_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],3Ah
+       mov     [supplemental_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       call    make_mmx_prefix
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      palignr_mmreg_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     mmx_imm8
+      palignr_mmreg_mmreg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+amd3dnow_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],0Fh
+       mov     byte [value],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      amd3dnow_mmreg_mmreg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       call    store_instruction_with_imm8
+       jmp     instruction_assembled
+      amd3dnow_mmreg_mmreg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,8
+       jne     invalid_operand_size
+       mov     bl,al
+       call    store_nomem_instruction
+       mov     al,byte [value]
+       stos    byte [edi]
+       jmp     instruction_assembled
+
+sse4_instruction_38_xmm0:
+       mov     [immediate_size],-1
+       jmp     sse4_instruction_38
+sse4_instruction_66_38_xmm0:
+       mov     [immediate_size],-1
+sse4_instruction_66_38:
+       mov     [opcode_prefix],66h
+sse4_instruction_38:
+       mov     [mmx_size],16
+       mov     [supplemental_code],al
+       mov     al,38h
+       jmp     sse_instruction
+sse4_ss_instruction_66_3a_imm8:
+       mov     [immediate_size],1
+       mov     cl,4
+       jmp     sse4_instruction_66_3a_setup
+sse4_sd_instruction_66_3a_imm8:
+       mov     [immediate_size],1
+       mov     cl,8
+       jmp     sse4_instruction_66_3a_setup
+sse4_instruction_66_3a_imm8:
+       mov     [immediate_size],1
+       mov     cl,16
+      sse4_instruction_66_3a_setup:
+       mov     [opcode_prefix],66h
+      sse4_instruction_3a_setup:
+       mov     [supplemental_code],al
+       mov     al,3Ah
+       mov     [mmx_size],cl
+       jmp     sse_instruction
+sse4_instruction_3a_imm8:
+       mov     [immediate_size],1
+       mov     cl,16
+       jmp     sse4_instruction_3a_setup
+pclmulqdq_instruction:
+       mov     byte [value],al
+       mov     al,44h
+       mov     cl,16
+       jmp     sse4_instruction_66_3a_setup
+extractps_instruction:
+       call    setup_66_0f_3a
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      extractps_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],4
+       je      extractps_size_ok
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+      extractps_size_ok:
+       push    edx ebx ecx
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       jmp     mmx_imm8
+      extractps_reg:
+       lods    byte [esi]
+       call    convert_register
+       push    eax
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       pop     ebx
+       mov     al,bh
+       cmp     al,4
+       je      mmx_nomem_imm8
+       cmp     al,8
+       jne     invalid_operand_size
+       cmp     [code_type],64
+       jne     illegal_instruction
+       jmp     mmx_nomem_imm8
+      setup_66_0f_3a:
+       mov     [extended_code],3Ah
+       mov     [supplemental_code],al
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],66h
+       ret
+insertps_instruction:
+       call    setup_66_0f_3a
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      insertps_xmmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],4
+       je      insertps_size_ok
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+      insertps_size_ok:
+       jmp     mmx_imm8
+      insertps_xmmreg_reg:
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     bl,al
+       jmp     mmx_nomem_imm8
+pextrq_instruction:
+       mov     [mmx_size],8
+       jmp     pextr_instruction
+pextrd_instruction:
+       mov     [mmx_size],4
+       jmp     pextr_instruction
+pextrw_instruction:
+       mov     [mmx_size],2
+       jmp     pextr_instruction
+pextrb_instruction:
+       mov     [mmx_size],1
+      pextr_instruction:
+       call    setup_66_0f_3a
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pextr_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[mmx_size]
+       cmp     al,[operand_size]
+       je      pextr_size_ok
+       cmp     [operand_size],0
+       jne     invalid_operand_size
+      pextr_size_ok:
+       cmp     al,8
+       jne     pextr_prefix_ok
+       call    operand_64bit
+      pextr_prefix_ok:
+       push    edx ebx ecx
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       jmp     mmx_imm8
+      pextr_reg:
+       lods    byte [esi]
+       call    convert_register
+       cmp     [mmx_size],4
+       ja      pextrq_reg
+       cmp     ah,4
+       je      pextr_reg_size_ok
+       cmp     [code_type],64
+       jne     pextr_invalid_size
+       cmp     ah,8
+       je      pextr_reg_size_ok
+      pextr_invalid_size:
+       jmp     invalid_operand_size
+      pextrq_reg:
+       cmp     ah,8
+       jne     pextr_invalid_size
+       call    operand_64bit
+      pextr_reg_size_ok:
+       mov     [operand_size],0
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       mov     ebx,eax
+       pop     eax
+       mov     [postbyte_register],al
+       mov     al,ah
+       cmp     [mmx_size],2
+       jne     pextr_reg_store
+       mov     [opcode_prefix],0
+       mov     [extended_code],0C5h
+       call    make_mmx_prefix
+       jmp     mmx_nomem_imm8
+      pextr_reg_store:
+       cmp     bh,16
+       jne     invalid_operand_size
+       xchg    bl,[postbyte_register]
+       jmp     mmx_nomem_imm8
+pinsrb_instruction:
+       mov     [mmx_size],1
+       jmp     pinsr_instruction
+pinsrd_instruction:
+       mov     [mmx_size],4
+       jmp     pinsr_instruction
+pinsrq_instruction:
+       mov     [mmx_size],8
+       call    operand_64bit
+      pinsr_instruction:
+       call    setup_66_0f_3a
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+      pinsr_xmmreg:
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pinsr_xmmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      mmx_imm8
+       mov     al,[mmx_size]
+       cmp     al,[operand_size]
+       je      mmx_imm8
+       jmp     invalid_operand_size
+      pinsr_xmmreg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       cmp     [mmx_size],8
+       je      pinsrq_xmmreg_reg
+       cmp     ah,4
+       je      mmx_nomem_imm8
+       jmp     invalid_operand_size
+      pinsrq_xmmreg_reg:
+       cmp     ah,8
+       je      mmx_nomem_imm8
+       jmp     invalid_operand_size
+pmovsxbw_instruction:
+       mov     [mmx_size],8
+       jmp     pmovsx_instruction
+pmovsxbd_instruction:
+       mov     [mmx_size],4
+       jmp     pmovsx_instruction
+pmovsxbq_instruction:
+       mov     [mmx_size],2
+       jmp     pmovsx_instruction
+pmovsxwd_instruction:
+       mov     [mmx_size],8
+       jmp     pmovsx_instruction
+pmovsxwq_instruction:
+       mov     [mmx_size],4
+       jmp     pmovsx_instruction
+pmovsxdq_instruction:
+       mov     [mmx_size],8
+      pmovsx_instruction:
+       call    setup_66_0f_38
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      pmovsx_xmmreg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       cmp     [operand_size],0
+       je      instruction_ready
+       mov     al,[mmx_size]
+       cmp     al,[operand_size]
+       jne     invalid_operand_size
+       jmp     instruction_ready
+      pmovsx_xmmreg_reg:
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      setup_66_0f_38:
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],66h
+       ret
+
+xsaves_instruction_64bit:
+       call    operand_64bit
+xsaves_instruction:
+       mov     ah,0C7h
+       jmp     xsave_common
+fxsave_instruction_64bit:
+       call    operand_64bit
+fxsave_instruction:
+       mov     ah,0AEh
+       xor     cl,cl
+      xsave_common:
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [postbyte_register],al
+       mov     [mmx_size],cl
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     ah,[operand_size]
+       or      ah,ah
+       jz      xsave_size_ok
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+      xsave_size_ok:
+       jmp     instruction_ready
+clflush_instruction:
+       mov     ah,0AEh
+       mov     cl,1
+       jmp     xsave_common
+cldemote_instruction:
+       mov     ah,1Ch
+       mov     cl,1
+       jmp     xsave_common
+stmxcsr_instruction:
+       mov     ah,0AEh
+       mov     cl,4
+       jmp     xsave_common
+prefetch_instruction:
+       mov     [extended_code],18h
+      prefetch_mem_8bit:
+       mov     [base_code],0Fh
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       or      ah,ah
+       jz      prefetch_size_ok
+       cmp     ah,1
+       jne     invalid_operand_size
+      prefetch_size_ok:
+       call    get_address
+       jmp     instruction_ready
+amd_prefetch_instruction:
+       mov     [extended_code],0Dh
+       jmp     prefetch_mem_8bit
+clflushopt_instruction:
+       mov     [extended_code],0AEh
+       mov     [opcode_prefix],66h
+       jmp     prefetch_mem_8bit
+pcommit_instruction:
+       mov     byte [edi],66h
+       inc     edi
+fence_instruction:
+       mov     bl,al
+       mov     ax,0AE0Fh
+       stos    word [edi]
+       mov     al,bl
+       stos    byte [edi]
+       jmp     instruction_assembled
+pause_instruction:
+       mov     ax,90F3h
+       stos    word [edi]
+       jmp     instruction_assembled
+movntq_instruction:
+       mov     [mmx_size],8
+       jmp     movnt_instruction
+movntpd_instruction:
+       mov     [opcode_prefix],66h
+movntps_instruction:
+       mov     [mmx_size],16
+      movnt_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_mmx_register
+       cmp     ah,[mmx_size]
+       jne     invalid_operand_size
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+
+movntsd_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [mmx_size],8
+       jmp     movnts_instruction
+movntss_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     [mmx_size],4
+      movnts_instruction:
+       mov     [extended_code],al
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,[mmx_size]
+       je      movnts_size_ok
+       test    al,al
+       jnz     invalid_operand_size
+      movnts_size_ok:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+
+movdiri_instruction:
+       mov     [supplemental_code],al
+       mov     al,38h
+movnti_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       cmp     ah,4
+       je      movnti_store
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+      movnti_store:
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+monitor_instruction:
+       mov     [postbyte_register],al
+       cmp     byte [esi],0
+       je      monitor_instruction_store
+       cmp     byte [esi],0Fh
+       je      monitor_instruction_store
+       call    take_register
+       cmp     ax,0400h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       cmp     ax,0401h
+       jne     invalid_operand
+       cmp     [postbyte_register],0C8h
+       jne     monitor_instruction_store
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       cmp     ax,0402h
+       jne     invalid_operand
+      monitor_instruction_store:
+       mov     ax,010Fh
+       stos    word [edi]
+       mov     al,[postbyte_register]
+       stos    byte [edi]
+       jmp     instruction_assembled
+pconfig_instruction:
+       mov     [postbyte_register],al
+       jmp     monitor_instruction_store
+movntdqa_instruction:
+       call    setup_66_0f_38
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       jmp     instruction_ready
+
+extrq_instruction:
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],78h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      extrq_xmmreg_xmmreg
+       test    ah,not 1
+       jnz     invalid_operand_size
+       cmp     al,'('
+       jne     invalid_operand
+       xor     bl,bl
+       xchg    bl,[postbyte_register]
+       call    store_nomem_instruction
+       call    get_byte_value
+       stosb
+       call    append_imm8
+       jmp     instruction_assembled
+      extrq_xmmreg_xmmreg:
+       inc     [extended_code]
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+insertq_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],78h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     [postbyte_register],al
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_xmm_register
+       mov     bl,al
+       cmp     byte [esi],','
+       je      insertq_with_imm
+       inc     [extended_code]
+       jmp     nomem_instruction_ready
+      insertq_with_imm:
+       call    store_nomem_instruction
+       call    append_imm8
+       call    append_imm8
+       jmp     instruction_assembled
+
+crc32_instruction:
+       mov     [opcode_prefix],0F2h
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],0F0h
+       call    take_register
+       mov     [postbyte_register],al
+       cmp     ah,4
+       je      crc32_reg_size_ok
+       cmp     ah,8
+       jne     invalid_operand
+       cmp     [code_type],64
+       jne     illegal_instruction
+      crc32_reg_size_ok:
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       mov     [operand_size],0
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      crc32_reg_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       test    al,al
+       jz      crc32_unknown_size
+       cmp     al,1
+       je      crc32_reg_mem_store
+       inc     [supplemental_code]
+       call    operand_autodetect
+      crc32_reg_mem_store:
+       jmp     instruction_ready
+      crc32_unknown_size:
+       call    recoverable_unknown_size
+       jmp     crc32_reg_mem_store
+      crc32_reg_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       cmp     al,1
+       je      crc32_reg_reg_store
+       inc     [supplemental_code]
+       call    operand_autodetect
+      crc32_reg_reg_store:
+       jmp     nomem_instruction_ready
+popcnt_instruction:
+       mov     [opcode_prefix],0F3h
+       jmp     bs_instruction
+movbe_instruction:
+       mov     [supplemental_code],al
+       mov     [extended_code],38h
+       mov     [base_code],0Fh
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      movbe_mem
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_argument
+       call    get_address
+       mov     al,[operand_size]
+       call    operand_autodetect
+       jmp     instruction_ready
+      movbe_mem:
+       inc     [supplemental_code]
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       mov     al,[operand_size]
+       call    operand_autodetect
+       jmp     instruction_ready
+adx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],0F6h
+       mov     [operand_prefix],al
+       call    get_reg_mem
+       jc      adx_reg_reg
+       mov     al,[operand_size]
+       cmp     al,4
+       je      instruction_ready
+       cmp     al,8
+       jne     invalid_operand_size
+       call    operand_64bit
+       jmp     instruction_ready
+      adx_reg_reg:
+       cmp     ah,4
+       je      nomem_instruction_ready
+       cmp     ah,8
+       jne     invalid_operand_size
+       call    operand_64bit
+       jmp     nomem_instruction_ready
+rdpid_instruction:
+       mov     [postbyte_register],al
+       mov     [extended_code],0C7h
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],0F3h
+       call    take_register
+       mov     bl,al
+       cmp     [code_type],64
+       je      rdpid_64bit
+       cmp     ah,4
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+      rdpid_64bit:
+       cmp     ah,8
+       jne     invalid_operand_size
+       jmp     nomem_instruction_ready
+ptwrite_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],0AEh
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],0F3h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      ptwrite_reg
+      ptwrite_mem:
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       cmp     al,4
+       je      ptwrite_mem_store
+       cmp     al,8
+       je      ptwrite_mem_64bit
+       or      al,al
+       jnz     invalid_operand_size
+       call    recoverable_unknown_size
+       jmp     ptwrite_mem_store
+      ptwrite_mem_64bit:
+       call    operand_64bit
+      ptwrite_mem_store:
+       mov     al,[operand_size]
+       call    operand_autodetect
+       jmp     instruction_ready
+      ptwrite_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     al,ah
+       cmp     al,4
+       je      nomem_instruction_ready
+       cmp     al,8
+       jne     invalid_operand_size
+       call    operand_64bit
+       jmp     nomem_instruction_ready
+
+vmclear_instruction:
+       mov     [opcode_prefix],66h
+       jmp     vmx_instruction
+vmxon_instruction:
+       mov     [opcode_prefix],0F3h
+vmx_instruction:
+       mov     [postbyte_register],al
+       mov     [extended_code],0C7h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      vmx_size_ok
+       cmp     al,8
+       jne     invalid_operand_size
+      vmx_size_ok:
+       mov     [base_code],0Fh
+       jmp     instruction_ready
+vmread_instruction:
+       mov     [extended_code],78h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      vmread_nomem
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       call    vmread_check_size
+       jmp     vmx_size_ok
+      vmread_nomem:
+       lods    byte [esi]
+       call    convert_register
+       push    eax
+       call    vmread_check_size
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       call    vmread_check_size
+       pop     ebx
+       mov     [base_code],0Fh
+       jmp     nomem_instruction_ready
+      vmread_check_size:
+       cmp     [code_type],64
+       je      vmread_long
+       cmp     [operand_size],4
+       jne     invalid_operand_size
+       ret
+      vmread_long:
+       cmp     [operand_size],8
+       jne     invalid_operand_size
+       ret
+vmwrite_instruction:
+       mov     [extended_code],79h
+       call    take_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      vmwrite_nomem
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       call    vmread_check_size
+       jmp     vmx_size_ok
+      vmwrite_nomem:
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       mov     [base_code],0Fh
+       jmp     nomem_instruction_ready
+vmx_inv_instruction:
+       call    setup_66_0f_38
+       call    take_register
+       mov     [postbyte_register],al
+       call    vmread_check_size
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      vmx_size_ok
+       cmp     al,16
+       jne     invalid_operand_size
+       jmp     vmx_size_ok
+simple_svm_instruction:
+       push    eax
+       mov     [base_code],0Fh
+       mov     [extended_code],1
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+      simple_svm_detect_size:
+       cmp     ah,2
+       je      simple_svm_16bit
+       cmp     ah,4
+       je      simple_svm_32bit
+       cmp     [code_type],64
+       jne     invalid_operand_size
+       jmp     simple_svm_store
+      simple_svm_16bit:
+       cmp     [code_type],16
+       je      simple_svm_store
+       cmp     [code_type],64
+       je      invalid_operand_size
+       jmp     prefixed_svm_store
+      simple_svm_32bit:
+       cmp     [code_type],32
+       je      simple_svm_store
+      prefixed_svm_store:
+       mov     al,67h
+       stos    byte [edi]
+      simple_svm_store:
+       call    store_classic_instruction_code
+       pop     eax
+       stos    byte [edi]
+       jmp     instruction_assembled
+skinit_instruction:
+       call    take_register
+       cmp     ax,0400h
+       jne     invalid_operand
+       mov     al,0DEh
+       jmp     simple_instruction_0f_01
+clzero_instruction:
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+       mov     al,0FCh
+       cmp     [code_type],64
+       je      clzero_64bit
+       cmp     ah,4
+       jne     invalid_operand
+       jmp     simple_instruction_0f_01
+      clzero_64bit:
+       cmp     ah,8
+       jne     invalid_operand
+       jmp     simple_instruction_0f_01
+invlpga_instruction:
+       push    eax
+       mov     [base_code],0Fh
+       mov     [extended_code],1
+       call    take_register
+       or      al,al
+       jnz     invalid_operand
+       mov     bl,ah
+       mov     [operand_size],0
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       cmp     ax,0401h
+       jne     invalid_operand
+       mov     ah,bl
+       jmp     simple_svm_detect_size
+
+rdrand_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],0C7h
+       mov     [postbyte_register],al
+       call    take_register
+       mov     bl,al
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+rdfsbase_instruction:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       mov     [opcode_prefix],0F3h
+       mov     [base_code],0Fh
+       mov     [extended_code],0AEh
+       mov     [postbyte_register],al
+       call    take_register
+       mov     bl,al
+       mov     al,ah
+       cmp     ah,2
+       je      invalid_operand_size
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+
+xabort_instruction:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     ah,1
+       ja      invalid_operand_size
+       cmp     al,'('
+       jne     invalid_operand
+       call    get_byte_value
+       mov     dl,al
+       mov     ax,0F8C6h
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       jmp     instruction_assembled
+xbegin_instruction:
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[code_type]
+       cmp     al,64
+       je      xbegin_64bit
+       cmp     al,32
+       je      xbegin_32bit
+      xbegin_16bit:
+       call    get_address_word_value
+       add     edi,4
+       mov     ebp,[addressing_space]
+       call    calculate_relative_offset
+       sub     edi,4
+       shl     eax,16
+       mov     ax,0F8C7h
+       stos    dword [edi]
+       jmp     instruction_assembled
+      xbegin_32bit:
+       call    get_address_dword_value
+       jmp     xbegin_address_ok
+      xbegin_64bit:
+       call    get_address_qword_value
+      xbegin_address_ok:
+       add     edi,5
+       mov     ebp,[addressing_space]
+       call    calculate_relative_offset
+       sub     edi,5
+       mov     edx,eax
+       cwde
+       cmp     eax,edx
+       jne     xbegin_rel32
+       mov     al,66h
+       stos    byte [edi]
+       mov     eax,edx
+       shl     eax,16
+       mov     ax,0F8C7h
+       stos    dword [edi]
+       jmp     instruction_assembled
+      xbegin_rel32:
+       sub     edx,1
+       jno     xbegin_rel32_ok
+       cmp     [code_type],64
+       je      jump_out_of_range
+      xbegin_rel32_ok:
+       mov     ax,0F8C7h
+       stos    word [edi]
+       mov     eax,edx
+       stos    dword [edi]
+       jmp     instruction_assembled
+
+bndcl_instruction:
+       mov     ah,0F3h
+       jmp     bndc_instruction
+bndcu_instruction:
+       mov     ah,0F2h
+      bndc_instruction:
+       mov     [opcode_prefix],ah
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_bnd_register
+       mov     [postbyte_register],al
+       call    get_bnd_size
+       mov     [operand_size],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       je      bndc_mem
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+      bndc_mem:
+       call    get_address_of_required_size
+       jmp     instruction_ready
+bndmov_instruction:
+       mov     [opcode_prefix],66h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    get_bnd_size
+       shl     al,1
+       mov     [operand_size],al
+       lods    byte [esi]
+       cmp     al,14h
+       je      bndmov_reg
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       inc     [extended_code]
+       call    get_address_of_required_size
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_bnd_register
+       mov     [postbyte_register],al
+       jmp     instruction_ready
+       bndmov_reg:
+       lods    byte [esi]
+       call    convert_bnd_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,14h
+       je      bndmov_reg_reg
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address_of_required_size
+       jmp     instruction_ready
+      bndmov_reg_reg:
+       lods    byte [esi]
+       call    convert_bnd_register
+       mov     bl,al
+       jmp     nomem_instruction_ready
+    take_bnd_register:
+       lods    byte [esi]
+       cmp     al,14h
+       jne     invalid_operand
+       lods    byte [esi]
+    convert_bnd_register:
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,6
+       jne     invalid_operand
+       and     al,1111b
+       ret
+bndmk_instruction:
+       mov     [opcode_prefix],0F3h
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_bnd_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_bnd_size
+       call    get_address_prefixes
+       call    get_address_component
+       cmp     byte [esi-1],']'
+       je      bndmk_ready
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       or      dl,bl
+       or      dl,[address_sign]
+       or      edx,[address_high]
+       jnz     invalid_address
+       mov     [address_register],bh
+       call    get_address_component
+       lods    byte [esi]
+       cmp     al,']'
+       jne     invalid_operand
+       or      bh,bh
+       jz      bndmk_selected_base
+       cmp     bl,bh
+       je      bndmk_to_index
+       or      bl,bl
+       jnz     invalid_address
+       mov     bl,bh
+      bndmk_to_index:
+       inc     cl
+      bndmk_selected_base:
+       mov     bh,[address_register]
+      bndmk_ready:
+       or      bx,bx
+       jz      instruction_ready
+       cmp     [address_size_declared],0
+       jne     instruction_ready
+       and     ch,not 0Fh
+       jmp     instruction_ready
+    get_bnd_size:
+       mov     al,4
+       cmp     [code_type],64
+       jne     bnd_size_ok
+       add     al,4
+      bnd_size_ok:
+       mov     [address_size],al
+       ret
+    get_address_component:
+       mov     [free_address_range],0
+       call    calculate_address
+       mov     [address_high],edx
+       mov     edx,eax
+       or      bx,bx
+       jz      address_component_ok
+       mov     al,bl
+       or      al,bh
+       shr     al,4
+       cmp     al,[address_size]
+       jne     invalid_address
+      address_component_ok:
+       ret
+bndldx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_bnd_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_bnd_mib
+       jmp     bndmk_ready
+bndstx_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],al
+       call    take_bnd_mib
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_bnd_register
+       mov     [postbyte_register],al
+       jmp     bndmk_ready
+    take_bnd_mib:
+       lods    byte [esi]
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_bnd_size
+       call    get_address_prefixes
+       call    get_address_component
+       cmp     byte [esi-1],']'
+       je      bnd_mib_ok
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,'('
+       jne     invalid_operand
+       mov     al,[address_sign]
+       push    eax ebx ecx edx
+       push    [address_symbol]
+       call    get_address_component
+       lods    byte [esi]
+       cmp     al,']'
+       jne     invalid_operand
+       or      dl,bl
+       or      dl,[address_sign]
+       or      edx,[address_high]
+       jnz     invalid_address
+       mov     [address_register],bh
+       pop     [address_symbol]
+       pop     edx ecx ebx eax
+       mov     [address_sign],al
+       or      bl,bl
+       jz      mib_place_index
+       or      bh,bh
+       jnz     invalid_address
+       cmp     cl,1
+       jne     invalid_address
+       mov     bh,bl
+      mib_place_index:
+       mov     bl,[address_register]
+       xor     cl,cl
+       or      bl,bl
+       jz      bnd_mib_ok
+       inc     cl
+      bnd_mib_ok:
+       ret
+
+tpause_instruction:
+       mov     [postbyte_register],6
+       mov     [extended_code],0AEh
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],al
+       call    take_register
+       cmp     ah,4
+       jne     invalid_operand_size
+       mov     bl,al
+       cmp     byte [esi],','
+       jne     nomem_instruction_ready
+       inc     esi
+       call    take_register
+       cmp     ax,0402h
+       jne     invalid_operand
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       cmp     ax,0400h
+       jne     invalid_operand
+       jmp     nomem_instruction_ready
+umonitor_instruction:
+       mov     [postbyte_register],6
+       mov     [extended_code],0AEh
+       mov     [base_code],0Fh
+       mov     [opcode_prefix],0F3h
+       call    take_register
+       mov     bl,al
+       mov     al,ah
+       call    operand_autodetect
+       jmp     nomem_instruction_ready
+movdir64b_instruction:
+       call    setup_66_0f_38
+       call    take_register
+       mov     [postbyte_register],al
+       xor     al,al
+       xchg    al,[operand_size]
+       push    eax
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       mov     al,[operand_size]
+       or      al,al
+       jz      movdir64b_ready
+       cmp     al,64
+       jne     invalid_operand_size
+      movdir64b_ready:
+       push    edi
+       call    store_instruction
+       pop     ebx eax
+       mov     cl,[code_type]
+       cmp     byte [ebx],67h
+       jne     movdir64b_size_check
+       shr     cl,1
+       cmp     cl,16
+       jae     movdir64b_size_check
+       mov     cl,32
+      movdir64b_size_check:
+       shl     al,3
+       cmp     al,cl
+       jne     invalid_operand_size
+       jmp     instruction_assembled
+
+setssbsy_instruction:
+       shl     eax,24
+       or      eax,010FF3h
+       stos    dword [edi]
+       jmp     instruction_assembled
+rstorssp_instruction:
+       mov     ah,1
+       jmp     setup_clrssbsy
+clrssbsy_instruction:
+       mov     ah,0AEh
+      setup_clrssbsy:
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],0F3h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       test    [operand_size],not 8
+       jnz     invalid_operand_size
+       jmp     instruction_ready
+rdsspq_instruction:
+       mov     [rex_prefix],48h
+rdsspd_instruction:
+       mov     ah,1Eh
+       jmp     setup_incssp
+incsspq_instruction:
+       mov     [rex_prefix],48h
+incsspd_instruction:
+       mov     ah,0AEh
+      setup_incssp:
+       mov     [base_code],0Fh
+       mov     [extended_code],ah
+       mov     [postbyte_register],al
+       mov     [opcode_prefix],0F3h
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+       call    convert_register
+       mov     bl,al
+       call    cet_size_check
+       jmp     nomem_instruction_ready
+      cet_size_check:
+       cmp     [rex_prefix],0
+       je      cet_dword
+       cmp     [code_type],64
+       jne     illegal_instruction
+       shr     ah,1
+      cet_dword:
+       cmp     ah,4
+       jne     invalid_operand_size
+       ret
+wrussq_instruction:
+       mov     [opcode_prefix],66h
+wrssq_instruction:
+       mov     [rex_prefix],48h
+       jmp     wrssd_instruction
+wrussd_instruction:
+       mov     [opcode_prefix],66h
+wrssd_instruction:
+       mov     [base_code],0Fh
+       mov     [extended_code],38h
+       mov     [supplemental_code],al
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       je      wrss_reg
+       cmp     al,'['
+       jne     invalid_operand
+       call    get_address
+       push    edx ebx ecx
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     [postbyte_register],al
+       pop     ecx ebx edx
+       call    cet_size_check
+       jmp     instruction_ready
+      wrss_reg:
+       lods    byte [esi]
+       call    convert_register
+       mov     [postbyte_register],al
+       lods    byte [esi]
+       cmp     al,','
+       jne     invalid_operand
+       call    take_register
+       mov     bl,al
+       xchg    bl,[postbyte_register]
+       call    cet_size_check
+       jmp     nomem_instruction_ready
+endbr_instruction:
+       shl     eax,24
+       or      eax,1E0FF3h
+       stos    dword [edi]
+       jmp     instruction_assembled
+
+take_register:
+       lods    byte [esi]
+       call    get_size_operator
+       cmp     al,10h
+       jne     invalid_operand
+       lods    byte [esi]
+convert_register:
+       mov     ah,al
+       shr     ah,4
+       and     al,0Fh
+       cmp     ah,8
+       je      match_register_size
+       cmp     ah,4
+       ja      invalid_operand
+       cmp     ah,1
+       ja      match_register_size
+       cmp     al,4
+       jb      match_register_size
+       or      ah,ah
+       jz      high_byte_register
+       or      [rex_prefix],40h
+      match_register_size:
+       cmp     ah,[operand_size]
+       je      register_size_ok
+       cmp     [operand_size],0
+       jne     operand_sizes_do_not_match
+       mov     [operand_size],ah
+      register_size_ok:
+       ret
+      high_byte_register:
+       mov     ah,1
+       or      [rex_prefix],10h
+       jmp     match_register_size
+convert_fpu_register:
+       mov     ah,al
+       shr     ah,4
+       and     al,111b
+       cmp     ah,10
+       jne     invalid_operand
+       jmp     match_register_size
+convert_mmx_register:
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,0Ch
+       je      xmm_register
+       ja      invalid_operand
+       and     al,111b
+       cmp     ah,0Bh
+       jne     invalid_operand
+       mov     ah,8
+       jmp     match_register_size
+      xmm_register:
+       and     al,0Fh
+       mov     ah,16
+       cmp     al,8
+       jb      match_register_size
+       cmp     [code_type],64
+       jne     invalid_operand
+       jmp     match_register_size
+convert_xmm_register:
+       mov     ah,al
+       shr     ah,4
+       cmp     ah,0Ch
+       je      xmm_register
+       jmp     invalid_operand
+get_size_operator:
+       xor     ah,ah
+       cmp     al,11h
+       jne     no_size_operator
+       mov     [size_declared],1
+       lods    word [esi]
+       xchg    al,ah
+       or      [operand_flags],1
+       cmp     ah,[operand_size]
+       je      size_operator_ok
+       cmp     [operand_size],0
+       jne     operand_sizes_do_not_match
+       mov     [operand_size],ah
+      size_operator_ok:
+       ret
+      no_size_operator:
+       mov     [size_declared],0
+       cmp     al,'['
+       jne     size_operator_ok
+       and     [operand_flags],not 1
+       ret
+get_jump_operator:
+       mov     [jump_type],0
+       cmp     al,12h
+       jne     jump_operator_ok
+       lods    word [esi]
+       mov     [jump_type],al
+       mov     al,ah
+      jump_operator_ok:
+       ret
+get_address:
+       and     [address_size],0
+    get_address_of_required_size:
+       call    get_address_prefixes
+       and     [free_address_range],0
+       call    calculate_address
+       cmp     byte [esi-1],']'
+       jne     invalid_address
+       mov     [address_high],edx
+       mov     edx,eax
+       cmp     [address_size_declared],0
+       jne     address_ok
+       cmp     [segment_register],4
+       ja      address_ok
+       or      bx,bx
+       jnz     clear_address_size
+       cmp     [code_type],64
+       jne     address_ok
+      calculate_relative_address:
+       mov     edx,[address_symbol]
+       mov     [symbol_identifier],edx
+       mov     edx,[address_high]
+       mov     ebp,[addressing_space]
+       call    calculate_relative_offset
+       mov     [address_high],edx
+       cdq
+       cmp     edx,[address_high]
+       je      address_high_ok
+       call    recoverable_overflow
+      address_high_ok:
+       mov     edx,eax
+       ror     ecx,16
+       mov     cl,[value_type]
+       rol     ecx,16
+       mov     bx,9900h
+      clear_address_size:
+       and     ch,not 0Fh
+      address_ok:
+       ret
+get_address_prefixes:
+       and     [segment_register],0
+       and     [address_size_declared],0
+       mov     al,[code_type]
+       shr     al,3
+       mov     [value_size],al
+       mov     al,[esi]
+       and     al,11110000b
+       cmp     al,60h
+       jne     get_address_size_prefix
+       lods    byte [esi]
+       sub     al,60h
+       mov     [segment_register],al
+       mov     al,[esi]
+       and     al,11110000b
+      get_address_size_prefix:
+       cmp     al,70h
+       jne     address_size_prefix_ok
+       lods    byte [esi]
+       sub     al,70h
+       cmp     al,2
+       jb      invalid_address_size
+       cmp     al,8
+       ja      invalid_address_size
+       mov     [value_size],al
+       or      [address_size_declared],1
+       or      [address_size],al
+       cmp     al,[address_size]
+       jne     invalid_address_size
+      address_size_prefix_ok:
+       ret
+operand_16bit:
+       cmp     [code_type],16
+       je      size_prefix_ok
+       mov     [operand_prefix],66h
+       ret
+operand_32bit:
+       cmp     [code_type],16
+       jne     size_prefix_ok
+       mov     [operand_prefix],66h
+      size_prefix_ok:
+       ret
+operand_64bit:
+       cmp     [code_type],64
+       jne     illegal_instruction
+       or      [rex_prefix],48h
+       ret
+operand_autodetect:
+       cmp     al,2
+       je      operand_16bit
+       cmp     al,4
+       je      operand_32bit
+       cmp     al,8
+       je      operand_64bit
+       jmp     invalid_operand_size
+store_segment_prefix_if_necessary:
+       mov     al,[segment_register]
+       or      al,al
+       jz      segment_prefix_ok
+       cmp     al,4
+       ja      segment_prefix_386
+       cmp     [code_type],64
+       je      segment_prefix_ok
+       cmp     al,3
+       je      ss_prefix
+       jb      segment_prefix_86
+       cmp     bl,25h
+       je      segment_prefix_86
+       cmp     bh,25h
+       je      segment_prefix_86
+       cmp     bh,45h
+       je      segment_prefix_86
+       cmp     bh,44h
+       je      segment_prefix_86
+       ret
+      ss_prefix:
+       cmp     bl,25h
+       je      segment_prefix_ok
+       cmp     bh,25h
+       je      segment_prefix_ok
+       cmp     bh,45h
+       je      segment_prefix_ok
+       cmp     bh,44h
+       je      segment_prefix_ok
+       jmp     segment_prefix_86
+store_segment_prefix:
+       mov     al,[segment_register]
+       or      al,al
+       jz      segment_prefix_ok
+       cmp     al,5
+       jae     segment_prefix_386
+      segment_prefix_86:
+       dec     al
+       shl     al,3
+       add     al,26h
+       stos    byte [edi]
+       jmp     segment_prefix_ok
+      segment_prefix_386:
+       add     al,64h-5
+       stos    byte [edi]
+      segment_prefix_ok:
+       ret
+store_instruction_code:
+       cmp     [vex_required],0
+       jne     store_vex_instruction_code
+store_classic_instruction_code:
+       mov     al,[operand_prefix]
+       or      al,al
+       jz      operand_prefix_ok
+       stos    byte [edi]
+      operand_prefix_ok:
+       mov     al,[opcode_prefix]
+       or      al,al
+       jz      opcode_prefix_ok
+       stos    byte [edi]
+      opcode_prefix_ok:
+       mov     al,[rex_prefix]
+       test    al,40h
+       jz      rex_prefix_ok
+       cmp     [code_type],64
+       jne     invalid_operand
+       test    al,0B0h
+       jnz     disallowed_combination_of_registers
+       stos    byte [edi]
+      rex_prefix_ok:
+       mov     al,[base_code]
+       stos    byte [edi]
+       cmp     al,0Fh
+       jne     instruction_code_ok
+      store_extended_code:
+       mov     al,[extended_code]
+       stos    byte [edi]
+       cmp     al,38h
+       je      store_supplemental_code
+       cmp     al,3Ah
+       je      store_supplemental_code
+      instruction_code_ok:
+       ret
+      store_supplemental_code:
+       mov     al,[supplemental_code]
+       stos    byte [edi]
+       ret
+store_nomem_instruction:
+       test    [postbyte_register],10000b
+       jz      nomem_reg_high_code_ok
+       or      [vex_required],10h
+       and     [postbyte_register],1111b
+      nomem_reg_high_code_ok:
+       test    [postbyte_register],1000b
+       jz      nomem_reg_code_ok
+       or      [rex_prefix],44h
+       and     [postbyte_register],111b
+      nomem_reg_code_ok:
+       test    bl,10000b
+       jz      nomem_rm_high_code_ok
+       or      [rex_prefix],42h
+       or      [vex_required],8
+       and     bl,1111b
+      nomem_rm_high_code_ok:
+       test    bl,1000b
+       jz      nomem_rm_code_ok
+       or      [rex_prefix],41h
+       and     bl,111b
+      nomem_rm_code_ok:
+       and     [displacement_compression],0
+       call    store_instruction_code
+       mov     al,[postbyte_register]
+       shl     al,3
+       or      al,bl
+       or      al,11000000b
+       stos    byte [edi]
+       ret
+store_instruction:
+       mov     [current_offset],edi
+       and     [displacement_compression],0
+       test    [postbyte_register],10000b
+       jz      reg_high_code_ok
+       or      [vex_required],10h
+       and     [postbyte_register],1111b
+      reg_high_code_ok:
+       test    [postbyte_register],1000b
+       jz      reg_code_ok
+       or      [rex_prefix],44h
+       and     [postbyte_register],111b
+      reg_code_ok:
+       cmp     [code_type],64
+       jne     address_value_ok
+       xor     eax,eax
+       bt      edx,31
+       sbb     eax,[address_high]
+       jz      address_value_ok
+       cmp     [address_high],0
+       jne     address_value_out_of_range
+       test    ch,44h
+       jnz     address_value_ok
+       test    bx,8080h
+       jz      address_value_ok
+      address_value_out_of_range:
+       call    recoverable_overflow
+      address_value_ok:
+       call    store_segment_prefix_if_necessary
+       test    [vex_required],4
+       jnz     address_vsib
+       or      bx,bx
+       jz      address_immediate
+       cmp     bx,9800h
+       je      address_rip_based
+       cmp     bx,9400h
+       je      address_eip_based
+       cmp     bx,9900h
+       je      address_relative
+       mov     al,bl
+       or      al,bh
+       and     al,11110000b
+       cmp     al,80h
+       je      postbyte_64bit
+       cmp     al,40h
+       je      postbyte_32bit
+       cmp     al,20h
+       jne     invalid_address
+       cmp     [code_type],64
+       je      invalid_address_size
+       call    address_16bit_prefix
+       test    ch,22h
+       setz    [displacement_compression]
+       call    store_instruction_code
+       cmp     bl,bh
+       jbe     determine_16bit_address
+       xchg    bl,bh
+      determine_16bit_address:
+       cmp     bx,2600h
+       je      address_si
+       cmp     bx,2700h
+       je      address_di
+       cmp     bx,2300h
+       je      address_bx
+       cmp     bx,2500h
+       je      address_bp
+       cmp     bx,2625h
+       je      address_bp_si
+       cmp     bx,2725h
+       je      address_bp_di
+       cmp     bx,2723h
+       je      address_bx_di
+       cmp     bx,2623h
+       jne     invalid_address
+      address_bx_si:
+       xor     al,al
+       jmp     postbyte_16bit
+      address_bx_di:
+       mov     al,1
+       jmp     postbyte_16bit
+      address_bp_si:
+       mov     al,10b
+       jmp     postbyte_16bit
+      address_bp_di:
+       mov     al,11b
+       jmp     postbyte_16bit
+      address_si:
+       mov     al,100b
+       jmp     postbyte_16bit
+      address_di:
+       mov     al,101b
+       jmp     postbyte_16bit
+      address_bx:
+       mov     al,111b
+       jmp     postbyte_16bit
+      address_bp:
+       mov     al,110b
+      postbyte_16bit:
+       test    ch,22h
+       jnz     address_16bit_value
+       or      ch,ch
+       jnz     address_sizes_do_not_agree
+       cmp     edx,10000h
+       jge     value_out_of_range
+       cmp     edx,-8000h
+       jl      value_out_of_range
+       or      dx,dx
+       jz      address
+       cmp     [displacement_compression],2
+       ja      address_8bit_value
+       je      address_16bit_value
+       cmp     dx,80h
+       jb      address_8bit_value
+       cmp     dx,-80h
+       jae     address_8bit_value
+      address_16bit_value:
+       or      al,10000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       mov     eax,edx
+       stos    word [edi]
+       ret
+      address_8bit_value:
+       or      al,01000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       mov     al,dl
+       stos    byte [edi]
+       ret
+      address:
+       cmp     al,110b
+       je      address_8bit_value
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       ret
+      address_vsib:
+       mov     al,bl
+       shr     al,4
+       test    al,1
+       jz      vsib_high_code_ok
+       or      [vex_register],10000b
+       or      [vex_required],8
+       xor     al,1
+      vsib_high_code_ok:
+       cmp     al,6
+       je      vsib_index_ok
+       cmp     al,0Ch
+       jb      invalid_address
+      vsib_index_ok:
+       mov     al,bh
+       shr     al,4
+       cmp     al,4
+       je      postbyte_32bit
+       cmp     [code_type],64
+       je      address_prefix_ok
+       test    al,al
+       jnz     invalid_address
+      postbyte_32bit:
+       call    address_32bit_prefix
+       jmp     address_prefix_ok
+      postbyte_64bit:
+       cmp     [code_type],64
+       jne     invalid_address_size
+      address_prefix_ok:
+       cmp     bl,44h
+       je      invalid_address
+       cmp     bl,84h
+       je      invalid_address
+       test    bh,1000b
+       jz      base_code_ok
+       or      [rex_prefix],41h
+      base_code_ok:
+       test    bl,1000b
+       jz      index_code_ok
+       or      [rex_prefix],42h
+      index_code_ok:
+       test    ch,44h or 88h
+       setz    [displacement_compression]
+       call    store_instruction_code
+       or      cl,cl
+       jz      only_base_register
+      base_and_index:
+       mov     al,100b
+       xor     ah,ah
+       cmp     cl,1
+       je      scale_ok
+       cmp     cl,2
+       je      scale_1
+       cmp     cl,4
+       je      scale_2
+       or      ah,11000000b
+       jmp     scale_ok
+      scale_2:
+       or      ah,10000000b
+       jmp     scale_ok
+      scale_1:
+       or      ah,01000000b
+      scale_ok:
+       or      bh,bh
+       jz      only_index_register
+       and     bl,111b
+       shl     bl,3
+       or      ah,bl
+       and     bh,111b
+       or      ah,bh
+      sib_ready:
+       test    ch,44h or 88h
+       jnz     sib_address_32bit_value
+       or      ch,ch
+       jnz     address_sizes_do_not_agree
+       cmp     bh,5
+       je      address_value
+       or      edx,edx
+       jz      sib_address
+      address_value:
+       cmp     [displacement_compression],2
+       ja      sib_address_8bit_value
+       je      sib_address_32bit_value
+       cmp     edx,80h
+       jb      sib_address_8bit_value
+       cmp     edx,-80h
+       jnb     sib_address_8bit_value
+      sib_address_32bit_value:
+       or      al,10000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    word [edi]
+       jmp     store_address_32bit_value
+      sib_address_8bit_value:
+       or      al,01000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    word [edi]
+       mov     al,dl
+       stos    byte [edi]
+       ret
+      sib_address:
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    word [edi]
+       ret
+      only_index_register:
+       or      ah,101b
+       and     bl,111b
+       shl     bl,3
+       or      ah,bl
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    word [edi]
+       test    ch,44h or 88h
+       jnz     store_address_32bit_value
+       or      ch,ch
+       jnz     invalid_address_size
+       cmp     [displacement_compression],2
+       jbe     store_address_32bit_value
+       mov     edx,[uncompressed_displacement]
+       jmp     store_address_32bit_value
+      zero_index_register:
+       mov     bl,4
+       mov     cl,1
+       jmp     base_and_index
+      only_base_register:
+       mov     al,bh
+       and     al,111b
+       cmp     al,4
+       je      zero_index_register
+       test    ch,44h or 88h
+       jnz     simple_address_32bit_value
+       or      ch,ch
+       jnz     address_sizes_do_not_agree
+       or      edx,edx
+       jz      simple_address
+       cmp     [displacement_compression],2
+       ja      simple_address_8bit_value
+       je      simple_address_32bit_value
+       cmp     edx,80h
+       jb      simple_address_8bit_value
+       cmp     edx,-80h
+       jnb     simple_address_8bit_value
+      simple_address_32bit_value:
+       or      al,10000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       jmp     store_address_32bit_value
+      simple_address_8bit_value:
+       or      al,01000000b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       mov     al,dl
+       stos    byte [edi]
+       ret
+      simple_address:
+       cmp     al,5
+       je      simple_address_8bit_value
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       ret
+      address_immediate:
+       cmp     [code_type],64
+       je      address_immediate_sib
+       test    ch,44h or 88h
+       jnz     address_immediate_32bit
+       test    ch,22h
+       jnz     address_immediate_16bit
+       or      ch,ch
+       jnz     invalid_address_size
+       cmp     [code_type],16
+       je      addressing_16bit
+      address_immediate_32bit:
+       call    address_32bit_prefix
+       call    store_instruction_code
+      store_immediate_address:
+       mov     al,101b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+      store_address_32bit_value:
+       test    ch,0F0h
+       jz      address_32bit_relocation_ok
+       mov     eax,ecx
+       shr     eax,16
+       cmp     al,4
+       jne     address_32bit_relocation
+       mov     al,2
+      address_32bit_relocation:
+       xchg    [value_type],al
+       mov     ebx,[address_symbol]
+       xchg    ebx,[symbol_identifier]
+       call    mark_relocation
+       mov     [value_type],al
+       mov     [symbol_identifier],ebx
+      address_32bit_relocation_ok:
+       mov     eax,edx
+       stos    dword [edi]
+       ret
+      store_address_64bit_value:
+       test    ch,0F0h
+       jz      address_64bit_relocation_ok
+       mov     eax,ecx
+       shr     eax,16
+       xchg    [value_type],al
+       mov     ebx,[address_symbol]
+       xchg    ebx,[symbol_identifier]
+       call    mark_relocation
+       mov     [value_type],al
+       mov     [symbol_identifier],ebx
+      address_64bit_relocation_ok:
+       mov     eax,edx
+       stos    dword [edi]
+       mov     eax,[address_high]
+       stos    dword [edi]
+       ret
+      address_immediate_sib:
+       test    ch,44h
+       jnz     address_immediate_sib_32bit
+       test    ch,not 88h
+       jnz     invalid_address_size
+       test    edx,80000000h
+       jz      address_immediate_sib_store
+       cmp     [address_high],0
+       je      address_immediate_sib_nosignextend
+      address_immediate_sib_store:
+       call    store_instruction_code
+       mov     al,100b
+       mov     ah,100101b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    word [edi]
+       jmp     store_address_32bit_value
+      address_immediate_sib_32bit:
+       test    ecx,0FF0000h
+       jnz     address_immediate_sib_nosignextend
+       test    edx,80000000h
+       jz      address_immediate_sib_store
+      address_immediate_sib_nosignextend:
+       call    address_32bit_prefix
+       jmp     address_immediate_sib_store
+      address_eip_based:
+       mov     al,67h
+       stos    byte [edi]
+      address_rip_based:
+       cmp     [code_type],64
+       jne     invalid_address
+       call    store_instruction_code
+       jmp     store_immediate_address
+      address_relative:
+       call    store_instruction_code
+       movzx   eax,[immediate_size]
+       add     eax,edi
+       sub     eax,[current_offset]
+       add     eax,5
+       sub     edx,eax
+       jno     address_relative_ok
+       call    recoverable_overflow
+      address_relative_ok:
+       mov     al,101b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       shr     ecx,16
+       xchg    [value_type],cl
+       mov     ebx,[address_symbol]
+       xchg    ebx,[symbol_identifier]
+       mov     eax,edx
+       call    mark_relocation
+       mov     [value_type],cl
+       mov     [symbol_identifier],ebx
+       stos    dword [edi]
+       ret
+      addressing_16bit:
+       cmp     edx,10000h
+       jge     address_immediate_32bit
+       cmp     edx,-8000h
+       jl      address_immediate_32bit
+       movzx   edx,dx
+      address_immediate_16bit:
+       call    address_16bit_prefix
+       call    store_instruction_code
+       mov     al,110b
+       mov     cl,[postbyte_register]
+       shl     cl,3
+       or      al,cl
+       stos    byte [edi]
+       mov     eax,edx
+       stos    word [edi]
+       cmp     edx,10000h
+       jge     value_out_of_range
+       cmp     edx,-8000h
+       jl      value_out_of_range
+       ret
+      address_16bit_prefix:
+       cmp     [code_type],16
+       je      instruction_prefix_ok
+       mov     al,67h
+       stos    byte [edi]
+       ret
+      address_32bit_prefix:
+       cmp     [code_type],32
+       je      instruction_prefix_ok
+       mov     al,67h
+       stos    byte [edi]
+      instruction_prefix_ok:
+       ret
+store_instruction_with_imm8:
+       mov     [immediate_size],1
+       call    store_instruction
+       mov     al,byte [value]
+       stos    byte [edi]
+       ret
+store_instruction_with_imm16:
+       mov     [immediate_size],2
+       call    store_instruction
+       mov     ax,word [value]
+       call    mark_relocation
+       stos    word [edi]
+       ret
+store_instruction_with_imm32:
+       mov     [immediate_size],4
+       call    store_instruction
+       mov     eax,dword [value]
+       call    mark_relocation
+       stos    dword [edi]
+       ret