Browse Source

avxtestgenerator: working on new tests for compressed disp8*N

git-svn-id: branches/tg74/avx512-0037785@48416 -
tg74 4 years ago
parent
commit
f172d87925

+ 133 - 25
tests/utils/avx/asmtestgenerator.pas

@@ -34,6 +34,8 @@ type
 
 
   TOpMemType = Set of TOpType;
   TOpMemType = Set of TOpType;
 
 
+  TOpMode = (omUnknown, omXXM, omYYM, omZZM);
+
   TOperandListItem = class(TObject)
   TOperandListItem = class(TObject)
   private
   private
     FOpActive: boolean;
     FOpActive: boolean;
@@ -166,9 +168,9 @@ const
                                                  msiZMem32, msiZMem64,
                                                  msiZMem32, msiZMem64,
                                                  msiVMemMultiple, msiVMemRegSize];
                                                  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
 var
   InsTabCache : PInsTabCache;
   InsTabCache : PInsTabCache;
@@ -3575,7 +3577,7 @@ var
   sSuffix: string;
   sSuffix: string;
   sl_Operand: String;
   sl_Operand: String;
   sl_Inst   : String;
   sl_Inst   : String;
-  sRegCombi0: String;
+  sRegCombi: String;
   sRegCombi1: String;
   sRegCombi1: String;
   sRegCombi2: String;
   sRegCombi2: String;
   sRegCombi3: String;
   sRegCombi3: String;
@@ -3588,8 +3590,10 @@ var
   sl_RegCombi1: string;
   sl_RegCombi1: string;
   sl_RegCombi2: string;
   sl_RegCombi2: string;
   sl_RegCombi3: string;
   sl_RegCombi3: string;
+  sInstruction: string;
   MaskRegNeeded:boolean;
   MaskRegNeeded:boolean;
   slRegCombi: TStringList;
   slRegCombi: TStringList;
+  OpMode: TOpMode;
 
 
   function PrepareOperandTyp(const aTyp: String): String;
   function PrepareOperandTyp(const aTyp: String): String;
   begin
   begin
@@ -3611,6 +3615,7 @@ var
     iCnt3: integer;
     iCnt3: integer;
     iCnt4: integer;
     iCnt4: integer;
     iMaxCnt: integer;
     iMaxCnt: integer;
+
   begin
   begin
     with TStringList.Create do
     with TStringList.Create do
     try
     try
@@ -3749,7 +3754,7 @@ begin
               Item.OpTyp    := otXMMReg;
               Item.OpTyp    := otXMMReg;
               Item.OpActive := true;
               Item.OpActive := true;
 
 
