diff options
author | tg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-25 05:24:29 +0000 |
---|---|---|
committer | tg74 <tg74@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-01-25 05:24:29 +0000 |
commit | a273e52413a47e2c4d604f0a3f0fa8456cafae17 (patch) | |
tree | 6662ffc5f76f4163de20d6c0b1ac91db34daa5e4 | |
parent | bd6cc4fade80b15967ddfce2b21d2586af16fc6a (diff) | |
download | fpc-a273e52413a47e2c4d604f0a3f0fa8456cafae17.tar.gz |
avxtestgenerator: working on new tests for compressed disp8*N
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/tg74@48416 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | avx512-0037785/tests/utils/avx/asmtestgenerator.pas | 158 | ||||
-rw-r--r-- | avx512-0037785/tests/utils/avx/avxopcodes.pas | 3 | ||||
-rw-r--r-- | avx512-0037785/tests/utils/avx/avxtestgenerator.lpi | 5 | ||||
-rw-r--r-- | avx512-0037785/tests/utils/avx/options.pas | 1 |
4 files changed, 140 insertions, 27 deletions
diff --git a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas index e780170d8d..32d3b419bc 100644 --- a/avx512-0037785/tests/utils/avx/asmtestgenerator.pas +++ b/avx512-0037785/tests/utils/avx/asmtestgenerator.pas @@ -34,6 +34,8 @@ type TOpMemType = Set of TOpType; + TOpMode = (omUnknown, omXXM, omYYM, omZZM); + TOperandListItem = class(TObject) private FOpActive: boolean; @@ -166,9 +168,9 @@ const msiZMem32, msiZMem64, msiVMemMultiple, msiVMemRegSize]; - OTMEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM, - otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512, - otRM32, otRM64, otB32, otB64]; + MEMTYPES: TOpMemType = [otXMMRM, otXMMRM16, otXMMRM8, otYMMRM, otZMMRM, + otMem8, otMem16, otMem32, otMem64, otMem128, otMem256, otMem512, + otRM32, otRM64, otB32, otB64]; var InsTabCache : PInsTabCache; @@ -3575,7 +3577,7 @@ var sSuffix: string; sl_Operand: String; sl_Inst : String; - sRegCombi0: String; + sRegCombi: String; sRegCombi1: String; sRegCombi2: String; sRegCombi3: String; @@ -3588,8 +3590,10 @@ var sl_RegCombi1: string; sl_RegCombi2: string; sl_RegCombi3: string; + sInstruction: string; MaskRegNeeded:boolean; slRegCombi: TStringList; + OpMode: TOpMode; function PrepareOperandTyp(const aTyp: String): String; begin @@ -3611,6 +3615,7 @@ var iCnt3: integer; iCnt4: integer; iMaxCnt: integer; + begin with TStringList.Create do try @@ -3749,7 +3754,7 @@ begin Item.OpTyp := otXMMReg; Item.OpActive := true; - Item.Values.Add('XMM16|XMM1'); + Item.Values.Add('XMM16'); end else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or @@ -3771,7 +3776,7 @@ begin //if (sSuffix <> '') and // (MaskRegNeeded = false) then Item.Values.Add('XMM0'); - Item.Values.Add('XMM16|XMM1'); + Item.Values.Add('XMM16'); end else if (AnsiSameText(sl_Operand, 'XMMRM')) or (AnsiSameText(sl_Operand, 'XMMRM_M')) or @@ -3825,7 +3830,7 @@ begin Item.OpTyp := otYMMReg; Item.OpActive := true; - Item.Values.Add('YMM16|XMM1|XMM2'); + Item.Values.Add('YMM16'); end else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or @@ -3848,7 +3853,7 @@ begin //if (sSuffix <> '') and // (MaskRegNeeded = false) then Item.Values.Add('YMM0'); - Item.Values.Add('YMM16|XMM1|XMM2'); + Item.Values.Add('YMM16'); end else if (AnsiSameText(sl_Operand, 'YMMRM')) or (AnsiSameText(sl_Operand, 'YMMRM_M')) or @@ -3879,7 +3884,7 @@ begin Item.OpTyp := otZMMReg; Item.OpActive := true; - Item.Values.Add('ZMM16,XMM1,XMM2,XMM3,XMM4'); + Item.Values.Add('ZMM16'); end else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or @@ -3898,8 +3903,7 @@ 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); + Item.Values.Add('ZMM16'); end else if (AnsiSameText(sl_Operand, 'ZMMRM')) or (AnsiSameText(sl_Operand, 'ZMMRM_M')) or @@ -3914,12 +3918,12 @@ begin 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}'; + //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); @@ -4568,6 +4572,7 @@ begin else UseDefault := true; end; + // TODO deaktivieren //UseDefault := true; if UseDefault then @@ -4587,17 +4592,13 @@ begin while slRegCombi.Count < 5 do slRegCombi.Add(''); - sRegCombi0 := ''; - sRegCombi1 := ''; - sRegCombi2 := ''; - sRegCombi3 := ''; - sRegCombi4 := ''; - //if OItem1.OpActive then - //begin + //SplitOperands(OItem1.Values[il_Op1], OItem2.Values[il_Op2], OItem3.Values[il_Op3], OItem4.Values[il_Op4] + if OItem1.OpActive then + begin // SplitOperand(OItem1.Values[il_Op1], sRegCombi0,sRegCombi1,sRegCombi2,sRegCombi3,sRegCombi4); // - //end; + end; finally FreeAndNil(slRegCombi); end; @@ -4678,6 +4679,113 @@ begin end else begin + OpMode := omUnknown; + + case il_Operands of + 3: if (OItem1.OpTyp = otXMMReg) and + (OItem2.OpTyp = otXMMReg) and + (OItem3.OpTyp in MEMTYPES) then OpMode := omXXM + + else if (OItem1.OpTyp = otYMMReg) and + (OItem2.OpTyp = otYMMReg) and + (OItem3.OpTyp in MEMTYPES) then OpMode := omYYM + + else if (OItem1.OpTyp = otZMMReg) and + (OItem2.OpTyp = otZMMReg) and + (OItem3.OpTyp in MEMTYPES) then OpMode := omZZM + else + begin + + end; + else; + end; + + + sInstruction := 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 + sRegCombi := ''; + + if OItem1.OpActive then + begin + if sRegCombi <> '' then sRegCombi := sRegCombi + ', '; + sRegCombi := sRegCombi + OItem1.Values[il_Op1]; + end; + + if OItem2.OpActive then + begin + if sRegCombi <> '' then sRegCombi := sRegCombi + ', '; + sRegCombi := sRegCombi + OItem2.Values[il_Op2]; + end; + + if OItem3.OpActive then + begin + if sRegCombi <> '' then sRegCombi := sRegCombi + ', '; + sRegCombi := sRegCombi + OItem3.Values[il_Op3]; + end; + + if OItem4.OpActive then + begin + if sRegCombi <> '' then sRegCombi := sRegCombi + ', '; + sRegCombi := sRegCombi + OItem4.Values[il_Op4]; + end; + + if sRegCombi <> '' then + begin + //result.Add(format('%-20s%s', [aInst, sl_RegCombi])); + result.Add(format('%-20s%s', [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'); + + 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(' vinserti32x4 zmm1, zmm1, xmm2, 01'); + result.Add(' vinserti32x4 zmm1, zmm1, xmm3, 02'); + result.Add(' vinserti32x4 zmm1, zmm1, xmm4, 03'); + + result.Add(' vpcmpeqb k2, ' + OItem1.Values[il_Op1] + ', zmm1'); + result.Add(' kandq k1, k1, k2'); + result.Add(''); + + end; + + + end; + + sRegCombi := ''; + end; + end; + end; + end; + end; + + + //sl_Inst := format('%-20s', [aInst]); // //for il_Op1 := 0 to OItem1.Values.Count - 1 do diff --git a/avx512-0037785/tests/utils/avx/avxopcodes.pas b/avx512-0037785/tests/utils/avx/avxopcodes.pas index 3407637aca..7ac99be1e7 100644 --- a/avx512-0037785/tests/utils/avx/avxopcodes.pas +++ b/avx512-0037785/tests/utils/avx/avxopcodes.pas @@ -3484,9 +3484,10 @@ begin end else begin - TAsmTestGenerator.CalcTestData(aX64, aAVX512 and (sl[3] = '1'), aSAE, sl[0], sl[4], sl[5], sl[6], sl[7], slAsm); + TAsmTestGenerator.CalcTestDataCDisp8(aX64, aAVX512 and (sl[3] = '1'), aSAE, sl[0], sl[4], sl[5], sl[6], sl[7], slAsm); end; + sDestFile := 'CDISP8_' + sDestFile; SaveFile(slAsm, sDestFile, aDestPath, aFileExt, slLocalHeader, aFooterList); writeln(format('%s%s%s', [aDestPath, sDestFile, aFileExt])); diff --git a/avx512-0037785/tests/utils/avx/avxtestgenerator.lpi b/avx512-0037785/tests/utils/avx/avxtestgenerator.lpi index df0cac5f89..e1fc55dd9c 100644 --- a/avx512-0037785/tests/utils/avx/avxtestgenerator.lpi +++ b/avx512-0037785/tests/utils/avx/avxtestgenerator.lpi @@ -21,11 +21,14 @@ <Version Value="2"/> </PublishOptions> <RunParams> + <local> + <CommandLineParams Value="-px8664 -ffpccd8 -o\home\torsten\tmp\fpc\fpc -z -mvaddpd"/> + </local> <FormatVersion Value="2"/> <Modes Count="1"> <Mode0 Name="default"> <local> - <CommandLineParams Value="-px8664 -ffpc -o\home\torsten\tmp\fpc\fpc -z -mvgatherqpd"/> + <CommandLineParams Value="-px8664 -ffpccd8 -o\home\torsten\tmp\fpc\fpc -z -mvaddpd"/> </local> </Mode0> </Modes> diff --git a/avx512-0037785/tests/utils/avx/options.pas b/avx512-0037785/tests/utils/avx/options.pas index 8e6566b144..91e6890256 100644 --- a/avx512-0037785/tests/utils/avx/options.pas +++ b/avx512-0037785/tests/utils/avx/options.pas @@ -97,6 +97,7 @@ begin else if sValue = 'fasm' then FOutputFormat := 'F' else if sValue = 'fpcinc' then FOutputFormat := 'I' else if sValue = 'fpcmref' then FOutputFormat := 'm' + else if sValue = 'fpccd8' then FOutputFormat := 'd' else IsInvalidParam := true; 'p': if sValue = 'x8664' then |