mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-16 05:50:40 +01:00
* merged new changes to avx2 branch (AVX2 vectory-memory support) by Torsten Grundke
git-svn-id: trunk@28527 -
This commit is contained in:
parent
4ef87579eb
commit
8635894de4
@ -1827,9 +1827,13 @@ implementation
|
||||
{No register, so memory reference.}
|
||||
if (input.typ<>top_ref) then
|
||||
internalerror(200409262);
|
||||
if ((input.ref^.index<>NR_NO) and (getregtype(input.ref^.index)<>R_INTREGISTER)) or
|
||||
|
||||
if ((input.ref^.index<>NR_NO) and (getregtype(input.ref^.index)=R_MMREGISTER) and (input.ref^.base<>NR_NO) and (getregtype(input.ref^.base)<>R_INTREGISTER)) or // vector memory (AVX2)
|
||||
((input.ref^.index<>NR_NO) and (getregtype(input.ref^.index)<>R_INTREGISTER) and (getregtype(input.ref^.index)<>R_MMREGISTER)) or
|
||||
((input.ref^.base<>NR_NO) and (getregtype(input.ref^.base)<>R_INTREGISTER)) then
|
||||
internalerror(200301081);
|
||||
internalerror(200301081);
|
||||
|
||||
|
||||
ir:=input.ref^.index;
|
||||
br:=input.ref^.base;
|
||||
isub:=getsubreg(ir);
|
||||
@ -1849,8 +1853,15 @@ implementation
|
||||
{ it's an indirection }
|
||||
begin
|
||||
{ 16 bit address? }
|
||||
if ((ir<>NR_NO) and (isub<>R_SUBADDR)) or
|
||||
((br<>NR_NO) and (bsub<>R_SUBADDR)) then
|
||||
|
||||
if ((ir<>NR_NO) and (isub in [R_SUBMMX,R_SUBMMY]) and
|
||||
(br<>NR_NO) and (bsub=R_SUBADDR)
|
||||
) then
|
||||
begin
|
||||
// vector memory (AVX2) =>> ignore
|
||||
end
|
||||
else if ((ir<>NR_NO) and (isub<>R_SUBADDR)) or
|
||||
((br<>NR_NO) and (bsub<>R_SUBADDR)) then
|
||||
message(asmw_e_16bit_not_supported);
|
||||
{$ifdef OPTEA}
|
||||
{ make single reg base }
|
||||
@ -1893,14 +1904,30 @@ implementation
|
||||
end;
|
||||
{ index }
|
||||
case ir of
|
||||
NR_EAX : index:=0;
|
||||
NR_ECX : index:=1;
|
||||
NR_EDX : index:=2;
|
||||
NR_EBX : index:=3;
|
||||
NR_NO : index:=4;
|
||||
NR_EBP : index:=5;
|
||||
NR_ESI : index:=6;
|
||||
NR_EDI : index:=7;
|
||||
NR_EAX,
|
||||
NR_XMM0,
|
||||
NR_YMM0: index:=0;
|
||||
NR_ECX,
|
||||
NR_XMM1,
|
||||
NR_YMM1: index:=1;
|
||||
NR_EDX,
|
||||
NR_XMM2,
|
||||
NR_YMM2: index:=2;
|
||||
NR_EBX,
|
||||
NR_XMM3,
|
||||
NR_YMM3: index:=3;
|
||||
NR_NO,
|
||||
NR_XMM4,
|
||||
NR_YMM4: index:=4;
|
||||
NR_EBP,
|
||||
NR_XMM5,
|
||||
NR_YMM5: index:=5;
|
||||
NR_ESI,
|
||||
NR_XMM6,
|
||||
NR_YMM6: index:=6;
|
||||
NR_EDI,
|
||||
NR_XMM7,
|
||||
NR_YMM7: index:=7;
|
||||
else
|
||||
exit;
|
||||
end;
|
||||
|
||||
@ -28,7 +28,8 @@ uses BaseList, Classes;
|
||||
|
||||
type
|
||||
TOpType = (otUnknown, otXMMReg, otXMMRM, otXMMRM16, otXMMRM8, otYMMReg, otYMMRM, otEAX, otRAX, otMem32,
|
||||
otMem8, otMem16, otMem64, otMem128, otMem256, otREG64, otREG32, otRM32, otRM64, otIMM8);
|
||||
otMem8, otMem16, otMem64, otMem128, otMem256, otREG64, otREG32, otRM32, otRM64, otIMM8,
|
||||
otXMEM32, otXMEM64, otYMEM32, otYMEM64);
|
||||
|
||||
TOperandListItem = class(TObject)
|
||||
private
|
||||
@ -58,6 +59,8 @@ type
|
||||
end;
|
||||
|
||||
|
||||
{ TAsmTestGenerator }
|
||||
|
||||
TAsmTestGenerator = class(TObject)
|
||||
private
|
||||
FReg32Base : TStringList;
|
||||
@ -66,10 +69,15 @@ type
|
||||
FReg64Index : TStringList;
|
||||
FReg6432Base : TStringList;
|
||||
FReg6432Index : TStringList;
|
||||
FReg32XMMIndex : TStringList;
|
||||
FReg32YMMIndex : TStringList;
|
||||
FReg64XMMIndex : TStringList;
|
||||
FReg64YMMIndex : TStringList;
|
||||
|
||||
Fx64: boolean;
|
||||
|
||||
procedure MemRegBaseIndexCombi(const aPrefix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
procedure VectorMemRegBaseIndexCombi(const aPrefix: String; aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
|
||||
function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList;
|
||||
public
|
||||
@ -583,6 +591,76 @@ begin
|
||||
|
||||
Item.Values.Add('0');
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'XMEM32') then
|
||||
begin
|
||||
Item.OpNumber := il_Op;
|
||||
Item.OpTyp := otXMEM32;
|
||||
Item.OpActive := true;
|
||||
|
||||
if UsePrefix then sl_Prefix := 'oword ';
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
|
||||
end
|
||||
else
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
|
||||
end;
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'XMEM64') then
|
||||
begin
|
||||
Item.OpNumber := il_Op;
|
||||
Item.OpTyp := otXMEM64;
|
||||
Item.OpActive := true;
|
||||
|
||||
if UsePrefix then sl_Prefix := 'oword ';
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64XMMIndex, Item.Values);
|
||||
end
|
||||
else
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32XMMIndex, Item.Values);
|
||||
end;
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'YMEM32') then
|
||||
begin
|
||||
Item.OpNumber := il_Op;
|
||||
Item.OpTyp := otYMEM32;
|
||||
Item.OpActive := true;
|
||||
|
||||
if UsePrefix then sl_Prefix := 'yword ';
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
|
||||
end
|
||||
else
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
|
||||
end;
|
||||
end
|
||||
else if AnsiSameText(sl_Operand, 'YMEM64') then
|
||||
begin
|
||||
Item.OpNumber := il_Op;
|
||||
Item.OpTyp := otYMEM64;
|
||||
Item.OpActive := true;
|
||||
|
||||
if UsePrefix then sl_Prefix := 'yword ';
|
||||
|
||||
if x64 then
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64YMMIndex, Item.Values);
|
||||
end
|
||||
else
|
||||
begin
|
||||
VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32YMMIndex, Item.Values);
|
||||
end;
|
||||
end
|
||||
|
||||
|
||||
else
|
||||
begin
|
||||
Item.OpNumber := il_Op;
|
||||
@ -590,7 +668,8 @@ begin
|
||||
Item.OpActive := false;
|
||||
|
||||
Item.Values.Add('');
|
||||
end;
|
||||
end
|
||||
|
||||
end;
|
||||
|
||||
sl_RegCombi := '';
|
||||
@ -755,6 +834,11 @@ begin
|
||||
FReg64Index := TStringList.Create;
|
||||
FReg6432Base := TStringList.Create;
|
||||
FReg6432Index := TStringList.Create;
|
||||
FReg32XMMIndex := TStringList.Create;
|
||||
FReg32YMMIndex := TStringList.Create;
|
||||
FReg64XMMIndex := TStringList.Create;
|
||||
FReg64YMMIndex := TStringList.Create;
|
||||
|
||||
|
||||
FReg32Base.Add('EAX');
|
||||
FReg32Base.Add('EBX');
|
||||
@ -840,6 +924,60 @@ begin
|
||||
FReg6432Index.Add('R13D');
|
||||
FReg6432Index.Add('R14D');
|
||||
FReg6432Index.Add('R15D');
|
||||
|
||||
FReg32XMMIndex.ADD('XMM0');
|
||||
FReg32XMMIndex.ADD('XMM1');
|
||||
FReg32XMMIndex.ADD('XMM2');
|
||||
FReg32XMMIndex.ADD('XMM3');
|
||||
FReg32XMMIndex.ADD('XMM4');
|
||||
FReg32XMMIndex.ADD('XMM5');
|
||||
FReg32XMMIndex.ADD('XMM6');
|
||||
FReg32XMMIndex.ADD('XMM7');
|
||||
|
||||
FReg32YMMIndex.ADD('YMM0');
|
||||
FReg32YMMIndex.ADD('YMM1');
|
||||
FReg32YMMIndex.ADD('YMM2');
|
||||
FReg32YMMIndex.ADD('YMM3');
|
||||
FReg32YMMIndex.ADD('YMM4');
|
||||
FReg32YMMIndex.ADD('YMM5');
|
||||
FReg32YMMIndex.ADD('YMM6');
|
||||
FReg32YMMIndex.ADD('YMM7');
|
||||
|
||||
FReg64XMMIndex.ADD('XMM0');
|
||||
FReg64XMMIndex.ADD('XMM1');
|
||||
FReg64XMMIndex.ADD('XMM2');
|
||||
FReg64XMMIndex.ADD('XMM3');
|
||||
FReg64XMMIndex.ADD('XMM4');
|
||||
FReg64XMMIndex.ADD('XMM5');
|
||||
FReg64XMMIndex.ADD('XMM6');
|
||||
FReg64XMMIndex.ADD('XMM7');
|
||||
FReg64XMMIndex.ADD('XMM8');
|
||||
FReg64XMMIndex.ADD('XMM9');
|
||||
FReg64XMMIndex.ADD('XMM10');
|
||||
FReg64XMMIndex.ADD('XMM11');
|
||||
FReg64XMMIndex.ADD('XMM12');
|
||||
FReg64XMMIndex.ADD('XMM13');
|
||||
FReg64XMMIndex.ADD('XMM14');
|
||||
FReg64XMMIndex.ADD('XMM15');
|
||||
|
||||
|
||||
FReg64YMMIndex.ADD('YMM0');
|
||||
FReg64YMMIndex.ADD('YMM1');
|
||||
FReg64YMMIndex.ADD('YMM2');
|
||||
FReg64YMMIndex.ADD('YMM3');
|
||||
FReg64YMMIndex.ADD('YMM4');
|
||||
FReg64YMMIndex.ADD('YMM5');
|
||||
FReg64YMMIndex.ADD('YMM6');
|
||||
FReg64YMMIndex.ADD('YMM7');
|
||||
FReg64YMMIndex.ADD('YMM8');
|
||||
FReg64YMMIndex.ADD('YMM9');
|
||||
FReg64YMMIndex.ADD('YMM10');
|
||||
FReg64YMMIndex.ADD('YMM11');
|
||||
FReg64YMMIndex.ADD('YMM12');
|
||||
FReg64YMMIndex.ADD('YMM13');
|
||||
FReg64YMMIndex.ADD('YMM14');
|
||||
FReg64YMMIndex.ADD('YMM15');
|
||||
|
||||
end;
|
||||
|
||||
destructor TAsmTestGenerator.Destroy;
|
||||
@ -851,6 +989,11 @@ begin
|
||||
FreeAndNil(FReg6432Base);
|
||||
FreeAndNil(FReg6432Index);
|
||||
|
||||
FreeAndNil(FReg32XMMIndex);
|
||||
FreeAndNil(FReg32YMMIndex);
|
||||
FreeAndNil(FReg64XMMIndex);
|
||||
FreeAndNil(FReg64YMMIndex);
|
||||
|
||||
inherited;
|
||||
end;
|
||||
|
||||
@ -880,6 +1023,51 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TAsmTestGenerator.VectorMemRegBaseIndexCombi(const aPrefix: String;
|
||||
aSLBaseReg, aSLIndexReg, aRList: TStringList);
|
||||
var
|
||||
il_Base: integer;
|
||||
il_Index: integer;
|
||||
begin
|
||||
|
||||
//for il_Index := 0 to aSLIndexReg.Count - 1 do
|
||||
//begin
|
||||
// aRList.Add(format(aPrefix + '[%s]', [aSLIndexReg[il_Index]]));
|
||||
//
|
||||
// aRList.Add(format(aPrefix + '[%s * 2]', [aSLIndexReg[il_Index]]));
|
||||
// aRList.Add(format(aPrefix + '[%s * 4]', [aSLIndexReg[il_Index]]));
|
||||
// aRList.Add(format(aPrefix + '[%s * 8]', [aSLIndexReg[il_Index]]));
|
||||
//
|
||||
// aRList.Add(format(aPrefix + '[%s * 2 + 16]', [aSLIndexReg[il_Index]]));
|
||||
// aRList.Add(format(aPrefix + '[%s * 4 + 32]', [aSLIndexReg[il_Index]]));
|
||||
// aRList.Add(format(aPrefix + '[%s * 8 + 48]', [aSLIndexReg[il_Index]]));
|
||||
//end;
|
||||
|
||||
|
||||
for il_Base := 0 to aSLBaseReg.Count - 1 do
|
||||
begin
|
||||
//aRList.Add(format(aPrefix + '[%s]', [aSLBaseReg[il_Base]]));
|
||||
|
||||
for il_Index := 0 to aSLIndexReg.Count - 1 do
|
||||
begin
|
||||
aRList.Add(format(aPrefix + '[%s + %s]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 2]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 4]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 8]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 2 + 16]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 4 + 32]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
aRList.Add(format(aPrefix + '[%s + %s * 8 + 48]', [aSLBaseReg[il_Base], aSLIndexReg[il_Index]]));
|
||||
|
||||
|
||||
aRList.Add(format(aPrefix + '[%s + %s]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
|
||||
|
||||
aRList.Add(format(aPrefix + '[%s + %s + 16]', [aSLIndexReg[il_Index], aSLBaseReg[il_Base]]));
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
class procedure TAsmTestGenerator.CalcTestData(aX64: boolean; const aInst, aOp1, aOp2, aOp3,
|
||||
aOp4: String; aSL: TStringList);
|
||||
var
|
||||
|
||||
@ -773,6 +773,36 @@ begin
|
||||
FOpCodeList.Add('VFNMSUB132SS,1,1,XMMREG,XMMREG,XMMRM,');
|
||||
FOpCodeList.Add('VFNMSUB213SS,1,1,XMMREG,XMMREG,XMMRM,');
|
||||
FOpCodeList.Add('VFNMSUB231SS,1,1,XMMREG,XMMREG,XMMRM,');
|
||||
|
||||
|
||||
FOpCodeList.Add('VGATHERDPD,1,1,XMMREG,XMEM32,XMMREG,');
|
||||
FOpCodeList.Add('VGATHERDPD,1,1,YMMREG,XMEM32,YMMREG,');
|
||||
|
||||
FOpCodeList.Add('VGATHERQPD,1,1,XMMREG,XMEM64,XMMREG,');
|
||||
FOpCodeList.Add('VGATHERQPD,1,1,YMMREG,YMEM64,YMMREG,');
|
||||
|
||||
|
||||
FOpCodeList.Add('VGATHERDPS,1,1,XMMREG,XMEM32,XMMREG,');
|
||||
FOpCodeList.Add('VGATHERDPS,1,1,YMMREG,YMEM32,YMMREG,');
|
||||
|
||||
FOpCodeList.Add('VGATHERQPS,1,1,XMMREG,XMEM64,XMMREG,');
|
||||
FOpCodeList.Add('VGATHERQPS,1,1,XMMREG,YMEM64,XMMREG,');
|
||||
|
||||
|
||||
|
||||
FOpCodeList.Add('VPGATHERDD,1,1,XMMREG,XMEM32,XMMREG,');
|
||||
FOpCodeList.Add('VPGATHERDD,1,1,YMMREG,YMEM32,YMMREG,');
|
||||
|
||||
FOpCodeList.Add('VPGATHERQD,1,1,XMMREG,XMEM64,XMMREG,');
|
||||
FOpCodeList.Add('VPGATHERQD,1,1,XMMREG,YMEM64,XMMREG,');
|
||||
|
||||
|
||||
FOpCodeList.Add('VPGATHERDQ,1,1,XMMREG,XMEM32,XMMREG,');
|
||||
FOpCodeList.Add('VPGATHERDQ,1,1,YMMREG,XMEM32,YMMREG,');
|
||||
|
||||
FOpCodeList.Add('VPGATHERQQ,1,1,XMMREG,XMEM64,XMMREG,');
|
||||
FOpCodeList.Add('VPGATHERQQ,1,1,YMMREG,YMEM64,YMMREG,');
|
||||
|
||||
end;
|
||||
|
||||
function TAVXTestGenerator.InternalMakeTestFiles(aX64: boolean; aDestPath, aFileExt: String;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user