mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 05:59:19 +02:00
FpDebug: fix disassembler pause,psrldq,extrq... Issue #40555, #40557, #40558 patch by Red_prig (Pavel)
This commit is contained in:
parent
94d9d1dd16
commit
cecc5ee87d
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user