avxtestgenerator: working on new testmethods avx512-memref-operands - 'compressed disp8*N'

git-svn-id: branches/tg74/avx512-0037785@48419 -
This commit is contained in:
tg74 2021-01-25 16:01:01 +00:00 committed by Michaël Van Canneyt
parent f172d87925
commit 334becf76b
2 changed files with 293 additions and 35 deletions

View File

@ -34,7 +34,11 @@ type
TOpMemType = Set of TOpType;
TOpMode = (omUnknown, omXXM, omYYM, omZZM);
TOpMode = (omUnknown,
omKXM, omKYM, omKZM,
omXXM, omXXB32, omXXB64, omXMI, omXB32I, omXB64I,
omYYM, omYYB32, omYYB64, omYMI, omYB32I, omYB64I,
omZZM, omZZB32, omZZB64, omZMI, omZB32I, omZB64I);
TOperandListItem = class(TObject)
private
@ -170,7 +174,8 @@ const
MEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM,
otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512,
otRM32, otRM64, otB32, otB64];
otRM32, otRM64];
BMEMTYPES: TOpMemType = [otB32, otB64];
var
InsTabCache : PInsTabCache;
@ -3591,6 +3596,8 @@ var
sl_RegCombi2: string;
sl_RegCombi3: string;
sInstruction: string;
sMREF: string;
sLogMsg: string;
MaskRegNeeded:boolean;
slRegCombi: TStringList;
OpMode: TOpMode;
@ -3686,6 +3693,46 @@ var
end;
end;
function MapOperand(aOpTyp: TOpType): String;
begin
case aOpTyp of
otXMMReg: result := 'X';
otYMMReg: result := 'Y';
otZMMReg: result := 'Z';
otEAX,
otRAX,
otREG64,
otREG32,
otREG16,
otREG8: result := 'R';
otRM32,
otRM64,
otXMMRM,
otXMMRM8,
otXMMRM16,
otYMMRM,
otZMMRM,
otMem32,
otMem8,
otMem16,
otMem64,
otMem128,
otMem256,
otMem512: result := 'M';
otIMM8: result := 'I';
otXMEM32: result := 'X32';
otXMEM64: result := 'X64';
otYMEM32: result := 'Y32';
otYMEM64: result := 'Y64';
otZMEM32: result := 'Z32';
otZMEM64: result := 'Z64';
otB32: result := 'B32';
otB64: result := 'B64';
otKREG: result := 'K';
else result := '';
end;
end;
begin
result := TStringList.Create;
@ -4682,20 +4729,103 @@ begin
OpMode := omUnknown;
case il_Operands of
3: if (OItem1.OpTyp = otXMMReg) and
3: if (OItem1.OpTyp = otKReg) and
(OItem2.OpTyp = otXMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
(OItem3.OpTyp in MEMTYPES) then OpMode := omKXM
else if (OItem1.OpTyp = otKReg) and
(OItem2.OpTyp = otYMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omKYM
else if (OItem1.OpTyp = otKReg) and
(OItem2.OpTyp = otZMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omKZM
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp = otXMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omXXM
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp = otXMMReg) and
(OItem3.OpTyp = otB32) then OpMode := omXXB32
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp = otXMMReg) and
(OItem3.OpTyp = otB64) then OpMode := omXXB64
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp = otB32) and
(OItem3.OpTyp = otIMM8) then OpMode := omXB32I
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp = otB64) and
(OItem3.OpTyp = otIMM8) then OpMode := omXB64I
else if (OItem1.OpTyp = otXMMReg) and
(OItem2.OpTyp in MEMTYPES) and
(OItem3.OpTyp = otIMM8) then OpMode := omXMI
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp = otYMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omYYM
(OItem3.OpTyp in MEMTYPES) then OpMode := omYYM
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp = otYMMReg) and
(OItem3.OpTyp = otB32) then OpMode := omYYB32
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp = otYMMReg) and
(OItem3.OpTyp = otB64) then OpMode := omYYB64
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp = otB32) and
(OItem3.OpTyp = otIMM8) then OpMode := omYB32I
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp = otB64) and
(OItem3.OpTyp = otIMM8) then OpMode := omYB64I
else if (OItem1.OpTyp = otYMMReg) and
(OItem2.OpTyp in MEMTYPES) and
(OItem3.OpTyp = otIMM8) then OpMode := omYMI
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp = otZMMReg) and
(OItem3.OpTyp in MEMTYPES) then OpMode := omZZM
(OItem3.OpTyp in MEMTYPES) then OpMode := omZZM
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp = otZMMReg) and
(OItem3.OpTyp = otB32) then OpMode := omZZB32
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp = otZMMReg) and
(OItem3.OpTyp = otB64) then OpMode := omZZB64
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp = otB32) and
(OItem3.OpTyp = otIMM8) then OpMode := omZB32I
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp = otB64) and
(OItem3.OpTyp = otIMM8) then OpMode := omZB64I
else if (OItem1.OpTyp = otZMMReg) and
(OItem2.OpTyp in MEMTYPES) and
(OItem3.OpTyp = otIMM8) then OpMode := omZMI
else
begin
sLogMsg := '';
sLogMsg := MapOperand(OItem1.Optyp) + MapOperand(OItem2.Optyp) + MapOperand(OItem3.Optyp);
if sLogMsg <> '' then
begin
if (sLogMsg <> 'RMI') and
(sLogMsg <> 'RRM') and
(sLogMsg <> 'RMR') and
(sLogMsg <> 'KKK') and
(sLogMsg <> 'KKI') and
(sLogMsg <> 'XXX') and
(sLogMsg <> 'YYY') and
(sLogMsg <> 'ZZZ') and
(sLogMsg <> 'XXI') and
(sLogMsg <> 'YYI') and
(sLogMsg <> 'ZZI') and
(sLogMsg <> 'XYI') and
(sLogMsg <> 'YZI') and
(sLogMsg <> 'XZI') and
(sLogMsg <> 'RXI') and
(sLogMsg <> 'RYI') and
(sLogMsg <> 'RZI') and
(sLogMsg <> 'XXR') then
writeln('offen: ' + sLogMsg);
end;
end;
else;
end;
@ -4740,40 +4870,168 @@ begin
if sRegCombi <> '' then
begin
//result.Add(format('%-20s%s', [aInst, sl_RegCombi]));
result.Add(format('%-20s%s', [sInstruction, sRegCombi]));
result.Add(format('%-20s %6s', [sInstruction, sRegCombi]));
case OpMode of
omXXM: begin
result.Add(sInstruction + 'XMM1, XMM1, ' + OItem3.Values[il_Op3] + ' + $00');
result.Add(' vpcmpeqb k2, ' + OItem1.Values[il_Op1] + ', xmm1');
result.Add(' kandq k1, k1, k2');
result.Add('');
end;
omYYM: begin
result.Add(sInstruction + 'XMM1, XMM1, ' + OItem3.Values[il_Op3] + ' + $00');
result.Add(sInstruction + 'XMM2, XMM2, ' + OItem3.Values[il_Op3] + ' + $10');
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', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'XMM1']));
//result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omXB32I,
omXB64I: begin
sMREF := OItem2.Values[il_Op2];
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(' vinserti32x4 ymm1, ymm1, xmm2, 01');
result.Add(' vpcmpeqb k2, ' + OItem1.Values[il_Op1] + ', ymm1');
result.Add(' kandq k1, k1, k2');
result.Add('');
end;
omZZM: begin
result.Add(sInstruction + 'XMM1, XMM1, ' + OItem3.Values[il_Op3] + ' + $00');
result.Add(sInstruction + 'XMM2, XMM2, ' + OItem3.Values[il_Op3] + ' + $10');
result.Add(sInstruction + 'XMM3, XMM3, ' + OItem3.Values[il_Op3] + ' + $20');
result.Add(sInstruction + 'XMM4, XMM4, ' + OItem3.Values[il_Op3] + ' + $30');
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('');
end;
omXXM: begin
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', 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('');
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(' vinserti32x4 zmm1, zmm1, xmm2, 01');
result.Add(' vinserti32x4 zmm1, zmm1, xmm3, 02');
result.Add(' vinserti32x4 zmm1, zmm1, xmm4, 03');
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('');
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('');
end;
result.Add(' vpcmpeqb k2, ' + OItem1.Values[il_Op1] + ', zmm1');
result.Add(' kandq k1, k1, k2');
result.Add('');
omYB32I,
omYB64I: begin
sMREF := OItem2.Values[il_Op2];
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}', []);
end;
result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omYYM: begin
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omYYB32,
omYYB64: 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 + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omYMI: 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 + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'YMM1', 'YMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'YMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omZB32I,
omZB64I:
begin
sMREF := OItem2.Values[il_Op2];
if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
result.Add(format('%20s%6s,%6s + $00, %s', [aInst, 'XMM1', sMREF, OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s + $10, %s', [aInst, 'XMM2', sMREF, OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', sMREF, OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omZZM: begin
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omZZB32,
omZZB64: begin
sMREF := OItem3.Values[il_Op3];
if Pos('{1to8}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to8}', '{1to2}', [])
else if Pos('{1to16}', sMREF) > 0 then sMREF := StringReplace(sMREF, '{1to16}', '{1to4}', []);
result.Add(format('%20s%6s,%6s, %s + $00', [aInst, 'XMM1', 'XMM1', sMREF]));
result.Add(format('%20s%6s,%6s, %s + $10', [aInst, 'XMM2', 'XMM2', sMREF]));
result.Add(format('%20s%6s,%6s, %s + $20', [aInst, 'XMM3', 'XMM3', sMREF]));
result.Add(format('%20s%6s,%6s, %s + $30', [aInst, 'XMM4', 'XMM4', sMREF]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
omZMI: 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 + $10, %s', [aInst, 'XMM2', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s + $20, %s', [aInst, 'XMM3', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s + $30, %s', [aInst, 'XMM4', OItem2.Values[il_Op2], OItem3.Values[il_Op3]]));
result.Add(format('%20s%6s,%6s, %s, 01', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM2']));
result.Add(format('%20s%6s,%6s, %s, 02', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM3']));
result.Add(format('%20s%6s,%6s, %s, 03', ['vinserti32x4', 'ZMM1', 'ZMM1', 'XMM4']));
result.Add(format('%20s%6s,%6s, %s', ['vpcmpeqb', 'K2', OItem1.Values[il_Op1], 'ZMM1']));
result.Add(format('%20s%6s,%6s, %s', ['kandq', 'K1', 'K1', 'K2']));
result.Add('');
end;
end;

View File

@ -22,13 +22,13 @@
</PublishOptions>
<RunParams>
<local>
<CommandLineParams Value="-px8664 -ffpccd8 -o\home\torsten\tmp\fpc\fpc -z -mvaddpd"/>
<CommandLineParams Value="-px8664 -ffpc -o\home\torsten\tmp\fpc\fpc -z -mvgatherqpd"/>
</local>
<FormatVersion Value="2"/>
<Modes Count="1">
<Mode0 Name="default">
<local>
<CommandLineParams Value="-px8664 -ffpccd8 -o\home\torsten\tmp\fpc\fpc -z -mvaddpd"/>
<CommandLineParams Value="-px8664 -ffpc -o\home\torsten\tmp\fpc\fpc -z -mvgatherqpd"/>
</local>
</Mode0>
</Modes>