mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 01:19:16 +02:00
FpDebug: x86-disassembler: fix popcnt,bsf,tzcnt,bsr,lzcnt Issue #40843
This commit is contained in:
parent
b0d10a2a5a
commit
4fd8e89e60
@ -3482,7 +3482,7 @@ begin
|
|||||||
AddGv; AddEw;
|
AddGv; AddEw;
|
||||||
end;
|
end;
|
||||||
$B8: begin
|
$B8: begin
|
||||||
DecodeSIMD([soNone, soF3]);
|
DecodeSIMD([soNone, soF3], True);
|
||||||
case SimdOpcode of
|
case SimdOpcode of
|
||||||
soNone: begin SetOpcode(OPjmpe ); AddIz; end; // Itanium SDM, volume 4, page 256.
|
soNone: begin SetOpcode(OPjmpe ); AddIz; end; // Itanium SDM, volume 4, page 256.
|
||||||
soF3: begin SetOpcode(OPpopcnt); AddGv; AddEv; end;
|
soF3: begin SetOpcode(OPpopcnt); AddGv; AddEv; end;
|
||||||
@ -3499,16 +3499,18 @@ begin
|
|||||||
AddEv; AddGv;
|
AddEv; AddGv;
|
||||||
end;
|
end;
|
||||||
$BC: begin
|
$BC: begin
|
||||||
DecodeSIMD([soNone, soF3]);
|
DecodeSIMD([soNone, soF3], True);
|
||||||
case SimdOpcode of
|
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;
|
soF3: begin SetOpcode(OPtzcnt); AddGv; AddEv; end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
$BD: begin
|
$BD: begin
|
||||||
DecodeSIMD([soNone, soF3]);
|
DecodeSIMD([soNone, soF3], True);
|
||||||
case SimdOpcode of
|
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;
|
soF3: begin SetOpcode(OPlzcnt); AddGv; AddEv; end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -5,9 +5,9 @@ unit TestAsm;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, SysUtils, FpPascalBuilder, FpDbgDisasX86, FpDbgClasses, FpDbgLoader,
|
Classes, SysUtils, FpPascalBuilder, FpDbgDisasX86, FpDbgClasses, FpDbgLoader, FpDbgUtil,
|
||||||
FpDbgUtil, {$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif}, TestOutputLogger, TestDbgTestSuites, fpcunit,
|
FpDbgCpuX86, LazLoggerBase, TestOutputLogger, TestDbgTestSuites, fpcunit, testutils,
|
||||||
testutils, testregistry, RegExpr;
|
testregistry, RegExpr;
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
@ -21,11 +21,22 @@ type
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
type
|
type
|
||||||
|
|
||||||
|
{ TDummyProcess }
|
||||||
|
|
||||||
TDummyProcess = class(TDbgProcess)
|
TDummyProcess = class(TDbgProcess)
|
||||||
public
|
public
|
||||||
|
function CreateBreakPointTargetHandler: TFpBreakPointTargetHandler; override;
|
||||||
property NewMode: TFPDMode write SetMode;
|
property NewMode: TFPDMode write SetMode;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ TDummyProcess }
|
||||||
|
|
||||||
|
function TDummyProcess.CreateBreakPointTargetHandler: TFpBreakPointTargetHandler;
|
||||||
|
begin
|
||||||
|
Result := TBreakPointx86Handler.Create(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestAssembler.TestDisAsm;
|
procedure TTestAssembler.TestDisAsm;
|
||||||
var
|
var
|
||||||
DisAss: TX86AsmDecoder;
|
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('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;
|
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('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;
|
Process.NewMode := dm64;
|
||||||
|
|
||||||
TestDis('push rax', #$50, 'push rax'); // push rax
|
TestDis('push rax', #$50, 'push rax'); // push rax
|
||||||
|
Loading…
Reference in New Issue
Block a user