forked from KolibriOS/kolibrios
b34f9856cb
git-svn-id: svn://kolibrios.org@9353 a494cfbc-eb01-0410-851d-a64ba20cac60
976 lines
27 KiB
PHP
976 lines
27 KiB
PHP
r8d equ edi
|
|
r8 equ rdi
|
|
;-----------------------------------------------------------------------------
|
|
R32RM32C5:
|
|
mov eax,R32RM32
|
|
jmp R16RM16C5.1
|
|
R16RM16C5:
|
|
mov eax,R16RM16
|
|
.1: cmp byte [rsi],0xC0
|
|
jae RtnAVX2C5
|
|
or byte [I.Flags],_O
|
|
and byte [I.Prefixes],not (bit P66)
|
|
jmp rax
|
|
|
|
RtnAVX2C5:
|
|
;F0/66/F2/F3/REX then #UD
|
|
test byte [I.Prefixes],bit PF0+bit P66+bit PF2+bit PF3+bit P4X
|
|
jnz ErrorDec
|
|
|
|
FetchB
|
|
mov [I.VEX],al
|
|
and [I.VEX],7Fh ;clear VEX.R
|
|
|
|
mov ah,al
|
|
and al,10000000b
|
|
xor al,10000000b
|
|
shr al,5 ;REX.R
|
|
jz .L1
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .L1
|
|
cmp [I.Arch],CPUX64
|
|
jne ErrorDec
|
|
.L1:
|
|
mov [I.PreREX],al
|
|
call SetMagicBytes
|
|
|
|
mov [I.P],1
|
|
|
|
mov al,ah
|
|
and al,01111000b ;vvvv
|
|
xor al,01111000b
|
|
shr al,3
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .L2
|
|
cmp al,7
|
|
jbe .L2
|
|
cmp [I.Arch],CPUX64
|
|
jne ErrorDec
|
|
.L2:
|
|
mov [I.VVVV],al
|
|
mov al,ah
|
|
and eax,11b ;pp
|
|
;mov [PP],al
|
|
mov edx,[rax*4+C4C5Tab]
|
|
mov edi,[rax*3+CMPSuffixesX]
|
|
jmp C4C5XX
|
|
;-----------------------------------------------------------------------------
|
|
R32RM32C4:
|
|
mov eax,R32RM32
|
|
jmp R16RM16C4.1
|
|
R16RM16C4:
|
|
mov eax,R16RM16
|
|
.1: cmp byte [rsi],0xC0
|
|
jae RtnAVX2C4
|
|
or byte [I.Flags],_O
|
|
and byte [I.Prefixes],not (bit P66)
|
|
jmp rax
|
|
RtnAVX2C4:
|
|
mov [I.RandSize],0
|
|
;F0/66/F2/F3/REX then #UD
|
|
test byte [I.Prefixes],bit PF0+bit P66+bit PF2+bit PF3+bit P4X
|
|
jnz ErrorDec
|
|
|
|
FetchB
|
|
mov ah,al
|
|
;and al,11100000b
|
|
xor al,11100000b
|
|
shr al,5 ;REX.RXB
|
|
jz .L1
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .L1
|
|
cmp [I.Arch],CPUX64
|
|
jne ErrorDec
|
|
.L1:
|
|
mov [I.PreREX],al
|
|
call SetMagicBytes
|
|
|
|
mov [I.P],1
|
|
|
|
mov al,ah
|
|
and al,11111b
|
|
mov [I.MMMMM],al ;mmmmm
|
|
|
|
FetchB
|
|
mov ah,al
|
|
mov [I.VEX],al
|
|
and al,01111000b ;vvvv
|
|
xor al,01111000b
|
|
shr al,3
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .L2
|
|
cmp al,7
|
|
jbe .L2
|
|
cmp [I.Arch],CPUX64
|
|
jne ErrorDec
|
|
.L2:
|
|
mov [I.VVVV],al
|
|
mov al,ah
|
|
and eax,11b ;pp
|
|
;mov [PP],al
|
|
|
|
mov edx,[rax*4+C4C5Tab]
|
|
mov ebx,[rax*4+C438Tab]
|
|
mov ecx,[rax*4+C43ATab]
|
|
mov edi,[rax*3+CMPSuffixesX]
|
|
|
|
mov al,[I.MMMMM]
|
|
or al,al
|
|
jz ErrorDec
|
|
cmp al,00011b
|
|
ja ErrorDec
|
|
;cmp al,00011b
|
|
jne .L3
|
|
mov edx,ecx
|
|
.L3:
|
|
cmp al,00010b
|
|
jne .L4
|
|
mov edx,ebx
|
|
.L4:
|
|
|
|
C4C5XX:
|
|
mov word [I.Suffix3rd],di
|
|
FetchB
|
|
mov [I.AfterVEX],al
|
|
|
|
mov [I.SaveRSI],rsi
|
|
.L1:
|
|
cmp dword [rdx],-1
|
|
jz ErrorDec
|
|
cmp al,[rdx+CXX.Imm]
|
|
jz .L2
|
|
add edx,CXX.Size
|
|
jmp .L1
|
|
.L2:
|
|
mov eax,dword [rdx+CXX.Flags]
|
|
mov word [I.FlagsVEX],ax
|
|
|
|
mov cl,VEXL
|
|
|
|
and al,cl
|
|
mov ah,[I.VEX]
|
|
and ah,al
|
|
jnz ErrorDec
|
|
|
|
test [I.FlagsVEX],VEXN
|
|
jz .L3
|
|
mov ah,[I.VEX]
|
|
and ah,cl
|
|
jz ErrorDec
|
|
.L3:
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
test [I.FlagsVEX+1],VEXG shr 8
|
|
jz .L4
|
|
xor cl,cl
|
|
cmp [I.Arch],CPUX64
|
|
jne .L4
|
|
mov cl,VEXW
|
|
.L4:
|
|
mov al,[rdx+CXX.MOS]
|
|
test [I.VEX],cl
|
|
jz .L5
|
|
shr al,4
|
|
.L5: and al,0Fh
|
|
mov [I.RandSize],al
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
mov al,byte [rdx+CXX.Flags]
|
|
and al,VEXW
|
|
mov ah,[I.VEX]
|
|
|
|
cmp [I.Arch],CPUX64
|
|
je .L6
|
|
test [I.FlagsVEX+1],VEXC shr 8
|
|
jnz .L6
|
|
test ah,VEXW
|
|
jnz ErrorDec
|
|
.L6:
|
|
and ah,al
|
|
jnz ErrorDec
|
|
|
|
mov al,byte [rdx+CXX.Flags]
|
|
and al,VEXV
|
|
jz .L7
|
|
cmp [I.VVVV],0 ;!1111b=0000b
|
|
jnz ErrorDec
|
|
.L7:
|
|
movzx r8d,[rdx+CXX.Rtn]
|
|
add r8d,RtnXX
|
|
|
|
mov edx,dword [rdx+CXX.Name]
|
|
test [I.FlagsVEX+1],VEXH shr 8
|
|
jnz .L8
|
|
mov [I.Prefix],'v'
|
|
.L8: mov [I.Name],dx
|
|
|
|
test [I.FlagsVEX+1],VEXF shr 8
|
|
jnz .L9
|
|
call FetchModRM
|
|
.L9:
|
|
test [I.FlagsVEX+1],VEXR shr 8
|
|
jz .LA
|
|
cmp [I.Mod],3
|
|
jnz ErrorDec
|
|
.LA:
|
|
cmp [I.Mod],3
|
|
jnz .LB
|
|
test [I.FlagsVEX],VEXM
|
|
jnz ErrorDec
|
|
.LB: jmp r8
|
|
|
|
RtnC4C5:
|
|
lea r8,[I.Arg1]
|
|
|
|
mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1: mov ah,al
|
|
|
|
test [I.FlagsVEX+1],VEX2 shr 8
|
|
jz .L2
|
|
mov ah,XMMRG
|
|
.L2:
|
|
test [I.FlagsVEX+1],VEX1 shr 8
|
|
jz .L3
|
|
mov al,XMMRG
|
|
.L3:
|
|
test [I.FlagsVEX+1],VEXG shr 8
|
|
jz .L4
|
|
mov ax,GPR32 by GPR32
|
|
cmp [I.Arch],CPUX64
|
|
jne .L4
|
|
test [I.VEX],VEXW
|
|
jz .L4
|
|
mov ax,GPR64 by GPR64
|
|
.L4:
|
|
push rax
|
|
test [I.FlagsVEX+1],VEXS shr 8
|
|
jnz .NDD
|
|
mov [r8+TArg.Type],al
|
|
mov [r8+TArg.Type2nd],InReg
|
|
add r8d,sizeof.TArg
|
|
.NDD:
|
|
mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L5
|
|
mov al,YMMRG
|
|
.L5:
|
|
test [I.FlagsVEX+1],VEXG shr 8
|
|
jz .L6
|
|
mov al,GPR32
|
|
cmp [I.Arch],CPUX64
|
|
jne .L6
|
|
test [I.VEX],VEXW
|
|
jz .L6
|
|
mov al,GPR64
|
|
.L6:
|
|
test [I.FlagsVEX],VEXV
|
|
jnz .L7
|
|
mov [r8+TArg.Type],al
|
|
mov [r8+TArg.Type2nd],InVVVV
|
|
add r8d,sizeof.TArg
|
|
.L7: pop rax
|
|
|
|
;cmp [I.Mod],3
|
|
;setnz [r8+TArg.Mem]
|
|
mov dl,ah
|
|
mov [r8+TArg.Type],dl
|
|
mov [r8+TArg.Type2nd],InRM
|
|
add r8d,sizeof.TArg
|
|
|
|
test [I.FlagsVEX],VEXI
|
|
jnz .Imm
|
|
|
|
test [I.FlagsVEX],VEX8
|
|
jz .L8
|
|
movzx eax,byte [rsi]
|
|
cmp al,1Fh
|
|
ja .Imm
|
|
FetchB
|
|
|
|
cmp [I.AfterVEX],0xC2
|
|
jne .L8
|
|
mov edx,[rax*2+CMPxxNames]
|
|
mov [I.Name],dx
|
|
mov eax,dword [I.Suffix3rd]
|
|
mov dword [I.Suffix2nd],eax
|
|
ret
|
|
|
|
.Imm: FetchB
|
|
mov [r8+TArg.Type],80h+1
|
|
mov [r8+TArg.ImmB],al
|
|
ret
|
|
.L8:
|
|
test [I.FlagsVEX],VEX4
|
|
jnz .L9
|
|
ret
|
|
.L9:
|
|
FetchB
|
|
shr al,4
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .LA
|
|
cmp [I.Arch],CPUX64
|
|
je .LA
|
|
and al,111b
|
|
.LA: mov [r8+TArg.Reg],al
|
|
mov [r8+TArg.Type],XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .LB
|
|
mov [r8+TArg.Type],YMMRG
|
|
.LB: ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC401:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg2.Mem]
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg2.Type2nd],InRM
|
|
|
|
mov [I.Arg1.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov [I.Arg1.Type],YMMRG
|
|
.L1: ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC404:test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.LastByte],'q'
|
|
.L1: ;jmp RtnC402
|
|
;-----------------------------------------------------------------------------
|
|
RtnC402:mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InRM
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg3.Type2nd],InReg
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC403:test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.LastByte],'q'
|
|
.L1: jmp RtnC4C5
|
|
;-----------------------------------------------------------------------------
|
|
;-----------------------------------------------------------------------------
|
|
RtnC405:test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.LastByte],'q'
|
|
.L1: ;jmp RtnC4VT
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4VT:mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1: call SetVT
|
|
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg2.Mem]
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg3.Type2nd],InVVVV
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC406:call RtnC4VT
|
|
mov ax,'ps'
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov ah,'d' ;'pd'
|
|
.L1: mov word [I.Suffix2nd],ax
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC407:call RtnC4C5
|
|
mov ax,'ps'
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov ah,'d' ;'pd'
|
|
.L1: mov word [I.Suffix2nd],ax
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC408:test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.RandSize],xQ
|
|
.L1: call RtnC4C5
|
|
mov ax,'ss'
|
|
test [I.VEX],VEXW
|
|
jz .L2
|
|
mov ah,'d' ;'sd'
|
|
.L2: mov word [I.Suffix2nd],ax
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC409:
|
|
mov al,GPR32
|
|
cmp [I.Arch],CPUX64
|
|
jne .L1
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov al,GPR64
|
|
.L1:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg2.Mem]
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg3.Type2nd],InVVVV
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC40A:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'w'
|
|
.L0:
|
|
mov al,KXXRG
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InRM
|
|
FetchB
|
|
mov [I.Arg3.Type],80h+1
|
|
mov [I.Arg3.ImmB],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC40B:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
.L0: jmp RtnC40A.L0
|
|
;-----------------------------------------------------------------------------
|
|
RtnC40C:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InRM
|
|
|
|
mov [I.Arg2.Type],YMMRG
|
|
mov [I.Arg2.Type2nd],InReg
|
|
.L1:
|
|
FetchB
|
|
mov [I.Arg3.Type],80h+1
|
|
mov [I.Arg3.ImmB],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC40D:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InRM
|
|
|
|
mov al,XMMRG
|
|
test [I.XOP],XOPL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1:
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InReg
|
|
jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
RtnC40F:
|
|
mov al,GPR64
|
|
cmp [I.Arch],CPUX64
|
|
jne RtnC40E.L1
|
|
test [I.VEX],VEXW
|
|
jnz RtnC40E.L2
|
|
RtnC40E:
|
|
.L1: mov al,GPR32
|
|
.L2:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InRM
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg2.Type2nd],InReg
|
|
jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
RtnC410:
|
|
mov [I.Arg1.Type],YMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],YMMRG
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg3.Mem]
|
|
mov [I.Arg3.Type],XMMRG
|
|
mov [I.Arg3.Type2nd],InRM
|
|
FetchB
|
|
mov [I.Arg4.Type],80h+1
|
|
mov [I.Arg4.ImmB],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnCLMUL:
|
|
call RtnC4C5
|
|
movzx eax,byte [rsi-1]
|
|
cmp al,18
|
|
ja .L1
|
|
mov edx,[rax*2+TabCLMUL]
|
|
or dx,dx
|
|
jz .L1
|
|
mov [I.Name],dx
|
|
mov [I.Arg4.Type],0 ;Delete
|
|
.L1: ret
|
|
;-----------------------------------------------------------------------------
|
|
C40F3A48:
|
|
mov ebx,TPERMIL2PSX
|
|
jmp C40F3A49.L1
|
|
;-----------------------------------------------------------------------------
|
|
C40F3A49:
|
|
mov ebx,TPERMIL2PDX
|
|
.L1:
|
|
mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L2
|
|
mov al,YMMRG
|
|
.L2:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg4.Type],al
|
|
FetchB
|
|
mov dl,al
|
|
shr dl,4
|
|
|
|
cmp [IgnoreInvalid],True
|
|
je .L3
|
|
cmp [I.Arch],CPUX64
|
|
je .L3
|
|
and dl,111b
|
|
.L3:
|
|
lea r8,[I.Arg3]
|
|
test [I.VEX],VEXW
|
|
jnz .L7
|
|
lea r8,[I.Arg4]
|
|
.L7: mov [r8+TArg.Reg],dl
|
|
|
|
and eax,1111b
|
|
|
|
cmp al,0011b
|
|
ja .L4
|
|
mov edx,[rax*2+rbx]
|
|
mov [I.Name],dx
|
|
jmp .L5
|
|
.L4:
|
|
mov [I.Arg5.Type],80h+1
|
|
mov [I.Arg5.ImmB],al
|
|
.L5:
|
|
lea r8,[I.Arg4]
|
|
test [I.VEX],VEXW
|
|
jnz .L6
|
|
lea r8,[I.Arg3]
|
|
.L6:
|
|
mov [r8+TArg.Type2nd],InRM
|
|
;cmp [I.Mod],3
|
|
;setnz [r8+TArg.Mem]
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC411:
|
|
call RM32R32M
|
|
mov [I.Arg2.Type],XMMRG
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
cmp [I.Arch],CPUX64
|
|
jnz ErrorDec
|
|
mov [I.Arg1.Type],GPR64
|
|
mov [I.RandSize],VQWORD+80h
|
|
mov [I.LastByte],'q'
|
|
.L1: jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
RtnC413:
|
|
push RtnPINSR?
|
|
RtnC412:
|
|
mov [I.Arg1.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg3.Mem]
|
|
mov [I.Arg3.Type],GPR32
|
|
mov [I.Arg3.Type2nd],InRM
|
|
FetchB
|
|
mov [I.Arg4.Type],80h+1
|
|
mov [I.Arg4.ImmB],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC414:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg2.Type],YMMRG
|
|
mov [I.Arg2.Type2nd],InRM
|
|
|
|
mov [I.Arg1.Type],YMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
C4FMA: mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg4.Type],al
|
|
FetchB
|
|
shr al,4
|
|
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
|
|
lea r8,[I.Arg3]
|
|
test [I.VEX],VEXW
|
|
jnz .L2
|
|
lea r8,[I.Arg4]
|
|
.L2:
|
|
mov [r8+TArg.Reg],al
|
|
|
|
lea r8,[I.Arg4]
|
|
test [I.VEX],VEXW
|
|
jnz .L3
|
|
lea r8,[I.Arg3]
|
|
.L3:
|
|
;cmp [I.Mod],3
|
|
;setnz [r8+TArg.Mem]
|
|
mov [r8+TArg.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC415:
|
|
movzx eax,[I.Reg]
|
|
mov edx,[rax*2+BMI1]
|
|
or dx,dx
|
|
jz ErrorDec
|
|
mov [I.Name],dx
|
|
mov [I.Prefix],0
|
|
|
|
mov al,GPR32
|
|
cmp [I.Arch],CPUX64
|
|
jne .L1
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov al,GPR64
|
|
.L1:
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg1.Type],al
|
|
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg2.Mem]
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg1.Type2nd],InVVVV
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC416:
|
|
call R32RM32M
|
|
|
|
cmp [I.Arch],CPUX64
|
|
jne .L1
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.Arg1.Type],GPR64
|
|
mov [I.Arg2.Type],GPR64
|
|
.L1: jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C508:
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
mov [I.Name],TKUNPCKDQ
|
|
.L1: jmp RtnC4C502.L0
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C501:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
.L0: jmp RtnC4C502.L0
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C502:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'d'
|
|
.L0: ;
|
|
cmp [I.Mod],3
|
|
jnz ErrorDec
|
|
;
|
|
mov al,KXXRG
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg3.Type],al
|
|
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg3.Mem]
|
|
mov [I.Arg3.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C503:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'d'
|
|
.L0: jmp RtnC4C505.L0
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C504:
|
|
cmp [I.Mod],3
|
|
jnz ErrorDec
|
|
RtnC4C505:
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
.L0:
|
|
mov al,KXXRG
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],al
|
|
|
|
mov [I.Arg1.Type2nd],InReg
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg2.Mem]
|
|
mov [I.Arg2.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C506:
|
|
cmp [I.Mod],3
|
|
jz ErrorDec
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'d'
|
|
.L0:
|
|
mov al,KXXRG
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],al
|
|
|
|
mov [I.Arg2.Type2nd],InReg
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C507:
|
|
cmp [I.Mod],3
|
|
jz ErrorDec
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
.L0:
|
|
jmp RtnC4C506.L0
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C509:
|
|
cmp [I.Mod],3
|
|
jnz ErrorDec
|
|
mov al,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
mov al,GPR64
|
|
.L0:
|
|
mov [I.Arg1.Type],KXXRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50A:
|
|
cmp [I.Mod],3
|
|
jnz ErrorDec
|
|
mov al,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L0
|
|
mov [I.LastByte],'q'
|
|
mov al,GPR64
|
|
.L0:
|
|
mov [I.Arg2.Type],KXXRG
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg1.Type],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50B:
|
|
cmp [I.Reg],2 ;/2
|
|
jb ErrorDec
|
|
cmp [I.Reg],3 ;/3
|
|
ja ErrorDec
|
|
jne .L1
|
|
mov [I.Name],TSTMXCSR
|
|
.L1:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type2nd],InRM
|
|
mov [I.Arg1.Type],GPR32
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50C:
|
|
mov al,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov al,YMMRG
|
|
.L1:
|
|
;cmp [I.Mod],3
|
|
;setnz [I.Arg1.Mem]
|
|
mov [I.Arg1.Type2nd],InRM
|
|
mov [I.Arg2.Type2nd],InReg
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],al
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
C4C5NB2:
|
|
mov dx,TMOVLHPS
|
|
jmp C4C5NB1.L1
|
|
;-----------------------------------------------------------------------------
|
|
C4C5NB1:mov dx,TMOVHLPS
|
|
.L1: cmp [I.Mod],3
|
|
jne .L2
|
|
mov [I.Name],dx
|
|
.L2: jmp RtnC4C5
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50D:
|
|
mov ah,XMMRG
|
|
test [I.VEX],VEXL
|
|
jz .L1
|
|
mov ah,YMMRG
|
|
.L1:
|
|
mov al,GPR32
|
|
cmp [I.Arch],CPUX64
|
|
jnz .L2
|
|
mov al,GPR64
|
|
.L2:
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],ah
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50E:
|
|
test [I.VEX],VEXL
|
|
jnz .L1
|
|
mov [I.Name],TZEROUPPER
|
|
.L1: ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C5XRM:
|
|
mov al,XMMRG
|
|
mov ah,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
cmp [I.Arch],CPUX64
|
|
jnz ErrorDec
|
|
mov [I.LastByte],'q'
|
|
mov ah,GPR64
|
|
.L1:
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type2nd],InRM
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],ah
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C5RMX:
|
|
mov al,XMMRG
|
|
mov ah,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
cmp [I.Arch],CPUX64
|
|
jnz ErrorDec
|
|
mov [I.LastByte],'q'
|
|
mov ah,GPR64
|
|
.L1:
|
|
mov [I.Arg2.Type2nd],InReg
|
|
mov [I.Arg1.Type2nd],InRM
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg1.Type],ah
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C50F:
|
|
mov al,GPR64
|
|
cmp [I.Arch],CPUX64
|
|
jz .L1
|
|
mov al,GPR32
|
|
.L1:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type2nd],InRM
|
|
jmp RtnC40C.L1
|
|
;-----------------------------------------------------------------------------
|
|
C4C50F71:
|
|
mov edx,T0F71Names
|
|
jmp C4C5NDSX
|
|
;-----------------------------------------------------------------------------
|
|
C4C50F72:
|
|
mov edx,T0F72Names
|
|
jmp C4C5NDSX
|
|
;-----------------------------------------------------------------------------
|
|
C4C50F73:
|
|
mov edx,T0F73Names
|
|
C4C5NDSX:
|
|
movzx eax,[I.Reg]
|
|
mov edx,[rdx+rax*2]
|
|
or dx,dx
|
|
jz ErrorDec
|
|
mov [I.Name],dx
|
|
jmp RtnC4C5
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C510:
|
|
mov al,YMMRG
|
|
test [I.VEX],VEXL
|
|
jnz .L1
|
|
mov al,XMMRG
|
|
.L1:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],al
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
mov [I.Arg3.Type],XMMRG
|
|
mov [I.Arg3.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C511:
|
|
mov al,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
cmp [I.Arch],CPUX64
|
|
jnz ErrorDec
|
|
mov al,GPR64
|
|
.L1:
|
|
mov [I.Arg1.Type],al
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg2.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
RtnC4C512:
|
|
mov al,GPR32
|
|
test [I.VEX],VEXW
|
|
jz .L1
|
|
cmp [I.Arch],CPUX64
|
|
jnz ErrorDec
|
|
mov [I.RandSize],VQWORD
|
|
mov al,GPR64
|
|
.L1:
|
|
mov [I.Arg1.Type],XMMRG
|
|
mov [I.Arg1.Type2nd],InReg
|
|
mov [I.Arg2.Type],XMMRG
|
|
mov [I.Arg2.Type2nd],InVVVV
|
|
mov [I.Arg3.Type],al
|
|
mov [I.Arg3.Type2nd],InRM
|
|
ret
|
|
;-----------------------------------------------------------------------------
|
|
C4C5MXJ:cmp [I.Mod],3
|
|
jz RtnC4C5
|
|
cmp [I.VVVV],0 ;!1111b=0000b
|
|
jnz ErrorDec
|
|
jmp RtnC4C50C
|
|
;-----------------------------------------------------------------------------
|
|
C4C5XMJ:cmp [I.Mod],3
|
|
jz .L1
|
|
or [I.FlagsVEX],VEXV
|
|
cmp [I.VVVV],0 ;!1111b=0000b
|
|
jnz ErrorDec
|
|
.L1: jmp RtnC4C5
|