; flat assembler core ; Copyright (c) 1999-2019, Tomasz Grysztar. ; All rights reserved. avx_single_source_pd_instruction_er_evex: or [vex_required],8 avx_single_source_pd_instruction_er: or [operand_flags],2+4+8 jmp avx_pd_instruction avx_single_source_pd_instruction_sae_evex: or [vex_required],8 or [operand_flags],2+4 jmp avx_pd_instruction avx_pd_instruction_imm8: mov [immediate_size],1 jmp avx_pd_instruction avx_pd_instruction_er: or [operand_flags],8 avx_pd_instruction_sae: or [operand_flags],4 avx_pd_instruction: mov [opcode_prefix],66h or [rex_prefix],80h mov cx,0800h jmp avx_instruction_with_broadcast avx_pd_instruction_38_evex: or [vex_required],8 mov [supplemental_code],al mov al,38h jmp avx_pd_instruction avx_cvtps2dq_instruction: mov [opcode_prefix],66h jmp avx_single_source_ps_instruction_er avx_cvtudq2ps_instruction: mov [opcode_prefix],0F2h avx_single_source_ps_instruction_er_evex: or [vex_required],8 avx_single_source_ps_instruction_er: or [operand_flags],2+4+8 jmp avx_ps_instruction avx_single_source_ps_instruction_noevex: or [operand_flags],2 or [vex_required],2 jmp avx_ps_instruction avx_ps_instruction_imm8: mov [immediate_size],1 jmp avx_ps_instruction avx_ps_instruction_er: or [operand_flags],8 avx_ps_instruction_sae: or [operand_flags],4 avx_ps_instruction: mov cx,0400h jmp avx_instruction_with_broadcast avx_ps_instruction_66_38_evex: or [vex_required],8 mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_ps_instruction avx_sd_instruction_er: or [operand_flags],8 avx_sd_instruction_sae: or [operand_flags],4 avx_sd_instruction: mov [opcode_prefix],0F2h or [rex_prefix],80h mov cl,8 jmp avx_instruction avx_ss_instruction_er: or [operand_flags],8 avx_ss_instruction_sae: or [operand_flags],4 avx_ss_instruction: mov [opcode_prefix],0F3h mov cl,4 jmp avx_instruction avx_ss_instruction_noevex: or [vex_required],2 jmp avx_ss_instruction avx_single_source_q_instruction_38_evex: or [operand_flags],2 avx_q_instruction_38_evex: or [vex_required],8 avx_q_instruction_38: mov [supplemental_code],al mov al,38h jmp avx_q_instruction avx_q_instruction_38_w1_evex: or [vex_required],8 avx_q_instruction_38_w1: or [rex_prefix],8 jmp avx_q_instruction_38 avx_q_instruction_3a_imm8_w1: or [rex_prefix],8 jmp avx_q_instruction_3a_imm8 avx_q_instruction_3a_imm8_evex: or [vex_required],8 avx_q_instruction_3a_imm8: mov [immediate_size],1 mov [supplemental_code],al mov al,3Ah jmp avx_q_instruction avx_q_instruction_evex: or [vex_required],8 avx_q_instruction: or [rex_prefix],80h mov ch,8 jmp avx_pi_instruction avx_single_source_d_instruction_38_evex_w1: or [rex_prefix],8 avx_single_source_d_instruction_38_evex: or [vex_required],8 avx_single_source_d_instruction_38: or [operand_flags],2 jmp avx_d_instruction_38 avx_d_instruction_38_evex: or [vex_required],8 avx_d_instruction_38: mov [supplemental_code],al mov al,38h jmp avx_d_instruction avx_d_instruction_3a_imm8_evex: mov [immediate_size],1 or [vex_required],8 mov [supplemental_code],al mov al,3Ah jmp avx_d_instruction avx_single_source_d_instruction_imm8: or [operand_flags],2 mov [immediate_size],1 jmp avx_d_instruction avx_d_instruction_evex: or [vex_required],8 avx_d_instruction: mov ch,4 jmp avx_pi_instruction avx_bw_instruction_3a_imm8_w1_evex: or [rex_prefix],8 avx_bw_instruction_3a_imm8_evex: mov [immediate_size],1 or [vex_required],8 mov [supplemental_code],al mov al,3Ah jmp avx_bw_instruction avx_single_source_bw_instruction_38: or [operand_flags],2 avx_bw_instruction_38: mov [supplemental_code],al mov al,38h avx_bw_instruction: xor ch,ch avx_pi_instruction: mov [opcode_prefix],66h xor cl,cl jmp avx_instruction_with_broadcast avx_bw_instruction_38_w1_evex: or [rex_prefix],8 avx_bw_instruction_38_evex: or [vex_required],8 jmp avx_bw_instruction_38 avx_pd_instruction_noevex: xor cl,cl or [vex_required],2 mov [opcode_prefix],66h jmp avx_instruction avx_ps_instruction_noevex: or [vex_required],2 mov [opcode_prefix],0F2h xor cl,cl jmp avx_instruction avx_instruction: xor ch,ch avx_instruction_with_broadcast: mov [mmx_size],cl mov [broadcast_size],ch mov [base_code],0Fh mov [extended_code],al avx_xop_common: or [vex_required],1 lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand avx_reg: lods byte [esi] call convert_avx_register mov [postbyte_register],al call take_avx512_mask avx_vex_reg: test [operand_flags],2 jnz avx_vex_reg_ok lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al avx_vex_reg_ok: mov al,[mmx_size] or al,al jz avx_regs_size_ok mov ah,[operand_size] or ah,ah jz avx_regs_size_ok cmp al,ah je avx_regs_size_ok ja invalid_operand_size cmp ah,16 jne invalid_operand_size avx_regs_size_ok: lods byte [esi] cmp al,',' jne invalid_operand avx_regs_rm: call take_avx_rm jc avx_regs_reg mov al,[immediate_size] cmp al,1 je mmx_imm8 jb instruction_ready cmp al,-4 je sse_cmp_mem_ok cmp byte [esi],',' jne invalid_operand inc esi call take_avx_register shl al,4 jc invalid_operand or byte [value],al test al,80h jz avx_regs_mem_reg_store cmp [code_type],64 jne invalid_operand avx_regs_mem_reg_store: call take_imm4_if_needed call store_instruction_with_imm8 jmp instruction_assembled avx_regs_reg: mov bl,al call take_avx512_rounding mov al,[immediate_size] cmp al,1 je mmx_nomem_imm8 jb nomem_instruction_ready cmp al,-4 je sse_cmp_nomem_ok lods byte [esi] cmp al,',' jne invalid_operand mov al,bl shl al,4 jc invalid_operand or byte [value],al test al,80h jz avx_regs_reg_ cmp [code_type],64 jne invalid_operand avx_regs_reg_: call take_avx_rm jc avx_regs_reg_reg cmp [immediate_size],-2 jg invalid_operand or [rex_prefix],8 call take_imm4_if_needed call store_instruction_with_imm8 jmp instruction_assembled avx_regs_reg_reg: shl al,4 jc invalid_operand and byte [value],1111b or byte [value],al call take_imm4_if_needed call store_nomem_instruction mov al,byte [value] stos byte [edi] jmp instruction_assembled take_avx_rm: xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator cmp al,'[' je take_avx_mem cmp al,10h jne invalid_operand mov [operand_size],cl lods byte [esi] call convert_avx_register or cl,cl jnz avx_reg_ok or cl,[mmx_size] jz avx_reg_ok cmp ah,cl je avx_reg_ok jb invalid_operand_size cmp ah,16 jne invalid_operand_size avx_reg_ok: stc ret take_avx_mem: push ecx call get_address cmp byte [esi],'{' jne avx_mem_ok inc esi lods byte [esi] cmp al,1Fh jne invalid_operand mov al,[esi] shr al,4 cmp al,1 jne invalid_operand mov al,[mmx_size] or al,al jnz avx_mem_broadcast_check mov eax,[esp] or al,al jnz avx_mem_broadcast_check mov al,[broadcast_size] mov [mmx_size],al mov ah,cl lods byte [esi] and al,1111b mov cl,al mov al,[broadcast_size] shl al,cl mov [esp],al mov cl,ah jmp avx_mem_broadcast_ok avx_mem_broadcast_check: bsf eax,eax xchg al,[broadcast_size] mov [mmx_size],al bsf eax,eax jz invalid_operand mov ah,[broadcast_size] sub ah,al lods byte [esi] and al,1111b cmp al,ah jne invalid_operand_size avx_mem_broadcast_ok: or [vex_required],40h lods byte [esi] cmp al,'}' jne invalid_operand avx_mem_ok: pop eax or al,al jz avx_mem_size_deciding xchg al,[operand_size] cmp [mmx_size],0 jne avx_mem_size_enforced or al,al jz avx_mem_size_ok cmp al,[operand_size] jne operand_sizes_do_not_match avx_mem_size_ok: clc ret avx_mem_size_deciding: mov al,[operand_size] cmp [mmx_size],0 jne avx_mem_size_enforced cmp al,16 je avx_mem_size_ok cmp al,32 je avx_mem_size_ok cmp al,64 je avx_mem_size_ok or al,al jnz invalid_operand_size call recoverable_unknown_size avx_mem_size_enforced: or al,al jz avx_mem_size_ok cmp al,[mmx_size] je avx_mem_size_ok jmp invalid_operand_size take_imm4_if_needed: cmp [immediate_size],-3 jne imm4_ok push ebx ecx edx lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] cmp al,'(' jne invalid_operand call get_byte_value test al,11110000b jnz value_out_of_range or byte [value],al pop edx ecx ebx imm4_ok: ret take_avx512_mask: cmp byte [esi],'{' jne avx512_masking_ok test [operand_flags],10h jnz invalid_operand inc esi lods byte [esi] cmp al,14h jne invalid_operand lods byte [esi] mov ah,al shr ah,4 cmp ah,5 jne invalid_operand and al,111b or al,al jz invalid_operand mov [mask_register],al or [vex_required],20h lods byte [esi] cmp al,'}' jne invalid_operand cmp byte [esi],'{' jne avx512_masking_ok test [operand_flags],20h jnz invalid_operand inc esi lods byte [esi] cmp al,1Fh jne invalid_operand lods byte [esi] or al,al jnz invalid_operand or [mask_register],80h lods byte [esi] cmp al,'}' jne invalid_operand avx512_masking_ok: retn take_avx512_rounding: test [operand_flags],4+8 jz avx512_rounding_done test [operand_flags],8 jz avx512_rounding_allowed cmp [mmx_size],0 jne avx512_rounding_allowed cmp [operand_size],64 jne avx512_rounding_done avx512_rounding_allowed: cmp byte [esi],',' jne avx512_rounding_done cmp byte [esi+1],'{' jne avx512_rounding_done add esi,2 mov [rounding_mode],0 or [vex_required],40h test [operand_flags],8 jz take_sae or [vex_required],80h lods byte [esi] cmp al,1Fh jne invalid_operand lods byte [esi] mov ah,al shr ah,4 cmp ah,2 jne invalid_operand and al,11b mov [rounding_mode],al lods byte [esi] cmp al,'-' jne invalid_operand take_sae: lods byte [esi] cmp al,1Fh jne invalid_operand lods byte [esi] cmp al,30h jne invalid_operand lods byte [esi] cmp al,'}' jne invalid_operand avx512_rounding_done: retn avx_movdqu_instruction: mov ah,0F3h jmp avx_movdq_instruction avx_movdqa_instruction: mov ah,66h avx_movdq_instruction: mov [opcode_prefix],ah or [vex_required],2 jmp avx_movps_instruction avx512_movdqu16_instruction: or [rex_prefix],8 avx512_movdqu8_instruction: mov ah,0F2h jmp avx_movdq_instruction_evex avx512_movdqu64_instruction: or [rex_prefix],8 avx512_movdqu32_instruction: mov ah,0F3h jmp avx_movdq_instruction_evex avx512_movdqa64_instruction: or [rex_prefix],8 avx512_movdqa32_instruction: mov ah,66h avx_movdq_instruction_evex: mov [opcode_prefix],ah or [vex_required],8 jmp avx_movps_instruction avx_movpd_instruction: mov [opcode_prefix],66h or [rex_prefix],80h avx_movps_instruction: or [operand_flags],2 mov [base_code],0Fh mov [extended_code],al or [vex_required],1 xor al,al mov [mmx_size],al mov [broadcast_size],al lods byte [esi] call get_size_operator cmp al,10h je avx_reg inc [extended_code] test [extended_code],1 jnz avx_mem add [extended_code],-1+10h avx_mem: cmp al,'[' jne invalid_operand call get_address or [operand_flags],20h call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al jmp instruction_ready avx_movntpd_instruction: or [rex_prefix],80h avx_movntdq_instruction: mov [opcode_prefix],66h avx_movntps_instruction: mov [base_code],0Fh mov [extended_code],al or [vex_required],1 or [operand_flags],10h mov [mmx_size],0 lods byte [esi] call get_size_operator jmp avx_mem avx_compress_q_instruction: or [rex_prefix],8 avx_compress_d_instruction: or [vex_required],8 mov [mmx_size],0 call setup_66_0f_38 lods byte [esi] call get_size_operator cmp al,10h jne avx_mem lods byte [esi] call convert_avx_register mov bl,al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al jmp nomem_instruction_ready avx_lddqu_instruction: mov ah,0F2h or [vex_required],2 avx_load_instruction: mov [opcode_prefix],ah mov [base_code],0Fh mov [extended_code],al mov [mmx_size],0 or [vex_required],1 call take_avx_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,'[' jne invalid_operand call get_address jmp instruction_ready avx_movntdqa_instruction: mov [supplemental_code],al mov al,38h mov ah,66h jmp avx_load_instruction avx_movq_instruction: or [rex_prefix],8 mov [mmx_size],8 jmp avx_mov_instruction avx_movd_instruction: mov [mmx_size],4 avx_mov_instruction: or [vex_required],1 mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],7Eh lods byte [esi] call get_size_operator cmp al,10h je avx_movd_reg cmp al,'[' jne invalid_operand call get_address mov al,[mmx_size] not al and [operand_size],al jnz invalid_operand_size lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al cmp [mmx_size],8 jne instruction_ready and [rex_prefix],not 8 or [rex_prefix],80h mov [extended_code],0D6h jmp instruction_ready avx_movd_reg: lods byte [esi] cmp al,0C0h jae avx_movd_xmmreg call convert_register cmp ah,[mmx_size] jne invalid_operand_size mov [operand_size],0 mov bl,al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al avx_movd_reg_ready: test [rex_prefix],8 jz nomem_instruction_ready cmp [code_type],64 jne illegal_instruction jmp nomem_instruction_ready avx_movd_xmmreg: sub [extended_code],10h call convert_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h je avx_movd_xmmreg_reg cmp al,'[' jne invalid_operand call get_address mov al,[mmx_size] cmp al,8 jne avx_movd_xmmreg_mem_ready call avx_movq_xmmreg_xmmreg_opcode avx_movd_xmmreg_mem_ready: not al test [operand_size],al jnz invalid_operand_size jmp instruction_ready avx_movd_xmmreg_reg: lods byte [esi] cmp al,0C0h jae avx_movq_xmmreg_xmmreg call convert_register cmp ah,[mmx_size] jne invalid_operand_size mov bl,al jmp avx_movd_reg_ready avx_movq_xmmreg_xmmreg: cmp [mmx_size],8 jne invalid_operand call avx_movq_xmmreg_xmmreg_opcode call convert_avx_register cmp ah,16 jne invalid_operand_size mov bl,al jmp nomem_instruction_ready avx_movq_xmmreg_xmmreg_opcode: and [rex_prefix],not 8 or [rex_prefix],80h add [extended_code],10h mov [opcode_prefix],0F3h ret avx_movddup_instruction: or [vex_required],1 mov [opcode_prefix],0F2h mov [base_code],0Fh mov [extended_code],al or [rex_prefix],80h xor al,al mov [mmx_size],al mov [broadcast_size],al lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register mov [postbyte_register],al cmp ah,16 ja avx_movddup_size_ok mov [mmx_size],8 avx_movddup_size_ok: call take_avx512_mask jmp avx_vex_reg_ok avx_movlpd_instruction: mov [opcode_prefix],66h or [rex_prefix],80h avx_movlps_instruction: mov [base_code],0Fh mov [extended_code],al mov [mmx_size],8 mov [broadcast_size],0 or [vex_required],1 lods byte [esi] call get_size_operator cmp al,10h jne avx_movlps_mem lods byte [esi] call convert_avx_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al cmp [operand_size],16 jne invalid_operand mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_rm jc invalid_operand jmp instruction_ready avx_movlps_mem: cmp al,'[' jne invalid_operand call get_address avx_movlps_mem_: mov al,[operand_size] or al,al jz avx_movlps_mem_size_ok cmp al,[mmx_size] jne invalid_operand_size mov [operand_size],0 avx_movlps_mem_size_ok: lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register cmp ah,16 jne invalid_operand mov [postbyte_register],al inc [extended_code] jmp instruction_ready avx_movhlps_instruction: mov [base_code],0Fh mov [extended_code],al or [vex_required],1 call take_avx_register cmp ah,16 jne invalid_operand mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al jmp nomem_instruction_ready avx_movsd_instruction: mov al,0F2h mov cl,8 or [rex_prefix],80h jmp avx_movs_instruction avx_movss_instruction: mov al,0F3h mov cl,4 avx_movs_instruction: mov [opcode_prefix],al mov [mmx_size],cl or [vex_required],1 mov [base_code],0Fh mov [extended_code],10h lods byte [esi] call get_size_operator cmp al,10h jne avx_movs_mem lods byte [esi] call convert_avx_register cmp ah,16 jne invalid_operand mov [postbyte_register],al call take_avx512_mask xor cl,cl xchg cl,[operand_size] lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne avx_movs_reg_mem mov [operand_size],cl lods byte [esi] call convert_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al cmp bl,8 jb nomem_instruction_ready inc [extended_code] xchg bl,[postbyte_register] jmp nomem_instruction_ready avx_movs_reg_mem: cmp al,'[' jne invalid_operand call get_address mov al,[operand_size] or al,al jz avx_movs_reg_mem_ok cmp al,[mmx_size] jne invalid_operand_size avx_movs_reg_mem_ok: jmp instruction_ready avx_movs_mem: cmp al,'[' jne invalid_operand call get_address or [operand_flags],20h call take_avx512_mask jmp avx_movlps_mem_ avx_comiss_instruction: or [operand_flags],2+4+10h mov cl,4 jmp avx_instruction avx_comisd_instruction: or [operand_flags],2+4+10h mov [opcode_prefix],66h or [rex_prefix],80h mov cl,8 jmp avx_instruction avx_movshdup_instruction: or [operand_flags],2 mov [opcode_prefix],0F3h xor cl,cl jmp avx_instruction avx_cvtqq2pd_instruction: mov [opcode_prefix],0F3h or [vex_required],8 or [operand_flags],2+4+8 or [rex_prefix],8 mov cx,0800h jmp avx_instruction_with_broadcast avx_pshuf_w_instruction: mov [opcode_prefix],al or [operand_flags],2 mov [immediate_size],1 mov al,70h xor cl,cl jmp avx_instruction avx_single_source_128bit_instruction_38_noevex: or [operand_flags],2 avx_128bit_instruction_38_noevex: mov cl,16 jmp avx_instruction_38_noevex avx_single_source_instruction_38_noevex: or [operand_flags],2 jmp avx_pi_instruction_38_noevex avx_pi_instruction_38_noevex: xor cl,cl avx_instruction_38_noevex: or [vex_required],2 avx_instruction_38: mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_instruction avx_ss_instruction_3a_imm8_noevex: mov cl,4 jmp avx_instruction_3a_imm8_noevex avx_sd_instruction_3a_imm8_noevex: mov cl,8 jmp avx_instruction_3a_imm8_noevex avx_single_source_128bit_instruction_3a_imm8_noevex: or [operand_flags],2 avx_128bit_instruction_3a_imm8_noevex: mov cl,16 jmp avx_instruction_3a_imm8_noevex avx_triple_source_instruction_3a_noevex: xor cl,cl mov [immediate_size],-1 mov byte [value],0 jmp avx_instruction_3a_noevex avx_single_source_instruction_3a_imm8_noevex: or [operand_flags],2 avx_pi_instruction_3a_imm8_noevex: xor cl,cl avx_instruction_3a_imm8_noevex: mov [immediate_size],1 avx_instruction_3a_noevex: or [vex_required],2 avx_instruction_3a: mov [opcode_prefix],66h mov [supplemental_code],al mov al,3Ah jmp avx_instruction avx_pi_instruction_3a_imm8: xor cl,cl mov [immediate_size],1 jmp avx_instruction_3a avx_pclmulqdq_instruction: mov byte [value],al mov [immediate_size],-4 xor cl,cl mov al,44h or [operand_flags],10h jmp avx_instruction_3a avx_instruction_38_nomask: or [operand_flags],10h xor cl,cl jmp avx_instruction_38 avx512_single_source_pd_instruction_sae_imm8: or [operand_flags],2 avx512_pd_instruction_sae_imm8: or [rex_prefix],8 mov cx,0800h jmp avx512_instruction_sae_imm8 avx512_single_source_ps_instruction_sae_imm8: or [operand_flags],2 avx512_ps_instruction_sae_imm8: mov cx,0400h jmp avx512_instruction_sae_imm8 avx512_sd_instruction_sae_imm8: or [rex_prefix],8 mov cx,0008h jmp avx512_instruction_sae_imm8 avx512_ss_instruction_sae_imm8: mov cx,0004h avx512_instruction_sae_imm8: or [operand_flags],4 avx512_instruction_imm8: or [vex_required],8 mov [opcode_prefix],66h mov [immediate_size],1 mov [supplemental_code],al mov al,3Ah jmp avx_instruction_with_broadcast avx512_pd_instruction_er: or [operand_flags],4+8 jmp avx512_pd_instruction avx512_single_source_pd_instruction_sae: or [operand_flags],4 avx512_single_source_pd_instruction: or [operand_flags],2 avx512_pd_instruction: or [rex_prefix],8 mov cx,0800h jmp avx512_instruction avx512_ps_instruction_er: or [operand_flags],4+8 jmp avx512_ps_instruction avx512_single_source_ps_instruction_sae: or [operand_flags],4 avx512_single_source_ps_instruction: or [operand_flags],2 avx512_ps_instruction: mov cx,0400h jmp avx512_instruction avx512_sd_instruction_er: or [operand_flags],8 avx512_sd_instruction_sae: or [operand_flags],4 avx512_sd_instruction: or [rex_prefix],8 mov cx,0008h jmp avx512_instruction avx512_ss_instruction_er: or [operand_flags],8 avx512_ss_instruction_sae: or [operand_flags],4 avx512_ss_instruction: mov cx,0004h avx512_instruction: or [vex_required],8 mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_instruction_with_broadcast avx512_exp2pd_instruction: or [rex_prefix],8 or [operand_flags],2+4 mov cx,0840h jmp avx512_instruction avx512_exp2ps_instruction: or [operand_flags],2+4 mov cx,0440h jmp avx512_instruction fma_instruction_pd: or [rex_prefix],8 mov cx,0800h jmp fma_instruction fma_instruction_ps: mov cx,0400h jmp fma_instruction fma_instruction_sd: or [rex_prefix],8 mov cx,0008h jmp fma_instruction fma_instruction_ss: mov cx,0004h fma_instruction: or [operand_flags],4+8 mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_instruction_with_broadcast fma4_instruction_p: xor cl,cl jmp fma4_instruction fma4_instruction_sd: mov cl,8 jmp fma4_instruction fma4_instruction_ss: mov cl,4 fma4_instruction: mov [immediate_size],-2 mov byte [value],0 jmp avx_instruction_3a_noevex avx_cmp_pd_instruction: mov [opcode_prefix],66h or [rex_prefix],80h mov cx,0800h jmp avx_cmp_instruction avx_cmp_ps_instruction: mov cx,0400h jmp avx_cmp_instruction avx_cmp_sd_instruction: mov [opcode_prefix],0F2h or [rex_prefix],80h mov cx,0008h jmp avx_cmp_instruction avx_cmp_ss_instruction: mov [opcode_prefix],0F3h mov cx,0004h avx_cmp_instruction: mov byte [value],al mov [immediate_size],-4 or [operand_flags],4+20h mov al,0C2h jmp avx_cmp_common avx_cmpeqq_instruction: or [rex_prefix],80h mov ch,8 mov [supplemental_code],al mov al,38h jmp avx_cmp_pi_instruction avx_cmpeqd_instruction: mov ch,4 jmp avx_cmp_pi_instruction avx_cmpeqb_instruction: xor ch,ch jmp avx_cmp_pi_instruction avx512_cmp_uq_instruction: or [rex_prefix],8 mov ch,8 mov ah,1Eh jmp avx_cmp_pi_instruction_evex avx512_cmp_ud_instruction: mov ch,4 mov ah,1Eh jmp avx_cmp_pi_instruction_evex avx512_cmp_q_instruction: or [rex_prefix],8 mov ch,8 mov ah,1Fh jmp avx_cmp_pi_instruction_evex avx512_cmp_d_instruction: mov ch,4 mov ah,1Fh jmp avx_cmp_pi_instruction_evex avx512_cmp_uw_instruction: or [rex_prefix],8 avx512_cmp_ub_instruction: xor ch,ch mov ah,3Eh jmp avx_cmp_pi_instruction_evex avx512_cmp_w_instruction: or [rex_prefix],8 avx512_cmp_b_instruction: xor ch,ch mov ah,3Fh avx_cmp_pi_instruction_evex: mov byte [value],al mov [immediate_size],-4 mov [supplemental_code],ah mov al,3Ah or [vex_required],8 avx_cmp_pi_instruction: xor cl,cl or [operand_flags],20h mov [opcode_prefix],66h avx_cmp_common: mov [mmx_size],cl mov [broadcast_size],ch mov [extended_code],al mov [base_code],0Fh lods byte [esi] call get_size_operator cmp al,14h je avx_maskreg cmp al,10h jne invalid_operand or [vex_required],2 jmp avx_reg avx_maskreg: cmp [operand_size],0 jne invalid_operand_size or [vex_required],8 lods byte [esi] call convert_mask_register mov [postbyte_register],al call take_avx512_mask jmp avx_vex_reg avx512_fpclasspd_instruction: or [rex_prefix],8 mov cx,0800h jmp avx_fpclass_instruction avx512_fpclassps_instruction: mov cx,0400h jmp avx_fpclass_instruction avx512_fpclasssd_instruction: or [rex_prefix],8 mov cx,0008h jmp avx_fpclass_instruction avx512_fpclassss_instruction: mov cx,0004h avx_fpclass_instruction: mov [broadcast_size],ch mov [mmx_size],cl or [operand_flags],2 call setup_66_0f_3a mov [immediate_size],1 lods byte [esi] cmp al,14h je avx_maskreg jmp invalid_operand avx512_ptestnmd_instruction: mov ch,4 jmp avx512_ptestnm_instruction avx512_ptestnmq_instruction: or [rex_prefix],8 mov ch,8 jmp avx512_ptestnm_instruction avx512_ptestnmw_instruction: or [rex_prefix],8 avx512_ptestnmb_instruction: xor ch,ch avx512_ptestnm_instruction: mov ah,0F3h jmp avx512_ptest_instruction avx512_ptestmd_instruction: mov ch,4 jmp avx512_ptestm_instruction avx512_ptestmq_instruction: or [rex_prefix],8 mov ch,8 jmp avx512_ptestm_instruction avx512_ptestmw_instruction: or [rex_prefix],8 avx512_ptestmb_instruction: xor ch,ch avx512_ptestm_instruction: mov ah,66h avx512_ptest_instruction: xor cl,cl mov [opcode_prefix],ah mov [supplemental_code],al mov al,38h or [vex_required],8 jmp avx_cmp_common mask_shift_instruction_q: or [rex_prefix],8 mask_shift_instruction_d: or [operand_flags],2 or [immediate_size],1 mov [opcode_prefix],66h mov [supplemental_code],al mov al,3Ah jmp mask_instruction mask_instruction_single_source_b: mov [opcode_prefix],66h jmp mask_instruction_single_source_w mask_instruction_single_source_d: mov [opcode_prefix],66h mask_instruction_single_source_q: or [rex_prefix],8 mask_instruction_single_source_w: or [operand_flags],2 jmp mask_instruction mask_instruction_b: mov [opcode_prefix],66h jmp mask_instruction_w mask_instruction_d: mov [opcode_prefix],66h mask_instruction_q: or [rex_prefix],8 mask_instruction_w: mov [operand_size],32 mask_instruction: or [vex_required],1 mov [base_code],0Fh mov [extended_code],al call take_mask_register mov [postbyte_register],al test [operand_flags],2 jnz mask_instruction_nds_ok lods byte [esi] cmp al,',' jne invalid_operand call take_mask_register mov [vex_register],al mask_instruction_nds_ok: lods byte [esi] cmp al,',' jne invalid_operand call take_mask_register mov bl,al cmp [immediate_size],0 jne mmx_nomem_imm8 jmp nomem_instruction_ready take_mask_register: lods byte [esi] cmp al,14h jne invalid_operand lods byte [esi] convert_mask_register: mov ah,al shr ah,4 cmp ah,5 jne invalid_operand and al,1111b ret kmov_instruction: mov [mmx_size],al or [vex_required],1 mov [base_code],0Fh mov [extended_code],90h lods byte [esi] cmp al,14h je kmov_maskreg cmp al,10h je kmov_reg call get_size_operator inc [extended_code] cmp al,'[' jne invalid_argument call get_address lods byte [esi] cmp al,',' jne invalid_operand call take_mask_register mov [postbyte_register],al kmov_with_mem: mov ah,[mmx_size] mov al,[operand_size] or al,al jz kmov_mem_size_ok cmp al,ah jne invalid_operand_size kmov_mem_size_ok: call setup_kmov_prefix jmp instruction_ready setup_kmov_prefix: cmp ah,4 jb kmov_w_ok or [rex_prefix],8 kmov_w_ok: test ah,1 or 4 jz kmov_prefix_ok mov [opcode_prefix],66h kmov_prefix_ok: ret kmov_maskreg: lods byte [esi] call convert_mask_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] cmp al,14h je kmov_maskreg_maskreg cmp al,10h je kmov_maskreg_reg call get_size_operator cmp al,'[' jne invalid_argument call get_address jmp kmov_with_mem kmov_maskreg_maskreg: lods byte [esi] call convert_mask_register mov bl,al mov ah,[mmx_size] call setup_kmov_prefix jmp nomem_instruction_ready kmov_maskreg_reg: add [extended_code],2 lods byte [esi] call convert_register kmov_with_reg: mov bl,al mov al,[mmx_size] mov ah,4 cmp al,ah jbe kmov_reg_size_check mov ah,al kmov_reg_size_check: cmp ah,[operand_size] jne invalid_operand_size cmp al,8 je kmov_f2_w1 cmp al,2 ja kmov_f2 je nomem_instruction_ready mov [opcode_prefix],66h jmp nomem_instruction_ready kmov_f2_w1: or [rex_prefix],8 cmp [code_type],64 jne illegal_instruction kmov_f2: mov [opcode_prefix],0F2h jmp nomem_instruction_ready kmov_reg: add [extended_code],3 lods byte [esi] call convert_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_mask_register jmp kmov_with_reg avx512_pmov_m2_instruction_w1: or [rex_prefix],8 avx512_pmov_m2_instruction: or [vex_required],8 call setup_f3_0f_38 call take_avx_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_mask_register mov bl,al jmp nomem_instruction_ready avx512_pmov_2m_instruction_w1: or [rex_prefix],8 avx512_pmov_2m_instruction: or [vex_required],8 call setup_f3_0f_38 call take_mask_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al jmp nomem_instruction_ready setup_f3_0f_38: mov [extended_code],38h mov [supplemental_code],al mov [base_code],0Fh mov [opcode_prefix],0F3h ret vzeroall_instruction: mov [operand_size],32 vzeroupper_instruction: mov [base_code],0Fh mov [extended_code],al and [displacement_compression],0 call store_vex_instruction_code jmp instruction_assembled 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 xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator cmp al,'[' je avx_shift_reg_mem mov [operand_size],cl cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand push esi xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator cmp al,10h je avx_shift_reg_reg_reg pop esi cmp al,'[' je avx_shift_reg_reg_mem xchg cl,[operand_size] test cl,not 1 jnz invalid_operand_size dec esi call convert_avx_shift_opcode mov bl,al jmp mmx_nomem_imm8 convert_avx_shift_opcode: mov al,[extended_code] mov ah,al and ah,1111b add ah,70h mov [extended_code],ah shr al,4 sub al,0Ch shl al,1 xchg al,[postbyte_register] xchg al,[vex_register] ret avx_shift_reg_reg_reg: pop eax lods byte [esi] call convert_xmm_register xchg cl,[operand_size] mov bl,al jmp nomem_instruction_ready avx_shift_reg_reg_mem: mov [mmx_size],16 push ecx lods byte [esi] call get_size_operator call get_address pop eax xchg al,[operand_size] test al,al jz instruction_ready cmp al,16 jne invalid_operand_size jmp instruction_ready avx_shift_reg_mem: or [vex_required],8 call take_avx_mem call convert_avx_shift_opcode jmp mmx_imm8 avx_shift_dq_instruction: mov [postbyte_register],al mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],73h or [vex_required],1 mov [mmx_size],0 call take_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,'[' je avx_shift_dq_reg_mem cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register mov bl,al jmp mmx_nomem_imm8 avx_shift_dq_reg_mem: or [vex_required],8 call get_address jmp mmx_imm8 avx512_rotate_q_instruction: mov cl,8 or [rex_prefix],cl jmp avx512_rotate_instruction avx512_rotate_d_instruction: mov cl,4 avx512_rotate_instruction: mov [broadcast_size],cl mov [postbyte_register],al mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],72h or [vex_required],8 mov [mmx_size],0 mov [immediate_size],1 call take_avx_register mov [vex_register],al call take_avx512_mask jmp avx_vex_reg_ok avx_pmovsxbq_instruction: mov cl,2 jmp avx_pmovsx_instruction avx_pmovsxbd_instruction: mov cl,4 jmp avx_pmovsx_instruction avx_pmovsxbw_instruction: mov cl,8 avx_pmovsx_instruction: mov [mmx_size],cl or [vex_required],1 call setup_66_0f_38 call take_avx_register mov [postbyte_register],al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand xor al,al xchg al,[operand_size] bsf ecx,eax sub cl,4 shl [mmx_size],cl push eax lods byte [esi] call get_size_operator cmp al,10h je avx_pmovsx_reg_reg cmp al,'[' jne invalid_operand call get_address pop eax xchg al,[operand_size] or al,al jz instruction_ready cmp al,[mmx_size] jne invalid_operand_size jmp instruction_ready avx_pmovsx_reg_reg: lods byte [esi] call convert_avx_register mov bl,al cmp ah,[mmx_size] je avx_pmovsx_xmmreg_reg_size_ok jb invalid_operand_size cmp ah,16 jne invalid_operand_size avx_pmovsx_xmmreg_reg_size_ok: pop eax mov [operand_size],al jmp nomem_instruction_ready avx512_pmovqb_instruction: mov cl,2 jmp avx512_pmov_instruction avx512_pmovdb_instruction: mov cl,4 jmp avx512_pmov_instruction avx512_pmovwb_instruction: mov cl,8 avx512_pmov_instruction: mov [mmx_size],cl or [vex_required],8 mov [extended_code],38h mov [supplemental_code],al mov [base_code],0Fh mov [opcode_prefix],0F3h lods byte [esi] call get_size_operator cmp al,10h je avx512_pmov_reg cmp al,'[' jne invalid_operand call get_address or [operand_flags],20h call avx512_pmov_common or al,al jz instruction_ready cmp al,[mmx_size] jne invalid_operand_size jmp instruction_ready avx512_pmov_common: call take_avx512_mask xor al,al xchg al,[operand_size] push eax lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al mov al,ah mov ah,cl bsf ecx,eax sub cl,4 shl [mmx_size],cl mov cl,ah pop eax ret avx512_pmov_reg: lods byte [esi] call convert_avx_register mov bl,al call avx512_pmov_common cmp al,[mmx_size] je nomem_instruction_ready jb invalid_operand_size cmp al,16 jne invalid_operand_size jmp nomem_instruction_ready avx_broadcast_128_instruction_noevex: or [vex_required],2 mov cl,10h jmp avx_broadcast_instruction avx512_broadcast_32x2_instruction: mov cl,08h jmp avx_broadcast_instruction_evex avx512_broadcast_32x4_instruction: mov cl,10h jmp avx_broadcast_instruction_evex avx512_broadcast_32x8_instruction: mov cl,20h jmp avx_broadcast_instruction_evex avx512_broadcast_64x2_instruction: mov cl,10h jmp avx_broadcast_instruction_w1_evex avx512_broadcast_64x4_instruction: mov cl,20h avx_broadcast_instruction_w1_evex: or [rex_prefix],8 avx_broadcast_instruction_evex: or [vex_required],8 jmp avx_broadcast_instruction avx_broadcastss_instruction: mov cl,4 jmp avx_broadcast_instruction avx_broadcastsd_instruction: or [rex_prefix],80h mov cl,8 jmp avx_broadcast_instruction avx_pbroadcastb_instruction: mov cl,1 jmp avx_broadcast_pi_instruction avx_pbroadcastw_instruction: mov cl,2 jmp avx_broadcast_pi_instruction avx_pbroadcastd_instruction: mov cl,4 jmp avx_broadcast_pi_instruction avx_pbroadcastq_instruction: mov cl,8 or [rex_prefix],80h avx_broadcast_pi_instruction: or [operand_flags],40h avx_broadcast_instruction: mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h mov [mmx_size],cl mov [base_code],0Fh mov [extended_code],al or [vex_required],1 call take_avx_register cmp ah,[mmx_size] je invalid_operand_size test [operand_flags],40h jnz avx_broadcast_destination_size_ok cmp [mmx_size],4 je avx_broadcast_destination_size_ok cmp [supplemental_code],59h je avx_broadcast_destination_size_ok cmp ah,16 je invalid_operand_size avx_broadcast_destination_size_ok: xor ah,ah xchg ah,[operand_size] push eax call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h je avx_broadcast_reg_reg cmp al,'[' jne invalid_operand call get_address pop eax xchg ah,[operand_size] mov [postbyte_register],al mov al,[broadcast_size] mov al,[mmx_size] cmp al,ah je instruction_ready or al,al jz instruction_ready or ah,ah jz instruction_ready jmp invalid_operand_size avx_broadcast_reg_reg: lods byte [esi] test [operand_flags],40h jz avx_broadcast_reg_avx_reg cmp al,60h jb avx_broadcast_reg_general_reg cmp al,80h jb avx_broadcast_reg_avx_reg cmp al,0C0h jb avx_broadcast_reg_general_reg avx_broadcast_reg_avx_reg: call convert_avx_register mov bl,al mov al,[mmx_size] or al,al jz avx_broadcast_reg_avx_reg_size_ok cmp ah,16 jne invalid_operand_size cmp al,ah jae invalid_operand avx_broadcast_reg_avx_reg_size_ok: pop eax xchg ah,[operand_size] mov [postbyte_register],al test [vex_required],2 jnz invalid_operand jmp nomem_instruction_ready avx_broadcast_reg_general_reg: call convert_register mov bl,al mov al,[mmx_size] or al,al jz avx_broadcast_reg_general_reg_size_ok cmp al,ah je avx_broadcast_reg_general_reg_size_ok ja invalid_operand_size cmp ah,4 jne invalid_operand_size avx_broadcast_reg_general_reg_size_ok: cmp al,4 jb avx_broadcast_reg_general_reg_ready cmp al,8 mov al,3 jne avx_broadcast_reg_general_reg_ready or [rex_prefix],8 avx_broadcast_reg_general_reg_ready: add al,7Ah-1 mov [supplemental_code],al or [vex_required],8 pop eax xchg ah,[operand_size] mov [postbyte_register],al jmp nomem_instruction_ready avx512_extract_64x4_instruction: or [rex_prefix],8 avx512_extract_32x8_instruction: or [vex_required],8 mov cl,32 jmp avx_extractf_instruction avx512_extract_64x2_instruction: or [rex_prefix],8 avx512_extract_32x4_instruction: or [vex_required],8 mov cl,16 jmp avx_extractf_instruction avx_extractf128_instruction: or [vex_required],2 mov cl,16 avx_extractf_instruction: mov [mmx_size],cl call setup_66_0f_3a lods byte [esi] call get_size_operator cmp al,10h je avx_extractf_reg cmp al,'[' jne invalid_operand call get_address xor al,al xchg al,[operand_size] or al,al jz avx_extractf_mem_size_ok cmp al,[mmx_size] jne invalid_operand_size avx_extractf_mem_size_ok: call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register cmp ah,[mmx_size] jbe invalid_operand_size mov [postbyte_register],al jmp mmx_imm8 avx_extractf_reg: lods byte [esi] call convert_avx_register cmp ah,[mmx_size] jne invalid_operand_size push eax call take_avx512_mask mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register cmp ah,[mmx_size] jbe invalid_operand_size mov [postbyte_register],al pop ebx jmp mmx_nomem_imm8 avx512_insert_64x4_instruction: or [rex_prefix],8 avx512_insert_32x8_instruction: or [vex_required],8 mov cl,32 jmp avx_insertf_instruction avx512_insert_64x2_instruction: or [rex_prefix],8 avx512_insert_32x4_instruction: or [vex_required],8 mov cl,16 jmp avx_insertf_instruction avx_insertf128_instruction: or [vex_required],2 mov cl,16 avx_insertf_instruction: mov [mmx_size],cl mov [broadcast_size],0 call setup_66_0f_3a call take_avx_register cmp ah,[mmx_size] jbe invalid_operand mov [postbyte_register],al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al mov al,[mmx_size] xchg al,[operand_size] push eax lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h je avx_insertf_reg_reg_reg cmp al,'[' jne invalid_operand call get_address pop eax mov [operand_size],al jmp mmx_imm8 avx_insertf_reg_reg_reg: lods byte [esi] call convert_avx_register mov bl,al pop eax mov [operand_size],al jmp mmx_nomem_imm8 avx_extract_b_instruction: mov cl,1 jmp avx_extract_instruction avx_extract_w_instruction: mov cl,2 jmp avx_extract_instruction avx_extract_q_instruction: or [rex_prefix],8 mov cl,8 jmp avx_extract_instruction avx_extract_d_instruction: mov cl,4 avx_extract_instruction: mov [mmx_size],cl call setup_66_0f_3a or [vex_required],1 lods byte [esi] call get_size_operator cmp al,10h je avx_extractps_reg cmp al,'[' jne invalid_operand call get_address mov al,[mmx_size] not al and [operand_size],al jnz invalid_operand_size lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al jmp mmx_imm8 avx_extractps_reg: lods byte [esi] call convert_register mov bl,al mov al,[mmx_size] cmp ah,al jb invalid_operand_size cmp ah,4 je avx_extractps_reg_size_ok cmp ah,8 jne invalid_operand_size cmp [code_type],64 jne invalid_operand cmp al,4 jae avx_extractps_reg_size_ok or [rex_prefix],8 avx_extractps_reg_size_ok: mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al cmp [supplemental_code],15h jne mmx_nomem_imm8 mov [extended_code],0C5h xchg bl,[postbyte_register] jmp mmx_nomem_imm8 avx_insertps_instruction: mov [immediate_size],1 or [operand_flags],10h mov [opcode_prefix],66h mov [supplemental_code],al mov al,3Ah mov cl,4 jmp avx_instruction avx_pinsrb_instruction: mov cl,1 jmp avx_pinsr_instruction_3a avx_pinsrw_instruction: mov cl,2 jmp avx_pinsr_instruction avx_pinsrd_instruction: mov cl,4 jmp avx_pinsr_instruction_3a avx_pinsrq_instruction: cmp [code_type],64 jne illegal_instruction mov cl,8 or [rex_prefix],8 avx_pinsr_instruction_3a: mov [supplemental_code],al mov al,3Ah avx_pinsr_instruction: mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],al mov [mmx_size],cl or [vex_required],1 call take_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al jmp pinsr_xmmreg avx_cvtudq2pd_instruction: or [vex_required],8 avx_cvtdq2pd_instruction: mov [opcode_prefix],0F3h mov cl,4 jmp avx_cvt_d_instruction avx_cvtps2qq_instruction: or [operand_flags],8 avx_cvttps2qq_instruction: or [operand_flags],4 or [vex_required],8 mov [opcode_prefix],66h mov cl,4 jmp avx_cvt_d_instruction avx_cvtps2pd_instruction: or [operand_flags],4 mov cl,4 avx_cvt_d_instruction: mov [base_code],0Fh mov [extended_code],al or [vex_required],1 mov [broadcast_size],cl call take_avx_register mov [postbyte_register],al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand xor ecx,ecx xchg cl,[operand_size] mov al,cl shr al,1 mov [mmx_size],al lods byte [esi] call get_size_operator cmp al,'[' je avx_cvt_d_reg_mem cmp al,10h jne invalid_operand mov [operand_size],0 lods byte [esi] call convert_avx_register cmp ah,[mmx_size] je avx_cvt_d_reg_reg_size_ok jb invalid_operand_size cmp ah,16 jne invalid_operand_size avx_cvt_d_reg_reg_size_ok: mov bl,al mov [operand_size],cl call take_avx512_rounding jmp nomem_instruction_ready avx_cvt_d_reg_mem: call take_avx_mem jmp instruction_ready avx_cvtpd2dq_instruction: or [operand_flags],4+8 mov [opcode_prefix],0F2h jmp avx_cvt_q_instruction avx_cvtuqq2ps_instruction: mov [opcode_prefix],0F2h avx_cvtpd2udq_instruction: or [operand_flags],8 avx_cvttpd2udq_instruction: or [operand_flags],4 or [vex_required],8 jmp avx_cvt_q_instruction avx_cvtpd2ps_instruction: or [operand_flags],8 avx_cvttpd2dq_instruction: or [operand_flags],4 mov [opcode_prefix],66h avx_cvt_q_instruction: mov [broadcast_size],8 mov [base_code],0Fh mov [extended_code],al or [vex_required],1 or [rex_prefix],80h call take_avx_register mov [postbyte_register],al push eax call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand xor al,al mov [operand_size],al mov [mmx_size],al call take_avx_rm jnc avx_cvt_q_reg_mem mov bl,al pop eax call avx_cvt_q_check_size call take_avx512_rounding jmp nomem_instruction_ready avx_cvt_q_reg_mem: pop eax call avx_cvt_q_check_size jmp instruction_ready avx_cvt_q_check_size: mov al,[operand_size] or al,al jz avx_cvt_q_size_not_specified cmp al,64 ja invalid_operand_size shr al,1 cmp al,ah je avx_cvt_q_size_ok ja invalid_operand_size cmp ah,16 jne invalid_operand_size avx_cvt_q_size_ok: ret avx_cvt_q_size_not_specified: cmp ah,64 shr 1 jne recoverable_unknown_size mov [operand_size],64 ret avx_cvttps2udq_instruction: or [vex_required],8 or [operand_flags],2+4 mov cx,0400h jmp avx_instruction_with_broadcast avx_cvttps2dq_instruction: mov [opcode_prefix],0F3h or [operand_flags],2+4 mov cx,0400h jmp avx_instruction_with_broadcast avx_cvtph2ps_instruction: mov [opcode_prefix],66h mov [supplemental_code],al or [operand_flags],4 mov al,38h xor cl,cl jmp avx_cvt_d_instruction avx_cvtps2ph_instruction: call setup_66_0f_3a or [vex_required],1 or [operand_flags],4 lods byte [esi] call get_size_operator cmp al,10h je vcvtps2ph_reg cmp al,'[' jne invalid_operand call get_address call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand shl [operand_size],1 call take_avx_register mov [postbyte_register],al shr ah,1 mov [mmx_size],ah jmp mmx_imm8 vcvtps2ph_reg: lods byte [esi] call convert_avx_register mov bl,al call take_avx512_mask xor cl,cl xchg cl,[operand_size] shl cl,1 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al or cl,cl jz vcvtps2ph_reg_size_ok cmp cl,ah je vcvtps2ph_reg_size_ok jb invalid_operand_size cmp ah,16 jne invalid_operand_size vcvtps2ph_reg_size_ok: call take_avx512_rounding jmp mmx_nomem_imm8 avx_cvtsd2usi_instruction: or [operand_flags],8 avx_cvttsd2usi_instruction: or [vex_required],8 jmp avx_cvttsd2si_instruction avx_cvtsd2si_instruction: or [operand_flags],8 avx_cvttsd2si_instruction: mov ah,0F2h mov cl,8 jmp avx_cvt_2si_instruction avx_cvtss2usi_instruction: or [operand_flags],8 avx_cvttss2usi_instruction: or [vex_required],8 jmp avx_cvttss2si_instruction avx_cvtss2si_instruction: or [operand_flags],8 avx_cvttss2si_instruction: mov ah,0F3h mov cl,4 avx_cvt_2si_instruction: or [operand_flags],2+4 mov [mmx_size],cl mov [broadcast_size],0 mov [opcode_prefix],ah mov [base_code],0Fh mov [extended_code],al or [vex_required],1 lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al mov [operand_size],0 cmp ah,4 je avx_cvt_2si_reg cmp ah,8 jne invalid_operand_size call operand_64bit avx_cvt_2si_reg: lods byte [esi] cmp al,',' jne invalid_operand call take_avx_rm jnc instruction_ready mov bl,al call take_avx512_rounding jmp nomem_instruction_ready avx_cvtusi2sd_instruction: or [vex_required],8 avx_cvtsi2sd_instruction: mov ah,0F2h mov cl,8 jmp avx_cvtsi_instruction avx_cvtusi2ss_instruction: or [vex_required],8 avx_cvtsi2ss_instruction: mov ah,0F3h mov cl,4 avx_cvtsi_instruction: or [operand_flags],2+4+8 mov [mmx_size],cl mov [opcode_prefix],ah mov [base_code],0Fh mov [extended_code],al or [vex_required],1 call take_avx_register cmp ah,16 jne invalid_operand_size mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand mov [operand_size],0 lods byte [esi] call get_size_operator cmp al,'[' je avx_cvtsi_reg_reg_mem cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov bl,al cmp ah,4 je avx_cvtsi_reg_reg_reg32 cmp ah,8 jne invalid_operand_size call operand_64bit avx_cvtsi_rounding: call take_avx512_rounding jmp nomem_instruction_ready avx_cvtsi_reg_reg_reg32: cmp [mmx_size],8 jne avx_cvtsi_rounding jmp nomem_instruction_ready avx_cvtsi_reg_reg_mem: call get_address mov al,[operand_size] mov [mmx_size],al or al,al jz single_mem_nosize cmp al,4 je instruction_ready cmp al,8 jne invalid_operand_size call operand_64bit jmp instruction_ready avx_maskmov_w1_instruction: or [rex_prefix],8 avx_maskmov_instruction: call setup_66_0f_38 mov [mmx_size],0 or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h jne avx_maskmov_mem lods byte [esi] call convert_avx_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,'[' jne invalid_operand call get_address jmp instruction_ready avx_maskmov_mem: cmp al,'[' jne invalid_operand call get_address lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al add [supplemental_code],2 jmp instruction_ready avx_movmskpd_instruction: mov [opcode_prefix],66h avx_movmskps_instruction: mov [base_code],0Fh mov [extended_code],50h or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al cmp ah,4 je avx_movmskps_reg_ok cmp ah,8 jne invalid_operand_size cmp [code_type],64 jne invalid_operand avx_movmskps_reg_ok: mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al jmp nomem_instruction_ready avx_maskmovdqu_instruction: or [vex_required],2 jmp maskmovdqu_instruction avx_pmovmskb_instruction: or [vex_required],2 mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],al lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register cmp ah,4 je avx_pmovmskb_reg_size_ok cmp [code_type],64 jne invalid_operand_size cmp ah,8 jnz invalid_operand_size avx_pmovmskb_reg_size_ok: mov [postbyte_register],al mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al jmp nomem_instruction_ready gather_pd_instruction: or [rex_prefix],8 gather_ps_instruction: call setup_66_0f_38 or [vex_required],4 or [operand_flags],20h call take_avx_register mov [postbyte_register],al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand xor cl,cl xchg cl,[operand_size] push ecx lods byte [esi] call get_size_operator cmp al,'[' jne invalid_argument call get_address pop eax xchg al,[operand_size] gather_mem_size_check: mov ah,4 test [rex_prefix],8 jz gather_elements_size_ok add ah,ah gather_elements_size_ok: mov [mmx_size],ah test al,al jz gather_mem_size_ok cmp al,ah jne invalid_operand_size gather_mem_size_ok: cmp byte [esi],',' je gather_reg_mem_reg test [vex_required],20h jz invalid_operand mov ah,[operand_size] mov al,80h jmp gather_arguments_ok gather_reg_mem_reg: or [vex_required],2 inc esi call take_avx_register gather_arguments_ok: mov [vex_register],al cmp al,[postbyte_register] je disallowed_combination_of_registers mov al,bl and al,11111b cmp al,[postbyte_register] je disallowed_combination_of_registers cmp al,[vex_register] je disallowed_combination_of_registers mov al,bl shr al,5 cmp al,0Ch shr 1 je gather_vr128 mov ah,32 cmp al,6 shr 1 jne gather_regular add ah,ah gather_regular: mov al,[rex_prefix] shr al,3 xor al,[supplemental_code] test al,1 jz gather_uniform test [supplemental_code],1 jz gather_double mov al,ah xchg al,[operand_size] add al,al cmp al,ah jne invalid_operand_size jmp instruction_ready gather_double: add ah,ah gather_uniform: cmp ah,[operand_size] jne invalid_operand_size jmp instruction_ready gather_vr128: cmp ah,16 je instruction_ready cmp ah,32 jne invalid_operand_size test [supplemental_code],1 jnz invalid_operand_size test [rex_prefix],8 jz invalid_operand_size jmp instruction_ready scatter_pd_instruction: or [rex_prefix],8 scatter_ps_instruction: call setup_66_0f_38 or [vex_required],4+8 or [operand_flags],20h lods byte [esi] call get_size_operator cmp al,'[' jne invalid_argument call get_address call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand xor al,al xchg al,[operand_size] push eax call take_avx_register mov [postbyte_register],al pop eax jmp gather_mem_size_check gatherpf_qpd_instruction: mov ah,0C7h jmp gatherpf_pd_instruction gatherpf_dpd_instruction: mov ah,0C6h gatherpf_pd_instruction: or [rex_prefix],8 mov cl,8 jmp gatherpf_instruction gatherpf_qps_instruction: mov ah,0C7h jmp gatherpf_ps_instruction gatherpf_dps_instruction: mov ah,0C6h gatherpf_ps_instruction: mov cl,4 gatherpf_instruction: mov [mmx_size],cl mov [postbyte_register],al mov al,ah call setup_66_0f_38 or [vex_required],4+8 or [operand_flags],20h lods byte [esi] call get_size_operator cmp al,'[' jne invalid_argument call get_address call take_avx512_mask mov ah,[mmx_size] mov al,[operand_size] or al,al jz gatherpf_mem_size_ok cmp al,ah jne invalid_operand_size gatherpf_mem_size_ok: mov [operand_size],64 mov al,6 shr 1 cmp ah,4 je gatherpf_check_vsib cmp [supplemental_code],0C6h jne gatherpf_check_vsib mov al,0Eh shr 1 gatherpf_check_vsib: mov ah,bl shr ah,5 cmp al,ah jne invalid_operand jmp instruction_ready bmi_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],0F3h mov [postbyte_register],al bmi_reg: or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h je bmi_reg_reg cmp al,'[' jne invalid_argument call get_address call operand_32or64 jmp instruction_ready bmi_reg_reg: lods byte [esi] call convert_register mov bl,al call operand_32or64 jmp nomem_instruction_ready operand_32or64: mov al,[operand_size] cmp al,4 je operand_32or64_ok cmp al,8 jne invalid_operand_size cmp [code_type],64 jne invalid_operand or [rex_prefix],8 operand_32or64_ok: ret pdep_instruction: mov [opcode_prefix],0F2h jmp andn_instruction pext_instruction: mov [opcode_prefix],0F3h andn_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al or [vex_required],2 lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand jmp bmi_reg sarx_instruction: mov [opcode_prefix],0F3h jmp bzhi_instruction shrx_instruction: mov [opcode_prefix],0F2h jmp bzhi_instruction shlx_instruction: mov [opcode_prefix],66h bzhi_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al or [vex_required],2 call get_reg_mem jc bzhi_reg_reg call get_vex_source_register jc invalid_operand call operand_32or64 jmp instruction_ready bzhi_reg_reg: call get_vex_source_register jc invalid_operand call operand_32or64 jmp nomem_instruction_ready get_vex_source_register: lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,10h jne no_vex_source_register lods byte [esi] call convert_register mov [vex_register],al clc ret no_vex_source_register: stc ret bextr_instruction: mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al or [vex_required],2 call get_reg_mem jc bextr_reg_reg call get_vex_source_register jc bextr_reg_mem_imm32 call operand_32or64 jmp instruction_ready bextr_reg_reg: call get_vex_source_register jc bextr_reg_reg_imm32 call operand_32or64 jmp nomem_instruction_ready setup_bextr_imm_opcode: mov [xop_opcode_map],0Ah mov [base_code],10h call operand_32or64 ret bextr_reg_mem_imm32: call get_imm32 call setup_bextr_imm_opcode jmp store_instruction_with_imm32 bextr_reg_reg_imm32: call get_imm32 call setup_bextr_imm_opcode store_nomem_instruction_with_imm32: call store_nomem_instruction mov eax,dword [value] call mark_relocation stos dword [edi] jmp instruction_assembled get_imm32: cmp al,'(' jne invalid_operand push edx ebx ecx call get_dword_value mov dword [value],eax pop ecx ebx edx ret rorx_instruction: mov [opcode_prefix],0F2h mov [base_code],0Fh mov [extended_code],3Ah mov [supplemental_code],al or [vex_required],2 call get_reg_mem jc rorx_reg_reg call operand_32or64 jmp mmx_imm8 rorx_reg_reg: call operand_32or64 jmp mmx_nomem_imm8 tbm_instruction: mov [xop_opcode_map],9 mov ah,al shr ah,4 and al,111b mov [base_code],ah mov [postbyte_register],al jmp bmi_reg llwpcb_instruction: or [vex_required],2 mov [xop_opcode_map],9 mov [base_code],12h mov [postbyte_register],al lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov bl,al call operand_32or64 jmp nomem_instruction_ready lwpins_instruction: or [vex_required],2 mov [xop_opcode_map],0Ah mov [base_code],12h mov [vex_register],al lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] call convert_register mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator cmp al,10h je lwpins_reg_reg cmp al,'[' jne invalid_argument push ecx call get_address pop eax xchg al,[operand_size] test al,al jz lwpins_reg_mem_size_ok cmp al,4 jne invalid_operand_size lwpins_reg_mem_size_ok: call prepare_lwpins jmp store_instruction_with_imm32 lwpins_reg_reg: lods byte [esi] call convert_register cmp ah,4 jne invalid_operand_size mov [operand_size],cl mov bl,al call prepare_lwpins jmp store_nomem_instruction_with_imm32 prepare_lwpins: lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_imm32 call operand_32or64 mov al,[vex_register] xchg al,[postbyte_register] mov [vex_register],al ret xop_single_source_sd_instruction: or [operand_flags],2 mov [mmx_size],8 jmp xop_instruction_9 xop_single_source_ss_instruction: or [operand_flags],2 mov [mmx_size],4 jmp xop_instruction_9 xop_single_source_instruction: or [operand_flags],2 mov [mmx_size],0 xop_instruction_9: mov [base_code],al mov [xop_opcode_map],9 jmp avx_xop_common xop_single_source_128bit_instruction: or [operand_flags],2 mov [mmx_size],16 jmp xop_instruction_9 xop_triple_source_128bit_instruction: mov [immediate_size],-1 mov byte [value],0 mov [mmx_size],16 jmp xop_instruction_8 xop_128bit_instruction: mov [immediate_size],-2 mov byte [value],0 mov [mmx_size],16 xop_instruction_8: mov [base_code],al mov [xop_opcode_map],8 jmp avx_xop_common xop_pcom_b_instruction: mov ah,0CCh jmp xop_pcom_instruction xop_pcom_d_instruction: mov ah,0CEh jmp xop_pcom_instruction xop_pcom_q_instruction: mov ah,0CFh jmp xop_pcom_instruction xop_pcom_w_instruction: mov ah,0CDh jmp xop_pcom_instruction xop_pcom_ub_instruction: mov ah,0ECh jmp xop_pcom_instruction xop_pcom_ud_instruction: mov ah,0EEh jmp xop_pcom_instruction xop_pcom_uq_instruction: mov ah,0EFh jmp xop_pcom_instruction xop_pcom_uw_instruction: mov ah,0EDh xop_pcom_instruction: mov byte [value],al mov [immediate_size],-4 mov [mmx_size],16 mov [base_code],ah mov [xop_opcode_map],8 jmp avx_xop_common vpcmov_instruction: or [vex_required],2 mov [immediate_size],-2 mov byte [value],0 mov [mmx_size],0 mov [base_code],al mov [xop_opcode_map],8 jmp avx_xop_common xop_shift_instruction: mov [base_code],al or [vex_required],2 mov [xop_opcode_map],9 call take_avx_register cmp ah,16 jne invalid_operand mov [postbyte_register],al lods byte [esi] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator cmp al,'[' je xop_shift_reg_mem cmp al,10h jne invalid_operand lods byte [esi] call convert_xmm_register mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand push esi xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator pop esi xchg cl,[operand_size] cmp al,'[' je xop_shift_reg_reg_mem cmp al,10h jne xop_shift_reg_reg_imm call take_avx_register mov bl,al xchg bl,[vex_register] jmp nomem_instruction_ready xop_shift_reg_reg_mem: or [rex_prefix],8 lods byte [esi] call get_size_operator call get_address jmp instruction_ready xop_shift_reg_reg_imm: xor bl,bl xchg bl,[vex_register] cmp [base_code],94h jae invalid_operand add [base_code],30h mov [xop_opcode_map],8 dec esi jmp mmx_nomem_imm8 xop_shift_reg_mem: call get_address lods byte [esi] cmp al,',' jne invalid_operand push esi xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator pop esi xchg cl,[operand_size] cmp al,10h jne xop_shift_reg_mem_imm call take_avx_register mov [vex_register],al jmp instruction_ready xop_shift_reg_mem_imm: cmp [base_code],94h jae invalid_operand add [base_code],30h mov [xop_opcode_map],8 dec esi jmp mmx_imm8 avx512_4vnniw_instruction: mov [opcode_prefix],0F2h mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al mov [mmx_size],16 mov [broadcast_size],0 or [vex_required],8 call take_avx_register mov [postbyte_register],al call take_avx512_mask lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [vex_register],al cmp byte [esi],'+' jne reg4_ok inc esi cmp dword [esi],29030128h jne invalid_operand lods dword [esi] reg4_ok: cmp [operand_size],64 jne invalid_operand_size mov [operand_size],0 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_rm jc invalid_operand mov [operand_size],64 jmp instruction_ready set_evex_mode: mov [evex_mode],al jmp instruction_assembled take_avx_register: lods byte [esi] call get_size_operator cmp al,10h jne invalid_operand lods byte [esi] convert_avx_register: mov ah,al and al,1Fh and ah,0E0h sub ah,60h jb invalid_operand jz avx512_register_size sub ah,60h jb invalid_operand jnz avx_register_size_ok mov ah,16 jmp avx_register_size_ok avx512_register_size: mov ah,64 avx_register_size_ok: cmp al,8 jb match_register_size cmp [code_type],64 jne invalid_operand jmp match_register_size store_vex_instruction_code: test [rex_prefix],10h jnz invalid_operand test [vex_required],0F8h jnz store_evex_instruction_code test [vex_register],10000b jnz store_evex_instruction_code cmp [operand_size],64 je store_evex_instruction_code mov al,[base_code] cmp al,0Fh jne store_xop_instruction_code test [vex_required],2 jnz prepare_vex cmp [evex_mode],0 je prepare_vex cmp [displacement_compression],1 jne prepare_vex cmp edx,80h jb prepare_vex cmp edx,-80h jae prepare_vex mov al,bl or al,bh shr al,4 cmp al,2 je prepare_vex call compress_displacement cmp [displacement_compression],2 ja prepare_evex jb prepare_vex dec [displacement_compression] mov edx,[uncompressed_displacement] prepare_vex: mov ah,[extended_code] cmp ah,38h je store_vex_0f38_instruction_code cmp ah,3Ah je store_vex_0f3a_instruction_code test [rex_prefix],1011b jnz store_vex_0f_instruction_code mov [edi+2],ah mov byte [edi],0C5h mov al,[vex_register] not al shl al,3 mov ah,[rex_prefix] shl ah,5 and ah,80h xor al,ah call get_vex_lpp_bits mov [edi+1],al call check_vex add edi,3 ret get_vex_lpp_bits: cmp [operand_size],32 jne get_vex_pp_bits or al,100b get_vex_pp_bits: mov ah,[opcode_prefix] cmp ah,66h je vex_66 cmp ah,0F3h je vex_f3 cmp ah,0F2h je vex_f2 test ah,ah jnz disallowed_combination_of_registers ret vex_f2: or al,11b ret vex_f3: or al,10b ret vex_66: or al,1 ret store_vex_0f38_instruction_code: mov al,11100010b mov ah,[supplemental_code] jmp make_c4_vex store_vex_0f3a_instruction_code: mov al,11100011b mov ah,[supplemental_code] jmp make_c4_vex store_vex_0f_instruction_code: mov al,11100001b make_c4_vex: mov [edi+3],ah mov byte [edi],0C4h mov ah,[rex_prefix] shl ah,5 xor al,ah mov [edi+1],al call check_vex mov al,[vex_register] xor al,1111b shl al,3 mov ah,[rex_prefix] shl ah,4 and ah,80h or al,ah call get_vex_lpp_bits mov [edi+2],al add edi,4 ret check_vex: cmp [code_type],64 je vex_ok not al test al,11000000b jnz invalid_operand test [rex_prefix],40h jnz invalid_operand vex_ok: ret store_xop_instruction_code: mov [edi+3],al mov byte [edi],8Fh mov al,[xop_opcode_map] mov ah,[rex_prefix] test ah,40h jz xop_ok cmp [code_type],64 jne invalid_operand xop_ok: not ah shl ah,5 xor al,ah mov [edi+1],al mov al,[vex_register] xor al,1111b shl al,3 mov ah,[rex_prefix] shl ah,4 and ah,80h or al,ah call get_vex_lpp_bits mov [edi+2],al add edi,4 ret store_evex_instruction_code: test [vex_required],2 jnz invalid_operand cmp [base_code],0Fh jne invalid_operand cmp [displacement_compression],1 jne prepare_evex call compress_displacement prepare_evex: mov ah,[extended_code] cmp ah,38h je store_evex_0f38_instruction_code cmp ah,3Ah je store_evex_0f3a_instruction_code mov al,11110001b make_evex: mov [edi+4],ah mov byte [edi],62h mov ah,[rex_prefix] shl ah,5 xor al,ah mov ah,[vex_required] and ah,10h xor al,ah mov [edi+1],al call check_vex mov al,[vex_register] not al and al,1111b shl al,3 mov ah,[rex_prefix] shl ah,4 or ah,[rex_prefix] and ah,80h or al,ah or al,100b call get_vex_pp_bits mov [edi+2],al mov al,[vex_register] not al shr al,1 and al,1000b test [vex_required],80h jne evex_rounding mov ah,[operand_size] cmp ah,16 jbe evex_l_ok or al,ah jmp evex_l_ok evex_rounding: mov ah,[rounding_mode] shl ah,5 or al,ah evex_l_ok: test [vex_required],20h jz evex_zaaa_ok or al,[mask_register] evex_zaaa_ok: test [vex_required],40h jz evex_b_ok or al,10h evex_b_ok: mov [edi+3],al add edi,5 ret store_evex_0f38_instruction_code: mov al,11110010b mov ah,[supplemental_code] jmp make_evex store_evex_0f3a_instruction_code: mov al,11110011b mov ah,[supplemental_code] jmp make_evex compress_displacement: mov ebp,ecx mov [uncompressed_displacement],edx or edx,edx jz displacement_compressed xor ecx,ecx mov cl,[mmx_size] test cl,cl jnz calculate_displacement_scale mov cl,[operand_size] calculate_displacement_scale: bsf ecx,ecx jz displacement_compression_ok xor eax,eax shrd eax,edx,cl jnz displacement_not_compressed sar edx,cl cmp edx,80h jb displacement_compressed cmp edx,-80h jnb displacement_compressed shl edx,cl displacement_not_compressed: inc [displacement_compression] jmp displacement_compression_ok displacement_compressed: add [displacement_compression],2 displacement_compression_ok: mov ecx,ebp ret