-              Item.Values.Add('XMM16|XMM1');
+              Item.Values.Add('XMM16');
             end
             end
             else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or
             else if (AnsiSameText(sl_Operand, 'XMMREG_M')) or
                     (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
                     (AnsiSameText(sl_Operand, 'XMMREG_MZ')) or
@@ -3771,7 +3776,7 @@ begin
               //if (sSuffix <> '') and
               //if (sSuffix <> '') and
               //   (MaskRegNeeded = false) then Item.Values.Add('XMM0');
               //   (MaskRegNeeded = false) then Item.Values.Add('XMM0');
 
 
-              Item.Values.Add('XMM16|XMM1');
+              Item.Values.Add('XMM16');
             end
             end
             else if (AnsiSameText(sl_Operand, 'XMMRM')) or
             else if (AnsiSameText(sl_Operand, 'XMMRM')) or
                     (AnsiSameText(sl_Operand, 'XMMRM_M')) or
                     (AnsiSameText(sl_Operand, 'XMMRM_M')) or
@@ -3825,7 +3830,7 @@ begin
               Item.OpTyp    := otYMMReg;
               Item.OpTyp    := otYMMReg;
               Item.OpActive := true;
               Item.OpActive := true;
 
 
-              Item.Values.Add('YMM16|XMM1|XMM2');
+              Item.Values.Add('YMM16');
             end
             end
             else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or
             else if (AnsiSameText(sl_Operand, 'YMMREG_M')) or
                     (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
                     (AnsiSameText(sl_Operand, 'YMMREG_MZ')) or
@@ -3848,7 +3853,7 @@ begin
               //if (sSuffix <> '') and
               //if (sSuffix <> '') and
               //   (MaskRegNeeded = false) then Item.Values.Add('YMM0');
               //   (MaskRegNeeded = false) then Item.Values.Add('YMM0');
 
 
-              Item.Values.Add('YMM16|XMM1|XMM2');
+              Item.Values.Add('YMM16');
             end
             end
             else if (AnsiSameText(sl_Operand, 'YMMRM'))  or
             else if (AnsiSameText(sl_Operand, 'YMMRM'))  or
                     (AnsiSameText(sl_Operand, 'YMMRM_M')) or
                     (AnsiSameText(sl_Operand, 'YMMRM_M')) or
@@ -3879,7 +3884,7 @@ begin
               Item.OpTyp    := otZMMReg;
               Item.OpTyp    := otZMMReg;
               Item.OpActive := true;
               Item.OpActive := true;
 
 
-              Item.Values.Add('ZMM16,XMM1,XMM2,XMM3,XMM4');
+              Item.Values.Add('ZMM16');
             end
             end
             else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
             else if (AnsiSameText(sl_Operand, 'ZMMREG_M')) or
                     (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
                     (AnsiSameText(sl_Operand, 'ZMMREG_MZ')) or
@@ -3898,8 +3903,7 @@ begin
               //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
               //if Pos('_ER', AnsiUppercase(sl_Operand)) > 0 then sSuffix := ', {rd-sae}'
               // else if FSAE and (Pos('_SAE', AnsiUppercase(sl_Operand)) > 0) then sSuffix := ', {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
             end
             else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
             else if (AnsiSameText(sl_Operand, 'ZMMRM')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
                     (AnsiSameText(sl_Operand, 'ZMMRM_M')) or
@@ -3914,12 +3918,12 @@ begin
 
 
               if UsePrefix then sl_Prefix := 'zword ';
               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)
               if x64 then MemRegBaseIndexCombi(sl_Prefix, '', FReg64Base, FReg64Index, Item.Values)
                else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
                else MemRegBaseIndexCombi(sl_Prefix, '', FReg32Base, FReg32Index, Item.Values);
@@ -4568,6 +4572,7 @@ begin
             else UseDefault := true;
             else UseDefault := true;
           end;
           end;
 
 
+          // TODO deaktivieren
           //UseDefault := true;
           //UseDefault := true;
 
 
           if UseDefault then
           if UseDefault then
@@ -4587,17 +4592,13 @@ begin
                       while slRegCombi.Count < 5 do
                       while slRegCombi.Count < 5 do
                        slRegCombi.Add('');
                        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);
                       //  SplitOperand(OItem1.Values[il_Op1], sRegCombi0,sRegCombi1,sRegCombi2,sRegCombi3,sRegCombi4);
                       //
                       //
-                      //end;
+                      end;
                     finally
                     finally
                       FreeAndNil(slRegCombi);
                       FreeAndNil(slRegCombi);
                     end;
                     end;
@@ -4678,6 +4679,113 @@ begin
           end
           end
           else
           else
           begin
           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]);
             //sl_Inst := format('%-20s', [aInst]);
             //
             //
             //for il_Op1 := 0 to OItem1.Values.Count - 1 do
             //for il_Op1 := 0 to OItem1.Values.Count - 1 do

+ 2 - 1
tests/utils/avx/avxopcodes.pas

@@ -3484,9 +3484,10 @@ begin
                 end
                 end
                 else
                 else
 	        begin
 	        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;
 	        end;
 
 
+                sDestFile := 'CDISP8_' + sDestFile;
                 SaveFile(slAsm, sDestFile, aDestPath, aFileExt, slLocalHeader, aFooterList);
                 SaveFile(slAsm, sDestFile, aDestPath, aFileExt, slLocalHeader, aFooterList);
                 writeln(format('%s%s%s', [aDestPath, sDestFile, aFileExt]));
                 writeln(format('%s%s%s', [aDestPath, sDestFile, aFileExt]));
 
 

+ 4 - 1
tests/utils/avx/avxtestgenerator.lpi

@@ -21,11 +21,14 @@
       <Version Value="2"/>
       <Version Value="2"/>
     </PublishOptions>
     </PublishOptions>
     <RunParams>
     <RunParams>
+      <local>
+        <CommandLineParams Value="-px8664 -ffpccd8 -o\home\torsten\tmp\fpc\fpc -z -mvaddpd"/>
+      </local>
       <FormatVersion Value="2"/>
       <FormatVersion Value="2"/>
       <Modes Count="1">
       <Modes Count="1">
         <Mode0 Name="default">
         <Mode0 Name="default">
           <local>
           <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>
           </local>
         </Mode0>
         </Mode0>
       </Modes>
       </Modes>

+ 1 - 0
tests/utils/avx/options.pas

@@ -97,6 +97,7 @@ begin
                else if sValue = 'fasm' then FOutputFormat := 'F'
                else if sValue = 'fasm' then FOutputFormat := 'F'
                else if sValue = 'fpcinc' then FOutputFormat := 'I'
                else if sValue = 'fpcinc' then FOutputFormat := 'I'
                else if sValue = 'fpcmref' then FOutputFormat := 'm'
                else if sValue = 'fpcmref' then FOutputFormat := 'm'
+               else if sValue = 'fpccd8' then FOutputFormat := 'd'
 
 
                else IsInvalidParam := true;
                else IsInvalidParam := true;
          'p': if sValue = 'x8664' then
          'p': if sValue = 'x8664' then