From 25b23034ea868b021f4ccb4c6dfe492f854572e4 Mon Sep 17 00:00:00 2001 From: Ivan Baravy Date: Mon, 1 Aug 2016 01:31:26 +0000 Subject: [PATCH] fasm: update to 1.71.54 git-svn-id: svn://kolibrios.org@6467 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/fasm/trunk/assemble.inc | 90 +- programs/develop/fasm/trunk/avx.inc | 3396 ++++++++++++++++------ programs/develop/fasm/trunk/errors.inc | 5 +- programs/develop/fasm/trunk/exprcalc.inc | 358 +-- programs/develop/fasm/trunk/exprpars.inc | 41 +- programs/develop/fasm/trunk/formats.inc | 21 +- programs/develop/fasm/trunk/messages.inc | 2 +- programs/develop/fasm/trunk/parser.inc | 48 +- programs/develop/fasm/trunk/preproce.inc | 312 +- programs/develop/fasm/trunk/symbdump.inc | 2 +- programs/develop/fasm/trunk/tables.inc | 1464 +++++++--- programs/develop/fasm/trunk/variable.inc | 22 +- programs/develop/fasm/trunk/version.inc | 4 +- programs/develop/fasm/trunk/x86_64.inc | 1152 ++++---- 14 files changed, 4741 insertions(+), 2176 deletions(-) diff --git a/programs/develop/fasm/trunk/assemble.inc b/programs/develop/fasm/trunk/assemble.inc index 4a4ba89417..3d779a67bc 100644 --- a/programs/develop/fasm/trunk/assemble.inc +++ b/programs/develop/fasm/trunk/assemble.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. assembler: @@ -32,6 +32,7 @@ assembler: 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: @@ -192,7 +193,7 @@ assemble_line: new_line: lods dword [esi] mov [current_line],eax - mov [prefixed_instruction],0 + and [prefix_flags],0 cmp [symbols_file],0 je continue_line cmp [next_pass_needed],0 @@ -329,31 +330,10 @@ assemble_line: cmp eax,0Fh jb invalid_use_of_symbol je reserved_word_used_as_symbol - mov edx,[eax+8] - push edx - cmp [current_pass],0 - je get_constant_value - test dl,4 - jnz get_constant_value - mov cx,[current_pass] - cmp cx,[eax+16] - je get_constant_value - or dl,4 - mov [eax+8],dl - get_constant_value: push eax - mov al,byte [esi-1] - push eax - or [size_override],-1 + or [operand_flags],1 call get_value pop ebx - mov ch,bl - pop ebx - pop ecx - test cl,4 - jnz constant_referencing_mode_ok - and byte [ebx+8],not 4 - constant_referencing_mode_ok: xor cl,cl mov ch,[value_type] cmp ch,3 @@ -453,16 +433,16 @@ assemble_line: or byte [ebx+0Ah],2 jmp continue_line assemble_instruction: -; mov [operand_size],0 -; mov [size_override],0 -; mov [operand_prefix],0 -; mov [opcode_prefix],0 +; mov [operand_size],0 +; mov [operand_flags],0 +; mov [operand_prefix],0 +; mov [rex_prefix],0 and dword [operand_size],0 -; mov [rex_prefix],0 -; mov [vex_required],0 -; mov [vex_register],0 -; mov [immediate_size],0 - and dword [rex_prefix],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] @@ -471,6 +451,8 @@ assemble_line: add [esp],ebx ret instruction_assembled: + test [prefix_flags],not 1 + jnz illegal_instruction mov al,[esi] cmp al,0Fh je line_assembled @@ -671,7 +653,7 @@ load_directive: push ebx cmp byte [esi],'.' je invalid_value - or [size_override],-1 + or [operand_flags],1 call get_address_value pop ebp call calculate_relative_offset @@ -718,7 +700,7 @@ store_directive: mov [operand_size],1 jmp store_value_ok sized_store: - or [size_override],-1 + or [operand_flags],1 call get_value store_value_ok: cmp [value_type],0 @@ -833,7 +815,7 @@ times_directive: cmp eax,[stack_limit] jb stack_overflow push esi - or [prefixed_instruction],-1 + or [prefix_flags],1 call continue_line mov eax,[counter_limit] cmp [counter],eax @@ -1008,8 +990,8 @@ virtual_directive: addressing_space_closed: ret repeat_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction lods byte [esi] cmp al,'(' jne invalid_argument @@ -1030,8 +1012,8 @@ repeat_directive: mov [ebx+4],eax jmp instruction_assembled end_repeat: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction call find_structure_data jc unexpected_instruction mov eax,[counter_limit] @@ -1062,8 +1044,8 @@ repeat_directive: jne unexpected_instruction ret while_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction call allocate_structure_data mov word [ebx],while_directive-instruction_handler mov eax,1 @@ -1093,8 +1075,8 @@ while_directive: pop ebx jmp instruction_assembled end_while: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction call find_structure_data jc unexpected_instruction mov eax,[ebx+4] @@ -1109,8 +1091,8 @@ while_directive: jne unexpected_instruction ret if_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction call calculate_logical_expression mov dl,al mov al,[esi] @@ -1146,8 +1128,8 @@ if_directive: or al,-1 jmp make_if_structure else_directive: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction mov ax,if_directive-instruction_handler call find_structure_data jc unexpected_instruction @@ -1173,8 +1155,8 @@ if_directive: call remove_structure_data jmp instruction_assembled end_if: - cmp [prefixed_instruction],0 - jne unexpected_instruction + test [prefix_flags],1 + jnz unexpected_instruction call find_structure_data jc unexpected_instruction call remove_structure_data @@ -1377,7 +1359,7 @@ data_bytes: inc esi or eax,eax jz duplicate_zero_times - cmp byte [esi],'{' + cmp byte [esi],91h jne duplicate_single_data_value inc esi duplicate_data: @@ -1389,7 +1371,7 @@ data_bytes: lods byte [esi] cmp al,',' je duplicated_values - cmp al,'}' + cmp al,92h jne invalid_argument pop ebx eax dec eax @@ -1407,13 +1389,13 @@ data_bytes: mov esi,ebx jmp duplicate_single_data_value duplicate_zero_times: - cmp byte [esi],'{' + cmp byte [esi],91h jne skip_single_data_value inc esi skip_data_value: call skip_symbol jc invalid_argument - cmp byte [esi],'}' + cmp byte [esi],92h jne skip_data_value inc esi jmp data_defined diff --git a/programs/develop/fasm/trunk/avx.inc b/programs/develop/fasm/trunk/avx.inc index 80686b9675..135979fb40 100644 --- a/programs/develop/fasm/trunk/avx.inc +++ b/programs/develop/fasm/trunk/avx.inc @@ -1,81 +1,169 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. -avx_single_source_pd_instruction: - or [vex_required],2 +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 - mov [mmx_size],0 - jmp avx_instruction -avx_single_source_ps_instruction: + 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 [mmx_size],0 - jmp avx_instruction -avx_sd_instruction_imm8: - mov [immediate_size],1 + 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 - mov [mmx_size],8 + or [rex_prefix],80h + mov cl,8 jmp avx_instruction -avx_ss_instruction_imm8: - mov [immediate_size],1 +avx_ss_instruction_er: + or [operand_flags],8 +avx_ss_instruction_sae: + or [operand_flags],4 avx_ss_instruction: mov [opcode_prefix],0F3h - mov [mmx_size],4 + mov cl,4 jmp avx_instruction -avx_cmp_pd_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_evex: + mov [immediate_size],1 + or [vex_required],8 + 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: + 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_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 -avx_cmp_ps_instruction: - mov [mmx_size],0 - mov byte [value],al - mov al,0C2h jmp avx_instruction -avx_cmp_sd_instruction: +avx_ps_instruction_noevex: + or [vex_required],2 mov [opcode_prefix],0F2h - mov [mmx_size],8 - mov byte [value],al - mov al,0C2h + xor cl,cl jmp avx_instruction -avx_cmp_ss_instruction: - mov [opcode_prefix],0F3h - mov [mmx_size],4 - mov byte [value],al - mov al,0C2h - jmp avx_instruction -avx_comiss_instruction: - or [vex_required],2 - mov [mmx_size],4 - jmp avx_instruction -avx_comisd_instruction: - or [vex_required],2 - mov [opcode_prefix],66h - mov [mmx_size],8 - jmp avx_instruction -avx_haddps_instruction: - mov [opcode_prefix],0F2h - mov [mmx_size],0 - jmp avx_instruction -avx_movshdup_instruction: - or [vex_required],2 - mov [opcode_prefix],0F3h - mov [mmx_size],0 - jmp avx_instruction -avx_128bit_instruction: - mov [mmx_size],16 - mov [opcode_prefix],66h 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_common: + avx_xop_common: or [vex_required],1 lods byte [esi] call get_size_operator @@ -85,8 +173,9 @@ avx_instruction: lods byte [esi] call convert_avx_register mov [postbyte_register],al + call take_avx512_mask avx_vex_reg: - test [vex_required],2 + test [operand_flags],2 jnz avx_vex_reg_ok lods byte [esi] cmp al,',' @@ -94,35 +183,36 @@ avx_instruction: call take_avx_register mov [vex_register],al avx_vex_reg_ok: - cmp [mmx_size],0 + 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 + 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,[extended_code] - mov ah,[supplemental_code] - cmp al,0C2h - je sse_cmp_mem_ok - cmp ax,443Ah - je sse_cmp_mem_ok - mov al,[base_code] - and al,11011100b - cmp al,11001100b - je sse_cmp_mem_ok - cmp [immediate_size],1 + mov al,[immediate_size] + cmp al,1 je mmx_imm8 - cmp [immediate_size],0 - jge instruction_ready + 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 @@ -134,25 +224,19 @@ avx_instruction: jmp instruction_assembled avx_regs_reg: 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 - mov al,[base_code] - and al,11011100b - cmp al,11001100b - je sse_cmp_nomem_ok - cmp [immediate_size],1 + call take_avx512_rounding + mov al,[immediate_size] + cmp al,1 je mmx_nomem_imm8 - cmp [immediate_size],0 - jge nomem_instruction_ready + 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_ @@ -169,6 +253,7 @@ avx_instruction: 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 @@ -183,41 +268,103 @@ avx_instruction: call get_size_operator cmp al,'[' je take_avx_mem - mov [operand_size],cl cmp al,10h jne invalid_operand + mov [operand_size],cl lods byte [esi] call convert_avx_register - cmp [mmx_size],0 + 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 + jne invalid_operand_size avx_reg_ok: stc ret take_avx_mem: push ecx call get_address - pop eax - cmp [mmx_size],0 - jne avx_smem - xchg al,[operand_size] + 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 - jz avx_mem_ok + 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_ok: + avx_mem_size_ok: clc ret - avx_smem: - xchg al,[operand_size] + 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 - jz avx_smem_ok + jnz invalid_operand_size + call recoverable_unknown_size + avx_mem_size_enforced: + or al,al + jz avx_mem_size_ok cmp al,[mmx_size] - jne invalid_operand_size - avx_smem_ok: - clc - ret + je avx_mem_size_ok + jmp invalid_operand_size take_imm4_if_needed: cmp [immediate_size],-3 jne imm4_ok @@ -235,90 +382,126 @@ avx_instruction: pop edx ecx ebx imm4_ok: ret - -avx_single_source_128bit_instruction_38: - or [vex_required],2 -avx_128bit_instruction_38: - mov [mmx_size],16 - jmp avx_instruction_38_setup -avx_single_source_instruction_38: - or [vex_required],2 -avx_instruction_38: - mov [mmx_size],0 - avx_instruction_38_setup: - mov [opcode_prefix],66h - mov [supplemental_code],al - mov al,38h - jmp avx_instruction -avx_instruction_38_w1: - or [rex_prefix],8 - jmp avx_instruction_38 - -avx_ss_instruction_3a_imm8: - mov [mmx_size],4 - jmp avx_instruction_3a_imm8_setup -avx_sd_instruction_3a_imm8: - mov [mmx_size],8 - jmp avx_instruction_3a_imm8_setup -avx_single_source_128bit_instruction_3a_imm8: - or [vex_required],2 -avx_128bit_instruction_3a_imm8: - mov [mmx_size],16 - jmp avx_instruction_3a_imm8_setup -avx_triple_source_instruction_3a: - mov [mmx_size],0 - mov [immediate_size],-1 - mov byte [value],0 - jmp avx_instruction_3a_setup -avx_single_source_instruction_3a_imm8: - or [vex_required],2 -avx_instruction_3a_imm8: - mov [mmx_size],0 - avx_instruction_3a_imm8_setup: - mov [immediate_size],1 - avx_instruction_3a_setup: - mov [opcode_prefix],66h - mov [supplemental_code],al - mov al,3Ah - jmp avx_instruction -avx_pclmulqdq_instruction: - mov byte [value],al - mov [mmx_size],16 - mov al,44h - jmp avx_instruction_3a_setup - -avx_permq_instruction: - or [vex_required],2 - or [rex_prefix],8 -avx_perm2f128_instruction: - mov [immediate_size],1 - mov ah,3Ah - jmp avx_perm_instruction -avx_permd_instruction: - mov ah,38h - avx_perm_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],ah - mov [supplemental_code],al - mov [mmx_size],0 - or [vex_required],1 - call take_avx_register - cmp ah,32 - jne invalid_operand_size - mov [postbyte_register],al - jmp avx_vex_reg + 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 + or al,al + jz invalid_operand + and al,111b + 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 + 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+80h + test [operand_flags],8 + jz take_sae + 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 [opcode_prefix],0F3h + 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: - mov [mmx_size],0 - or [vex_required],2 + 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 @@ -331,6 +514,8 @@ avx_movps_instruction: cmp al,'[' jne invalid_operand call get_address + or [operand_flags],20h + call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand @@ -338,110 +523,205 @@ avx_movps_instruction: mov [postbyte_register],al jmp instruction_ready avx_movntpd_instruction: + or [rex_prefix],80h +avx_movntdq_instruction: mov [opcode_prefix],66h avx_movntps_instruction: - or [vex_required],1 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_lddqu_instruction: - mov [opcode_prefix],0F2h +avx_compress_q_instruction: + or [rex_prefix],8 +avx_compress_d_instruction: + or [vex_required],8 mov [mmx_size],0 - xor cx,cx + 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 - or cl,cl - jz avx_load_reg_ok - cmp ah,cl + mov [postbyte_register],al + lods byte [esi] + cmp al,',' jne invalid_operand - avx_load_reg_ok: - cmp [mmx_size],0 - je avx_load_reg_ - xor ah,ah - avx_load_reg_: - xchg ah,[operand_size] - push eax + 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 - je avx_load_reg_reg + 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 + 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 - pop eax - xchg ah,[operand_size] - mov [postbyte_register],al mov al,[mmx_size] - or al,al - jz instruction_ready - or ah,ah - jz instruction_ready - cmp al,ah - jne invalid_operand_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_load_reg_reg: + 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 nomem_instruction_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 - cmp ch,ah - jne invalid_operand - mov bl,al - pop eax - xchg ah,[operand_size] mov [postbyte_register],al - jmp nomem_instruction_ready - -avx_movntdqa_instruction: - mov [mmx_size],0 - xor cx,cx - jmp avx_load_instruction_38 -avx_broadcastss_instruction: - mov [mmx_size],4 - xor cl,cl - mov ch,16 - jmp avx_load_instruction_38 -avx_broadcastsd_instruction: + cmp ah,16 + ja avx_movddup_size_ok mov [mmx_size],8 - mov cl,32 - mov ch,16 - jmp avx_load_instruction_38 -avx_pbroadcastb_instruction: - mov [mmx_size],1 - jmp avx_pbroadcast_instruction -avx_pbroadcastw_instruction: - mov [mmx_size],2 - jmp avx_pbroadcast_instruction -avx_pbroadcastd_instruction: - mov [mmx_size],4 - jmp avx_pbroadcast_instruction -avx_pbroadcastq_instruction: - mov [mmx_size],8 - avx_pbroadcast_instruction: - xor cl,cl - mov ch,16 - jmp avx_load_instruction_38 -avx_broadcastf128_instruction: - mov [mmx_size],16 - mov cl,32 - xor ch,ch - avx_load_instruction_38: - mov [opcode_prefix],66h - mov [supplemental_code],al - mov al,38h - jmp avx_load_instruction + 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 @@ -468,6 +748,7 @@ avx_movlps_instruction: cmp al,'[' jne invalid_operand call get_address + avx_movlps_mem_: mov al,[operand_size] or al,al jz avx_movlps_mem_size_ok @@ -503,120 +784,30 @@ avx_movhlps_instruction: call take_avx_register mov bl,al jmp nomem_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],1 - 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 - call take_avx_rm - jc invalid_operand - 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 - setup_66_0f_38: - mov [extended_code],38h - mov [supplemental_code],al - mov [base_code],0Fh - mov [opcode_prefix],66h - ret -avx_movd_instruction: - or [vex_required],1 - jmp movd_instruction -avx_movq_instruction: - or [vex_required],1 - jmp movq_instruction -avx_movddup_instruction: - or [vex_required],1 - mov [opcode_prefix],0F2h - 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_avx_register - mov [postbyte_register],al - mov [mmx_size],0 - cmp ah,32 - je avx_regs_size_ok - mov [mmx_size],8 - jmp avx_regs_size_ok -avx_movmskpd_instruction: - mov [opcode_prefix],66h -avx_movmskps_instruction: - mov [base_code],0Fh - mov [extended_code],50h - 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 - 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_movsd_instruction: - mov [opcode_prefix],0F2h - mov [mmx_size],8 + mov al,0F2h + mov cl,8 + or [rex_prefix],80h jmp avx_movs_instruction avx_movss_instruction: - mov [opcode_prefix],0F3h - mov [mmx_size],4 + 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_movlps_mem + jne avx_movs_mem lods byte [esi] - call convert_xmm_register + 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] @@ -651,15 +842,703 @@ avx_movss_instruction: 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_cvtdq2pd_instruction: +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 -avx_cvtps2pd_instruction: + 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 + or [vex_required],2 + mov cl,16 + mov al,44h + jmp avx_instruction_3a + +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 + 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 +vldmxcsr_instruction: + or [vex_required],2 + jmp fxsave_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 @@ -667,205 +1546,573 @@ avx_cvtps2pd_instruction: xchg cl,[operand_size] lods byte [esi] call get_size_operator - cmp al,10h - jne avx_cvtdq2pd_reg_mem - lods byte [esi] - call convert_xmm_register - mov bl,al - mov [operand_size],cl - jmp nomem_instruction_ready - avx_cvtdq2pd_reg_mem: cmp al,'[' + je avx_shift_reg_mem + mov [operand_size],cl + cmp al,10h jne invalid_operand - mov [mmx_size],cl - call get_address - mov al,[mmx_size] - mov ah,al - xchg al,[operand_size] - or al,al - jz instruction_ready - shl al,1 - cmp al,ah - jne invalid_operand_size - jmp instruction_ready -avx_cvtpd2dq_instruction: - mov [opcode_prefix],0F2h - jmp avx_cvtpd_instruction -avx_cvtpd2ps_instruction: - mov [opcode_prefix],66h - avx_cvtpd_instruction: - mov [base_code],0Fh - mov [extended_code],al - or [vex_required],1 - call take_avx_register - mov [postbyte_register],al - cmp ah,16 - jne invalid_operand + lods byte [esi] + call convert_avx_register + mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand - mov [operand_size],0 + push esi + xor cl,cl + xchg cl,[operand_size] lods byte [esi] call get_size_operator cmp al,10h - jne avx_cvtpd2dq_reg_mem + 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 nomem_instruction_ready - avx_cvtpd2dq_reg_mem: + 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 - mov al,[operand_size] + pop eax + xchg al,[operand_size] or al,al - jz operand_size_not_specified - cmp al,16 - je instruction_ready - cmp al,32 + jz instruction_ready + cmp al,[mmx_size] jne invalid_operand_size jmp instruction_ready -avx_cvttps2dq_instruction: - or [vex_required],2 - mov [opcode_prefix],0F3h - mov [mmx_size],0 - jmp avx_instruction -avx_cvtsd2si_instruction: - or [vex_required],1 - jmp cvtsd2si_instruction -avx_cvtss2si_instruction: - or [vex_required],1 - jmp cvtss2si_instruction -avx_cvtsi2ss_instruction: - mov [opcode_prefix],0F3h - jmp avx_cvtsi_instruction -avx_cvtsi2sd_instruction: - mov [opcode_prefix],0F2h - avx_cvtsi_instruction: - mov [base_code],0Fh - mov [extended_code],al - or [vex_required],1 - call take_avx_register + 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 - mov [postbyte_register],al + 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 [vex_register],al - jmp cvtsi_xmmreg + 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_extractf128_instruction: +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 + 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_extractf128_reg + je avx_extractf_reg cmp al,'[' jne invalid_operand call get_address xor al,al xchg al,[operand_size] or al,al - jz avx_extractf128_mem_size_ok - cmp al,16 + jz avx_extractf_mem_size_ok + cmp al,[mmx_size] jne invalid_operand_size - avx_extractf128_mem_size_ok: + avx_extractf_mem_size_ok: + call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register - cmp ah,32 - jne invalid_operand_size + cmp ah,[mmx_size] + jbe invalid_operand_size mov [postbyte_register],al jmp mmx_imm8 - avx_extractf128_reg: + avx_extractf_reg: lods byte [esi] - call convert_xmm_register + 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 - call take_avx_register - cmp ah,32 - jne invalid_operand_size - mov [postbyte_register],al - pop ebx - 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 -avx_insertf128_instruction: - or [vex_required],1 - call setup_66_0f_3a - call take_avx_register - cmp ah,32 - jne invalid_operand - mov [postbyte_register],al lods byte [esi] - cmp al,',' + call get_size_operator + cmp al,10h + je avx_insertf_reg_reg_reg + cmp al,'[' jne invalid_operand - call take_avx_register - mov [vex_register],al - mov [operand_size],0 - mov [mmx_size],16 + call get_address + pop eax + mov [operand_size],al + jmp mmx_imm8 + avx_insertf_reg_reg_reg: lods byte [esi] - cmp al,',' - jne invalid_operand - call take_avx_rm - mov [operand_size],32 - jnc mmx_imm8 + call convert_avx_register mov bl,al + pop eax + mov [operand_size],al jmp mmx_nomem_imm8 -avx_extractps_instruction: +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 - jmp extractps_instruction -avx_insertps_instruction: - or [vex_required],1 - call take_avx_register + 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 - call take_avx_register - mov [vex_register],al - jmp insertps_xmmreg -avx_pextrb_instruction: - or [vex_required],1 - jmp pextrb_instruction -avx_pextrw_instruction: - or [vex_required],1 - jmp pextrw_instruction -avx_pextrd_instruction: - or [vex_required],1 - jmp pextrd_instruction -avx_pextrq_instruction: - or [vex_required],1 - jmp pextrq_instruction + 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 [mmx_size],1 - or [vex_required],1 + mov cl,1 jmp avx_pinsr_instruction_3a avx_pinsrw_instruction: - mov [mmx_size],2 - or [vex_required],1 + mov cl,2 jmp avx_pinsr_instruction avx_pinsrd_instruction: - mov [mmx_size],4 - or [vex_required],1 + mov cl,4 jmp avx_pinsr_instruction_3a avx_pinsrq_instruction: - mov [mmx_size],8 - or [vex_required],1 - call operand_64bit + mov cl,8 + or [rex_prefix],8 avx_pinsr_instruction_3a: mov [supplemental_code],al mov al,3Ah @@ -873,6 +2120,8 @@ avx_pinsrq_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 @@ -883,11 +2132,375 @@ avx_pinsrq_instruction: call take_avx_register mov [vex_register],al jmp pinsr_xmmreg -avx_maskmovdqu_instruction: + +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 + 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] + 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],1 + or [vex_required],2 mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],al @@ -912,242 +2525,171 @@ avx_pmovmskb_instruction: call take_avx_register mov bl,al jmp nomem_instruction_ready -avx_pshufd_instruction: - or [vex_required],1 - mov [mmx_size],0 - mov [opcode_prefix],al - mov [base_code],0Fh - mov [extended_code],70h + +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 - call take_avx_rm - jnc mmx_imm8 - mov bl,al - jmp mmx_nomem_imm8 - -avx_pmovsxbw_instruction: - mov [mmx_size],8 - jmp avx_pmovsx_instruction -avx_pmovsxbd_instruction: - mov [mmx_size],4 - jmp avx_pmovsx_instruction -avx_pmovsxbq_instruction: - mov [mmx_size],2 - jmp avx_pmovsx_instruction -avx_pmovsxwd_instruction: - mov [mmx_size],8 - jmp avx_pmovsx_instruction -avx_pmovsxwq_instruction: - mov [mmx_size],4 - jmp avx_pmovsx_instruction -avx_pmovsxdq_instruction: - mov [mmx_size],8 - avx_pmovsx_instruction: - or [vex_required],1 - call setup_66_0f_38 + 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 - mov [postbyte_register],al + 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,10h - je avx_pmovsx_xmmreg_reg cmp al,'[' - jne invalid_operand + jne invalid_argument call get_address - pop eax - cmp al,32 - jb avx_pmovsx_size_check - shl [mmx_size],1 - avx_pmovsx_size_check: - xchg al,[operand_size] - test al,al - jz instruction_ready - cmp al,[mmx_size] + 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 - avx_pmovsx_xmmreg_reg: - lods byte [esi] - call convert_xmm_register - mov bl,al - pop eax - mov [operand_size],al - jmp nomem_instruction_ready -avx_permil_instruction: - call setup_66_0f_3a - 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,'[' - je avx_permil_reg_mem - 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 - xchg cl,[operand_size] - pop esi - cmp al,'[' - je avx_permil_reg_reg_mem - cmp al,10h - jne avx_permil_reg_reg_imm8 - call take_avx_register - mov bl,al - mov [extended_code],38h - add [supplemental_code],8 - jmp nomem_instruction_ready - avx_permil_reg_reg_mem: - lods byte [esi] - call get_size_operator - call get_address - mov [extended_code],38h - add [supplemental_code],8 - jmp instruction_ready - avx_permil_reg_reg_imm8: - dec esi - xor bl,bl - xchg bl,[vex_register] - jmp mmx_nomem_imm8 - avx_permil_reg_mem: - call get_address - jmp mmx_imm8 -avx_bit_shift_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],al - or [vex_required],1 - call take_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 - push esi - xor cl,cl - xchg cl,[operand_size] - lods byte [esi] - call get_size_operator - cmp al,10h - je avx_bit_shift_regs_reg - pop esi - cmp al,'[' - je avx_bit_shift_regs_mem - xchg cl,[operand_size] - dec esi - 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] - xchg bl,[vex_register] - jmp mmx_nomem_imm8 - avx_bit_shift_regs_reg: - pop eax - lods byte [esi] - call convert_xmm_register - xchg cl,[operand_size] - mov bl,al - jmp nomem_instruction_ready - avx_bit_shift_regs_mem: - 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_pslldq_instruction: - mov [postbyte_register],al - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],73h - or [vex_required],1 - call take_avx_register - mov [vex_register],al - lods byte [esi] - cmp al,',' - jne invalid_operand - call take_avx_register - mov bl,al - jmp mmx_nomem_imm8 - -vzeroall_instruction: - mov [operand_size],32 -vzeroupper_instruction: - mov [base_code],0Fh - mov [extended_code],al - or [vex_required],1 - call store_instruction_code - jmp instruction_assembled -vldmxcsr_instruction: - or [vex_required],1 - jmp fxsave_instruction -vcvtph2ps_instruction: - mov [opcode_prefix],66h - mov [supplemental_code],al - mov al,38h - jmp avx_cvtps2pd_instruction -vcvtps2ph_instruction: - call setup_66_0f_3a - or [vex_required],1 - lods byte [esi] - call get_size_operator - cmp al,10h - je vcvtps2ph_reg - cmp al,'[' - jne invalid_operand - call get_address - lods byte [esi] - cmp al,',' - jne invalid_operand - shl [operand_size],1 - call take_avx_register - mov [postbyte_register],al - jmp mmx_imm8 - vcvtps2ph_reg: - lods byte [esi] - call convert_xmm_register - mov bl,al - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - call take_avx_register - mov [postbyte_register],al - jmp mmx_nomem_imm8 bmi_instruction: mov [base_code],0Fh @@ -1155,7 +2697,7 @@ bmi_instruction: mov [supplemental_code],0F3h mov [postbyte_register],al bmi_reg: - or [vex_required],1 + or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h @@ -1201,7 +2743,7 @@ andn_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al - or [vex_required],1 + or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h @@ -1225,7 +2767,7 @@ bzhi_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al - or [vex_required],1 + or [vex_required],2 call get_reg_mem jc bzhi_reg_reg call get_vex_source_register @@ -1257,7 +2799,7 @@ bextr_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al - or [vex_required],1 + or [vex_required],2 call get_reg_mem jc bextr_reg_reg call get_vex_source_register @@ -1300,7 +2842,7 @@ rorx_instruction: mov [base_code],0Fh mov [extended_code],3Ah mov [supplemental_code],al - or [vex_required],1 + or [vex_required],2 call get_reg_mem jc rorx_reg_reg call operand_32or64 @@ -1309,49 +2851,101 @@ rorx_instruction: call operand_32or64 jmp mmx_nomem_imm8 -fma_instruction_pd: - or [rex_prefix],8 -fma_instruction_ps: - mov [mmx_size],0 - jmp avx_instruction_38_setup -fma_instruction_sd: - or [rex_prefix],8 - mov [mmx_size],8 - jmp avx_instruction_38_setup -fma_instruction_ss: - mov [mmx_size],4 - jmp avx_instruction_38_setup +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 -fma4_instruction_p: - mov [mmx_size],0 - jmp fma4_instruction_setup -fma4_instruction_sd: - mov [mmx_size],8 - jmp fma4_instruction_setup -fma4_instruction_ss: - mov [mmx_size],4 - fma4_instruction_setup: - mov [immediate_size],-2 - mov byte [value],0 - jmp avx_instruction_3a_setup +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 [vex_required],2 + or [operand_flags],2 mov [mmx_size],8 jmp xop_instruction_9 xop_single_source_ss_instruction: - or [vex_required],2 + or [operand_flags],2 mov [mmx_size],4 jmp xop_instruction_9 xop_single_source_instruction: - or [vex_required],2 + or [operand_flags],2 mov [mmx_size],0 xop_instruction_9: mov [base_code],al mov [xop_opcode_map],9 - jmp avx_common + jmp avx_xop_common xop_single_source_128bit_instruction: - or [vex_required],2 + or [operand_flags],2 mov [mmx_size],16 jmp xop_instruction_9 xop_triple_source_128bit_instruction: @@ -1366,7 +2960,7 @@ xop_128bit_instruction: xop_instruction_8: mov [base_code],al mov [xop_opcode_map],8 - jmp avx_common + jmp avx_xop_common xop_pcom_b_instruction: mov ah,0CCh jmp xop_pcom_instruction @@ -1392,21 +2986,22 @@ 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_common + jmp avx_xop_common vpcmov_instruction: - or [vex_required],1 + 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_common + jmp avx_xop_common xop_shift_instruction: mov [base_code],al - or [vex_required],1 + or [vex_required],2 mov [xop_opcode_map],9 call take_avx_register cmp ah,16 @@ -1482,176 +3077,9 @@ xop_shift_instruction: dec esi jmp mmx_imm8 -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: - mov [base_code],0Fh - mov [supplemental_code],al - mov al,3Ah - mov [mmx_size],0 - jmp avx_instruction - -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],1 - 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],1 - 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 - -gather_instruction_pd: - or [rex_prefix],8 -gather_instruction_ps: - call setup_66_0f_38 - or [vex_required],4 - call take_avx_register - mov [postbyte_register],al - 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] - test al,al - jz gather_elements_size_ok - test [rex_prefix],8 - jnz gather_elements_64bit - cmp al,4 - jne invalid_operand_size - jmp gather_elements_size_ok - gather_elements_64bit: - cmp al,8 - jne invalid_operand_size - gather_elements_size_ok: - lods byte [esi] - cmp al,',' - jne invalid_operand - call take_avx_register - mov [vex_register],al - cmp al,[postbyte_register] - je disallowed_combination_of_registers - mov al,bl - and al,1111b - cmp al,[postbyte_register] - je disallowed_combination_of_registers - cmp al,[vex_register] - je disallowed_combination_of_registers - mov al,bl - shr al,4 - cmp al,0Ch - je gather_vr_128bit - mov al,[rex_prefix] - shr al,3 - xor al,[supplemental_code] - test al,1 - jz gather_256bit - test [supplemental_code],1 - jz invalid_operand_size - mov al,32 - xchg al,[operand_size] - cmp al,16 - jne invalid_operand_size - jmp instruction_ready - gather_256bit: - cmp ah,32 - jne invalid_operand_size - jmp instruction_ready - gather_vr_128bit: - cmp ah,16 - je instruction_ready - test [supplemental_code],1 - jnz invalid_operand_size - test [rex_prefix],8 - jz invalid_operand_size - jmp instruction_ready +set_evex_mode: + mov [evex_mode],al + jmp instruction_assembled take_avx_register: lods byte [esi] @@ -1661,21 +3089,58 @@ take_avx_register: lods byte [esi] convert_avx_register: mov ah,al - and al,0Fh - and ah,0F0h - sub ah,0B0h - jbe invalid_operand - cmp ah,32 - ja invalid_operand + 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 @@ -1699,9 +3164,9 @@ store_vex_instruction_code: ret get_vex_lpp_bits: cmp [operand_size],32 - jne vex_l_bit_ok + jne get_vex_pp_bits or al,100b - vex_l_bit_ok: + get_vex_pp_bits: mov ah,[opcode_prefix] cmp ah,66h je vex_66 @@ -1785,3 +3250,106 @@ store_xop_instruction_code: 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/programs/develop/fasm/trunk/errors.inc b/programs/develop/fasm/trunk/errors.inc index 3dce8d7a5d..ee0522df03 100644 --- a/programs/develop/fasm/trunk/errors.inc +++ b/programs/develop/fasm/trunk/errors.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. out_of_memory: @@ -24,6 +24,9 @@ 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 diff --git a/programs/develop/fasm/trunk/exprcalc.inc b/programs/develop/fasm/trunk/exprcalc.inc index 23f10045d4..f3f32b4bbd 100644 --- a/programs/develop/fasm/trunk/exprcalc.inc +++ b/programs/develop/fasm/trunk/exprcalc.inc @@ -1,7 +1,6 @@ - ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. calculate_expression: @@ -12,6 +11,10 @@ calculate_expression: 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 @@ -36,12 +39,16 @@ calculate_expression: sub edi,14h mov ebx,edi sub ebx,14h - cmp al,0E0h + cmp al,0F0h je calculate_rva - cmp al,0E1h + 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] @@ -197,14 +204,8 @@ calculate_expression: mov al,[ebx+10] or al,al jz calculation_loop - cmp [size_override],-1 - je calculation_loop - cmp [size_override],0 - je check_size - cmp [operand_size],0 - jne calculation_loop - mov [operand_size],al - jmp calculation_loop + test [operand_flags],1 + jnz calculation_loop check_size: xchg [operand_size],al or al,al @@ -623,76 +624,6 @@ calculate_expression: xor [ebx],eax xor [ebx+4],edx xor [ebx+13],cl - jz calculation_loop - or cl,cl - jz xor_size_check - xor eax,[ebx] - xor edx,[ebx+4] - xor_size_check: - mov cl,[value_size] - cmp cl,1 - je xor_byte_result - cmp cl,2 - je xor_word_result - cmp cl,4 - je xor_dword_result - cmp cl,6 - je xor_pword_result - cmp cl,8 - jne calculation_loop - xor edx,[ebx+4] - js xor_result_truncated - jmp calculation_loop - xor_pword_result: - test edx,0FFFF0000h - jnz calculation_loop - cmp word [ebx+6],-1 - jne calculation_loop - xor dx,[ebx+4] - jns calculation_loop - not word [ebx+6] - jmp xor_result_truncated - xor_dword_result: - test edx,edx - jnz calculation_loop - cmp dword [ebx+4],-1 - jne calculation_loop - xor eax,[ebx] - jns calculation_loop - not dword [ebx+4] - jmp xor_result_truncated - xor_word_result: - test edx,edx - jnz calculation_loop - test eax,0FFFF0000h - jnz calculation_loop - cmp dword [ebx+4],-1 - jne calculation_loop - cmp word [ebx+2],-1 - jne calculation_loop - xor ax,[ebx] - jns calculation_loop - not dword [ebx+4] - not word [ebx+2] - jmp xor_result_truncated - xor_byte_result: - test edx,edx - jnz calculation_loop - test eax,0FFFFFF00h - jnz calculation_loop - cmp dword [ebx+4],-1 - jne calculation_loop - cmp word [ebx+2],-1 - jne calculation_loop - cmp byte [ebx+1],-1 - jne calculation_loop - xor al,[ebx] - jns calculation_loop - not dword [ebx+4] - not word [ebx+2] - not byte [ebx+1] - xor_result_truncated: - mov byte [ebx+13],0 jmp calculation_loop shr_negative: mov byte [edi+13],0 @@ -761,25 +692,6 @@ calculate_expression: calculate_shr: cmp byte [edi+13],0 jne shr_negative - cmp byte [ebx+13],0 - je do_shr - mov al,[value_size] - cmp al,1 - je shr_negative_byte - cmp al,2 - je shr_negative_word - cmp al,4 - je shr_negative_dword - cmp al,6 - je shr_negative_pword - cmp al,8 - jne do_shr - shr_negative_qword: - test byte [ebx+7],80h - jz do_shr - shr_truncated: - mov byte [ebx+13],0 - do_shr: mov edx,[ebx+4] mov eax,[ebx] cmp dword [edi+4],0 @@ -809,43 +721,6 @@ calculate_expression: mov dword [ebx],eax mov dword [ebx+4],eax jmp calculation_loop - shr_negative_byte: - cmp dword [ebx+4],-1 - jne do_shr - cmp word [ebx+2],-1 - jne do_shr - cmp byte [ebx+1],-1 - jne do_shr - test byte [ebx],80h - jz do_shr - not dword [ebx+4] - not word [ebx+2] - not byte [ebx+1] - jmp shr_truncated - shr_negative_word: - cmp dword [ebx+4],-1 - jne do_shr - cmp word [ebx+2],-1 - jne do_shr - test byte [ebx+1],80h - jz do_shr - not dword [ebx+4] - not word [ebx+2] - jmp shr_truncated - shr_negative_dword: - cmp dword [ebx+4],-1 - jne do_shr - test byte [ebx+3],80h - jz do_shr - not dword [ebx+4] - jmp shr_truncated - shr_negative_pword: - cmp word [ebx+6],-1 - jne do_shr - test byte [ebx+5],80h - jz do_shr - not word [ebx+6] - jmp shr_truncated calculate_not: cmp word [edi+8],0 jne invalid_expression @@ -853,56 +728,53 @@ calculate_expression: je not_ok call recoverable_misuse not_ok: - mov al,[value_size] - cmp al,1 - je not_byte - cmp al,2 - je not_word - cmp al,4 - je not_dword - cmp al,6 - je not_pword - cmp al,8 - je not_qword not dword [edi] not dword [edi+4] not byte [edi+13] add edi,14h jmp calculation_loop - not_qword: - not dword [edi] - not dword [edi+4] - finish_not: - mov byte [edi+13],0 + 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 - not_byte: - cmp dword [edi+4],0 - jne not_qword - cmp word [edi+2],0 - jne not_qword - cmp byte [edi+1],0 - jne not_qword - not byte [edi] - jmp finish_not - not_word: - cmp dword [edi+4],0 - jne not_qword - cmp word [edi+2],0 - jne not_qword - not word [edi] - jmp finish_not - not_dword: - cmp dword [edi+4],0 - jne not_qword - not dword [edi] - jmp finish_not - not_pword: - cmp word [edi+6],0 - jne not_qword - not word [edi+4] - not dword [edi] - jmp finish_not calculate_neg: cmp byte [edi+8],0 je neg_first_register_ok @@ -1158,7 +1030,8 @@ calculate_expression: cmp al,4 je convert_fp_dword test al,not 8 - jnz invalid_value + jz convert_fp_qword + call recoverable_misuse convert_fp_qword: xor eax,eax xor edx,edx @@ -1194,7 +1067,7 @@ calculate_expression: cmp cx,52 ja value_out_of_range cmp cx,32 - jbe fp_qword_small_shift + jb fp_qword_small_shift sub cx,32 mov eax,edx xor edx,edx @@ -1338,7 +1211,7 @@ calculate_expression: get_byte_value: mov [value_size],1 - mov [size_override],-1 + or [operand_flags],1 call calculate_value or al,al jz check_byte_value @@ -1350,7 +1223,7 @@ get_byte_value: je byte_positive cmp edx,-1 jne range_exceeded - cmp eax,-80h + cmp eax,-100h jb range_exceeded ret byte_positive: @@ -1382,7 +1255,7 @@ get_byte_value: ret get_word_value: mov [value_size],2 - mov [size_override],-1 + or [operand_flags],1 call calculate_value cmp al,2 jb check_word_value @@ -1394,7 +1267,7 @@ get_word_value: je word_positive cmp edx,-1 jne range_exceeded - cmp eax,-8000h + cmp eax,-10000h jb range_exceeded ret word_positive: @@ -1405,7 +1278,7 @@ get_word_value: ret get_dword_value: mov [value_size],4 - mov [size_override],-1 + or [operand_flags],1 call calculate_value cmp al,4 jne check_dword_value @@ -1426,8 +1299,6 @@ get_dword_value: je dword_positive cmp edx,-1 jne range_exceeded - bt eax,31 - jnc range_exceeded ret dword_positive: test edx,edx @@ -1435,7 +1306,7 @@ get_dword_value: ret get_pword_value: mov [value_size],6 - mov [size_override],-1 + or [operand_flags],1 call calculate_value cmp al,4 jne check_pword_value @@ -1445,7 +1316,7 @@ get_pword_value: mov edx,[edi+4] cmp byte [edi+13],0 je pword_positive - cmp edx,-8000h + cmp edx,-10000h jb range_exceeded ret pword_positive: @@ -1454,20 +1325,15 @@ get_pword_value: ret get_qword_value: mov [value_size],8 - mov [size_override],-1 + or [operand_flags],1 call calculate_value check_qword_value: mov eax,[edi] mov edx,[edi+4] - cmp byte [edi+13],0 - je qword_positive - cmp edx,-80000000h - jb range_exceeded - qword_positive: ret get_count_value: mov [value_size],8 - mov [size_override],-1 + or [operand_flags],1 call calculate_expression cmp word [edi+8],0 jne invalid_value @@ -1636,33 +1502,31 @@ get_address_value: mov ax,bx shr ah,4 shr al,4 - cmp ah,0Ch - je check_vsib_address - cmp ah,0Dh - je check_vsib_address - cmp al,0Ch - je check_vsib_address - cmp al,0Dh - je check_vsib_address or bh,bh jz check_address_registers or bl,bl jz check_address_registers cmp al,ah - jne invalid_address + 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 address_sizes_do_not_match + jne invalid_address address_registers_sizes_ok: cmp al,4 je sib_allowed cmp al,8 je sib_allowed - cmp al,0Fh + cmp al,9 je check_ip_relative_address cmp cl,1 ja invalid_address @@ -1679,13 +1543,15 @@ get_address_value: check_ip_relative_address: or bl,bl jnz invalid_address - cmp bh,0F8h + cmp bh,98h je check_rip_relative_address - cmp bh,0F4h + cmp bh,94h jne invalid_address cmp [free_address_range],0 - jne check_qword_value - jmp check_dword_value + je check_dword_value + mov eax,[edi] + mov edx,[edi+4] + ret check_rip_relative_address: mov eax,[edi] cdq @@ -1792,35 +1658,41 @@ get_address_value: and al,cl jz check_immediate_address jmp invalid_address - check_vsib_address: - cmp ah,0Ch - je swap_vsib_registers - cmp ah,0Dh - jne check_vsib_base + 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 - check_vsib_base: - test bh,bh - jz vsib_base_ok - mov al,bh - shr al,4 - cmp al,4 - je vsib_base_ok - cmp [code_type],64 - jne invalid_address - cmp al,8 - jne invalid_address - vsib_base_ok: - mov al,bl - shr al,4 - cmp al,0Ch - je check_index_scale - cmp al,0Dh - je check_index_scale - jmp invalid_address + jmp check_vsib_base calculate_relative_offset: cmp [value_undefined],0 @@ -1912,7 +1784,7 @@ calculate_logical_expression: jmp logical_loop get_value_for_comparison: mov [value_size],8 - mov [size_override],-1 + or [operand_flags],1 lods byte [esi] call calculate_expression cmp byte [edi+8],0 @@ -1943,7 +1815,7 @@ calculate_logical_expression: negation_ok: push eax mov al,[esi] - cmp al,'{' + cmp al,91h je logical_expression cmp al,0FFh je invalid_expression @@ -1965,7 +1837,7 @@ calculate_logical_expression: jz logical_number cmp al,0Fh je logical_number - cmp al,'}' + cmp al,92h je logical_number cmp al,'&' je logical_number @@ -2124,7 +1996,7 @@ calculate_logical_expression: inc esi jmp check_expression defined_fp_value: - add esi,12 + add esi,12+1 jmp expression_checked defined_string: lods dword [esi] @@ -2206,7 +2078,7 @@ calculate_logical_expression: mov [logical_value_wrapping],dl push eax lods byte [esi] - cmp al,'}' + cmp al,92h jne invalid_expression pop eax logical_value_ok: diff --git a/programs/develop/fasm/trunk/exprpars.inc b/programs/develop/fasm/trunk/exprpars.inc index 49d77f9c23..542499333c 100644 --- a/programs/develop/fasm/trunk/exprpars.inc +++ b/programs/develop/fasm/trunk/exprpars.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. convert_expression: @@ -77,7 +77,7 @@ convert_expression: ret convert_number: - lea eax,[edi-10h] + lea eax,[edi+20h] mov edx,[memory_end] cmp [source_start],0 je check_memory_for_number @@ -129,7 +129,11 @@ convert_number: pop [current_offset] lods byte [esi] cmp al,')' - jne invalid_expression + je subexpression_closed + dec esi + mov al,'!' + stosb + subexpression_closed: ret symbol_value: cmp [source_start],0 @@ -147,16 +151,13 @@ convert_number: 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 ah,0Dh - je register_value - cmp ah,0Fh - je register_value - cmp ah,2 - jne no_address_register cmp al,23h je register_value cmp al,25h @@ -912,7 +913,7 @@ preevaluate_logical_expression: je preevaluate_or cmp dl,'&' je preevaluate_and - cmp dl,'}' + cmp dl,92h je preevaluation_done or dl,dl jnz invalid_logical_expression @@ -987,7 +988,7 @@ preevaluate_logical_expression: jmp skip_logical_value negation_skipped: mov al,[esi] - cmp al,'{' + cmp al,91h jne skip_simple_logical_value inc esi xchg al,[logical_value_wrapping] @@ -1003,7 +1004,7 @@ preevaluate_logical_expression: je skip_logical_expression cmp al,'&' je skip_logical_expression - cmp al,'}' + cmp al,92h jne wrongly_structured_logical_expression pop eax mov [logical_value_wrapping],al @@ -1026,13 +1027,13 @@ preevaluate_logical_expression: je logical_value_skipped cmp al,'&' je logical_value_skipped - cmp al,'{' + cmp al,91h je skip_logical_value_internal_parenthesis - cmp al,'}' + cmp al,92h jne skip_logical_value_symbol sub [logical_value_parentheses],1 jnc skip_logical_value_symbol - cmp [logical_value_wrapping],'{' + cmp [logical_value_wrapping],91h jne skip_logical_value_symbol jmp logical_value_skipped skip_logical_value_internal_parenthesis: @@ -1049,7 +1050,7 @@ preevaluate_logical_expression: jmp preevaluate_negation preevaluate_negation_ok: mov ebx,esi - cmp byte [esi],'{' + cmp byte [esi],91h jne preevaluate_simple_logical_value lods byte [esi] stos byte [edi] @@ -1062,7 +1063,7 @@ preevaluate_logical_expression: pop ebp cmp al,0FFh je invalid_logical_value - cmp byte [esi],'}' + cmp byte [esi],92h jne invalid_logical_value or al,al jnz preevaluated_expression_value @@ -1089,9 +1090,9 @@ preevaluate_logical_expression: mov al,[esi] or al,al jz logical_value_boundaries_found - cmp al,'{' + cmp al,91h je logical_value_internal_parentheses - cmp al,'}' + cmp al,92h je logical_value_boundaries_parenthesis_close cmp al,'|' je logical_value_boundaries_found @@ -1116,7 +1117,7 @@ preevaluate_logical_expression: logical_value_boundaries_parenthesis_close: sub [logical_value_parentheses],1 jnc next_symbol_in_logical_value - cmp [logical_value_wrapping],'{' + cmp [logical_value_wrapping],91h jne next_symbol_in_logical_value logical_value_boundaries_found: or edx,edx diff --git a/programs/develop/fasm/trunk/formats.inc b/programs/develop/fasm/trunk/formats.inc index f526f02445..13c42b4b53 100644 --- a/programs/develop/fasm/trunk/formats.inc +++ b/programs/develop/fasm/trunk/formats.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. formatter: @@ -454,7 +454,8 @@ format_mz: jmp format_defined mark_mz_relocation: push eax ebx - inc [number_of_relocations] + inc word [number_of_relocations] + jz format_limitations_exceeded mov ebx,[free_additional_memory] mov eax,edi sub eax,[code_start] @@ -1611,6 +1612,7 @@ make_pe_fixups: 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: @@ -1645,6 +1647,7 @@ make_pe_fixups: loop make_fixup fixups_done: mov [last_fixup_base],edx + mov [last_fixup_header],ebx pop esi mov eax,edi sub eax,ebp @@ -3491,8 +3494,22 @@ elf_formatter: 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 diff --git a/programs/develop/fasm/trunk/messages.inc b/programs/develop/fasm/trunk/messages.inc index 4ef4148c76..04ae451ec3 100644 --- a/programs/develop/fasm/trunk/messages.inc +++ b/programs/develop/fasm/trunk/messages.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. _out_of_memory db 'out of memory',0 diff --git a/programs/develop/fasm/trunk/parser.inc b/programs/develop/fasm/trunk/parser.inc index 0b6ca8f1fd..f72b2a8ca0 100644 --- a/programs/develop/fasm/trunk/parser.inc +++ b/programs/develop/fasm/trunk/parser.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. parser: @@ -34,6 +34,7 @@ parser: add esi,16 parse_line: mov [formatter_symbols_allowed],0 + mov [decorator_symbols_allowed],0 cmp byte [esi],1Ah jne empty_instruction push edi @@ -529,15 +530,20 @@ parse_line_contents: cmp al,']' je separator cmp al,'{' - je unallowed_character + je open_decorator cmp al,'}' - je unallowed_character + 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 @@ -825,7 +831,7 @@ parse_line_contents: jb stack_overflow push esi edi inc esi - mov al,'{' + mov al,91h stos byte [edi] inc [parenthesis_stack] jmp parse_argument @@ -879,10 +885,16 @@ parse_line_contents: 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] @@ -908,8 +920,9 @@ parse_line_contents: jne unknown_segment_prefix mov al,ah and ah,11110000b - cmp ah,60h + cmp ah,30h jne unknown_segment_prefix + add al,30h stos byte [edi] jmp convert_address unknown_segment_prefix: @@ -928,13 +941,19 @@ parse_line_contents: cmp byte [esi],'(' jne argument_parsed inc esi - mov al,'{' + 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,'}' + mov al,92h separator: stos byte [edi] argument_parsed: @@ -1049,7 +1068,7 @@ get_symbol: mov ecx,ebp cmp cl,11 ja no_symbol - sub cl,2 + sub cl,1 jc no_symbol movzx ebx,word [symbols+ecx*4] add ebx,symbols @@ -1070,6 +1089,8 @@ get_symbol: 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: @@ -1077,6 +1098,9 @@ get_symbol: add esi,ebp clc ret + decorator_symbol: + cmp [decorator_symbols_allowed],0 + jne symbol_ok no_symbol: pop esi mov ecx,ebp @@ -1258,7 +1282,7 @@ get_label_id: inc esi cmp byte [esi-1],'$' je get_org_origin_id - sub esi,ecx + sub esi,2 jmp find_label get_current_offset_id: xor eax,eax @@ -1363,12 +1387,12 @@ get_label_id: cmp al,30h jb name_first_char_ok cmp al,39h - jbe invalid_name + jbe numeric_name name_first_char_ok: cmp al,'$' jne check_for_reserved_word - cmp ecx,1 - jne invalid_name + numeric_name: + add esi,ecx reserved_word: mov eax,0Fh pop edi diff --git a/programs/develop/fasm/trunk/preproce.inc b/programs/develop/fasm/trunk/preproce.inc index bed1e57153..aa9e00199d 100644 --- a/programs/develop/fasm/trunk/preproce.inc +++ b/programs/develop/fasm/trunk/preproce.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. preprocessor: @@ -42,6 +42,150 @@ preprocessor: 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 @@ -78,7 +222,11 @@ preprocessor: mov [ebx],eax call use_postponed_macro pop edx - jmp process_postponed_list + 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 @@ -275,6 +423,7 @@ convert_line: jne backslashed_symbol stos byte [edi] inc byte [ecx] + jz name_too_long jmp group_backslashes no_end_quote: mov byte [ebx-5],0 @@ -896,6 +1045,8 @@ define_macro: 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,'*' @@ -904,10 +1055,13 @@ define_macro: macro_argument_end: cmp al,',' je skip_macro_arguments + cmp al,'&' + je macro_arguments_finisher cmp al,']' jne end_macro_arguments - lods byte [esi] not ebp + macro_arguments_finisher: + lods byte [esi] end_macro_arguments: or ebp,ebp jnz invalid_macro_arguments @@ -917,7 +1071,7 @@ define_macro: je found_macro_block jmp invalid_macro_arguments macro_argument_with_default_value: - or [default_argument_value],-1 + or [skip_default_argument_value],-1 call skip_macro_argument_value inc esi jmp macro_argument_end @@ -956,10 +1110,12 @@ define_macro: jz argument_value_end cmp al,',' je argument_value_end - cmp [default_argument_value],0 + 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,']' @@ -975,10 +1131,12 @@ define_macro: je argument_string cmp al,1Ah je argument_symbol - cmp [default_argument_value],0 + 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,']' @@ -1056,6 +1214,7 @@ postpone_directive: 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 @@ -1063,8 +1222,6 @@ postpone_directive: and al,0F0h or al,1 mov [macro_status],al - mov eax,[current_line] - mov [error_line],eax lods byte [esi] or al,al jz line_preprocessed @@ -1080,6 +1237,9 @@ irp_directive: 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: @@ -1555,6 +1715,8 @@ use_macro: je next_argument cmp al,']' je next_arguments_group + cmp al,'&' + je arguments_end dec esi jmp arguments_end next_argument: @@ -1575,19 +1737,50 @@ use_macro: 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 [default_argument_value],0 + 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 byte [esi],'=' - je argument_with_default_value - cmp byte [esi],'*' - jne macro_argument_ok 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 - inc esi + mov [edx+12],eax + call finish_macro_argument macro_argument_ok: ret finish_macro_argument: @@ -1602,17 +1795,6 @@ use_macro: argument_value_length_ok: mov [edx+8],ecx ret - argument_with_default_value: - inc esi - push esi - or [default_argument_value],-1 - call skip_macro_argument_value - pop eax - cmp dword [edx+8],0 - jne macro_argument_ok - mov [edx+12],eax - call finish_macro_argument - jmp macro_argument_ok arguments_end: cmp byte [ebx],0 jne invalid_macro_arguments @@ -1738,6 +1920,8 @@ do_irp: 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,'*' @@ -1749,13 +1933,17 @@ do_irp: jmp irp_parameters_start irp_with_default_value: xor ebp,ebp - or [default_argument_value],-1 + 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 @@ -1769,9 +1957,11 @@ do_irp: 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],1 - ja get_irps_parameter + cmp [base_code],2 + je get_irps_parameter mov edx,[parameters_end] mov al,[edx] push eax @@ -1822,6 +2012,70 @@ do_irp: 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 + 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 @@ -2451,6 +2705,8 @@ reverse_block: 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 diff --git a/programs/develop/fasm/trunk/symbdump.inc b/programs/develop/fasm/trunk/symbdump.inc index f8d4ec21cf..f52d9e0f7a 100644 --- a/programs/develop/fasm/trunk/symbdump.inc +++ b/programs/develop/fasm/trunk/symbdump.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. dump_symbols: diff --git a/programs/develop/fasm/trunk/tables.inc b/programs/develop/fasm/trunk/tables.inc index b5db3a2d21..18261fc997 100644 --- a/programs/develop/fasm/trunk/tables.inc +++ b/programs/develop/fasm/trunk/tables.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. include_variable db 'INCLUDE',0 @@ -17,6 +17,8 @@ preprocessor_directives: 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' @@ -62,9 +64,11 @@ operators: single_operand_operators: db 1,'+',82h db 1,'-',83h + db 3,'bsf',0E0h + db 3,'bsr',0E1h db 3,'not',0D0h - db 3,'plt',0E1h - db 3,'rva',0E0h + db 3,'plt',0F1h + db 3,'rva',0F0h db 0 directive_operators: @@ -91,6 +95,7 @@ address_sizes: 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) @@ -102,6 +107,8 @@ symbols: 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 @@ -112,50 +119,62 @@ symbols_2: db 'bx',10h,23h db 'ch',10h,05h db 'cl',10h,11h - db 'cs',10h,62h + db 'cs',10h,32h db 'cx',10h,21h db 'dh',10h,06h db 'di',10h,27h db 'dl',10h,12h - db 'ds',10h,64h + db 'ds',10h,34h db 'dx',10h,22h - db 'es',10h,61h - db 'fs',10h,65h - db 'gs',10h,66h + 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,63h + db 'ss',10h,33h db 'st',10h,0A0h symbols_3: db 'bpl',10h,15h - db 'cr0',10h,50h - db 'cr1',10h,51h - db 'cr2',10h,52h - db 'cr3',10h,53h - db 'cr4',10h,54h - db 'cr5',10h,55h - db 'cr6',10h,56h - db 'cr7',10h,57h - db 'cr8',10h,58h - db 'cr9',10h,59h + 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',10h,70h - db 'dr1',10h,71h - db 'dr2',10h,72h - db 'dr3',10h,73h - db 'dr4',10h,74h - db 'dr5',10h,75h - db 'dr6',10h,76h - db 'dr7',10h,77h - db 'dr8',10h,78h - db 'dr9',10h,79h + 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 @@ -163,7 +182,7 @@ symbols_3: db 'edi',10h,47h db 'edx',10h,42h db 'efi',1Bh,10 - db 'eip',10h,0F4h + db 'eip',10h,94h db 'elf',18h,50h db 'esi',10h,46h db 'esp',10h,44h @@ -197,9 +216,10 @@ symbols_3: db 'rcx',10h,81h db 'rdi',10h,87h db 'rdx',10h,82h - db 'rip',10h,0F8h + 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 @@ -210,32 +230,39 @@ symbols_3: db 'st5',10h,0A5h db 'st6',10h,0A6h db 'st7',10h,0A7h - db 'tr0',10h,90h - db 'tr1',10h,91h - db 'tr2',10h,92h - db 'tr3',10h,93h - db 'tr4',10h,94h - db 'tr5',10h,95h - db 'tr6',10h,96h - db 'tr7',10h,97h + 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',10h,5Ah - db 'cr11',10h,5Bh - db 'cr12',10h,5Ch - db 'cr13',10h,5Dh - db 'cr14',10h,5Eh - db 'cr15',10h,5Fh + 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',10h,7Ah - db 'dr11',10h,7Bh - db 'dr12',10h,7Ch - db 'dr13',10h,7Dh - db 'dr14',10h,7Eh - db 'dr15',10h,7Fh + 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 @@ -275,17 +302,28 @@ symbols_4: db 'xmm7',10h,0C7h db 'xmm8',10h,0C8h db 'xmm9',10h,0C9h - db 'ymm0',10h,0D0h - db 'ymm1',10h,0D1h - db 'ymm2',10h,0D2h - db 'ymm3',10h,0D3h - db 'ymm4',10h,0D4h - db 'ymm5',10h,0D5h - db 'ymm6',10h,0D6h - db 'ymm7',10h,0D7h - db 'ymm8',10h,0D8h - db 'ymm9',10h,0D9h + 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 @@ -304,14 +342,69 @@ symbols_5: 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,0DAh - db 'ymm11',10h,0DBh - db 'ymm12',10h,0DCh - db 'ymm13',10h,0DDh - db 'ymm14',10h,0DEh - db 'ymm15',10h,0DFh + 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 @@ -323,6 +416,7 @@ symbols_6: db 'static',1Dh,1 symbols_7: db 'console',1Bh,3 + db 'dqqword',11h,64 db 'dynamic',1Eh,2 db 'efiboot',1Bh,11 symbols_8: @@ -404,6 +498,8 @@ instructions_3: 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 @@ -588,11 +684,13 @@ instructions_4: db 'cdqe',98h dw simple_instruction_64bit-instruction_handler db 'clac',0CAh - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'clgi',0DDh - dw simple_vmx_instruction-instruction_handler + 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 @@ -600,9 +698,9 @@ instructions_4: db 'data',0 dw data_directive-instruction_handler db 'dppd',41h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'dpps',40h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'else',0 dw else_directive-instruction_handler db 'emms',77h @@ -679,6 +777,14 @@ instructions_4: 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 @@ -792,9 +898,9 @@ instructions_4: db 'smsw',14h dw pm_store_word_instruction-instruction_handler db 'stac',0CBh - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'stgi',0DCh - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'stos',0AAh dw stos_instruction-instruction_handler db 'test',0 @@ -804,7 +910,7 @@ instructions_4: db 'verw',5 dw pm_word_instruction-instruction_handler db 'vpor',0EBh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler db 'wait',9Bh dw simple_instruction-instruction_handler db 'xadd',0C0h @@ -812,7 +918,7 @@ instructions_4: db 'xchg',0 dw xchg_instruction-instruction_handler db 'xend',0D5h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'xlat',0D7h dw xlat_instruction-instruction_handler instructions_5: @@ -836,6 +942,14 @@ instructions_5: 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 @@ -974,6 +1088,46 @@ instructions_5: 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 @@ -1127,7 +1281,7 @@ instructions_5: db 'psubw',0F9h dw basic_mmx_instruction-instruction_handler db 'ptest',17h - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pusha',60h dw simple_instruction_except64-instruction_handler db 'pushd',4 @@ -1153,11 +1307,11 @@ instructions_5: db 'repnz',0F2h dw prefix_instruction-instruction_handler db 'retfd',0CAh - dw ret_instruction_32bit-instruction_handler + dw retf_instruction_32bit-instruction_handler db 'retfq',0CAh - dw ret_instruction_64bit-instruction_handler + dw retf_instruction_64bit-instruction_handler db 'retfw',0CAh - dw ret_instruction_16bit-instruction_handler + dw retf_instruction_16bit-instruction_handler db 'retnd',0C2h dw ret_instruction_32bit_except64-instruction_handler db 'retnq',0C2h @@ -1231,9 +1385,9 @@ instructions_5: db 'tzmsk',14h dw tbm_instruction-instruction_handler db 'vdppd',41h - dw avx_128bit_instruction_3a_imm8-instruction_handler + dw avx_128bit_instruction_3a_imm8_noevex-instruction_handler db 'vdpps',40h - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vmovd',0 dw avx_movd_instruction-instruction_handler db 'vmovq',0 @@ -1247,9 +1401,13 @@ instructions_5: db 'vorps',56h dw avx_ps_instruction-instruction_handler db 'vpand',0DBh - dw avx_pd_instruction-instruction_handler + 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-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler db 'while',0 dw while_directive-instruction_handler db 'wrmsr',30h @@ -1263,14 +1421,14 @@ instructions_5: db 'xsave',100b dw fxsave_instruction-instruction_handler db 'xtest',0D6h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler instructions_6: db 'aesdec',0DEh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'aesenc',0DCh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'aesimc',0DBh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'andnpd',55h dw sse_pd_instruction-instruction_handler db 'andnps',55h @@ -1281,6 +1439,12 @@ instructions_6: 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 'cmovae',43h dw bs_instruction-instruction_handler db 'cmovbe',46h @@ -1403,6 +1567,30 @@ instructions_6: 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 @@ -1488,35 +1676,35 @@ instructions_6: db 'pinsrw',0C4h dw pinsrw_instruction-instruction_handler db 'pmaxsb',3Ch - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pmaxsd',3Dh - dw sse4_instruction_38-instruction_handler + 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_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pmaxuw',3Eh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pminsb',38h - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pminsd',39h - dw sse4_instruction_38-instruction_handler + 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_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pminuw',3Ah - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pmuldq',28h - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pmulhw',0E5h dw basic_mmx_instruction-instruction_handler db 'pmulld',40h - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pmullw',0D5h dw basic_mmx_instruction-instruction_handler db 'popcnt',0B8h @@ -1559,12 +1747,14 @@ instructions_6: 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 'rdtscp',1 - dw rdtscp_instruction-instruction_handler + db 'rdtscp',0F9h + dw simple_instruction_0f_01-instruction_handler db 'repeat',0 dw repeat_directive-instruction_handler db 'setalc',0D6h @@ -1595,20 +1785,20 @@ instructions_6: dw sse_sd_instruction-instruction_handler db 'sqrtss',51h dw sse_ss_instruction-instruction_handler - db 'swapgs',0 + 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 'vaddpd',58h - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_er-instruction_handler db 'vaddps',58h - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_er-instruction_handler db 'vaddsd',58h - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_er-instruction_handler db 'vaddss',58h - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_er-instruction_handler db 'vandpd',54h dw avx_pd_instruction-instruction_handler db 'vandps',54h @@ -1622,33 +1812,35 @@ instructions_6: db 'vcmpss',-1 dw avx_cmp_ss_instruction-instruction_handler db 'vdivpd',5Eh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_er-instruction_handler db 'vdivps',5Eh - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_er-instruction_handler db 'vdivsd',5Eh - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_er-instruction_handler db 'vdivss',5Eh - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_er-instruction_handler db 'vlddqu',0F0h dw avx_lddqu_instruction-instruction_handler db 'vmaxpd',5Fh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_sae-instruction_handler db 'vmaxps',5Fh - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_sae-instruction_handler db 'vmaxsd',5Fh - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_sae-instruction_handler db 'vmaxss',5Fh - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_sae-instruction_handler db 'vmcall',0C1h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler + db 'vmfunc',0D4h + dw simple_instruction_0f_01-instruction_handler db 'vminpd',5Dh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_sae-instruction_handler db 'vminps',5Dh - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_sae-instruction_handler db 'vminsd',5Dh - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_sae-instruction_handler db 'vminss',5Dh - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_sae-instruction_handler db 'vmload',0DAh dw simple_svm_instruction-instruction_handler db 'vmovsd',0 @@ -1660,37 +1852,51 @@ instructions_6: db 'vmsave',0DBh dw simple_svm_instruction-instruction_handler db 'vmulpd',59h - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_er-instruction_handler db 'vmulps',59h - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_er-instruction_handler db 'vmulsd',59h - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_er-instruction_handler db 'vmulss',59h - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_er-instruction_handler db 'vmxoff',0C4h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'vpabsb',1Ch - dw avx_single_source_instruction_38-instruction_handler + dw avx_single_source_bw_instruction_38-instruction_handler db 'vpabsd',1Eh - dw avx_single_source_instruction_38-instruction_handler + 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_instruction_38-instruction_handler + dw avx_single_source_bw_instruction_38-instruction_handler db 'vpaddb',0FCh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpaddd',0FEh - dw avx_pd_instruction-instruction_handler + dw avx_d_instruction-instruction_handler db 'vpaddq',0D4h - dw avx_pd_instruction-instruction_handler + dw avx_q_instruction-instruction_handler db 'vpaddw',0FDh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler + db 'vpandd',0DBh + dw avx_d_instruction_evex-instruction_handler db 'vpandn',0DFh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler + db 'vpandq',0DBh + dw avx_q_instruction_evex-instruction_handler db 'vpavgb',0E0h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpavgw',0E3h - dw avx_pd_instruction-instruction_handler + 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 @@ -1699,12 +1905,24 @@ instructions_6: 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 @@ -1730,43 +1948,49 @@ instructions_6: db 'vpshlw',95h dw xop_shift_instruction-instruction_handler db 'vpslld',0F2h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_d_instruction-instruction_handler db 'vpsllq',0F3h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_q_instruction-instruction_handler db 'vpsllw',0F1h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_bw_instruction-instruction_handler db 'vpsrad',0E2h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_d_instruction-instruction_handler + db 'vpsraq',0E2h + dw avx_shift_q_instruction_evex-instruction_handler db 'vpsraw',0E1h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_bw_instruction-instruction_handler db 'vpsrld',0D2h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_d_instruction-instruction_handler db 'vpsrlq',0D3h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_q_instruction-instruction_handler db 'vpsrlw',0D1h - dw avx_bit_shift_instruction-instruction_handler + dw avx_shift_bw_instruction-instruction_handler db 'vpsubb',0F8h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpsubd',0FAh - dw avx_pd_instruction-instruction_handler + dw avx_d_instruction-instruction_handler db 'vpsubq',0FBh - dw avx_pd_instruction-instruction_handler + dw avx_q_instruction-instruction_handler db 'vpsubw',0F9h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vptest',17h - dw avx_single_source_instruction_38-instruction_handler + 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-instruction_handler + dw avx_single_source_ps_instruction_noevex-instruction_handler db 'vrcpss',53h - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_noevex-instruction_handler db 'vsubpd',5Ch - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_er-instruction_handler db 'vsubps',5Ch - dw avx_ps_instruction-instruction_handler + dw avx_ps_instruction_er-instruction_handler db 'vsubsd',5Ch - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_er-instruction_handler db 'vsubss',5Ch - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_er-instruction_handler db 'vxorpd',57h dw avx_pd_instruction-instruction_handler db 'vxorps',57h @@ -1775,23 +1999,25 @@ instructions_6: 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 'xabort',0 dw xabort_instruction-instruction_handler db 'xbegin',0 dw xbegin_instruction-instruction_handler db 'xgetbv',0D0h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'xrstor',101b dw fxsave_instruction-instruction_handler db 'xsetbv',0D1h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler instructions_7: db 'blcfill',11h dw tbm_instruction-instruction_handler db 'blendpd',0Dh - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'blendps',0Ch - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'blsfill',12h dw tbm_instruction-instruction_handler db 'clflush',111b @@ -1921,7 +2147,7 @@ instructions_7: db 'movq2dq',0 dw movq2dq_instruction-instruction_handler db 'mpsadbw',42h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'paddusb',0DCh dw basic_mmx_instruction-instruction_handler db 'paddusw',0DDh @@ -1931,13 +2157,13 @@ instructions_7: db 'pavgusb',0BFh dw amd3dnow_instruction-instruction_handler db 'pblendw',0Eh - dw sse4_instruction_3a_imm8-instruction_handler + 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_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'pcmpeqw',75h dw basic_mmx_instruction-instruction_handler db 'pcmpgtb',64h @@ -1945,9 +2171,11 @@ instructions_7: db 'pcmpgtd',66h dw basic_mmx_instruction-instruction_handler db 'pcmpgtq',37h - dw sse4_instruction_38-instruction_handler + 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 'pfcmpeq',0B0h dw amd3dnow_instruction-instruction_handler db 'pfcmpge',90h @@ -1979,13 +2207,13 @@ instructions_7: db 'psubusw',0D9h dw basic_mmx_instruction-instruction_handler db 'roundpd',9 - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'roundps',8 - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'roundsd',0Bh - dw sse4_sd_instruction_3a_imm8-instruction_handler + dw sse4_sd_instruction_66_3a_imm8-instruction_handler db 'roundss',0Ah - dw sse4_ss_instruction_3a_imm8-instruction_handler + dw sse4_ss_instruction_66_3a_imm8-instruction_handler db 'rsqrtps',52h dw sse_ps_instruction-instruction_handler db 'rsqrtss',52h @@ -2007,11 +2235,15 @@ instructions_7: db 'ucomiss',2Eh dw comiss_instruction-instruction_handler db 'vaesdec',0DEh - dw avx_128bit_instruction_38-instruction_handler + dw avx_128bit_instruction_38_noevex-instruction_handler db 'vaesenc',0DCh - dw avx_128bit_instruction_38-instruction_handler + dw avx_128bit_instruction_38_noevex-instruction_handler db 'vaesimc',0DBh - dw avx_single_source_128bit_instruction_38-instruction_handler + 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 @@ -2020,6 +2252,10 @@ instructions_7: 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 @@ -2029,25 +2265,25 @@ instructions_7: db 'vfrczss',82h dw xop_single_source_ss_instruction-instruction_handler db 'vhaddpd',07Ch - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler db 'vhaddps',07Ch - dw avx_haddps_instruction-instruction_handler + dw avx_ps_instruction_noevex-instruction_handler db 'vhsubpd',07Dh - dw avx_pd_instruction-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler db 'vhsubps',07Dh - dw avx_haddps_instruction-instruction_handler + 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_vmx_instruction-instruction_handler + 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_movpd_instruction-instruction_handler + dw avx_movdqa_instruction-instruction_handler db 'vmovdqu',6Fh dw avx_movdqu_instruction-instruction_handler db 'vmovhpd',16h @@ -2069,9 +2305,21 @@ instructions_7: db 'vmwrite',0 dw vmwrite_instruction-instruction_handler db 'vpaddsb',0ECh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpaddsw',0EDh - dw avx_pd_instruction-instruction_handler + 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 @@ -2085,21 +2333,21 @@ instructions_7: db 'vpermps',16h dw avx_permd_instruction-instruction_handler db 'vpextrb',14h - dw avx_pextrb_instruction-instruction_handler + dw avx_extract_b_instruction-instruction_handler db 'vpextrd',16h - dw avx_pextrd_instruction-instruction_handler + dw avx_extract_d_instruction-instruction_handler db 'vpextrq',16h - dw avx_pextrq_instruction-instruction_handler + dw avx_extract_q_instruction-instruction_handler db 'vpextrw',15h - dw avx_pextrw_instruction-instruction_handler + dw avx_extract_w_instruction-instruction_handler db 'vphaddd',2 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vphaddw',1 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vphsubd',6 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vphsubw',5 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vpinsrb',20h dw avx_pinsrb_instruction-instruction_handler db 'vpinsrd',22h @@ -2109,83 +2357,121 @@ instructions_7: db 'vpinsrw',0C4h dw avx_pinsrw_instruction-instruction_handler db 'vpmaxsb',3Ch - dw avx_instruction_38-instruction_handler + dw avx_bw_instruction_38-instruction_handler db 'vpmaxsd',3Dh - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler + db 'vpmaxsq',3Dh + dw avx_q_instruction_38_evex-instruction_handler db 'vpmaxsw',0EEh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpmaxub',0DEh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpmaxud',3Fh - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler + db 'vpmaxuq',3Fh + dw avx_q_instruction_38_evex-instruction_handler db 'vpmaxuw',3Eh - dw avx_instruction_38-instruction_handler + dw avx_bw_instruction_38-instruction_handler db 'vpminsb',38h - dw avx_instruction_38-instruction_handler + dw avx_bw_instruction_38-instruction_handler db 'vpminsd',39h - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler + db 'vpminsq',39h + dw avx_q_instruction_38_evex-instruction_handler db 'vpminsw',0EAh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpminub',0DAh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpminud',3Bh - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler + db 'vpminuq',3Bh + dw avx_q_instruction_38_evex-instruction_handler db 'vpminuw',3Ah - dw avx_instruction_38-instruction_handler + 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_instruction_38-instruction_handler + dw avx_q_instruction_38-instruction_handler db 'vpmulhw',0E5h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpmulld',40h - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler + db 'vpmullq',40h + dw avx_q_instruction_38_evex-instruction_handler db 'vpmullw',0D5h - dw avx_pd_instruction-instruction_handler + 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_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpshufb',0 - dw avx_instruction_38-instruction_handler - db 'vpshufd',66h - dw avx_pshufd_instruction-instruction_handler + dw avx_bw_instruction_38-instruction_handler + db 'vpshufd',70h + dw avx_single_source_d_instruction_imm8-instruction_handler db 'vpsignb',8 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vpsignd',0Ah - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vpsignw',9 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vpslldq',111b - dw avx_pslldq_instruction-instruction_handler + dw avx_shift_dq_instruction-instruction_handler db 'vpsllvd',47h - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler db 'vpsllvq',47h - dw avx_instruction_38_w1-instruction_handler + 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_instruction_38-instruction_handler + 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_pslldq_instruction-instruction_handler + dw avx_shift_dq_instruction-instruction_handler db 'vpsrlvd',45h - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler db 'vpsrlvq',45h - dw avx_instruction_38_w1-instruction_handler + 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_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpsubsw',0E9h - dw avx_pd_instruction-instruction_handler + 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-instruction_handler + dw avx_single_source_pd_instruction_er-instruction_handler db 'vsqrtps',51h - dw avx_single_source_ps_instruction-instruction_handler + dw avx_single_source_ps_instruction_er-instruction_handler db 'vsqrtsd',51h - dw avx_sd_instruction-instruction_handler + dw avx_sd_instruction_er-instruction_handler db 'vsqrtss',51h - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_er-instruction_handler db 'vtestpd',0Fh - dw avx_single_source_instruction_38-instruction_handler + dw avx_single_source_instruction_38_noevex-instruction_handler db 'vtestps',0Eh - dw avx_single_source_instruction_38-instruction_handler + dw avx_single_source_instruction_38_noevex-instruction_handler db 'xsave64',100b dw fxsave_instruction_64bit-instruction_handler instructions_8: @@ -2194,9 +2480,9 @@ instructions_8: db 'addsubps',0D0h dw cvtpd2dq_instruction-instruction_handler db 'blendvpd',15h - dw sse4_instruction_38_xmm0-instruction_handler + dw sse4_instruction_66_38_xmm0-instruction_handler db 'blendvps',14h - dw sse4_instruction_38_xmm0-instruction_handler + dw sse4_instruction_66_38_xmm0-instruction_handler db 'cmpneqpd',4 dw cmp_pd_instruction-instruction_handler db 'cmpneqps',4 @@ -2269,8 +2555,38 @@ instructions_8: dw fldenv_instruction_16bit-instruction_handler db 'fxsave64',0 dw fxsave_instruction_64bit-instruction_handler - db 'insertps',0 + 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 'movmskpd',0 @@ -2288,11 +2604,11 @@ instructions_8: db 'packsswb',63h dw basic_mmx_instruction-instruction_handler db 'packusdw',2Bh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'packuswb',67h dw basic_mmx_instruction-instruction_handler db 'pblendvb',10h - dw sse4_instruction_38_xmm0-instruction_handler + dw sse4_instruction_66_38_xmm0-instruction_handler db 'pfrcpit1',0A6h dw amd3dnow_instruction-instruction_handler db 'pfrcpit2',0B6h @@ -2333,6 +2649,10 @@ instructions_8: dw rdfsbase_instruction-instruction_handler db 'rdgsbase',1 dw rdfsbase_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 @@ -2346,9 +2666,9 @@ instructions_8: db 'unpcklps',14h dw sse_ps_instruction-instruction_handler db 'vblendpd',0Dh - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vblendps',0Ch - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vcmpeqpd',0 dw avx_cmp_pd_instruction-instruction_handler db 'vcmpeqps',0 @@ -2408,49 +2728,67 @@ instructions_8: db 'vldmxcsr',10b dw vldmxcsr_instruction-instruction_handler db 'vmlaunch',0C2h - dw simple_vmx_instruction-instruction_handler + 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_movntpd_instruction-instruction_handler + 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_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vmresume',0C3h - dw simple_vmx_instruction-instruction_handler + dw simple_instruction_0f_01-instruction_handler db 'vpaddusb',0DCh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpaddusw',0DDh - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpalignr',0Fh - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8-instruction_handler db 'vpblendd',2 - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vpblendw',0Eh - dw avx_instruction_3a_imm8-instruction_handler + dw avx_pi_instruction_3a_imm8_noevex-instruction_handler db 'vpcmpeqb',74h - dw avx_pd_instruction-instruction_handler + dw avx_cmpeqb_instruction-instruction_handler db 'vpcmpeqd',76h - dw avx_pd_instruction-instruction_handler + dw avx_cmpeqd_instruction-instruction_handler db 'vpcmpeqq',29h - dw avx_instruction_38-instruction_handler + dw avx_cmpeqq_instruction-instruction_handler db 'vpcmpeqw',75h - dw avx_pd_instruction-instruction_handler + dw avx_cmpeqb_instruction-instruction_handler db 'vpcmpgtb',64h - dw avx_pd_instruction-instruction_handler + dw avx_cmpeqb_instruction-instruction_handler db 'vpcmpgtd',66h - dw avx_pd_instruction-instruction_handler + dw avx_cmpeqd_instruction-instruction_handler db 'vpcmpgtq',37h - dw avx_instruction_38-instruction_handler + dw avx_cmpeqq_instruction-instruction_handler db 'vpcmpgtw',65h - dw avx_pd_instruction-instruction_handler + 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 @@ -2491,6 +2829,22 @@ instructions_8: dw xop_pcom_q_instruction-instruction_handler db 'vpcomltw',0 dw xop_pcom_w_instruction-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 @@ -2500,7 +2854,7 @@ instructions_8: db 'vphadddq',0CBh dw xop_single_source_128bit_instruction-instruction_handler db 'vphaddsw',3 - dw avx_instruction_38-instruction_handler + dw avx_pi_instruction_38_noevex-instruction_handler db 'vphaddwd',0C6h dw xop_single_source_128bit_instruction-instruction_handler db 'vphaddwq',0C7h @@ -2510,9 +2864,13 @@ instructions_8: db 'vphsubdq',0E3h dw xop_single_source_128bit_instruction-instruction_handler db 'vphsubsw',7 - dw avx_instruction_38-instruction_handler + 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 @@ -2520,31 +2878,91 @@ instructions_8: db 'vpmacsww',95h dw xop_triple_source_128bit_instruction-instruction_handler db 'vpmaddwd',0F5h - dw avx_pd_instruction-instruction_handler + 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_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpmuludq',0F4h - dw avx_pd_instruction-instruction_handler + dw avx_q_instruction-instruction_handler db 'vpshufhw',0F3h - dw avx_pshufd_instruction-instruction_handler + dw avx_pshuf_w_instruction-instruction_handler db 'vpshuflw',0F2h - dw avx_pshufd_instruction-instruction_handler + dw avx_pshuf_w_instruction-instruction_handler db 'vpsubusb',0D8h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpsubusw',0D9h - dw avx_pd_instruction-instruction_handler + 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-instruction_handler + dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler db 'vroundps',8 - dw avx_single_source_instruction_3a_imm8-instruction_handler + dw avx_single_source_instruction_3a_imm8_noevex-instruction_handler db 'vroundsd',0Bh - dw avx_sd_instruction_3a_imm8-instruction_handler + dw avx_sd_instruction_3a_imm8_noevex-instruction_handler db 'vroundss',0Ah - dw avx_ss_instruction_3a_imm8-instruction_handler + dw avx_ss_instruction_3a_imm8_noevex-instruction_handler db 'vrsqrtps',52h - dw avx_single_source_ps_instruction-instruction_handler + dw avx_single_source_ps_instruction_noevex-instruction_handler db 'vrsqrtss',52h - dw avx_ss_instruction-instruction_handler + dw avx_ss_instruction_noevex-instruction_handler db 'vstmxcsr',11b dw vldmxcsr_instruction-instruction_handler db 'vucomisd',2Eh @@ -2580,20 +2998,20 @@ instructions_9: dw cvtsd2si_instruction-instruction_handler db 'cvttss2si',2Ch dw cvtss2si_instruction-instruction_handler - db 'extractps',0 + db 'extractps',17h dw extractps_instruction-instruction_handler db 'fxrstor64',1 dw fxsave_instruction_64bit-instruction_handler db 'pclmulqdq',-1 dw pclmulqdq_instruction-instruction_handler db 'pcmpestri',61h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'pcmpestrm',60h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'pcmpistri',63h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'pcmpistrm',62h - dw sse4_instruction_3a_imm8-instruction_handler + dw sse4_instruction_66_3a_imm8-instruction_handler db 'pmaddubsw',4 dw ssse3_instruction-instruction_handler db 'prefetchw',1 @@ -2610,14 +3028,26 @@ instructions_9: dw basic_mmx_instruction-instruction_handler db 'punpcklwd',61h dw basic_mmx_instruction-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-instruction_handler + dw avx_pd_instruction_noevex-instruction_handler db 'vaddsubps',0D0h - dw avx_haddps_instruction-instruction_handler + 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-instruction_handler + dw avx_triple_source_instruction_3a_noevex-instruction_handler db 'vblendvps',4Ah - dw avx_triple_source_instruction_3a-instruction_handler + dw avx_triple_source_instruction_3a_noevex-instruction_handler db 'vcmpneqpd',4 dw avx_cmp_pd_instruction-instruction_handler db 'vcmpneqps',4 @@ -2669,31 +3099,45 @@ instructions_9: db 'vcvtdq2pd',0E6h dw avx_cvtdq2pd_instruction-instruction_handler db 'vcvtdq2ps',5Bh - dw avx_single_source_ps_instruction-instruction_handler + 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 vcvtph2ps_instruction-instruction_handler + dw avx_cvtph2ps_instruction-instruction_handler db 'vcvtps2dq',5Bh - dw avx_single_source_pd_instruction-instruction_handler + dw avx_cvtps2dq_instruction-instruction_handler db 'vcvtps2pd',5Ah dw avx_cvtps2pd_instruction-instruction_handler db 'vcvtps2ph',1Dh - dw vcvtps2ph_instruction-instruction_handler + 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-instruction_handler + 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-instruction_handler + dw avx_ss_instruction_sae-instruction_handler db 'vcvtss2si',2Dh dw avx_cvtss2si_instruction-instruction_handler + db 'vdbpsadbw',42h + dw avx_d_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 @@ -2710,8 +3154,26 @@ instructions_9: dw fma4_instruction_sd-instruction_handler db 'vfnmsubss',7Eh dw fma4_instruction_ss-instruction_handler - db 'vinsertps',0 + 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 @@ -2723,15 +3185,63 @@ instructions_9: db 'vmovsldup',12h dw avx_movshdup_instruction-instruction_handler db 'vpackssdw',6Bh - dw avx_pd_instruction-instruction_handler + dw avx_d_instruction-instruction_handler db 'vpacksswb',63h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpackusdw',2Bh - dw avx_instruction_38-instruction_handler + dw avx_d_instruction_38-instruction_handler db 'vpackuswb',67h - dw avx_pd_instruction-instruction_handler + 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-instruction_handler + 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 @@ -2780,10 +3290,22 @@ instructions_9: dw xop_pcom_q_instruction-instruction_handler db 'vpcomneqw',5 dw xop_pcom_w_instruction-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_permil_instruction-instruction_handler + dw avx_permilpd_instruction-instruction_handler db 'vpermilps',4 - dw avx_permil_instruction-instruction_handler + 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 '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 'vphaddubd',0D2h dw xop_single_source_128bit_instruction-instruction_handler db 'vphaddubq',0D3h @@ -2817,11 +3339,23 @@ instructions_9: db 'vpmovsxbw',20h dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovsxdq',25h - dw avx_pmovsxdq_instruction-instruction_handler + dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovsxwd',23h - dw avx_pmovsxwd_instruction-instruction_handler + dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovsxwq',24h - dw avx_pmovsxwq_instruction-instruction_handler + 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 @@ -2829,13 +3363,37 @@ instructions_9: db 'vpmovzxbw',30h dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovzxdq',35h - dw avx_pmovsxdq_instruction-instruction_handler + dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovzxwd',33h - dw avx_pmovsxwd_instruction-instruction_handler + dw avx_pmovsxbw_instruction-instruction_handler db 'vpmovzxwq',34h - dw avx_pmovsxwq_instruction-instruction_handler + dw avx_pmovsxbd_instruction-instruction_handler db 'vpmulhrsw',0Bh - dw avx_instruction_38-instruction_handler + 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 @@ -2846,9 +3404,11 @@ instructions_9: dw avx_ps_instruction-instruction_handler instructions_10: db 'aesdeclast',0DFh - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'aesenclast',0DDh - dw sse4_instruction_38-instruction_handler + 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 @@ -2866,7 +3426,7 @@ instructions_10: db 'maskmovdqu',0 dw maskmovdqu_instruction-instruction_handler db 'phminposuw',41h - dw sse4_instruction_38-instruction_handler + dw sse4_instruction_66_38-instruction_handler db 'prefetcht0',1 dw prefetch_instruction-instruction_handler db 'prefetcht1',2 @@ -2877,6 +3437,10 @@ instructions_10: 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 @@ -2885,24 +3449,68 @@ instructions_10: 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_cvtpd2ps_instruction-instruction_handler + 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_cvtsd2si_instruction-instruction_handler + dw avx_cvttsd2si_instruction-instruction_handler db 'vcvttss2si',2Ch - dw avx_cvtss2si_instruction-instruction_handler - db 'vextractps',0 - dw avx_extractps_instruction-instruction_handler + 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_instruction_pd-instruction_handler + dw gather_pd_instruction-instruction_handler db 'vgatherdps',92h - dw gather_instruction_ps-instruction_handler + dw gather_ps_instruction-instruction_handler db 'vgatherqpd',93h - dw gather_instruction_pd-instruction_handler + dw gather_pd_instruction-instruction_handler db 'vgatherqps',93h - dw gather_instruction_ps-instruction_handler + 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 'vmaskmovpd',2Dh dw avx_maskmov_instruction-instruction_handler db 'vmaskmovps',2Ch @@ -2910,13 +3518,37 @@ instructions_10: db 'vpclmulqdq',-1 dw avx_pclmulqdq_instruction-instruction_handler db 'vpcmpestri',61h - dw avx_single_source_128bit_instruction_3a_imm8-instruction_handler + dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler db 'vpcmpestrm',60h - dw avx_single_source_128bit_instruction_3a_imm8-instruction_handler + dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler db 'vpcmpistri',63h - dw avx_single_source_128bit_instruction_3a_imm8-instruction_handler + dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler db 'vpcmpistrm',62h - dw avx_single_source_128bit_instruction_3a_imm8-instruction_handler + 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 @@ -2942,13 +3574,13 @@ instructions_10: db 'vpermil2ps',48h dw vpermil2_instruction-instruction_handler db 'vpgatherdd',90h - dw gather_instruction_ps-instruction_handler + dw gather_ps_instruction-instruction_handler db 'vpgatherdq',90h - dw gather_instruction_pd-instruction_handler + dw gather_pd_instruction-instruction_handler db 'vpgatherqd',91h - dw gather_instruction_ps-instruction_handler + dw gather_ps_instruction-instruction_handler db 'vpgatherqq',91h - dw gather_instruction_pd-instruction_handler + dw gather_pd_instruction-instruction_handler db 'vpmacssdqh',8Fh dw xop_triple_source_128bit_instruction-instruction_handler db 'vpmacssdql',87h @@ -2956,23 +3588,51 @@ instructions_10: db 'vpmadcsswd',0A6h dw xop_triple_source_128bit_instruction-instruction_handler db 'vpmaddubsw',4 - dw avx_instruction_38-instruction_handler + 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_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpunpckhdq',6Ah - dw avx_pd_instruction-instruction_handler + dw avx_d_instruction-instruction_handler db 'vpunpckhwd',69h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpunpcklbw',60h - dw avx_pd_instruction-instruction_handler + dw avx_bw_instruction-instruction_handler db 'vpunpckldq',62h - dw avx_pd_instruction-instruction_handler + dw avx_d_instruction-instruction_handler db 'vpunpcklwd',61h - dw avx_pd_instruction-instruction_handler + 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 @@ -2984,10 +3644,14 @@ instructions_11: dw pclmulqdq_instruction-instruction_handler db 'prefetchnta',0 dw prefetch_instruction-instruction_handler + db 'prefetchwt1',2 + dw amd_prefetch_instruction-instruction_handler + db 'sha256rnds2',0CBh + dw sse4_instruction_38_xmm0-instruction_handler db 'vaesdeclast',0DFh - dw avx_128bit_instruction_38-instruction_handler + dw avx_128bit_instruction_38_noevex-instruction_handler db 'vaesenclast',0DDh - dw avx_128bit_instruction_38-instruction_handler + dw avx_128bit_instruction_38_noevex-instruction_handler db 'vcmpeq_ospd',10h dw avx_cmp_pd_instruction-instruction_handler db 'vcmpeq_osps',10h @@ -3068,6 +3732,30 @@ instructions_11: 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 @@ -3138,6 +3826,10 @@ instructions_11: dw xop_pcom_q_instruction-instruction_handler db 'vpcomfalsew',6 dw xop_pcom_w_instruction-instruction_handler + db 'vpcompressd',8Bh + dw avx_compress_d_instruction-instruction_handler + db 'vpcompressq',8Bh + dw avx_compress_q_instruction-instruction_handler db 'vpcomtrueub',7 dw xop_pcom_ub_instruction-instruction_handler db 'vpcomtrueud',7 @@ -3146,12 +3838,44 @@ instructions_11: 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-instruction_handler + 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_pd_instruction-instruction_handler + dw avx_q_instruction-instruction_handler db 'vpunpcklqdq',6Ch - dw avx_pd_instruction-instruction_handler + 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 @@ -3273,6 +3997,22 @@ instructions_12: 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 @@ -3322,15 +4062,47 @@ instructions_13: 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_broadcastf128_instruction-instruction_handler + dw avx_broadcast_128_instruction_noevex-instruction_handler db 'vbroadcasti128',5Ah - dw avx_broadcastf128_instruction-instruction_handler + dw avx_broadcast_128_instruction_noevex-instruction_handler db 'vcmpfalse_ospd',1Bh dw avx_cmp_pd_instruction-instruction_handler db 'vcmpfalse_osps',1Bh @@ -3363,12 +4135,54 @@ instructions_14: dw fma_instruction_pd-instruction_handler db 'vfmsubadd231ps',0B7h dw fma_instruction_ps-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_3a_imm8-instruction_handler + 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 'vaeskeygenassist',0DFh - dw avx_single_source_128bit_instruction_3a_imm8-instruction_handler + dw avx_single_source_128bit_instruction_3a_imm8_noevex-instruction_handler instructions_end: data_directives: diff --git a/programs/develop/fasm/trunk/variable.inc b/programs/develop/fasm/trunk/variable.inc index 85ff146c35..74993bf270 100644 --- a/programs/develop/fasm/trunk/variable.inc +++ b/programs/develop/fasm/trunk/variable.inc @@ -1,6 +1,6 @@ ; flat assembler core variables -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. ; Variables which have to be set up by interface: @@ -13,6 +13,7 @@ additional_memory_end dd ? stack_limit dd ? +initial_definitions dd ? input_file dd ? output_file dd ? symbols_file dd ? @@ -42,6 +43,7 @@ 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 ? @@ -68,6 +70,7 @@ adjustment dq ? symbol_identifier dd ? address_symbol dd ? address_high dd ? +uncompressed_displacement dd ? format_flags dd ? resolver_flags dd ? symbols_stream dd ? @@ -87,6 +90,7 @@ 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 ? @@ -94,13 +98,16 @@ logical_value_parentheses dd ? file_extension dd ? operand_size db ? -size_override db ? +operand_flags db ? operand_prefix db ? -opcode_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 ? @@ -116,6 +123,8 @@ 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 ? @@ -124,17 +133,20 @@ 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 ? -default_argument_value db ? -prefixed_instruction db ? +skip_default_argument_value db ? +prefix_flags db ? formatter_symbols_allowed db ? +decorator_symbols_allowed db ? free_address_range db ? diff --git a/programs/develop/fasm/trunk/version.inc b/programs/develop/fasm/trunk/version.inc index 0a5d7aa5d2..b6eb575823 100644 --- a/programs/develop/fasm/trunk/version.inc +++ b/programs/develop/fasm/trunk/version.inc @@ -1,6 +1,6 @@ ; flat assembler version 1.71 -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. ; ; This programs is free for commercial and non-commercial use as long as @@ -33,7 +33,7 @@ ; cannot simply be copied and put under another distribution licence ; (including the GNU Public Licence). -VERSION_STRING equ "1.71.16" +VERSION_STRING equ "1.71.54" VERSION_MAJOR = 1 VERSION_MINOR = 71 diff --git a/programs/develop/fasm/trunk/x86_64.inc b/programs/develop/fasm/trunk/x86_64.inc index 7e0ca9185e..37b7e69ea2 100644 --- a/programs/develop/fasm/trunk/x86_64.inc +++ b/programs/develop/fasm/trunk/x86_64.inc @@ -1,6 +1,6 @@ ; flat assembler core -; Copyright (c) 1999-2013, Tomasz Grysztar. +; Copyright (c) 1999-2016, Tomasz Grysztar. ; All rights reserved. simple_instruction_except64: @@ -56,17 +56,21 @@ simple_extended_instruction: jmp instruction_assembled prefix_instruction: stos byte [edi] - or [prefixed_instruction],-1 + or [prefix_flags],1 jmp continue_line segment_prefix: mov ah,al shr ah,4 - cmp ah,6 + cmp ah,3 jne illegal_instruction and al,1111b mov [segment_register],al call store_segment_prefix - or [prefixed_instruction],-1 + 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] @@ -336,7 +340,7 @@ basic_instruction: jmp instruction_assembled basic_ax_imm: add [base_code],5 - call store_instruction_code + call store_classic_instruction_code jmp basic_store_imm_16bit basic_reg_imm_32bit: call operand_32bit @@ -366,7 +370,7 @@ basic_instruction: jmp instruction_assembled basic_eax_imm: add [base_code],5 - call store_instruction_code + call store_classic_instruction_code jmp basic_store_imm_32bit recoverable_unknown_size: cmp [error_line],0 @@ -415,6 +419,8 @@ mov_instruction: call get_size_operator cmp al,10h je mov_reg + cmp al,14h + je mov_creg cmp al,'[' jne invalid_operand mov_mem: @@ -431,9 +437,9 @@ mov_instruction: jne invalid_operand mov_mem_reg: lods byte [esi] - cmp al,60h + cmp al,30h jb mov_mem_general_reg - cmp al,70h + cmp al,40h jb mov_mem_sreg mov_mem_general_reg: call convert_register @@ -473,7 +479,7 @@ mov_instruction: call address_32bit_prefix mov [base_code],0A2h store_mov_address32: - call store_instruction_code + call store_classic_instruction_code call store_address_32bit_value jmp instruction_assembled mov_mem_address16_al: @@ -483,7 +489,7 @@ mov_instruction: store_mov_address16: cmp [code_type],64 je invalid_address - call store_instruction_code + call store_classic_instruction_code mov eax,edx stos word [edi] cmp edx,10000h @@ -493,7 +499,7 @@ mov_instruction: call store_segment_prefix_if_necessary mov [base_code],0A2h store_mov_address64: - call store_instruction_code + call store_classic_instruction_code call store_address_64bit_value jmp instruction_assembled mov_mem_ax: @@ -526,7 +532,7 @@ mov_instruction: mov [base_code],0A3h jmp store_mov_address64 mov_mem_sreg: - sub al,61h + sub al,31h mov [postbyte_register],al pop ecx ebx edx mov ah,[operand_size] @@ -556,6 +562,8 @@ mov_instruction: 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 @@ -573,8 +581,6 @@ mov_instruction: pop ecx ebx edx call store_instruction_with_imm16 jmp instruction_assembled - mov_mem_imm_nosize: - call recoverable_unknown_size mov_mem_imm_32bit: call operand_32bit call get_dword_value @@ -603,6 +609,8 @@ mov_instruction: 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: @@ -628,11 +636,8 @@ mov_instruction: and al,1111b mov [postbyte_register],al shr ah,4 - cmp ah,5 - je mov_reg_creg - cmp ah,7 - je mov_reg_dreg - ja mov_reg_treg + cmp ah,3 + jne invalid_operand dec [postbyte_register] cmp [operand_size],8 je mov_reg_sreg64 @@ -650,32 +655,31 @@ mov_instruction: mov_reg_sreg_store: mov [base_code],8Ch jmp nomem_instruction_ready - mov_reg_treg: - cmp ah,9 - jne invalid_operand - mov [extended_code],24h - jmp mov_reg_xrx - mov_reg_dreg: - mov [extended_code],21h - jmp mov_reg_xrx mov_reg_creg: - mov [extended_code],20h - mov_reg_xrx: + 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_xrx_64bit + je mov_reg_creg_64bit cmp [operand_size],4 jne invalid_operand_size cmp [postbyte_register],8 - jne mov_reg_xrx_store + jb mov_reg_creg_store cmp [extended_code],20h - jne mov_reg_xrx_store + jne mov_reg_creg_store mov al,0F0h stos byte [edi] mov [postbyte_register],0 - mov_reg_xrx_store: + mov_reg_creg_store: jmp nomem_instruction_ready - mov_reg_xrx_64bit: + mov_reg_creg_64bit: cmp [operand_size],8 jne invalid_operand_size jmp nomem_instruction_ready @@ -825,7 +829,7 @@ mov_instruction: and ah,111b add al,ah mov [base_code],al - call store_instruction_code + call store_classic_instruction_code ret mov_reg_64bit_imm_32bit: mov edx,eax @@ -839,11 +843,8 @@ mov_instruction: and al,1111b mov [postbyte_register],al shr ah,4 - cmp ah,5 - je mov_creg - cmp ah,7 - je mov_dreg - ja mov_treg + cmp ah,3 + jne invalid_operand cmp al,2 je illegal_instruction dec [postbyte_register] @@ -877,43 +878,38 @@ mov_instruction: mov_sreg_mem_size_ok: mov [base_code],8Eh jmp instruction_ready - mov_treg: - cmp ah,9 - jne invalid_operand - mov [extended_code],26h - jmp mov_xrx - mov_dreg: - mov [extended_code],23h - jmp mov_xrx mov_creg: - mov [extended_code],22h - mov_xrx: + 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 - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov bl,al cmp [code_type],64 - je mov_xrx_64bit + je mov_creg_64bit cmp ah,4 jne invalid_operand_size cmp [postbyte_register],8 - jne mov_xrx_store + jb mov_creg_store cmp [extended_code],22h - jne mov_xrx_store + jne mov_creg_store mov al,0F0h stos byte [edi] mov [postbyte_register],0 - mov_xrx_store: + mov_creg_store: jmp nomem_instruction_ready - mov_xrx_64bit: + mov_creg_64bit: cmp ah,8 - je mov_xrx_store + je mov_creg_store jmp invalid_operand_size test_instruction: mov [base_code],84h @@ -966,6 +962,8 @@ test_instruction: 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 @@ -983,8 +981,6 @@ test_instruction: pop ecx ebx edx call store_instruction_with_imm16 jmp instruction_assembled - test_mem_imm_nosize: - call recoverable_unknown_size test_mem_imm_32bit: call operand_32bit call get_dword_value @@ -1054,7 +1050,7 @@ test_instruction: jmp instruction_assembled test_al_imm: mov [base_code],0A8h - call store_instruction_code + call store_classic_instruction_code mov al,dl stos byte [edi] jmp instruction_assembled @@ -1074,7 +1070,7 @@ test_instruction: jmp instruction_assembled test_ax_imm: mov [base_code],0A9h - call store_instruction_code + call store_classic_instruction_code mov ax,dx stos word [edi] jmp instruction_assembled @@ -1095,7 +1091,7 @@ test_instruction: jmp instruction_assembled test_eax_imm: mov [base_code],0A9h - call store_instruction_code + call store_classic_instruction_code mov eax,edx stos dword [edi] jmp instruction_assembled @@ -1168,7 +1164,7 @@ xchg_instruction: xchg_ax_reg_store: add bl,90h mov [base_code],bl - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled xchg_reg_reg_store: inc [base_code] @@ -1268,7 +1264,7 @@ push_instruction: jnz invalid_operand_size call operand_16bit push_reg_store: - call store_instruction_code + call store_classic_instruction_code jmp push_done push_sreg: mov bl,al @@ -1308,9 +1304,9 @@ push_instruction: jne illegal_instruction push_sreg_store: mov al,bl - cmp al,70h + cmp al,40h jae invalid_operand - sub al,61h + sub al,31h jc invalid_operand cmp al,4 jae push_sreg_386 @@ -1393,7 +1389,7 @@ push_instruction: push_imm_8bit: mov ah,al mov [base_code],6Ah - call store_instruction_code + call store_classic_instruction_code mov al,ah stos byte [edi] jmp push_done @@ -1403,7 +1399,7 @@ push_instruction: call operand_16bit push_imm_16bit_store: mov [base_code],68h - call store_instruction_code + call store_classic_instruction_code mov ax,dx call mark_relocation stos word [edi] @@ -1422,7 +1418,7 @@ push_instruction: call operand_32bit push_imm_32bit_store: mov [base_code],68h - call store_instruction_code + call store_classic_instruction_code mov eax,edx call mark_relocation stos dword [edi] @@ -1433,10 +1429,11 @@ push_instruction: je instruction_assembled or al,al jz instruction_assembled - mov [operand_size],0 - mov [size_override],0 - mov [operand_prefix],0 - mov [rex_prefix],0 +; 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 @@ -1531,7 +1528,7 @@ pop_instruction: jnz invalid_operand_size call operand_16bit pop_reg_store: - call store_instruction_code + call store_classic_instruction_code pop_done: lods byte [esi] dec esi @@ -1539,15 +1536,16 @@ pop_instruction: je instruction_assembled or al,al jz instruction_assembled - mov [operand_size],0 - mov [size_override],0 - mov [operand_prefix],0 - mov [rex_prefix],0 +; 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,62h + cmp al,32h je pop_cs mov bl,al cmp dl,2 @@ -1584,9 +1582,9 @@ pop_instruction: jne illegal_instruction pop_sreg_store: mov al,bl - cmp al,70h + cmp al,40h jae invalid_operand - sub al,61h + sub al,31h jc invalid_operand cmp al,4 jae pop_sreg_386 @@ -1665,7 +1663,7 @@ inc_instruction: add al,bl add al,40h mov [base_code],al - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled inc_reg_long_form: inc [base_code] @@ -1708,11 +1706,7 @@ arpl_instruction: lods byte [esi] cmp al,',' jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al cmp ah,2 jne invalid_operand_size @@ -1726,22 +1720,13 @@ arpl_instruction: lods byte [esi] cmp al,',' jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al jmp nomem_instruction_ready bound_instruction: cmp [code_type],64 je illegal_instruction - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -1820,12 +1805,11 @@ ret_instruction_32bit: ret_instruction_16bit: call operand_16bit jmp ret_instruction -retf_instruction: - cmp [code_type],64 - jne 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 @@ -1857,22 +1841,29 @@ ret_instruction: jz simple_ret ret_imm_store: mov dx,ax - call store_instruction_code + call store_classic_instruction_code mov ax,dx stos word [edi] jmp instruction_assembled simple_ret: inc [base_code] - call store_instruction_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 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -1884,7 +1875,7 @@ lea_instruction: call get_size_operator cmp al,'[' jne invalid_operand - mov [size_override],-1 + or [operand_flags],1 call get_address pop eax mov [operand_size],al @@ -1908,12 +1899,7 @@ ls_instruction: cmp [code_type],64 je illegal_instruction ls_code_ok: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -2091,12 +2077,7 @@ shd_instruction: 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_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -2137,12 +2118,7 @@ shd_instruction: 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_register + call take_register mov bl,[postbyte_register] mov [postbyte_register],al mov al,ah @@ -2182,12 +2158,7 @@ shd_instruction: movx_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_register + call take_register mov [postbyte_register],al mov al,ah push eax @@ -2240,12 +2211,7 @@ movx_instruction: jmp nomem_instruction_ready movsxd_instruction: mov [base_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al cmp ah,8 jne invalid_operand_size @@ -2299,12 +2265,7 @@ bt_instruction: cmp byte [esi+2],'(' je bt_mem_imm bt_mem_reg: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al pop ecx ebx edx mov al,ah @@ -2352,12 +2313,7 @@ bt_instruction: cmp byte [esi+2],'(' je bt_reg_imm bt_reg_reg: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al mov al,ah call operand_autodetect @@ -2399,12 +2355,7 @@ bs_instruction: call operand_autodetect jmp nomem_instruction_ready get_reg_mem: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -2635,12 +2586,7 @@ imul_instruction: stos byte [edi] jmp instruction_assembled in_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register or al,al jnz invalid_operand lods byte [esi] @@ -2670,7 +2616,7 @@ in_instruction: in_ax_dx: call operand_autodetect mov [base_code],0EDh - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled in_al_dx: mov al,0ECh @@ -2695,7 +2641,7 @@ in_instruction: in_ax_imm: call operand_autodetect mov [base_code],0E5h - call store_instruction_code + call store_classic_instruction_code mov al,dl stos byte [edi] jmp instruction_assembled @@ -2719,12 +2665,7 @@ out_instruction: 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_register + call take_register or al,al jnz invalid_operand mov al,ah @@ -2737,7 +2678,7 @@ out_instruction: out_dx_ax: call operand_autodetect mov [base_code],0EFh - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled out_dx_al: mov al,0EEh @@ -2756,12 +2697,7 @@ out_instruction: 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_register + call take_register or al,al jnz invalid_operand mov al,ah @@ -2774,7 +2710,7 @@ out_instruction: out_imm_ax: call operand_autodetect mov [base_code],0E7h - call store_instruction_code + call store_classic_instruction_code mov al,dl stos byte [edi] jmp instruction_assembled @@ -2797,6 +2733,13 @@ jmp_instruction: 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 @@ -2942,7 +2885,7 @@ jmp_instruction: sub edx,3 jno jmp_imm_32bit_ok cmp [code_type],64 - je relative_jump_out_of_range + je jump_out_of_range jmp_imm_32bit_ok: mov al,[base_code] stos byte [edi] @@ -2958,7 +2901,7 @@ jmp_instruction: mov ecx,edx cdq cmp edx,ecx - jne relative_jump_out_of_range + jne jump_out_of_range call check_for_short_jump jnc jmp_imm_32bit_store jmp_short: @@ -3060,7 +3003,7 @@ jmp_instruction: call get_word_value mov ebx,eax call operand_16bit - call store_instruction_code + call store_classic_instruction_code mov ax,bx call mark_relocation stos word [edi] @@ -3075,13 +3018,14 @@ jmp_instruction: call get_dword_value mov ebx,eax call operand_32bit - call store_instruction_code + 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 @@ -3122,7 +3066,7 @@ conditional_jump: sub edx,4 jno conditional_jump_32bit_range_ok cmp [code_type],64 - je relative_jump_out_of_range + je jump_out_of_range conditional_jump_32bit_range_ok: mov ah,[base_code] add ah,10h @@ -3140,7 +3084,7 @@ conditional_jump: mov ecx,edx cdq cmp edx,ecx - jne relative_jump_out_of_range + jne jump_out_of_range call check_for_short_jump jnc conditional_jump_32bit_store conditional_jump_short: @@ -3245,7 +3189,7 @@ loop_instruction: mov ecx,edx cdq cmp edx,ecx - jne relative_jump_out_of_range + jne jump_out_of_range jmp make_loop_jump loop_jump_16bit: call get_address_word_value @@ -3647,12 +3591,7 @@ lgdt_instruction: lar_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_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -3694,12 +3633,13 @@ invlpg_instruction: swapgs_instruction: cmp [code_type],64 jne illegal_instruction -rdtscp_instruction: - mov [base_code],0Fh - mov [extended_code],1 - mov [postbyte_register],7 - mov bl,al - jmp nomem_instruction_ready +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 @@ -3715,12 +3655,7 @@ basic_486_instruction: 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_register + call take_register mov [postbyte_register],al pop ecx ebx edx mov al,ah @@ -3737,12 +3672,7 @@ basic_486_instruction: 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_register + call take_register mov bl,[postbyte_register] mov [postbyte_register],al mov al,ah @@ -3753,12 +3683,7 @@ basic_486_instruction: basic_486_reg_reg_8bit: jmp nomem_instruction_ready bswap_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register test al,1000b jz bswap_reg_code_ok or [rex_prefix],41h @@ -3772,11 +3697,11 @@ bswap_instruction: cmp ah,4 jne invalid_operand_size call operand_32bit - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled bswap_reg64: call operand_64bit - call store_instruction_code + call store_classic_instruction_code jmp instruction_assembled cmpxchgx_instruction: mov [base_code],0Fh @@ -4321,12 +4246,7 @@ mmx_bit_shift_instruction: pmovmskb_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_register + call take_register cmp ah,4 je pmovmskb_reg_size_ok cmp [code_type],64 @@ -4468,18 +4388,7 @@ movd_instruction: call get_address test [operand_size],not 4 jnz invalid_operand_size - 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 - call make_mmx_prefix - mov [postbyte_register],al + call get_mmx_source_register jmp instruction_ready movd_reg: lods byte [esi] @@ -4488,25 +4397,14 @@ movd_instruction: call convert_register cmp ah,4 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_mmx_register - mov [postbyte_register],al - call make_mmx_prefix + call get_mmx_source_register jmp nomem_instruction_ready movd_mmreg: mov [extended_code],6Eh call convert_mmx_register - call make_mmx_prefix mov [postbyte_register],al + call make_mmx_prefix mov [operand_size],0 lods byte [esi] cmp al,',' @@ -4528,19 +4426,24 @@ movd_instruction: 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 [vex_required],0 - jne mmx_prefix_for_vex cmp [operand_size],16 jne no_mmx_prefix mov [operand_prefix],66h no_mmx_prefix: ret - mmx_prefix_for_vex: - cmp [operand_size],16 - jne invalid_operand - mov [opcode_prefix],66h - ret movq_instruction: mov [base_code],0Fh lods byte [esi] @@ -4552,23 +4455,13 @@ movq_instruction: call get_address test [operand_size],not 8 jnz invalid_operand_size - mov [operand_size],0 - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_mmx_register - mov [postbyte_register],al - cmp ah,16 - je movq_mem_xmmreg - mov [extended_code],7Fh - jmp instruction_ready - movq_mem_xmmreg: - mov [extended_code],0D6h - mov [opcode_prefix],66h + 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] @@ -4578,20 +4471,9 @@ movq_instruction: cmp ah,8 jne invalid_operand_size mov bl,al - lods byte [esi] - cmp al,',' - jne invalid_operand - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - mov [operand_size],0 - lods byte [esi] - call convert_mmx_register - mov [postbyte_register],al - call make_mmx_prefix mov [extended_code],7Eh call operand_64bit + call get_mmx_source_register jmp nomem_instruction_ready movq_mmreg: call convert_mmx_register @@ -4611,6 +4493,8 @@ movq_instruction: 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 @@ -5036,12 +4920,7 @@ movmskpd_instruction: movmskps_instruction: mov [base_code],0Fh mov [extended_code],50h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al cmp ah,4 je movmskps_reg_ok @@ -5172,12 +5051,7 @@ cvtsd2si_instruction: cvt2si_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_register + call take_register mov [operand_size],0 cmp ah,4 je sse_reg @@ -5257,38 +5131,45 @@ amd3dnow_instruction: 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 [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp sse_instruction -sse4_ss_instruction_3a_imm8: +sse4_ss_instruction_66_3a_imm8: mov [immediate_size],1 - mov [mmx_size],4 - jmp sse4_instruction_3a_setup -sse4_sd_instruction_3a_imm8: + mov cl,4 + jmp sse4_instruction_66_3a_setup +sse4_sd_instruction_66_3a_imm8: mov [immediate_size],1 - mov [mmx_size],8 - jmp sse4_instruction_3a_setup -sse4_instruction_3a_imm8: + mov cl,8 + jmp sse4_instruction_66_3a_setup +sse4_instruction_66_3a_imm8: mov [immediate_size],1 - mov [mmx_size],16 - sse4_instruction_3a_setup: + 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 [mmx_size],16 mov al,44h - jmp sse4_instruction_3a_setup + mov cl,16 + jmp sse4_instruction_66_3a_setup extractps_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],3Ah - mov [supplemental_code],17h + call setup_66_0f_3a lods byte [esi] call get_size_operator cmp al,10h @@ -5336,9 +5217,17 @@ extractps_instruction: je mmx_nomem_imm8 cmp al,8 jne invalid_operand_size - call operand_64bit + 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 @@ -5346,11 +5235,6 @@ insertps_instruction: lods byte [esi] call convert_xmm_register mov [postbyte_register],al - insertps_xmmreg: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],3Ah - mov [supplemental_code],21h mov [operand_size],0 lods byte [esi] cmp al,',' @@ -5385,10 +5269,7 @@ pextrw_instruction: pextrb_instruction: mov [mmx_size],1 pextr_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],3Ah - mov [supplemental_code],al + call setup_66_0f_3a lods byte [esi] call get_size_operator cmp al,10h @@ -5463,7 +5344,6 @@ pextrb_instruction: cmp bh,16 jne invalid_operand_size xchg bl,[postbyte_register] - call operand_autodetect jmp mmx_nomem_imm8 pinsrb_instruction: mov [mmx_size],1 @@ -5475,10 +5355,7 @@ pinsrq_instruction: mov [mmx_size],8 call operand_64bit pinsr_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],3Ah - mov [supplemental_code],al + call setup_66_0f_3a lods byte [esi] call get_size_operator cmp al,10h @@ -5535,10 +5412,7 @@ pmovsxwq_instruction: pmovsxdq_instruction: mov [mmx_size],8 pmovsx_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],38h - mov [supplemental_code],al + call setup_66_0f_38 lods byte [esi] call get_size_operator cmp al,10h @@ -5568,6 +5442,12 @@ pmovsxdq_instruction: 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 fxsave_instruction_64bit: call operand_64bit @@ -5617,6 +5497,13 @@ prefetch_instruction: 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 @@ -5702,12 +5589,7 @@ movnti_instruction: 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_register + call take_register cmp ah,4 je movnti_store cmp ah,8 @@ -5722,23 +5604,13 @@ monitor_instruction: je monitor_instruction_store cmp byte [esi],0Fh je monitor_instruction_store - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register cmp ax,0400h jne invalid_operand 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_register + call take_register cmp ax,0401h jne invalid_operand cmp [postbyte_register],0C8h @@ -5746,12 +5618,7 @@ monitor_instruction: 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_register + call take_register cmp ax,0402h jne invalid_operand monitor_instruction_store: @@ -5761,10 +5628,7 @@ monitor_instruction: stos byte [edi] jmp instruction_assembled movntdqa_instruction: - mov [opcode_prefix],66h - mov [base_code],0Fh - mov [extended_code],38h - mov [supplemental_code],al + call setup_66_0f_38 lods byte [esi] call get_size_operator cmp al,10h @@ -5855,17 +5719,15 @@ crc32_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],0F0h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al - cmp ah,8 - je crc32_reg64 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 @@ -5873,7 +5735,7 @@ crc32_instruction: lods byte [esi] call get_size_operator cmp al,10h - je crc32_reg32_reg + je crc32_reg_reg cmp al,'[' jne invalid_operand call get_address @@ -5881,63 +5743,25 @@ crc32_instruction: test al,al jz crc32_unknown_size cmp al,1 - je crc32_reg32_mem_store - cmp al,4 - ja invalid_operand_size + je crc32_reg_mem_store inc [supplemental_code] call operand_autodetect - crc32_reg32_mem_store: + crc32_reg_mem_store: jmp instruction_ready crc32_unknown_size: call recoverable_unknown_size - jmp crc32_reg32_mem_store - crc32_reg32_reg: + 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_reg32_reg_store - cmp al,4 - ja invalid_operand_size + je crc32_reg_reg_store inc [supplemental_code] call operand_autodetect - crc32_reg32_reg_store: + crc32_reg_reg_store: jmp nomem_instruction_ready - crc32_reg64: - lods byte [esi] - cmp al,',' - jne invalid_operand - mov [operand_size],0 - call operand_64bit - lods byte [esi] - call get_size_operator - cmp al,10h - je crc32_reg64_reg - cmp al,'[' - jne invalid_operand - call get_address - mov ah,[operand_size] - mov al,8 - test ah,ah - jz crc32_unknown_size - cmp ah,1 - je crc32_reg32_mem_store - cmp ah,al - jne invalid_operand_size - inc [supplemental_code] - jmp crc32_reg32_mem_store - crc32_reg64_reg: - lods byte [esi] - call convert_register - mov bl,al - mov al,8 - cmp ah,1 - je crc32_reg32_reg_store - cmp ah,al - jne invalid_operand_size - inc [supplemental_code] - jmp crc32_reg32_reg_store popcnt_instruction: mov [opcode_prefix],0F3h jmp bs_instruction @@ -5972,12 +5796,7 @@ movbe_instruction: 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_register + call take_register mov [postbyte_register],al pop ecx ebx edx mov al,[operand_size] @@ -6005,13 +5824,6 @@ adx_instruction: call operand_64bit jmp nomem_instruction_ready -simple_vmx_instruction: - mov ah,al - mov al,0Fh - stos byte [edi] - mov al,1 - stos word [edi] - jmp instruction_assembled vmclear_instruction: mov [opcode_prefix],66h jmp vmx_instruction @@ -6045,12 +5857,7 @@ vmread_instruction: 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_register + call take_register mov [postbyte_register],al call vmread_check_size jmp vmx_size_ok @@ -6062,12 +5869,7 @@ vmread_instruction: 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_register + call take_register mov [postbyte_register],al call vmread_check_size pop ebx @@ -6085,12 +5887,7 @@ vmread_instruction: ret vmwrite_instruction: mov [extended_code],79h - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov [postbyte_register],al lods byte [esi] cmp al,',' @@ -6111,15 +5908,8 @@ vmwrite_instruction: mov [base_code],0Fh jmp nomem_instruction_ready vmx_inv_instruction: - mov [opcode_prefix],66h - mov [extended_code],38h - mov [supplemental_code],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call setup_66_0f_38 + call take_register mov [postbyte_register],al call vmread_check_size mov [operand_size],0 @@ -6141,12 +5931,7 @@ simple_svm_instruction: push eax mov [base_code],0Fh mov [extended_code],1 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register or al,al jnz invalid_operand simple_svm_detect_size: @@ -6170,31 +5955,21 @@ simple_svm_instruction: mov al,67h stos byte [edi] simple_svm_store: - call store_instruction_code + call store_classic_instruction_code pop eax stos byte [edi] jmp instruction_assembled skinit_instruction: - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register cmp ax,0400h jne invalid_operand mov al,0DEh - jmp simple_vmx_instruction + jmp simple_instruction_0f_01 invlpga_instruction: push eax mov [base_code],0Fh mov [extended_code],1 - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register or al,al jnz invalid_operand mov bl,ah @@ -6202,12 +5977,7 @@ invlpga_instruction: 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_register + call take_register cmp ax,0401h jne invalid_operand mov ah,bl @@ -6217,12 +5987,7 @@ rdrand_instruction: mov [base_code],0Fh mov [extended_code],0C7h mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov bl,al mov al,ah call operand_autodetect @@ -6234,12 +5999,7 @@ rdfsbase_instruction: mov [base_code],0Fh mov [extended_code],0AEh mov [postbyte_register],al - lods byte [esi] - call get_size_operator - cmp al,10h - jne invalid_operand - lods byte [esi] - call convert_register + call take_register mov bl,al mov al,ah cmp ah,2 @@ -6305,7 +6065,7 @@ xbegin_instruction: sub edx,1 jno xbegin_rel32_ok cmp [code_type],64 - je relative_jump_out_of_range + je jump_out_of_range xbegin_rel32_ok: mov ax,0F8C7h stos word [edi] @@ -6313,6 +6073,231 @@ xbegin_instruction: 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 [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] 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 al,al + jz bnd_mib_ok + inc cl + bnd_mib_ok: + ret + +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 @@ -6338,7 +6323,7 @@ convert_register: ret high_byte_register: mov ah,1 - or [rex_prefix],80h + or [rex_prefix],10h jmp match_register_size convert_fpu_register: mov ah,al @@ -6357,8 +6342,6 @@ convert_mmx_register: cmp ah,0Bh jne invalid_operand mov ah,8 - cmp [vex_required],0 - jne invalid_operand jmp match_register_size xmm_register: and al,0Fh @@ -6381,7 +6364,7 @@ get_size_operator: mov [size_declared],1 lods word [esi] xchg al,ah - mov [size_override],1 + or [operand_flags],1 cmp ah,[operand_size] je size_operator_ok cmp [operand_size],0 @@ -6393,7 +6376,7 @@ get_size_operator: mov [size_declared],0 cmp al,'[' jne size_operator_ok - mov [size_override],0 + and [operand_flags],not 1 ret get_jump_operator: mov [jump_type],0 @@ -6405,44 +6388,21 @@ get_jump_operator: jump_operator_ok: ret get_address: - mov [segment_register],0 - mov [address_size],0 - mov [free_address_range],0 - mov al,[code_type] - shr al,3 - mov [value_size],al - mov al,[esi] - and al,11110000b - cmp al,60h - jne get_size_prefix - lods byte [esi] - sub al,60h - mov [segment_register],al - mov al,[esi] - and al,11110000b - get_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 [address_size],al - mov [value_size],al - address_size_prefix_ok: + 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 [code_type],64 + cmp [address_size_declared],0 jne address_ok or bx,bx - jnz address_ok - test ch,0Fh - jnz address_ok + jnz clear_address_size + cmp [code_type],64 + jne address_ok calculate_relative_address: mov edx,[address_symbol] mov [symbol_identifier],edx @@ -6459,9 +6419,42 @@ get_address: ror ecx,16 mov cl,[value_type] rol ecx,16 - mov bx,0FF00h + 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 @@ -6536,6 +6529,7 @@ store_segment_prefix: 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 @@ -6573,16 +6567,28 @@ store_instruction_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 @@ -6592,6 +6598,12 @@ store_nomem_instruction: 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 @@ -6617,11 +6629,11 @@ store_instruction: jnz address_vsib or bx,bx jz address_immediate - cmp bx,0F800h + cmp bx,9800h je address_rip_based - cmp bx,0F400h + cmp bx,9400h je address_eip_based - cmp bx,0FF00h + cmp bx,9900h je address_relative mov al,bl or al,bh @@ -6635,6 +6647,8 @@ store_instruction: 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 @@ -6690,6 +6704,9 @@ store_instruction: 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 @@ -6711,10 +6728,6 @@ store_instruction: stos byte [edi] mov al,dl stos byte [edi] - cmp dx,80h - jge value_out_of_range - cmp dx,-80h - jl value_out_of_range ret address: cmp al,110b @@ -6727,11 +6740,17 @@ store_instruction: 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 - je vector_index_ok - cmp al,0Dh - jne invalid_address - vector_index_ok: + jb invalid_address + vsib_index_ok: mov al,bh shr al,4 cmp al,4 @@ -6759,6 +6778,8 @@ store_instruction: 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 @@ -6787,9 +6808,7 @@ store_instruction: and bh,111b or ah,bh sib_ready: - test ch,44h - jnz sib_address_32bit_value - test ch,88h + test ch,44h or 88h jnz sib_address_32bit_value or ch,ch jnz address_sizes_do_not_agree @@ -6798,10 +6817,13 @@ store_instruction: 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 - jae sib_address_8bit_value + jnb sib_address_8bit_value sib_address_32bit_value: or al,10000000b mov cl,[postbyte_register] @@ -6817,10 +6839,6 @@ store_instruction: stos word [edi] mov al,dl stos byte [edi] - cmp edx,80h - jge value_out_of_range - cmp edx,-80h - jl value_out_of_range ret sib_address: mov cl,[postbyte_register] @@ -6837,12 +6855,13 @@ store_instruction: shl cl,3 or al,cl stos word [edi] - test ch,44h - jnz store_address_32bit_value - test ch,88h + 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 @@ -6853,18 +6872,19 @@ store_instruction: and al,111b cmp al,4 je zero_index_register - test ch,44h - jnz simple_address_32bit_value - test ch,88h + 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 - jae simple_address_8bit_value + jnb simple_address_8bit_value simple_address_32bit_value: or al,10000000b mov cl,[postbyte_register] @@ -6880,10 +6900,6 @@ store_instruction: stos byte [edi] mov al,dl stos byte [edi] - cmp edx,80h - jge value_out_of_range - cmp edx,-80h - jl value_out_of_range ret simple_address: cmp al,5 @@ -6896,9 +6912,7 @@ store_instruction: address_immediate: cmp [code_type],64 je address_immediate_sib - test ch,44h - jnz address_immediate_32bit - test ch,88h + test ch,44h or 88h jnz address_immediate_32bit test ch,22h jnz address_immediate_16bit @@ -6988,7 +7002,9 @@ store_instruction: sub eax,[current_offset] add eax,5 sub edx,eax - jo value_out_of_range + jno @f + call recoverable_overflow + @@: mov al,101b mov cl,[postbyte_register] shl cl,3