summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-02-03 16:30:41 +0000
committertg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-02-03 16:30:41 +0000
commitd389c6c40ab18773869574d51719e4f1497716f1 (patch)
tree04ca3fb63804297d302798da6222b356c324762c
parent4c868c8c8179ac5566af1819f8088187549a65fc (diff)
downloadfpc-d389c6c40ab18773869574d51719e4f1497716f1.tar.gz
working on new testmethods avx512-memref-operands - 'compressed disp8*N'
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/tg74@48506 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--avx512-0037785/tests/utils/avx/asmtestgenerator.pas218
-rw-r--r--avx512-0037785/tests/utils/avx/avxopcodes.pas4
2 files changed, 144 insertions, 78 deletions
diff --git a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas
index 443d75442a..8ef3afc89e 100644
--- a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas
+++ b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas
@@ -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 + $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, %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', ['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
diff --git a/avx512-0037785/tests/utils/avx/avxopcodes.pas b/avx512-0037785/tests/utils/avx/avxopcodes.pas
index da4b76801a..7bc1adf155 100644
--- a/avx512-0037785/tests/utils/avx/avxopcodes.pas
+++ b/avx512-0037785/tests/utils/avx/avxopcodes.pas
@@ -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');