FpDebug: fix disassembler pause,psrldq,extrq... Issue #40555, #40557, #40558 patch by Red_prig (Pavel)

This commit is contained in:
Martin 2023-10-15 18:32:30 +02:00
parent 94d9d1dd16
commit cecc5ee87d
3 changed files with 160 additions and 10 deletions

View File

@ -192,6 +192,8 @@ type
OPor, OPout, OPouts,
OPextrq,
OPpabs, OPpackssdw, OPpacksswb, OPpackusdw, OPpackuswb, OPpadd, OPpadds,
OPpaddus, OPpalignr, OPpand, OPpandn, OPpause, OPpavg, OPpavgusb, OPpblendvb,
OPpblend, OPpclmulqdq, OPpcmpeq, OPpcmpestri, OPpcmpestrm, OPpcmpgt, OPpcmpistri,
@ -679,6 +681,8 @@ const
'or', 'out', 'outs',
'extrq',
'pabs', 'packssdw', 'packsswb', 'packusdw', 'packuswb', 'padd', 'padds',
'paddus', 'palignr', 'pand', 'pandn', 'pause', 'pavg', 'pavgusb', 'pblendvb',
'pblend', 'pclmulqdq', 'pcmpeq', 'pcmpestri', 'pcmpestrm', 'pcmpgt', 'pcmpistri',
@ -2669,7 +2673,7 @@ end;
procedure TX86Disassembler.DoGroup14;
const
OPC: array[0..7] of TOpCode = (OPX_Invalid, OPX_Invalid, OPpsrl, OPpsrl, OPX_Invalid, OPX_Invalid, OPpsll, OPpsrl);
OPC: array[0..7] of TOpCode = (OPX_Invalid, OPX_Invalid, OPpsrl, OPpsrl, OPX_Invalid, OPX_Invalid, OPpsll, OPpsll);
OPS: array[0..7] of TOpCodeSuffix = (OPSnone, OPSnone, OPSx_q, OPSx_dq, OPSnone, OPSnone, OPSx_q, OPSx_dq);
begin
Assert(Code[CodeIdx] = $73, 'Not group 14');
@ -3073,10 +3077,12 @@ begin
end;
end;
$2B: begin
DecodeSIMD([soNone, so66]);
DecodeSIMD([soNone, so66, soF2, soF3]);
case SimdOpcode of
soNone: begin SetOpcode(OPmovnt, OPSx_ps, True); AddMps; AddVps; end;
so66: begin SetOpcode(OPmovnt, OPSx_pd, True); AddMpd; AddVpd; end;
soF2: begin SetOpcode(OPmovnt, OPSx_sd, True); AddMpd; AddVpd; end;
soF3: begin SetOpcode(OPmovnt, OPSx_ss, True); AddMpd; AddVpd; end;
end;
end;
$2C: begin
@ -3303,14 +3309,24 @@ begin
end;
end;
$78: begin
DecodeSIMD([soNone]);
if SimdOpcode = soNone
then begin SetOpcode(OPvmread); AddEy; AddGy; end;
DecodeSIMD([soNone, so66, soF2]);
case SimdOpcode of
soNone: begin SetOpcode(OPvmread); AddEy; AddGy; end;
so66: begin
DecodeModRM;
if ModRM.Index = 0
then begin SetOpcode(OPextrq); AddUdq; AddIb; AddIb; end;
end;
soF2: begin SetOpcode(OPinsert, OPSx_q); AddVq; AddUdq; AddIb; AddIb; end;
end;
end;
$79: begin
DecodeSIMD([soNone]);
if SimdOpcode = soNone
then begin SetOpcode(OPvmwrite); AddGy; AddEy; end;
DecodeSIMD([soNone, so66, soF2]);
case SimdOpcode of
soNone: begin SetOpcode(OPvmwrite); AddGy; AddEy; end;
so66: begin SetOpcode(OPextrq); AddVq; AddUdq; end;
soF2: begin SetOpcode(OPinsert, OPSx_q); AddVq; AddUdq; end;
end;
end;
// $7A..$7B: OPX_Invalid
$7C: begin
@ -4244,7 +4260,11 @@ begin
//---
$90: begin
if preF3 in Flags
then SetOpcode(OPpause)
then
begin
SetOpcode(OPpause);
Exclude(Flags, preF3);
end
else if rexB in Flags
then begin
SetOpcode(OPxchg);

