; flat assembler core ; Copyright (c) 1999-2011, Tomasz Grysztar. ; All rights reserved. avx_single_source_pd_instruction: or [vex_required],2 jmp avx_pd_instruction avx_pd_instruction_imm8: mov [immediate_size],1 avx_pd_instruction: mov [opcode_prefix],66h mov [mmx_size],0 jmp avx_instruction avx_single_source_ps_instruction: or [vex_required],2 jmp avx_ps_instruction avx_ps_instruction_imm8: mov [immediate_size],1 avx_ps_instruction: mov [mmx_size],0 jmp avx_instruction avx_sd_instruction_imm8: mov [immediate_size],1 avx_sd_instruction: mov [opcode_prefix],0F2h mov [mmx_size],8 jmp avx_instruction avx_ss_instruction_imm8: mov [immediate_size],1 avx_ss_instruction: mov [opcode_prefix],0F3h mov [mmx_size],4 jmp avx_instruction avx_cmp_pd_instruction: 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: mov [opcode_prefix],0F2h mov [mmx_size],8 mov byte [value],al mov al,0C2h 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 avx_instruction: mov [base_code],0Fh mov [extended_code],al avx_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 avx_vex_reg: test [vex_required],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: cmp [mmx_size],0 je avx_regs_size_ok cmp ah,16 jne invalid_operand avx_regs_size_ok: lods byte [esi] cmp al,',' jne invalid_operand 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 je mmx_imm8 cmp [immediate_size],0 jge instruction_ready cmp byte [esi],',' jne invalid_operand inc esi call take_avx_register shl al,4 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 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 je mmx_nomem_imm8 cmp [immediate_size],0 jge nomem_instruction_ready lods byte [esi] cmp al,',' jne invalid_operand mov al,bl shl al,4 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 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 mov [operand_size],cl cmp al,10h jne invalid_operand lods byte [esi] call convert_avx_register cmp [mmx_size],0 je avx_reg_ok cmp ah,16 jne invalid_operand 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] or al,al jz avx_mem_ok cmp al,[operand_size] jne operand_sizes_do_not_match avx_mem_ok: clc ret avx_smem: xchg al,[operand_size] cmp al,[mmx_size] jne invalid_operand_size clc ret 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 avx_128bit_instruction: mov [mmx_size],16 mov [opcode_prefix],66h jmp avx_instruction avx_single_source_128bit_instruction_38: or [vex_required],2 avx_128bit_instruction_38: mov [mmx_size],16 avx_instruction_38_setup: mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_instruction avx_single_source_instruction_38: or [vex_required],2 mov [mmx_size],0 jmp avx_instruction_38_setup 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_triple_source_128bit_instruction_3a: mov [mmx_size],16 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_perm2f128_instruction: call setup_66_0f_3a mov [immediate_size],1 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 setup_66_0f_3a: mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],3Ah mov [supplemental_code],al ret avx_movdqu_instruction: mov [opcode_prefix],0F3h jmp avx_movps_instruction avx_movpd_instruction: mov [opcode_prefix],66h avx_movps_instruction: mov [mmx_size],0 or [vex_required],2 mov [base_code],0Fh mov [extended_code],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 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov [postbyte_register],al jmp instruction_ready avx_movntpd_instruction: mov [opcode_prefix],66h avx_movntps_instruction: or [vex_required],1 mov [base_code],0Fh mov [extended_code],al lods byte [esi] call get_size_operator jmp avx_mem avx_lddqu_instruction: mov [opcode_prefix],0F2h mov [mmx_size],0 xor cl,cl avx_load_instruction: mov [base_code],0Fh mov [extended_code],al or [vex_required],1 call take_avx_register or cl,cl jz avx_load_reg_ok cmp ah,cl 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] cmp al,',' jne invalid_operand lods byte [esi] call get_size_operator 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 jmp instruction_ready avx_movntdqa_instruction: mov [mmx_size],16 mov al,2Ah mov cl,16 jmp avx_load_instruction_38 avx_broadcastss_instruction: mov [mmx_size],4 mov al,18h xor cl,cl jmp avx_load_instruction_38 avx_broadcastsd_instruction: mov [mmx_size],8 mov al,19h mov cl,32 jmp avx_load_instruction_38 avx_broadcastf128_instruction: mov [mmx_size],16 mov al,1Ah mov cl,32 avx_load_instruction_38: mov [opcode_prefix],66h mov [supplemental_code],al mov al,38h jmp avx_load_instruction avx_movlpd_instruction: mov [opcode_prefix],66h avx_movlps_instruction: mov [base_code],0Fh mov [extended_code],al mov [mmx_size],8 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 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_maskmov_instruction: mov [opcode_prefix],66h mov [base_code],0Fh mov [extended_code],38h mov [supplemental_code],al 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 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 jmp avx_movs_instruction avx_movss_instruction: mov [opcode_prefix],0F3h mov [mmx_size],4 avx_movs_instruction: 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 lods byte [esi] call convert_xmm_register mov [postbyte_register],al 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_cvtdq2pd_instruction: mov [opcode_prefix],0F3h avx_cvtps2pd_instruction: 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 xor cl,cl 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,'[' jne invalid_operand mov [mmx_size],cl call get_address mov al,[operand_size] or al,al jz instruction_ready shl al,1 cmp al,[mmx_size] jne invalid_operand_size mov [operand_size],al 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] cmp al,',' jne invalid_operand mov [operand_size],0 lods byte [esi] call get_size_operator cmp al,10h jne avx_cvtpd2dq_reg_mem lods byte [esi] call convert_avx_register mov bl,al jmp nomem_instruction_ready avx_cvtpd2dq_reg_mem: cmp al,'[' jne invalid_operand call get_address mov al,[operand_size] or al,al jz operand_size_not_specified cmp al,16 je instruction_ready cmp al,32 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 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 cvtsi_xmmreg avx_extractf128_instruction: or [vex_required],1 call setup_66_0f_3a lods byte [esi] call get_size_operator cmp al,10h je avx_extractf128_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 jne invalid_operand_size avx_extractf128_mem_size_ok: lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register cmp ah,32 jne invalid_operand_size mov [postbyte_register],al jmp mmx_imm8 avx_extractf128_reg: lods byte [esi] call convert_xmm_register mov [operand_size],0 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 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,',' jne invalid_operand call take_avx_register mov [vex_register],al mov [operand_size],0 mov [mmx_size],16 lods byte [esi] cmp al,',' jne invalid_operand call take_avx_rm mov [operand_size],32 jnc mmx_imm8 mov bl,al jmp mmx_nomem_imm8 avx_extractps_instruction: or [vex_required],1 jmp extractps_instruction avx_insertps_instruction: 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 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 avx_pinsrb_instruction: mov [mmx_size],1 or [vex_required],1 jmp avx_pinsr_instruction_3a avx_pinsrw_instruction: mov [mmx_size],2 or [vex_required],1 jmp avx_pinsr_instruction avx_pinsrd_instruction: mov [mmx_size],4 or [vex_required],1 jmp avx_pinsr_instruction_3a avx_pinsrq_instruction: mov [mmx_size],8 or [vex_required],1 call operand_64bit 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 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_maskmovdqu_instruction: or [vex_required],1 jmp maskmovdqu_instruction avx_pmovmskb_instruction: or [vex_required],1 jmp pmovmskb_instruction avx_pshufd_instruction: or [vex_required],1 jmp pshufd_instruction 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 jmp pmovsx_instruction 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_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 cmp ah,16 jne invalid_operand mov [vex_register],al lods byte [esi] cmp al,',' jne invalid_operand call take_avx_register mov bl,al jmp mmx_nomem_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 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 push esi xor cl,cl xchg cl,[operand_size] lods byte [esi] call get_size_operator xchg cl,[operand_size] pop esi cmp al,10h je avx_bit_shift_regs_reg cmp al,'[' je avx_bit_shift_regs_mem 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: call take_avx_register mov bl,al jmp nomem_instruction_ready avx_bit_shift_regs_mem: lods byte [esi] call get_size_operator call get_address jmp instruction_ready 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 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 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 xop_single_source_sd_instruction: or [vex_required],2 mov [mmx_size],8 jmp xop_instruction_9 xop_single_source_ss_instruction: or [vex_required],2 mov [mmx_size],4 jmp xop_instruction_9 xop_single_source_instruction: or [vex_required],2 mov [mmx_size],0 xop_instruction_9: mov [base_code],al mov [xop_opcode_map],9 jmp avx_common xop_single_source_128bit_instruction: or [vex_required],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_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 [mmx_size],16 mov [base_code],ah mov [xop_opcode_map],8 jmp avx_common vpcmov_instruction: or [vex_required],1 mov [immediate_size],-2 mov byte [value],0 mov [mmx_size],0 mov [base_code],al mov [xop_opcode_map],8 jmp avx_common xop_shift_instruction: mov [base_code],al or [vex_required],1 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 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 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,0Fh and ah,0F0h sub ah,0B0h jbe invalid_operand cmp ah,32 ja invalid_operand cmp al,8 jb match_register_size cmp [code_type],64 jne invalid_operand jmp match_register_size store_vex_instruction_code: mov al,[base_code] cmp al,0Fh jne store_xop_instruction_code 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 vex_l_bit_ok or al,100b vex_l_bit_ok: 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 prefix_conflict 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