mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-06 19:30:43 +02:00
working on new testmethods avx512-memref-operands - 'compressed disp8*N'
git-svn-id: branches/tg74/avx512-0037785@48506 -
This commit is contained in:
parent
d13d625090
commit
2e54def8e5
@ -93,6 +93,7 @@ type
|
||||
FSAE: boolean;
|
||||
|
||||
procedure MemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
procedure MemRegBaseIndexCombiCDISP8N(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
procedure VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
function ParseBaseIndexReg(const aOp: string; var aBaseReg, aIndexReg: string): boolean;
|
||||
|
||||
@ -3607,6 +3608,7 @@ var
|
||||
MaskRegNeeded:boolean;
|
||||
slRegCombi: TStringList;
|
||||
OpMode: TOpMode;
|
||||
iOpNumMRef: integer;
|
||||
|
||||
function PrepareOperandTyp(const aTyp: String): String;
|
||||
begin
|
||||
@ -3739,6 +3741,25 @@ var
|
||||
end;
|
||||
end;
|
||||
|
||||
function AsmCodeBlockCompare(aAsmCounter: integer): String;
|
||||
var
|
||||
sReg: string;
|
||||
begin
|
||||
result := '';
|
||||
|
||||
case Fx64 of
|
||||
true: sReg := 'RAX';
|
||||
else sReg := 'EAX';
|
||||
end;
|
||||
|
||||
result := result + format('%20s%6s ', [' push', sReg]) + #13#10 +
|
||||
format('%20s%6s,%s', [' mov', sReg, inttostr(aAsmCounter)]) + #13#10 +
|
||||
format('%20s%6s,%s', [' kmovd', 'K7', 'EAX']) + #13#10 +
|
||||
format('%20s%6s', [' pop', sReg]) + #13#10 +
|
||||
format('%20s%6s, %s', ['kortestb', 'K1', 'K2']) + #13#10 +
|
||||
format('%20s %6s', [' jnc', '@@CHECKRESULT']) + #13#10 + #13#10;
|
||||
end;
|
||||
|
||||
begin
|
||||
result := TStringList.Create;
|
||||
|
||||
@ -3845,8 +3866,8 @@ begin
|
||||
|
||||
if UsePrefix then sl_Prefix := 'oword ';
|
||||
|
||||
if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'XMMRM8')) or
|
||||
(AnsiSameText(sl_Operand, 'XMMRM8_M')) or
|
||||
@ -3860,8 +3881,8 @@ begin
|
||||
|
||||
if UsePrefix then sl_Prefix := 'byte ';
|
||||
|
||||
if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'XMMRM16')) or
|
||||
(AnsiSameText(sl_Operand, 'XMMRM16_M')) or
|
||||
@ -3876,8 +3897,8 @@ begin
|
||||
|
||||
if UsePrefix then sl_Prefix := 'word ';
|
||||
|
||||
if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'YMMREG')) then
|
||||
begin
|
||||
@ -3930,8 +3951,8 @@ begin
|
||||
//if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
|
||||
// else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}';
|
||||
|
||||
if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
if x64 then MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'ZMMREG')) then
|
||||
begin
|
||||
@ -3998,10 +4019,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'MEM16') or
|
||||
AnsiSameText(sl_Operand, 'MEM16_M') then
|
||||
@ -4017,10 +4038,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'MEM32') or
|
||||
AnsiSameText(sl_Operand, 'MEM32_M') or
|
||||
@ -4040,10 +4061,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'MEM64')) or
|
||||
(AnsiSameText(sl_Operand, 'MEM64_M')) or
|
||||
@ -4061,10 +4082,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'MEM128')) or
|
||||
(AnsiSameText(sl_Operand, 'MEM128_M')) or
|
||||
@ -4082,10 +4103,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'MEM256')) or
|
||||
(AnsiSameText(sl_Operand, 'MEM256_M')) or
|
||||
@ -4104,10 +4125,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if (AnsiSameText(sl_Operand, 'MEM512')) or
|
||||
(AnsiSameText(sl_Operand, 'MEM512_M')) or
|
||||
@ -4126,10 +4147,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'REG8') then
|
||||
begin
|
||||
@ -4190,10 +4211,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'RM64') then
|
||||
begin
|
||||
@ -4208,10 +4229,10 @@ begin
|
||||
if x64 then
|
||||
begin
|
||||
Item.Values.AddStrings(FReg64Base);
|
||||
MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, '', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'IMM8') then
|
||||
begin
|
||||
@ -4452,10 +4473,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '4B32') then
|
||||
begin
|
||||
@ -4466,10 +4487,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '8B32') then
|
||||
begin
|
||||
@ -4480,10 +4501,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '16B32') then
|
||||
begin
|
||||
@ -4494,10 +4515,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '2B64') then
|
||||
begin
|
||||
@ -4508,10 +4529,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '4B64') then
|
||||
begin
|
||||
@ -4522,10 +4543,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '8B64') then
|
||||
begin
|
||||
@ -4536,10 +4557,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, '16B64') then
|
||||
begin
|
||||
@ -4550,10 +4571,10 @@ begin
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
|
||||
MemRegBaseIndexCombiCDISP8N(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values);
|
||||
//MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values);
|
||||
end
|
||||
else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
|
||||
else MemRegBaseIndexCombiCDISP8N(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values);
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'KREG') or
|
||||
AnsiSameText(sl_Operand, 'KREG_M') then
|
||||
@ -4736,6 +4757,16 @@ begin
|
||||
begin
|
||||
OpMode := omUnknown;
|
||||
|
||||
iOpNumMRef := -1;
|
||||
if (OItem1.OpTyp in MEMTYPES) or
|
||||
(OItem1.OpTyp in BMEMTYPES) then iOpNumMRef := 1
|
||||
else if (OItem2.OpTyp in MEMTYPES) or
|
||||
(OItem2.OpTyp in BMEMTYPES) then iOpNumMRef := 2
|
||||
else if (OItem3.OpTyp in MEMTYPES) or
|
||||
(OItem3.OpTyp in BMEMTYPES) then iOpNumMRef := 3
|
||||
else if (OItem4.OpTyp in MEMTYPES) or
|
||||
(OItem4.OpTyp in BMEMTYPES) then iOpNumMRef := 4;
|
||||
|
||||
case il_Operands of
|
||||
3: if (OItem1.OpTyp = otKReg) and
|
||||
(OItem2.OpTyp = otXMMReg) and
|
||||
@ -4878,15 +4909,32 @@ begin
|
||||
|
||||
if sRegCombi <> '' then
|
||||
begin
|
||||
case iOpNumMRef of
|
||||
1: sMRef := OItem1.Values[il_Op1];
|
||||
2: sMRef := OItem2.Values[il_Op2];
|
||||
3: sMRef := OItem3.Values[il_Op3];
|
||||
4: sMRef := OItem1.Values[il_Op4];
|
||||
else sMRef := '';
|
||||
end;
|
||||
|
||||
if ParseBaseIndexReg(OItem3.Values[il_Op3], sBaseReg, sIndexReg) then
|
||||
begin
|
||||
result.Add(format('%20s %s', [' pop', sBaseReg]));
|
||||
result.Add(format('%20s %s', [' push', sBaseReg]));
|
||||
|
||||
if trim(sIndexReg) <> '' then
|
||||
result.Add(format('%20s%6s, %s', [' xor', sIndexReg, sIndexReg]));
|
||||
end;
|
||||
|
||||
//result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
|
||||
result.Add(format('%-20s %6s', [sInstruction, sRegCombi]));
|
||||
|
||||
inc(iAsmCounter);
|
||||
case OpMode of
|
||||
omKXM: begin
|
||||
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, OItem1.Values[il_Op1], 'XMM1', OItem3.Values[il_Op3] ]));
|
||||
|
||||
result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, OItem1.Values[il_Op1], 'XMM1', OItem3.Values[il_Op3] ]));
|
||||
|
||||
// TODO
|
||||
//result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
//result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
|
||||
result.Add('');
|
||||
@ -4898,48 +4946,35 @@ begin
|
||||
else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
|
||||
else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
|
||||
|
||||
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
|
||||
result.Add('');
|
||||
result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
|
||||
result.Add(AsmCodeBlockCompare(iAsmCounter));
|
||||
end;
|
||||
omXXM: begin
|
||||
if ParseBaseIndexReg(OItem3.Values[il_Op3], sBaseReg, sIndexReg) then
|
||||
begin
|
||||
|
||||
end;
|
||||
result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
|
||||
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3] ]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
|
||||
case Fx64 of
|
||||
true: sReg := 'RAX';
|
||||
else sReg := 'EAX';
|
||||
end;
|
||||
|
||||
result.Add(format('%20s%6s', [' push', sReg]));
|
||||
result.Add(format('%20s%6s,%s', [' mov', sReg, str(iAsmCounter)]));
|
||||
result.Add(format('%20s%6s,%s', [' kmovd', 'K7', 'EAX']));
|
||||
result.Add(format('%20s%6s', [' pop', sReg]));
|
||||
|
||||
result.Add(format('%20s%6s,%6s', ['kortestb', 'K1', 'K2']));
|
||||
result.Add(format('%20s%6s', [' jnc', '@@CHECKRESULT']));
|
||||
result.Add('');
|
||||
result.Add(AsmCodeBlockCompare(iAsmCounter));
|
||||
end;
|
||||
omXXB32,
|
||||
omXXB64: begin
|
||||
sMREF := OItem3.Values[il_Op3];
|
||||
if Pos('{1to4}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to4}', '{1to2}', [])
|
||||
else if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to4}', [])
|
||||
else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to8}', []);
|
||||
|
||||
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
|
||||
result.Add('');
|
||||
result.Add(format('%20s%6s,%6s, %s + $2000', [aInst, 'XMM1', 'XMM1', sMREF]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
|
||||
result.Add(AsmCodeBlockCompare(iAsmCounter));
|
||||
end;
|
||||
omXMI: begin
|
||||
result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
|
||||
result.Add('');
|
||||
result.Add(format('%20s%6s,%6s + $2000, %s', [aInst, 'XMM1', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
|
||||
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqw', 'K2', OItem1.Values[il_Op1], 'XMM1']));
|
||||
|
||||
result.Add(AsmCodeBlockCompare(iAsmCounter));
|
||||
end;
|
||||
|
||||
omYB32I,
|
||||
@ -5423,6 +5458,34 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAsmTestGenerator.MemRegBaseIndexCombiCDISP8N(const aPrefix,
|
||||
aSuffix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
var
|
||||
iBase: integer;
|
||||
iIndex: integer;
|
||||
iOffset: integer;
|
||||
begin
|
||||
|
||||
for iBase := 0 to aSLBaseReg.Count - 1 do
|
||||
begin
|
||||
for iOffset := 0 to 63 do
|
||||
begin
|
||||
aRList.Add(format(aPrefix + '[%s +%2d]', [aSLBaseReg[iBase], iOffset]));
|
||||
|
||||
for iIndex := 0 to aSLIndexReg.Count - 1 do
|
||||
begin
|
||||
if aSLBaseReg[iBase] <> aSLIndexReg[iIndex] then
|
||||
begin
|
||||
aRList.Add(format(aPrefix + '[%s + %s + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 2 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 4 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 8 + %2d]', [aSLBaseReg[iBase], aSLIndexReg[iIndex], iOffset]));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix, aSuffix: String;
|
||||
aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
var
|
||||
@ -5480,6 +5543,9 @@ var
|
||||
begin
|
||||
result := false;
|
||||
|
||||
aBaseReg := '';
|
||||
aIndexReg := '';
|
||||
|
||||
iStartPos := Pos('[', aOp);
|
||||
iEndPos := Pos(']', aOp);
|
||||
|
||||
@ -5507,7 +5573,7 @@ begin
|
||||
if (FReg32Index.IndexOf(sIndexReg) >= 0) or
|
||||
(FReg64Index.IndexOf(sIndexReg) >= 0) or
|
||||
(FReg6432Index.IndexOf(sIndexReg) >= 0) then
|
||||
aIndexReg := sIndex;
|
||||
aIndexReg := sIndexReg;
|
||||
|
||||
result := trim(aBasereg) <> '';
|
||||
finally
|
||||
|
@ -3694,12 +3694,12 @@ begin
|
||||
slHeader.Add(' $E0, $E1, $E2, $E3, $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED, $EE, $EF,');
|
||||
slHeader.Add(' $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF);');
|
||||
slHeader.Add('var');
|
||||
slHeader.Add(' DataBlock: Array[0..$FFFF) of byte;');
|
||||
slHeader.Add(' DataBlock: Array[0..$FFFF] of byte;');
|
||||
slheader.Add(' i: integer;');
|
||||
|
||||
|
||||
slHeader.Add('begin');
|
||||
slHeader.Add(' for i := 0 to high(DataBlock) do
|
||||
slHeader.Add(' for i := 0 to high(DataBlock) do');
|
||||
slHeader.Add(' DataBlock[i] := cDataBlockByte[i mod 256];');
|
||||
|
||||
slHeader.Add(' asm');
|
||||
|
Loading…
Reference in New Issue
Block a user