Changed definition-sorting to produce deterministic output (JSON and generated tables)

This commit is contained in:
flobernd 2016-11-22 21:47:54 +01:00
parent 7f7cbd8dcd
commit 1159966784
6 changed files with 82449 additions and 82347 deletions

View File

@ -107,6 +107,7 @@ type
protected
constructor Create(Definition: TInstructionDefinition);
public
function CompareTo(const Other: TOpcodeExtensions): Integer;
function Equals(const Value: TOpcodeExtensions): Boolean; reintroduce;
published
property Mode: TExtInstructionMode read FMode write SetMode default imNeutral;
@ -332,6 +333,7 @@ type
protected
constructor Create(Definition: TInstructionDefinition);
public
function CompareTo(const Other: TX86Flags): Integer;
function Equals(const Value: TX86Flags): Boolean; reintroduce;
public
property HasConflicts: Boolean read GetConflictState;
@ -553,6 +555,7 @@ type
protected
constructor Create(Definition: TInstructionDefinition);
public
function CompareTo(const Other: TInstructionOperands): Integer;
function Equals(const Value: TInstructionOperands): Boolean; reintroduce;
public
destructor Destroy; override;
@ -670,6 +673,7 @@ type
procedure Update; inline;
procedure EndUpdate; inline;
public
function CompareTo(const Other: TInstructionDefinition): Integer;
function Equals(const Value: TInstructionDefinition;
CheckComment: Boolean = false;
CheckFilterRelatedAttributes: Boolean = true): Boolean; reintroduce;
@ -1442,6 +1446,28 @@ begin
FDefinition.UpdatePosition;
end;
function TOpcodeExtensions.CompareTo(const Other: TOpcodeExtensions): Integer;
var
I, A, B: Integer;
begin
Result := Ord(FMode) - Ord(Other.FMode);
if (Result = 0) then Result := Ord(FMandatoryPrefix) - Ord(Other.FMandatoryPrefix);
if (Result = 0) then Result := Ord(FModrmMod) - Ord(Other.FModrmMod);
if (Result = 0) then Result := Ord(FModrmReg) - Ord(Other.FModrmReg);
if (Result = 0) then Result := Ord(FModrmRm) - Ord(Other.FModrmRm);
if (Result = 0) then Result := Ord(FOperandSize) - Ord(Other.FOperandSize);
if (Result = 0) then Result := Ord(FAddressSize) - Ord(Other.FAddressSize);
if (Result = 0) then
begin
for I := 0 to SizeOf(TExtBitFilters) - 1 do
begin
A := PByte(PByte(@FBitFilters) + I)^;
B := PByte(PByte(@Other.FBitFilters) + I)^;
end;
Result := A - B;
end;
end;
constructor TOpcodeExtensions.Create(Definition: TInstructionDefinition);
begin
inherited Create;
@ -1721,6 +1747,27 @@ begin
FDefinition.UpdateValues;
end;
function TX86Flags.CompareTo(const Other: TX86Flags): Integer;
var
F, O: array[0..14] of ^TX86FlagValue;
I: Integer;
begin
Result := 0;
F[ 0] := @FCF; F[ 1] := @FPF; F[ 2] := @FAF; F[ 3] := @FZF; F[ 4] := @FSF;
F[ 5] := @FTF; F[ 6] := @FIF; F[ 7] := @FDF; F[ 8] := @FOF; F[ 9] := @FRF;
F[10] := @FVM; F[11] := @FAC; F[12] := @FVIF; F[13] := @FVIP; F[14] := @FID;
O[ 0] := @Other.FCF; O[ 1] := @Other.FPF; O[ 2] := @Other.FAF; O[ 3] := @Other.FZF;
O[ 4] := @Other.FSF; O[ 5] := @Other.FTF; O[ 6] := @Other.FIF; O[ 7] := @Other.FDF;
O[ 8] := @Other.FOF; O[ 9] := @Other.FRF; O[10] := @Other.FVM; O[11] := @Other.FAC;
O[12] := @Other.FVIF; O[13] := @Other.FVIP; O[14] := @Other.FID;
I := 0;
while (Result = 0) and (I < Length(F)) do
begin
Result := Ord(F[I]^) - Ord(O[I]^);
Inc(I);
end;
end;
constructor TX86Flags.Create(Definition: TInstructionDefinition);
begin
inherited Create;
@ -2519,6 +2566,22 @@ begin
FDefinition.UpdateValues;
end;
function TInstructionOperands.CompareTo(const Other: TInstructionOperands): Integer;
var
I: Integer;
begin
Result := 0;
I := 0;
while (Result = 0) and (I < Length(FOperands)) do
begin
Result := Ord(FOperands[I].OperandType) - Ord(Other.FOperands[I].OperandType);
if (Result = 0) then Result := Ord(FOperands[I].Encoding) - Ord(Other.FOperands[I].Encoding);
if (Result = 0) then
Result := Ord(FOperands[I].AccessMode) - Ord(Other.FOperands[I].AccessMode);
Inc(I);
end;
end;
constructor TInstructionOperands.Create(Definition: TInstructionDefinition);
var
I: Integer;
@ -2711,6 +2774,57 @@ begin
Inc(FUpdateCount);
end;
function TInstructionDefinition.CompareTo(const Other: TInstructionDefinition): Integer;
var
I, A, B: Integer;
begin
Result := CompareStr(FMnemonic, Other.FMnemonic);
if (Result = 0) then Result := Ord(FEncoding) - Ord(Other.FEncoding);
if (Result = 0) then Result := Ord(FOpcodeMap) - Ord(Other.FOpcodeMap);
if (Result = 0) then Result := FOpcode - Other.FOpcode;
if (Result = 0) then Result := FExtensions.CompareTo(Other.FExtensions);
if (Result = 0) then Result := FOperands.CompareTo(Other.FOperands);
if (Result = 0) then
begin
for I := 0 to SizeOf(TCPUIDFeatureFlagSet) - 1 do
begin
A := PByte(PByte(@FCPUID.FeatureFlags) + I)^;
B := PByte(PByte(@Other.FCPUID.FeatureFlags) + I)^;
end;
Result := A - B;
end;
if (Result = 0) then
begin
for I := 0 to SizeOf(TInstructionDefinitionFlags) - 1 do
begin
A := PByte(PByte(@FFlags) + I)^;
B := PByte(PByte(@Other.FFlags) + I)^;
end;
Result := A - B;
end;
if (Result = 0) then
begin
for I := 0 to SizeOf(TX86RegisterSet) - 1 do
begin
A := PByte(PByte(@FImplicitRead) + I)^;
B := PByte(PByte(@Other.FImplicitRead) + I)^;
end;
Result := A - B;
end;
if (Result = 0) then
begin
for I := 0 to SizeOf(TX86RegisterSet) - 1 do
begin
A := PByte(PByte(@FImplicitWrite) + I)^;
B := PByte(PByte(@Other.FImplicitWrite) + I)^;
end;
Result := A - B;
end;
if (Result = 0) then Result := FX86Flags.CompareTo(Other.FX86Flags);
if (Result = 0) then Result := FEVEXCD8Scale - Other.FEVEXCD8Scale;
if (Result = 0) then Result := CompareStr(FComment, Other.FComment);
end;
constructor TInstructionDefinition.Create(Editor: TInstructionEditor; const Mnemonic: String);
begin
inherited Create;
@ -3932,19 +4046,7 @@ begin
Comparison :=
function(const Left, Right: TInstructionDefinition): Integer
begin
Result := CompareStr(Left.Mnemonic, Right.Mnemonic);
if (Result = 0) then
begin
Result := Ord(Left.Encoding) - Ord(Right.Encoding);
end;
if (Result = 0) then
begin
Result := Ord(Left.OpcodeMap) - Ord(Right.OpcodeMap);
end;
if (Result = 0) then
begin
Result := Left.Opcode - Right.Opcode;
end;
Result := Left.CompareTo(Right);
end;
FDefinitions.Sort(TComparer<TInstructionDefinition>.Construct(Comparison));
// Save to JSON

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff