forked from KolibriOS/kolibrios
1354 lines
28 KiB
PHP
1354 lines
28 KiB
PHP
|
|
||
|
; 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
|