FpDebug: x86-disassembler: fix popcnt,bsf,tzcnt,bsr,lzcnt Issue #40843

This commit is contained in:
Martin 2024-03-14 13:00:37 +01:00
parent b0d10a2a5a
commit 4fd8e89e60
2 changed files with 73 additions and 8 deletions

View File

@ -3482,7 +3482,7 @@ begin
AddGv; AddEw;
end;
$B8: begin
DecodeSIMD([soNone, soF3]);
DecodeSIMD([soNone, soF3], True);
case SimdOpcode of
soNone: begin SetOpcode(OPjmpe ); AddIz; end; // Itanium SDM, volume 4, page 256.
soF3: begin SetOpcode(OPpopcnt); AddGv; AddEv; end;
@ -3499,16 +3499,18 @@ begin
AddEv; AddGv;
end;
$BC: begin
DecodeSIMD([soNone, soF3]);
DecodeSIMD([soNone, soF3], True);
case SimdOpcode of
soNone: begin SetOpcode(OPbsf ); AddGv; AddEv; end;
soNone,
so66: begin SetOpcode(OPbsf ); AddGv; AddEv; end;
soF3: begin SetOpcode(OPtzcnt); AddGv; AddEv; end;
end;
end;
$BD: begin
DecodeSIMD([soNone, soF3]);
DecodeSIMD([soNone, soF3], True);
case SimdOpcode of
soNone: begin SetOpcode(OPbsr ); AddGv; AddEv; end;
soNone,
so66: begin SetOpcode(OPbsr ); AddGv; AddEv; end;
soF3: begin SetOpcode(OPlzcnt); AddGv; AddEv; end;
end;
end;

View File