View File

@ -472,7 +472,7 @@
</Linking>
</CompilerOptions>
<Debugging>
<Exceptions Count="7">
<Exceptions Count="8">
<Item1>
<Name Value="EAbort"/>
</Item1>
@ -498,6 +498,9 @@
<Name Value="RunError(210)"/>
<Enabled Value="False"/>
</Item7>
<Item8>
<Name Value="EJSONParser"/>
</Item8>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -278,6 +278,71 @@ begin
TestDis('vzeroall', #$C5#$FC#$77, 'vzeroall');
TestDis('pslldq xmm0,$07', #$66#$0F#$73#$F8#$07, 'pslldq xmm0,$07');
TestDis('pslldq xmm1,$09', #$66#$0F#$73#$F9#$09, 'pslldq xmm1,$09');
TestDis('pslldq xmm2,$81', #$66#$0F#$73#$FA#$81, 'pslldq xmm2,$81');
TestDis('vpslldq xmm1,xmm2,$07', #$C5#$F1#$73#$FA#$07, 'vpslldq xmm1,xmm2,$07');
TestDis('vpslldq xmm0,xmm3,$0B', #$C5#$F9#$73#$FB#$0B, 'vpslldq xmm0,xmm3,$0B');
TestDis('vpslldq ymm1,ymm2,$07', #$C5#$F5#$73#$FA#$07, 'vpslldq ymm1,ymm2,$07');
TestDis('vpslldq ymm2,ymm0,$01', #$C5#$ED#$73#$F8#$01, 'vpslldq ymm2,ymm0,$01');
TestDis('psrldq xmm0,$07', #$66#$0F#$73#$D8#$07, 'psrldq xmm0,$07');
TestDis('psrldq xmm1,$09', #$66#$0F#$73#$D9#$09, 'psrldq xmm1,$09');
TestDis('psrldq xmm2,$81', #$66#$0F#$73#$DA#$81, 'psrldq xmm2,$81');
TestDis('vpsrldq xmm1,xmm2,$07', #$C5#$F1#$73#$DA#$07, 'vpsrldq xmm1,xmm2,$07');
TestDis('vpsrldq xmm0,xmm3,$0B', #$C5#$F9#$73#$DB#$0B, 'vpsrldq xmm0,xmm3,$0B');
TestDis('vpsrldq ymm1,ymm2,$07', #$C5#$F5#$73#$DA#$07, 'vpsrldq ymm1,ymm2,$07');
TestDis('vpsrldq ymm2,ymm0,$01', #$C5#$ED#$73#$D8#$01, 'vpsrldq ymm2,ymm0,$01');
TestDis('psllw mm1,[rsi]', #$0F#$F1#$0E, 'psllw mm1,[rsi]');
TestDis('psllw xmm0,[rsi]', #$66#$0F#$F1#$06, 'psllw xmm0,[rsi]');
TestDis('psllw xmm1,xmm2', #$66#$0F#$F1#$CA, 'psllw xmm1,xmm2');
TestDis('psllw xmm2,xmm0', #$66#$0F#$F1#$D0, 'psllw xmm2,xmm0');
TestDis('psllw mm1,$07', #$0F#$71#$F1#$07, 'psllw mm1,$07');
TestDis('psllw xmm1,$07', #$66#$0F#$71#$F1#$07, 'psllw xmm1,$07');
TestDis('pslld mm1,[rsi]', #$0F#$F2#$0E, 'pslld mm1,[rsi]');
TestDis('pslld xmm0,[rsi]', #$66#$0F#$F2#$06, 'pslld xmm0,[rsi]');
TestDis('pslld xmm1,xmm2', #$66#$0F#$F2#$CA, 'pslld xmm1,xmm2');
TestDis('pslld xmm2,xmm0', #$66#$0F#$F2#$D0, 'pslld xmm2,xmm0');
TestDis('pslld mm1,$07', #$0F#$72#$F1#$07, 'pslld mm1,$07');
TestDis('pslld xmm1,$07', #$66#$0F#$72#$F1#$07, 'pslld xmm1,$07');
TestDis('psllq mm1,[rsi]', #$0F#$F3#$0E, 'psllq mm1,[rsi]');
TestDis('psllq xmm0,[rsi]', #$66#$0F#$F3#$06, 'psllq xmm0,[rsi]');
TestDis('psllq xmm1,xmm2', #$66#$0F#$F3#$CA, 'psllq xmm1,xmm2');
TestDis('psllq xmm2,xmm0', #$66#$0F#$F3#$D0, 'psllq xmm2,xmm0');
TestDis('psllq mm1,$07', #$0F#$73#$F1#$07, 'psllq mm1,$07');
TestDis('psllq xmm1,$07', #$66#$0F#$73#$F1#$07, 'psllq xmm1,$07');
TestDis('psrlw mm1,[rsi]', #$0F#$D1#$0E, 'psrlw mm1,[rsi]');
TestDis('psrlw xmm0,[rsi]', #$66#$0F#$D1#$06, 'psrlw xmm0,[rsi]');
TestDis('psrlw xmm1,xmm2', #$66#$0F#$D1#$CA, 'psrlw xmm1,xmm2');
TestDis('psrlw xmm2,xmm0', #$66#$0F#$D1#$D0, 'psrlw xmm2,xmm0');
TestDis('psrlw mm1,$07', #$0F#$71#$D1#$07, 'psrlw mm1,$07');
TestDis('psrlw xmm1,$07', #$66#$0F#$71#$D1#$07, 'psrlw xmm1,$07');
TestDis('psrld mm1,[rsi]', #$0F#$D2#$0E, 'psrld mm1,[rsi]');
TestDis('psrld xmm0,[rsi]', #$66#$0F#$D2#$06, 'psrld xmm0,[rsi]');
TestDis('psrld xmm1,xmm2', #$66#$0F#$D2#$CA, 'psrld xmm1,xmm2');
TestDis('psrld xmm2,xmm0', #$66#$0F#$D2#$D0, 'psrld xmm2,xmm0');
TestDis('psrld mm1,$07', #$0F#$72#$D1#$07, 'psrld mm1,$07');
TestDis('psrld xmm1,$07', #$66#$0F#$72#$D1#$07, 'psrld xmm1,$07');
TestDis('psrlq mm1,[rsi]', #$0F#$D3#$0E, 'psrlq mm1,[rsi]');
TestDis('psrlq xmm0,[rsi]', #$66#$0F#$D3#$06, 'psrlq xmm0,[rsi]');
TestDis('psrlq xmm1,xmm2', #$66#$0F#$D3#$CA, 'psrlq xmm1,xmm2');
TestDis('psrlq xmm2,xmm0', #$66#$0F#$D3#$D0, 'psrlq xmm2,xmm0');
TestDis('psrlq mm1,$07', #$0F#$73#$D1#$07, 'psrlq mm1,$07');
TestDis('psrlq xmm1,$07', #$66#$0F#$73#$D1#$07, 'psrlq xmm1,$07');
TestDis('extrq xmm0,$03,$04', #$66#$0F#$78#$C0#$03#$04, 'extrq xmm0,$03,$04');
TestDis('extrq xmm1,$03,$04', #$66#$0F#$78#$C1#$03#$04, 'extrq xmm1,$03,$04');
TestDis('extrq xmm1,xmm2', #$66#$0F#$79#$CA, 'extrq xmm1,xmm2');
TestDis('insertq xmm1,xmm1,$03,$04', #$F2#$0F#$78#$C9#$03#$04, 'insertq xmm1,xmm1,$03,$04');
TestDis('insertq xmm1,xmm1', #$F2#$0F#$79#$C9, 'insertq xmm1,xmm1');
TestDis('insertq xmm1,xmm2,$03,$04', #$F2#$0F#$78#$CA#$03#$04, 'insertq xmm1,xmm2,$03,$04');
TestDis('insertq xmm1,xmm2', #$F2#$0F#$79#$CA, 'insertq xmm1,xmm2');
TestDis('movntsd [rsi],xmm2', #$F2#$0F#$2B#$16, 'movntsd [rsi],xmm2');
TestDis('movntsd [rsi],xmm1', #$F2#$0F#$2B#$0E, 'movntsd [rsi],xmm1');
TestDis('movntss [rsi],xmm2', #$F3#$0F#$2B#$16, 'movntss [rsi],xmm2');
TestDis('movntss [rsi],xmm1', #$F3#$0F#$2B#$0E, 'movntss [rsi],xmm1');
TestDis('pause', #$F3#$90, 'pause');
Process.NewMode := dm32;
@ -400,6 +465,68 @@ begin
TestDis('vzeroupper', #$C5#$F8#$77, 'vzeroupper');
TestDis('vzeroall', #$C5#$FC#$77, 'vzeroall');
TestDis('pslldq xmm0,$07', #$66#$0F#$73#$F8#$07, 'pslldq xmm0,$07');
TestDis('pslldq xmm1,$09', #$66#$0F#$73#$F9#$09, 'pslldq xmm1,$09');
TestDis('pslldq xmm2,$81', #$66#$0F#$73#$FA#$81, 'pslldq xmm2,$81');
TestDis('vpslldq xmm1,xmm2,$07', #$C5#$F1#$73#$FA#$07, 'vpslldq xmm1,xmm2,$07');
TestDis('vpslldq xmm0,xmm3,$0B', #$C5#$F9#$73#$FB#$0B, 'vpslldq xmm0,xmm3,$0B');
TestDis('vpslldq ymm1,ymm2,$07', #$C5#$F5#$73#$FA#$07, 'vpslldq ymm1,ymm2,$07');
TestDis('vpslldq ymm2,ymm0,$01', #$C5#$ED#$73#$F8#$01, 'vpslldq ymm2,ymm0,$01');
TestDis('psrldq xmm0,$07', #$66#$0F#$73#$D8#$07, 'psrldq xmm0,$07');
TestDis('psrldq xmm1,$09', #$66#$0F#$73#$D9#$09, 'psrldq xmm1,$09');
TestDis('psrldq xmm2,$81', #$66#$0F#$73#$DA#$81, 'psrldq xmm2,$81');
TestDis('vpsrldq xmm1,xmm2,$07', #$C5#$F1#$73#$DA#$07, 'vpsrldq xmm1,xmm2,$07');
TestDis('vpsrldq xmm0,xmm3,$0B', #$C5#$F9#$73#$DB#$0B, 'vpsrldq xmm0,xmm3,$0B');
TestDis('vpsrldq ymm1,ymm2,$07', #$C5#$F5#$73#$DA#$07, 'vpsrldq ymm1,ymm2,$07');
TestDis('vpsrldq ymm2,ymm0,$01', #$C5#$ED#$73#$D8#$01, 'vpsrldq ymm2,ymm0,$01');
TestDis('psllw mm1,[esi]', #$0F#$F1#$0E, 'psllw mm1,[esi]');
TestDis('psllw xmm0,[esi]', #$66#$0F#$F1#$06, 'psllw xmm0,[esi]');
TestDis('psllw xmm1,xmm2', #$66#$0F#$F1#$CA, 'psllw xmm1,xmm2');
TestDis('psllw xmm2,xmm0', #$66#$0F#$F1#$D0, 'psllw xmm2,xmm0');
TestDis('psllw mm1,$07', #$0F#$71#$F1#$07, 'psllw mm1,$07');
TestDis('psllw xmm1,$07', #$66#$0F#$71#$F1#$07, 'psllw xmm1,$07');
TestDis('pslld mm1,[esi]', #$0F#$F2#$0E, 'pslld mm1,[esi]');
TestDis('pslld xmm0,[esi]', #$66#$0F#$F2#$06, 'pslld xmm0,[esi]');
TestDis('pslld xmm1,xmm2', #$66#$0F#$F2#$CA, 'pslld xmm1,xmm2');
TestDis('pslld xmm2,xmm0', #$66#$0F#$F2#$D0, 'pslld xmm2,xmm0');
TestDis('pslld mm1,$07', #$0F#$72#$F1#$07, 'pslld mm1,$07');
TestDis('pslld xmm1,$07', #$66#$0F#$72#$F1#$07, 'pslld xmm1,$07');
TestDis('psllq mm1,[esi]', #$0F#$F3#$0E, 'psllq mm1,[esi]');
TestDis('psllq xmm0,[esi]', #$66#$0F#$F3#$06, 'psllq xmm0,[esi]');
TestDis('psllq xmm1,xmm2', #$66#$0F#$F3#$CA, 'psllq xmm1,xmm2');
TestDis('psllq xmm2,xmm0', #$66#$0F#$F3#$D0, 'psllq xmm2,xmm0');
TestDis('psllq mm1,$07', #$0F#$73#$F1#$07, 'psllq mm1,$07');
TestDis('psllq xmm1,$07', #$66#$0F#$73#$F1#$07, 'psllq xmm1,$07');
TestDis('psrlw mm1,[esi]', #$0F#$D1#$0E, 'psrlw mm1,[esi]');
TestDis('psrlw xmm0,[esi]', #$66#$0F#$D1#$06, 'psrlw xmm0,[esi]');
TestDis('psrlw xmm1,xmm2', #$66#$0F#$D1#$CA, 'psrlw xmm1,xmm2');
TestDis('psrlw xmm2,xmm0', #$66#$0F#$D1#$D0, 'psrlw xmm2,xmm0');
TestDis('psrlw mm1,$07', #$0F#$71#$D1#$07, 'psrlw mm1,$07');
TestDis('psrlw xmm1,$07', #$66#$0F#$71#$D1#$07, 'psrlw xmm1,$07');
TestDis('psrld mm1,[esi]', #$0F#$D2#$0E, 'psrld mm1,[esi]');
TestDis('psrld xmm0,[esi]', #$66#$0F#$D2#$06, 'psrld xmm0,[esi]');
TestDis('psrld xmm1,xmm2', #$66#$0F#$D2#$CA, 'psrld xmm1,xmm2');
TestDis('psrld xmm2,xmm0', #$66#$0F#$D2#$D0, 'psrld xmm2,xmm0');
TestDis('psrld mm1,$07', #$0F#$72#$D1#$07, 'psrld mm1,$07');
TestDis('psrld xmm1,$07', #$66#$0F#$72#$D1#$07, 'psrld xmm1,$07');
TestDis('psrlq mm1,[esi]', #$0F#$D3#$0E, 'psrlq mm1,[esi]');
TestDis('psrlq xmm0,[esi]', #$66#$0F#$D3#$06, 'psrlq xmm0,[esi]');
TestDis('psrlq xmm1,xmm2', #$66#$0F#$D3#$CA, 'psrlq xmm1,xmm2');
TestDis('psrlq xmm2,xmm0', #$66#$0F#$D3#$D0, 'psrlq xmm2,xmm0');
TestDis('psrlq mm1,$07', #$0F#$73#$D1#$07, 'psrlq mm1,$07');
TestDis('psrlq xmm1,$07', #$66#$0F#$73#$D1#$07, 'psrlq xmm1,$07');
TestDis('extrq xmm0,$03,$04', #$66#$0F#$78#$C0#$03#$04, 'extrq xmm0,$03,$04');
TestDis('extrq xmm1,$03,$04', #$66#$0F#$78#$C1#$03#$04, 'extrq xmm1,$03,$04');
TestDis('extrq xmm1,xmm2', #$66#$0F#$79#$CA, 'extrq xmm1,xmm2');
TestDis('insertq xmm1,xmm1,$03,$04', #$F2#$0F#$78#$C9#$03#$04, 'insertq xmm1,xmm1,$03,$04');
TestDis('insertq xmm1,xmm1', #$F2#$0F#$79#$C9, 'insertq xmm1,xmm1');
TestDis('insertq xmm1,xmm2,$03,$04', #$F2#$0F#$78#$CA#$03#$04, 'insertq xmm1,xmm2,$03,$04');
TestDis('insertq xmm1,xmm2', #$F2#$0F#$79#$CA, 'insertq xmm1,xmm2');
TestDis('movntsd [esi],xmm2', #$F2#$0F#$2B#$16, 'movntsd [esi],xmm2');
TestDis('movntsd [esi],xmm1', #$F2#$0F#$2B#$0E, 'movntsd [esi],xmm1');
TestDis('movntss [esi],xmm2', #$F3#$0F#$2B#$16, 'movntss [esi],xmm2');
TestDis('movntss [esi],xmm1', #$F3#$0F#$2B#$0E, 'movntss [esi],xmm1');
TestDis('pause', #$F3#$90, 'pause');
Process.NewMode := dm64;