diff options
author | tg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-19 05:12:39 +0000 |
---|---|---|
committer | tg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-19 05:12:39 +0000 |
commit | 65a4a920106d09ef8db6e6b8b2e4e970a0f0e77a (patch) | |
tree | 0b04c71e69c11c7b6e9d26d1c3b1af173bebbaca | |
parent | 9e7123b2d9aa377b4c2873c7836ff072f3c852dd (diff) | |
download | fpc-65a4a920106d09ef8db6e6b8b2e4e970a0f0e77a.tar.gz |
avxtestgenerator: working on new testmethods avx512-memref-operands - 'compressed disp8*N'
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/tg74@48187 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | avx512-0037785/tests/utils/avx/asmtestgenerator.pas | 1074 | ||||
-rw-r--r-- | avx512-0037785/tests/utils/avx/avxopcodes.pas | 209 | ||||
-rw-r--r-- | avx512-0037785/tests/utils/avx/avxtestgenerator.pp | 3 |
3 files changed, 1271 insertions, 15 deletions
diff --git a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas index 21423df5ff..01df2c3afc 100644 --- a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas +++ b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas @@ -32,6 +32,8 @@ type otXMEM32, otXMEM64, otYMEM32, otYMEM64, otZMEM32, otZMEM64, otB32, otB64, otKREG); + TOpMemType = Set of TOpType; + TOperandListItem = class(TObject) private FOpActive: boolean; @@ -89,12 +91,15 @@ type function InternalCalcTestData(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList; function InternalCalcTestDataMREF(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList; + function InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2, aOp3, aOp4: String): TStringList; public constructor Create; destructor Destroy; override; class procedure CalcTestData(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); class procedure CalcTestDataMREF(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); + class procedure CalcTestDataCDisp8(aX64, aAVX512, aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); + class procedure CalcTestInstFile; class procedure ListMemRefState; @@ -161,6 +166,9 @@ const msiZMem32, msiZMem64, msiVMemMultiple, msiVMemRegSize]; + OTMEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM, + otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512, + otRM32, otRM64, otB32, otB64]; var InsTabCache : PInsTabCache; @@ -3548,6 +3556,1050 @@ begin end; end; +function TAsmTestGenerator.InternalCalcTestDataCDISP8(const aInst, aOp1, aOp2, + aOp3, aOp4: String): TStringList; +var + i: integer; + Item: TOperandListItem; + OItem1: TOperandListItem; + OItem2: TOperandListItem; + OItem3: TOperandListItem; + OItem4: TOperandListItem; + + il_Op: integer; + il_Op1: integer; + il_Op2: integer; + il_Op3: integer; + il_Op4: integer; + + sSuffix: string; + sl_Operand: String; + sl_Inst : String; + sl_RegCombi: String; + sl_Prefix: String; + UsePrefix: boolean; + il_Operands: integer; + UsedParams: cardinal; + UseDefault: boolean; + sl_RegCombi1: string; + sl_RegCombi2: string; + sl_RegCombi3: string; + MaskRegNeeded:boolean; + + + function PrepareOperandTyp(const aTyp: String): String; + begin + result := aTyp; + if copy(result, length(result), 1) = '*' then result := copy(result, 1, length(result) - 1); + if result = 'XMMRM128' then result := 'XMMRM'; + if result = 'YMMRM256' then result := 'YMMRM'; + end; + + +begin + result := TStringList.Create; + + OItem1 := TOperandListItem.Create; + try + OItem2 := TOperandListItem.Create; + try + OItem3 := TOperandListItem.Create; + try + OItem4 := TOperandListItem.Create; + try + + UsePrefix := (UpperCase(aInst) = 'VCVTPD2DQ') OR + (UpperCase(aInst) = 'VCVTPD2PS') OR + (UpperCase(aInst) = 'VCVTSI2SD') OR + (UpperCase(aInst) = 'VCVTSI2SS') OR + (UpperCase(aInst) = 'VCVTTPD2DQ') or + (UpperCase(aInst) = 'VPMOVZXWQ') or + (UpperCase(aInst) = 'VCVTPD2UDQ') or + (UpperCase(aInst) = 'VCVTPD2UDQ') or + (UpperCase(aInst) = 'VCVTTPD2UDQ') or + (UpperCase(aInst) = 'VCVTUQQ2PS') or + (UpperCase(aInst) = 'VCVTQQ2PS') or + (UpperCase(aInst) = 'VCVTUSI2SD') or + (UpperCase(aInst) = 'VCVTUSI2SS') or + (UpperCase(aInst) = 'VFPCLASSPD') or + (UpperCase(aInst) = 'VFPCLASSPS') or + (UpperCase(aInst) = 'VCMPSS') + + ; + + + MaskRegNeeded := (Pos('VGATHER', Uppercase(aInst)) = 1) or + (Pos('VPGATHER', Uppercase(aInst)) = 1) or + (Pos('VPSCATTER', Uppercase(aInst)) = 1) or + (Pos('VSCATTER', Uppercase(aInst)) = 1); + + for il_Op := 1 to 4 do + begin + sl_Prefix := ''; + + case il_Op of + 1: begin + Item := OItem1; + sl_Operand := aOp1; + end; + 2: begin + Item := OItem2; + sl_Operand := aOp2; + end; + 3: begin + Item := OItem3; + sl_Operand := aOp3; + end; + 4: begin + Item := OItem4; + sl_Operand := aOp4; + end; + end; + + sl_Operand := PrepareOperandTyp(sl_Operand); + + if (AnsiSameText(sl_Operand, 'XMMREG')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMMReg; + Item.OpActive := true; + + Item.Values.Add('XMM0'); + end + else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or + (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or + (AnsiSameText(sl_Operand, 'XMMREG_ER')) or + (AnsiSameText(sl_Operand, 'XMMREG_SAE')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMMReg; + Item.OpActive := true; + + sSuffix := ''; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}' + else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if Pos('_ER', sl_Operand) > 0 then sSuffix := ', {ru-sae}' + else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}'; + + Item.Values.Add('XMM0' + sSuffix); + if (sSuffix <> '') and + (MaskRegNeeded = false) then Item.Values.Add('XMM0'); + end + else if (AnsiSameText(sl_Operand, 'XMMRM')) or + (AnsiSameText(sl_Operand, 'XMMRM_M')) or + (AnsiSameText(sl_Operand, 'XMMRM_MZ')) or + (AnsiSameText(sl_Operand, 'XMMRM_ER')) or + (AnsiSameText(sl_Operand, 'XMMRM_SAE')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMMRM; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'oword '; + + if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values) + else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'XMMRM8')) or + (AnsiSameText(sl_Operand, 'XMMRM8_M')) or + (AnsiSameText(sl_Operand, 'XMMRM8_MZ')) or + (AnsiSameText(sl_Operand, 'XMMRM8_ER')) or + (AnsiSameText(sl_Operand, 'XMMRM8_SAE')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMMRM8; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'byte '; + + if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values) + else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'XMMRM16')) or + (AnsiSameText(sl_Operand, 'XMMRM16_M')) or + (AnsiSameText(sl_Operand, 'XMMRM16_MZ')) or + (AnsiSameText(sl_Operand, 'XMMRM16_ER')) or + (AnsiSameText(sl_Operand, 'XMMRM16_SAE')) + then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMMRM16; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'word '; + + if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values) + else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'YMMREG')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otYMMReg; + Item.OpActive := true; + + Item.Values.Add('YMM0'); + end + else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or + (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or + (AnsiSameText(sl_Operand, 'YMMREG_ER')) or + (AnsiSameText(sl_Operand, 'YMMREG_SAE')) + then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otYMMReg; + Item.OpActive := true; + + sSuffix := ''; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}' + else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}' + else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {sae}'; + + Item.Values.Add('YMM0' + sSuffix); + if (sSuffix <> '') and + (MaskRegNeeded = false) then Item.Values.Add('YMM0'); + end + else if (AnsiSameText(sl_Operand, 'YMMRM')) or + (AnsiSameText(sl_Operand, 'YMMRM_M')) or + (AnsiSameText(sl_Operand, 'YMMRM_MZ')) or + (AnsiSameText(sl_Operand, 'YMMRM_ER')) or + (AnsiSameText(sl_Operand, 'YMMRM_SAE')) + then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otYMMRM; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'yword '; + + sSuffix := ''; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}' + else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + 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); + end + else if (AnsiSameText(sl_Operand, 'ZMMREG')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otZMMReg; + Item.OpActive := true; + + Item.Values.Add('ZMM0'); + end + else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or + (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or + (AnsiSameText(sl_Operand, 'ZMMREG_ER')) or + (AnsiSameText(sl_Operand, 'ZMMREG_SAE')) + then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otZMMReg; + Item.OpActive := true; + + sSuffix := ''; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}' + else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + 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); + end + else if (AnsiSameText(sl_Operand, 'ZMMRM')) or + (AnsiSameText(sl_Operand, 'ZMMRM_M')) or + (AnsiSameText(sl_Operand, 'ZMMRM_MZ')) or + (AnsiSameText(sl_Operand, 'XMMRM_ER')) or + (AnsiSameText(sl_Operand, 'XMMRM_SAE')) + then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otZMMRM; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'zword '; + + sSuffix := ''; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}' + else if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + 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); + end + else if AnsiSameText(sl_Operand, 'MEM8') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM8; + Item.OpActive := true; + + + + if UsePrefix then sl_Prefix := 'byte '; + + + sSuffix := ''; + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'MEM16') or + AnsiSameText(sl_Operand, 'MEM16_M') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM16; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'word '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'MEM32') or + AnsiSameText(sl_Operand, 'MEM32_M') or + AnsiSameText(sl_Operand, 'MEM32_MZ') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM32; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'dword '; + + sSuffix := ''; + + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'MEM64')) or + (AnsiSameText(sl_Operand, 'MEM64_M')) or + (AnsiSameText(sl_Operand, 'MEM64_MZ')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM64; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'qword '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'; + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'MEM128')) or + (AnsiSameText(sl_Operand, 'MEM128_M')) or + (AnsiSameText(sl_Operand, 'MEM128_MZ')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM128; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'oword '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'; + + if x64 then + begin + MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'MEM256')) or + (AnsiSameText(sl_Operand, 'MEM256_M')) or + (AnsiSameText(sl_Operand, 'MEM256_MZ')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM256; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'yword '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if (AnsiSameText(sl_Operand, 'MEM512')) or + (AnsiSameText(sl_Operand, 'MEM512_M')) or + (AnsiSameText(sl_Operand, 'MEM512_MZ')) then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otMEM512; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'zword '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + if Pos('_MZ', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1} {z}'; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'REG8') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otREG8; + Item.OpActive := true; + + if x64 then + begin + Item.Values.AddStrings(FReg8); + end + else Item.Values.AddStrings(FReg8); + end + else if AnsiSameText(sl_Operand, 'REG16') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otREG16; + Item.OpActive := true; + + if x64 then + begin + Item.Values.AddStrings(FReg16); + end + else Item.Values.AddStrings(FReg16); + end + else if AnsiSameText(sl_Operand, 'REG32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otREG32; + Item.OpActive := true; + + if x64 then + begin + Item.Values.AddStrings(FReg32Base); + end + else Item.Values.AddStrings(FReg32Base); + end + else if AnsiSameText(sl_Operand, 'REG64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otREG64; + Item.OpActive := true; + + if x64 then + begin + Item.Values.AddStrings(FReg64Base); + end; + end + else if AnsiSameText(sl_Operand, 'RM32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otRM32; + Item.OpActive := true; + + Item.Values.AddStrings(FReg32Base); + + if UsePrefix then sl_Prefix := 'dword '; + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'RM64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otRM32; + Item.OpActive := true; + + + + if UsePrefix then sl_Prefix := 'qword '; + + if x64 then + begin + Item.Values.AddStrings(FReg64Base); + MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'IMM8') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otIMM8; + Item.OpActive := true; + + Item.Values.Add('0'); + end + else if AnsiSameText(sl_Operand, 'XMEM32') or + AnsiSameText(sl_Operand, 'XMEM32_M') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otXMEM32; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'oword '; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values); + end; + end + else if AnsiSameText(sl_Operand, 'XMEM64') or + AnsiSameText(sl_Operand, 'XMEM64_M') 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; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64XMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64XMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32XMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32XMMIndex, Item.Values); + end; + + end + else if AnsiSameText(sl_Operand, 'YMEM32') or + AnsiSameText(sl_Operand, 'YMEM32_M') 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; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values); + end; + + end + else if AnsiSameText(sl_Operand, 'YMEM64') or + AnsiSameText(sl_Operand, 'YMEM64_M') 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; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64YMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64YMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32YMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32YMMIndex, Item.Values); + end; + + end + else if AnsiSameText(sl_Operand, 'ZMEM32') or + AnsiSameText(sl_Operand, 'ZMEM32_M') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otZMEM32; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'zword '; + + //if x64 then + //begin + // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values); + //end + //else + //begin + // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values); + //end; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values); + end; + + end + else if AnsiSameText(sl_Operand, 'ZMEM64') or + AnsiSameText(sl_Operand, 'ZMEM64_M') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otZMEM64; + Item.OpActive := true; + + if UsePrefix then sl_Prefix := 'zword '; + + //if x64 then + //begin + // VectorMemRegBaseIndexCombi(sl_prefix, FReg64Base, FReg64ZMMIndex, Item.Values); + //end + //else + //begin + // VectorMemRegBaseIndexCombi(sl_prefix, FReg32Base, FReg32ZMMIndex, Item.Values); + //end; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if x64 then + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg64Base, FReg64ZMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg64Base, FReg64ZMMIndex, Item.Values); + end + else + begin + VectorMemRegBaseIndexCombi(sl_prefix, sSuffix, FReg32Base, FReg32ZMMIndex, Item.Values); + if (sSuffix <> '') and + (MaskRegNeeded = false) + then + VectorMemRegBaseIndexCombi(sl_prefix, '', FReg32Base, FReg32ZMMIndex, Item.Values); + end; + + end + else if AnsiSameText(sl_Operand, '2B32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB32; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '4B32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB32; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '8B32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB32; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '16B32') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB32; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '2B64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB64; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to2}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to2}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '4B64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB64; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to4}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to4}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '8B64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB64; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to8}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to8}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, '16B64') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otB64; + Item.OpActive := true; + + + if x64 then + begin + MemRegBaseIndexCombi(sl_Prefix, ' {1to16}', FReg64Base, FReg64Index, Item.Values); + //MemRegBaseIndexCombi(FReg6432Base, FReg6432Index, Item.Values); + end + else MemRegBaseIndexCombi(sl_prefix, ' {1to16}', FReg32Base, FReg32Index, Item.Values); + end + else if AnsiSameText(sl_Operand, 'KREG') or + AnsiSameText(sl_Operand, 'KREG_M') then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otKREG; + Item.OpActive := true; + + sSuffix := ''; + if Pos('_M', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ' {k1}'; + + if UsePrefix then sl_Prefix := ''; + + for i := 0 to FRegKREG.Count - 1 do + Item.Values.Add(FRegKREG[i] + sSuffix); + end + else if trim(sl_Operand) = '' then + begin + Item.OpNumber := il_Op; + Item.OpTyp := otUnknown; + Item.OpActive := false; + + Item.Values.Add(''); + end + else + begin + Item.OpNumber := il_Op; + Item.OpTyp := otUnknown; + Item.OpActive := false; + + Item.Values.Add('?' + sl_Operand); + end + + end; + + sl_RegCombi := ''; + + + il_Operands := 0; + UsedParams := 0; + + if OItem1.OpActive then + begin + inc(il_Operands); + UsedParams := UsedParams or 1; + end; + + if OItem2.OpActive then + begin + inc(il_Operands); + UsedParams := UsedParams or 2; + end; + + if OItem3.OpActive then + begin + inc(il_Operands); + UsedParams := UsedParams or 4; + end; + + if OItem4.OpActive then + begin + inc(il_Operands); + UsedParams := UsedParams or 8; + end; + + case il_Operands of + 1: UseDefault := UsedParams <> 1; + 2: UseDefault := UsedParams <> 3; + 3: UseDefault := UsedParams <> 7; + 4: UseDefault := UsedParams <> 15; + else UseDefault := true; + end; + + //UseDefault := true; + + if UseDefault then + begin + sl_Inst := format('%-20s', [aInst]); + + for il_Op1 := 0 to OItem1.Values.Count - 1 do + begin + for il_Op2 := 0 to OItem2.Values.Count - 1 do + begin + for il_Op3 := 0 to OItem3.Values.Count - 1 do + begin + for il_Op4 := 0 to OItem4.Values.Count - 1 do + begin + sl_RegCombi := ''; + + if OItem1.OpActive then + begin + if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', '; + sl_RegCombi := sl_RegCombi + OItem1.Values[il_Op1]; + end; + + if OItem2.OpActive then + begin + if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', '; + sl_RegCombi := sl_RegCombi + OItem2.Values[il_Op2]; + end; + + if OItem3.OpActive then + begin + if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', '; + sl_RegCombi := sl_RegCombi + OItem3.Values[il_Op3]; + end; + + if OItem4.OpActive then + begin + if sl_RegCombi <> '' then sl_RegCombi := sl_RegCombi + ', '; + sl_RegCombi := sl_RegCombi + OItem4.Values[il_Op4]; + end; + + if sl_RegCombi <> '' then + begin + //result.Add(format('%-20s%s', [aInst, sl_RegCombi])); + result.Add(sl_Inst + sl_RegCombi); + sl_RegCombi := ''; + end; + end; + end; + end; + end; + end + else + begin + sl_Inst := format('%-20s', [aInst]); + + for il_Op1 := 0 to OItem1.Values.Count - 1 do + begin + if OItem1.OpActive then + begin + sl_RegCombi1 := OItem1.Values[il_Op1]; + end + else sl_RegCombi1 := ''; + + for il_Op2 := 0 to OItem2.Values.Count - 1 do + begin + if OItem2.OpActive then + begin + sl_RegCombi2 := sl_RegCombi1 + ', ' + OItem2.Values[il_Op2]; + end + else sl_RegCombi2 := sl_RegCombi1; + + for il_Op3 := 0 to OItem3.Values.Count - 1 do + begin + if OItem3.OpActive then + begin + sl_RegCombi3 := sl_RegCombi2 + ', ' + OItem3.Values[il_Op3]; + end + else sl_RegCombi3 := sl_RegCombi2; + + for il_Op4 := 0 to OItem4.Values.Count - 1 do + begin + if OItem4.OpActive then + begin + sl_RegCombi := sl_RegCombi3 + ', ' + OItem4.Values[il_Op4]; + end + else sl_RegCombi := sl_RegCombi3; + + if (sl_RegCombi <> '') and + ( + (OItem1.OpActive and (OItem1.OpTyp in OTMEMTYPES)) or + (OItem2.OpActive and (OItem2.OpTyp in OTMEMTYPES)) or + (OItem3.OpActive and (OItem3.OpTyp in OTMEMTYPES)) or + (OItem4.OpActive and (OItem4.OpTyp in OTMEMTYPES)) + ) then + begin + //result.Add(format('%-20s%s', [aInst, sl_RegCombi])); + result.Add(sl_Inst + sl_RegCombi); + + + + sl_RegCombi := ''; + end; + end; + end; + end; + end; + end; + finally + FreeAndNil(OItem4); + end; + finally + FreeAndNil(OItem3); + end; + finally + FreeAndNil(OItem2); + end; + finally + FreeAndNil(OItem1); + end; +end; + constructor TAsmTestGenerator.Create; begin @@ -3921,6 +4973,28 @@ begin end; end; +class procedure TAsmTestGenerator.CalcTestDataCDisp8(aX64, aAVX512, + aSAE: boolean; const aInst, aOp1, aOp2, aOp3, aOp4: String; aSL: TStringList); +var + sl: TStringList; +begin + with TAsmTestGenerator.Create do + try + Fx64 := aX64; + FAVX512 := aAVX512; + FSAE := aSAE; + + sl := InternalCalcTestDataCDisp8(aInst, aOp1, aOp2, aOp3, aOp4); + try + aSL.AddStrings(sl); + finally + FreeAndNil(sl); + end; + finally + Free; + end; +end; + class procedure TAsmTestGenerator.CalcTestInstFile; diff --git a/avx512-0037785/tests/utils/avx/avxopcodes.pas b/avx512-0037785/tests/utils/avx/avxopcodes.pas index 9915b8d80a..4c4b6ba7db 100644 --- a/avx512-0037785/tests/utils/avx/avxopcodes.pas +++ b/avx512-0037785/tests/utils/avx/avxopcodes.pas @@ -8,7 +8,7 @@ uses Classes; type - TTestFileTyp = (tfNasm, tfFPC, tfFasm, tfFPCInc, tfFPCMRef); + TTestFileTyp = (tfNasm, tfFPC, tfFasm, tfFPCInc, tfFPCMRef, tfFPCCDisp8); { TAVXTestGenerator } @@ -18,7 +18,10 @@ type protected procedure Init; + function SaveFile(aAsmList: TStringList; aOpcode, aDestPath, aFileExt: String; aHeaderList, aFooterList: TStringList): boolean; + function InternalMakeTestFiles(aMRef, aX64, aAVX512, aSAE: boolean; aDestPath, aFilemask, aFileExt: String; aOpCodeList, aHeaderList, aFooterList: TStringList): boolean; + function InternalMakeTestFilesCDisp8(aX64, aAVX512, aSAE: boolean; aDestPath, aFilemask, aFileExt: String; aOpCodeList, aHeaderList, aFooterList: TStringList): boolean; public constructor Create; @@ -3277,6 +3280,22 @@ begin FOpCodeList.Add('VPSHUFBITQMB,1,1,1,kreg_m,zmmreg,zmmrm,'); end; +function TAVXTestGenerator.SaveFile(aAsmList: TStringList; aOpcode, aDestPath, + aFileExt: String; aHeaderList, aFooterList: TStringList): boolean; +begin + begin + result := false; + + if aAsmList.Count > 0 then + begin + aAsmList.Insert(0, StringReplace(aHeaderList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); + aAsmList.AddStrings(StringReplace(aFooterList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); + + aAsmList.SaveToFile(IncludeTrailingBackslash(aDestPath) + aOpCode + aFileExt); + end; + end; +end; + function TAVXTestGenerator.InternalMakeTestFiles(aMRef, aX64, aAVX512, aSAE: boolean; aDestPath, aFilemask, aFileExt: String; aOpCodeList, aHeaderList, aFooterList: TStringList): boolean; var @@ -3292,18 +3311,18 @@ var NewOpCode: String; FoundNewOpcode: boolean; - function SaveFile(aAsmList: TStringList; aOpcode, aDestPath, aFileExt: String; aHeaderList, aFooterList: TStringList): boolean; - begin - result := false; - - if aAsmList.Count > 0 then - begin - aAsmList.Insert(0, StringReplace(aHeaderList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); - aAsmList.AddStrings(StringReplace(aFooterList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); - - aAsmList.SaveToFile(IncludeTrailingBackslash(aDestPath) + aOpCode + aFileExt); - end; - end; + //function SaveFile(aAsmList: TStringList; aOpcode, aDestPath, aFileExt: String; aHeaderList, aFooterList: TStringList): boolean; + //begin + // result := false; + // + // if aAsmList.Count > 0 then + // begin + // aAsmList.Insert(0, StringReplace(aHeaderList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); + // aAsmList.AddStrings(StringReplace(aFooterList.Text, '$$$OPCODE$$$', aOpCode, [rfReplaceAll])); + // + // aAsmList.SaveToFile(IncludeTrailingBackslash(aDestPath) + aOpCode + aFileExt); + // end; + //end; begin result := false; @@ -3395,6 +3414,101 @@ begin end; end; +function TAVXTestGenerator.InternalMakeTestFilesCDisp8(aX64, aAVX512, + aSAE: boolean; aDestPath, aFilemask, aFileExt: String; aOpCodeList, + aHeaderList, aFooterList: TStringList): boolean; +var + i,j: integer; + sData: string; + sDestFile: string; + sLocalVarDataTyp: string; + sl: TStringList; + slAsm: TStringList; + slLocalHeader: TStringList; + slFilemask: TStringList; + LastOpCode: String; + NewOpCode: String; + FoundNewOpcode: boolean; + +begin + result := false; + + aOpCodeList.Sort; + + sl := TStringList.Create; + try + slAsm := TStringList.Create; + try + slFilemask := TStringList.Create; + try + slFilemask.CommaText := ansilowercase(aFilemask); + + LastOpCode := ''; + + for i := 0 to aOpCodeList.Count - 1 do + begin + sl.Clear; + sl.CommaText := aOpCodeList[i]; + + while sl.Count < 8 do sl.Add(''); + + NewOpCode := ansilowercase(sl[0]); + + FoundNewOpcode := false; + for j := 0 to slFilemask.Count - 1 do + begin + if Pos(slFilemask[j], NewOpCode) = 1 then + FoundNewOpcode := true; + end; + + if not(FoundNewOpcode) and (slFilemask.Count > 0) then + NewOpcode := ''; + + if NewOpCode <> '' then + begin + if (not(aX64) and (sl[1] = '1')) or // i386 + (aX64 and (sl[2] = '1')) then // x86_64 + begin + sDestFile := format('%s_%d%s', [NewOpcode, i, trim(copy(sl[4],1,1) + copy(sl[5],1,1) + copy(sl[6],1,1) + copy(sl[7],1,1))]); + + slLocalHeader := TStringList.Create; + try + slLocalHeader.Text := aHeaderList.text; + + if (sl[4] = '') and + (sl[5] = '') and + (sl[6] = '') and + (sl[7] = '') then + begin // Opcode with no Params, e.g. VZEROALL + slAsm.Add(' ' + sl[0]); + end + else + begin + TAsmTestGenerator.CalcTestData(aX64, aAVX512 and (sl[3] = '1'), aSAE, sl[0], sl[4], sl[5], sl[6], sl[7], slAsm); + end; + + SaveFile(slAsm, sDestFile, aDestPath, aFileExt, slLocalHeader, aFooterList); + writeln(format('%s%s%s', [aDestPath, sDestFile, aFileExt])); + + finally + FreeAndNil(slLocalHeader); + end; + + slAsm.Clear; + end; + end; + end; + finally + FreeAndNil(slFilemask); + end; + finally + FreeAndNil(slAsm); + end; + finally + FreeAndNil(sl); + end; +end; + function TAVXTestGenerator.MakeTestFiles(aTyp: TTestFileTyp; aX64, aAVX512, aSAE: boolean; aDestPath, aFilemask: String): boolean; var @@ -3542,6 +3656,70 @@ begin slFooter.Add('begin'); slFooter.Add('end.'); end; + tfFPCCDisp8: + begin + writeln(format('outputformat: fpc platform: %s path: %s', + [cPlatform[aX64], aDestPath])); + + FileExt := '.pp'; + + slHeader.Add('Program $$$OPCODE$$$;'); + slHeader.Add('{$asmmode intel}'); + + slHeader.Add('const'); + slHeader.Add(' cDataBlockByte: Array[0..255] of byte = ( $00, $01, $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B, $0C, $0D, $0E, $0F,'); + slHeader.Add(' $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F,'); + slHeader.Add(' $20, $21, $22, $23, $24, $25, $26, $27, $28, $29, $2A, $2B, $2C, $2D, $2E, $2F,'); + slHeader.Add(' $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D, $3E, $3F,'); + slHeader.Add(' $40, $41, $42, $43, $44, $45, $46, $47, $48, $49, $4A, $4B, $4C, $4D, $4E, $4F,'); + slHeader.Add(' $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B, $5C, $5D, $5E, $5F,'); + slHeader.Add(' $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F,'); + slHeader.Add(' $70, $71, $72, $73, $74, $75, $76, $77, $78, $79, $7A, $7B, $7C, $7D, $7E, $7F,'); + slHeader.Add(' $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F,'); + slHeader.Add(' $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F,'); + slHeader.Add(' $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF,'); + slHeader.Add(' $B0, $B1, $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB, $BC, $BD, $BE, $BF,'); + slHeader.Add(' $C0, $C1, $C2, $C3, $C4, $C5, $C6, $C7, $C8, $C9, $CA, $CB, $CC, $CD, $CE, $CF,'); + slHeader.Add(' $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7, $D8, $D9, $DA, $DB, $DC, $DD, $DE, $DF,'); + 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('begin'); + slHeader.Add(' asm'); + + slHeader.Add(' vpxord zmm0, zmm0, zmm0'); + slHeader.Add(' vpxord xmm1, xmm1, xmm1'); + slHeader.Add(' vpxord xmm2, xmm2, xmm2'); + slHeader.Add(' vpxord xmm3, xmm3, xmm3'); + slHeader.Add(' vpxord xmm4, xmm4, xmm4'); + slHeader.Add(' vpcmpeqb k1, zmm0, zmm0'); + + if aX64 then + begin + slHeader.Add(' lea rax, cDataBlockByte'); + slHeader.Add(' push rax'); + end + else + begin + slHeader.Add(' lea eax, cDataBlockByte'); + slHeader.Add(' push eax'); + end; + + for i := 1 to 10 do + slHeader.Add('NOP'); + + if aX64 then slFooter.Add(' pop rax') + else slFooter.Add(' pop eax'); + + for i := 1 to 10 do + slFooter.Add('NOP'); + + slFooter.Add(' end;'); + slFooter.Add('end.'); + + end; tfFPCInc: begin writeln(format('outputformat: fpc platform: %s path: %s', [cPlatform[aX64], aDestPath])); @@ -3617,7 +3795,10 @@ begin end; end; - InternalMakeTestFiles(aTyp = tfFPCMRef, aX64, aAVX512, aSAE, aDestPath, aFilemask, Fileext, FOpCodeList, slHeader, slFooter); + case aTyp of + tfFPCCDisp8: InternalMakeTestFilesCDisp8(aX64, aAVX512, aSAE, aDestPath, aFilemask, Fileext, FOpCodeList, slHeader, slFooter); + else InternalMakeTestFiles(aTyp = tfFPCMRef, aX64, aAVX512, aSAE, aDestPath, aFilemask, Fileext, FOpCodeList, slHeader, slFooter); + end; finally FreeAndNil(slFooter); diff --git a/avx512-0037785/tests/utils/avx/avxtestgenerator.pp b/avx512-0037785/tests/utils/avx/avxtestgenerator.pp index 0b2fc0f2b1..680c7a1ed6 100644 --- a/avx512-0037785/tests/utils/avx/avxtestgenerator.pp +++ b/avx512-0037785/tests/utils/avx/avxtestgenerator.pp @@ -42,7 +42,7 @@ begin writeln('make avx assembler-testfiles'); writeln(''); writeln('-h help'); - writeln('-f [fpc,fpcmref,nasm,fasm,fpcinc] outputformat'); + writeln('-f [fpc,fpcmref,fpccd8,nasm,fasm,fpcinc] outputformat'); writeln('-l list opcode-memrefsize-states'); writeln('-m create only these testfile(s) (e.g. -mvgather,vpgather)'); writeln('-o destination path'); @@ -62,6 +62,7 @@ begin 'n': MakeTestFiles(tfNasm, x64, AVX512, false, Path, Filemask); 'I': MakeTestFiles(tfFPCInc, x64, AVX512, false, Path, Filemask); 'm': MakeTestFiles(tfFPCMRef, x64, AVX512, false, Path, Filemask); + 'd': MakeTestFiles(tfFPCCDisp8, x64, AVX512, false, Path, Filemask); 'l': ListMemRefState; end; end; |