@ -5,9 +5,9 @@ unit TestAsm;
interface
uses
Classes, SysUtils, FpPascalBuilder, FpDbgDisasX86, FpDbgClasses, FpDbgLoader,
FpDbgUtil, {$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif}, TestOutputLogger, TestDbgTestSuites, fpcunit,
testutils, testregistry, RegExpr;
Classes, SysUtils, FpPascalBuilder, FpDbgDisasX86, FpDbgClasses, FpDbgLoader, FpDbgUtil,
FpDbgCpuX86, LazLoggerBase, TestOutputLogger, TestDbgTestSuites, fpcunit, testutils,
testregistry, RegExpr;
type
@ -21,11 +21,22 @@ type
implementation
type
{ TDummyProcess }
TDummyProcess = class(TDbgProcess)
public
function CreateBreakPointTargetHandler: TFpBreakPointTargetHandler; override;
property NewMode: TFPDMode write SetMode;
end;
{ TDummyProcess }
function TDummyProcess.CreateBreakPointTargetHandler: TFpBreakPointTargetHandler;
begin
Result := TBreakPointx86Handler.Create(Self);
end;
procedure TTestAssembler.TestDisAsm;
var
DisAss: TX86AsmDecoder;
@ -373,6 +384,36 @@ begin
TestDis('vdppd xmm3,xmm1,[rsi],$07', #$c4#$e3#$71#$41#$1e#$07, 'vdppd xmm3,xmm1,[rsi],$07');
TestDis('popcnt rcx,rdx', #$f3#$48#$0f#$b8#$ca, 'popcnt rcx,rdx');
TestDis('popcnt ecx,edx', #$f3#$0f#$b8#$ca, 'popcnt ecx,edx');
TestDis('popcnt cx,dx', #$f3#$66#$0f#$b8#$ca, 'popcnt cx,dx');
TestDis('popcnt rcx,[rdx]', #$f3#$48#$0f#$b8#$0a, 'popcnt rcx,[rdx]');
TestDis('popcnt ecx,[rdx]', #$f3#$0f#$b8#$0a, 'popcnt ecx,[rdx]');
TestDis('popcnt cx,[rdx]', #$f3#$66#$0f#$b8#$0a, 'popcnt cx,[rdx]');
TestDis('bsf rcx,rdx', #$48#$0f#$bc#$ca, 'bsf rcx,rdx');
TestDis('bsf ecx,edx', #$0f#$bc#$ca, 'bsf ecx,edx');
TestDis('bsf cx,dx', #$66#$0f#$bc#$ca, 'bsf cx,dx');
TestDis('bsf rcx,[rdx]', #$48#$0f#$bc#$0a, 'bsf rcx,[rdx]');
TestDis('bsf ecx,[rdx]', #$0f#$bc#$0a, 'bsf ecx,[rdx]');
TestDis('bsf cx,[rdx]', #$66#$0f#$bc#$0a, 'bsf cx,[rdx]');
TestDis('bsr rcx,rdx', #$48#$0f#$bd#$ca, 'bsr rcx,rdx');
TestDis('bsr ecx,edx', #$0f#$bd#$ca, 'bsr ecx,edx');
TestDis('bsr cx,dx', #$66#$0f#$bd#$ca, 'bsr cx,dx');
TestDis('bsr rcx,[rdx]', #$48#$0f#$bd#$0a, 'bsr rcx,[rdx]');
TestDis('bsr ecx,[rdx]', #$0f#$bd#$0a, 'bsr ecx,[rdx]');
TestDis('bsr cx,[rdx]', #$66#$0f#$bd#$0a, 'bsr cx,[rdx]');
TestDis('tzcnt rcx,rdx', #$f3#$48#$0f#$bc#$ca, 'tzcnt rcx,rdx');
TestDis('tzcnt ecx,edx', #$f3#$0f#$bc#$ca, 'tzcnt ecx,edx');
TestDis('tzcnt cx,dx', #$66#$f3#$0f#$bc#$ca, 'tzcnt cx,dx');
TestDis('tzcnt rcx,[rdx]', #$f3#$48#$0f#$bc#$0a, 'tzcnt rcx,[rdx]');
TestDis('tzcnt ecx,[rdx]', #$f3#$0f#$bc#$0a, 'tzcnt ecx,[rdx]');
TestDis('tzcnt cx,[rdx]', #$66#$f3#$0f#$bc#$0a, 'tzcnt cx,[rdx]');
TestDis('lzcnt rcx,rdx', #$f3#$48#$0f#$bd#$ca, 'lzcnt rcx,rdx');
TestDis('lzcnt ecx,edx', #$f3#$0f#$bd#$ca, 'lzcnt ecx,edx');
TestDis('lzcnt cx,dx', #$66#$f3#$0f#$bd#$ca, 'lzcnt cx,dx');
TestDis('lzcnt rcx,[rdx]', #$f3#$48#$0f#$bd#$0a, 'lzcnt rcx,[rdx]');
TestDis('lzcnt ecx,[rdx]', #$f3#$0f#$bd#$0a, 'lzcnt ecx,[rdx]');
TestDis('lzcnt cx,[rdx]', #$66#$f3#$0f#$bd#$0a, 'lzcnt cx,[rdx]');
Process.NewMode := dm32;
@ -590,6 +631,28 @@ begin
TestDis('vdppd xmm3,xmm1,[esi],$07', #$c4#$e3#$71#$41#$1e#$07, 'vdppd xmm3,xmm1,[esi],$07');
TestDis('popcnt ecx,edx', #$f3#$0f#$b8#$ca, 'popcnt ecx,edx');
TestDis('popcnt cx,dx', #$f3#$66#$0f#$b8#$ca, 'popcnt cx,dx');
TestDis('popcnt ecx,[edx]', #$f3#$0f#$b8#$0a, 'popcnt ecx,[edx]');
TestDis('popcnt cx,[edx]', #$f3#$66#$0f#$b8#$0a, 'popcnt cx,[edx]');
TestDis('bsf ecx,edx', #$0f#$bc#$ca, 'bsf ecx,edx');
TestDis('bsf cx,dx', #$66#$0f#$bc#$ca, 'bsf cx,dx');
TestDis('bsf ecx,[edx]', #$0f#$bc#$0a, 'bsf ecx,[edx]');
TestDis('bsf cx,[edx]', #$66#$0f#$bc#$0a, 'bsf cx,[edx]');
TestDis('bsr ecx,edx', #$0f#$bd#$ca, 'bsr ecx,edx');
TestDis('bsr cx,dx', #$66#$0f#$bd#$ca, 'bsr cx,dx');
TestDis('bsr ecx,[edx]', #$0f#$bd#$0a, 'bsr ecx,[edx]');
TestDis('bsr cx,[edx]', #$66#$0f#$bd#$0a, 'bsr cx,[edx]');
TestDis('tzcnt ecx,edx', #$f3#$0f#$bc#$ca, 'tzcnt ecx,edx');
TestDis('tzcnt cx,dx', #$66#$f3#$0f#$bc#$ca, 'tzcnt cx,dx');
TestDis('tzcnt ecx,[edx]', #$f3#$0f#$bc#$0a, 'tzcnt ecx,[edx]');
TestDis('tzcnt cx,[edx]', #$66#$f3#$0f#$bc#$0a, 'tzcnt cx,[edx]');
TestDis('lzcnt ecx,edx', #$f3#$0f#$bd#$ca, 'lzcnt ecx,edx');
TestDis('lzcnt cx,dx', #$66#$f3#$0f#$bd#$ca, 'lzcnt cx,dx');
TestDis('lzcnt ecx,[edx]', #$f3#$0f#$bd#$0a, 'lzcnt ecx,[edx]');
TestDis('lzcnt cx,[edx]', #$66#$f3#$0f#$bd#$0a, 'lzcnt cx,[edx]');
Process.NewMode := dm64;
TestDis('push rax', #$50, 'push rax'); // push rax