Jelajahi Sumber

merge with trunk

git-svn-id: branches/tg74/avx2@28410 -
tg74 11 tahun lalu
induk
melakukan
307168988f

+ 161 - 3
tests/utils/avx/avxopcodes.pas

@@ -8,7 +8,7 @@ uses Classes;
 
 type
 
-  TTestFileTyp = (tfNasm, tfFPC);
+  TTestFileTyp = (tfNasm, tfFPC, tfFasm);
 
   TAVXTestGenerator = class(TObject)
   private
@@ -663,6 +663,146 @@ begin
   FOpCodeList.Add('VPSRLVD,1,1,XMMREG,XMMREG,XMMRM,');
   FOpCodeList.Add('VPSRLVQ,1,1,YMMREG,YMMREG,YMMRM,');
   FOpCodeList.Add('VPSRLVQ,1,1,XMMREG,XMMREG,XMMRM,');
+
+
+  FOpCodeList.Add('VFMADD132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADD231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD231SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD132SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD213SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADD231SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMADDSUB231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMADDSUB231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUBADD231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUBADD231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFMSUB231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB132SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB213SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB231SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB132SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB213SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFMSUB231SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMADD231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD132SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD213SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD231SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD132SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD213SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMADD231SS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB132PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB132PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB213PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB213PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB231PD,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB231PD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB132PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB132PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB213PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB213PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB231PS,1,1,YMMREG,YMMREG,YMMRM,');
+  FOpCodeList.Add('VFNMSUB231PS,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB132SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB213SD,1,1,XMMREG,XMMREG,XMMRM,');
+  FOpCodeList.Add('VFNMSUB231SD,1,1,XMMREG,XMMREG,XMMRM,');
+  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;
@@ -759,7 +899,7 @@ var
   FileExt: String;
   i: integer;
 const
-  cPlatform: array[boolean] of String = (('i386'), ('x86_64'));  
+  cPlatform: array[boolean] of String = (('i386'), ('x86_64'));
 begin
   result := false;
 
@@ -789,7 +929,7 @@ begin
                   slFooter.Add('end.');
                 end;
         tfNasm: begin
-                  writeln(format('outputformat: fpc  platform: %s  path: %s',
+                  writeln(format('outputformat: Nasm  platform: %s  path: %s',
                                  [cPlatform[aX64], aDestPath]));
 
                   FileExt := '.asm';
@@ -797,6 +937,24 @@ begin
                   if aX64 then slHeader.Add('[BITS 64]')
                    else slHeader.Add('[BITS 32]');
 
+                  for i := 1 to 10 do
+                   slHeader.Add('NOP');
+
+                  for i := 1 to 10 do
+                   slFooter.Add('NOP');
+                end;
+        tfFasm: begin
+                  writeln(format('outputformat: Fasm  platform: %s  path: %s',
+                                 [cPlatform[aX64], aDestPath]));
+
+                  FileExt := '.asm';
+
+                  if aX64 then slHeader.Add('format MS64 COFF')
+                   else slHeader.Add('format MS COFF');
+
+                  slHeader.Add('section ''.text'' code readable executable');
+                  slHeader.Add('myproc:');
+
                   for i := 1 to 10 do
                    slHeader.Add('NOP');
 

+ 10 - 10
tests/utils/avx/avxtestfilecmp.pp

@@ -24,9 +24,9 @@ begin
         writeln('');
         writeln('-h  help');
         writeln('-m  sourcefile mask');
-        writeln('-n  sourcefile extention');
+        writeln('-n  sourcefile extension');
         writeln('-d  destination path');
-        writeln('-e  destinationfile extention');
+        writeln('-e  destinationfile extension');
         writeln('-s  silent');
         writeln('');
         {$IFDEF WINDOWS}
@@ -44,25 +44,25 @@ begin
 
         if ExtractFileExt(sm) = '' then
         begin
-          if trim(SourceFileExtention) <> '' then
+          if trim(SourceFileExtension) <> '' then
           begin
-            if copy(SourceFileExtention, 1, 1) <> '.' then sm := sm + '.' + SourceFileExtention
-             else sm := sm + SourceFileExtention;
+            if copy(SourceFileExtension, 1, 1) <> '.' then sm := sm + '.' + SourceFileExtension
+             else sm := sm + SourceFileExtension;
           end;
         end;
 
         if (ExtractFilePath(sm) = DestPath) and
-           (DestFileExtention = '') then
+           (DestFileExtension = '') then
         begin
           writeln(format('Do you want compare the same files (sourcepath: "%s"  destination path: "%s"). [Y/N]',
                          [ExtractFilePath(sm), DestPath]));
 
           read(ch);
-          if ch in ['Y', 'y', 'J', 'N'] then CompareFiles(NoSourceFileExtention, NoDestFileExtention, Silent,
-                                                          sm, DestPath, DestFileExtention);
+          if ch in ['Y', 'y', 'J', 'N'] then CompareFiles(NoSourceFileExtension, NoDestFileExtension, Silent,
+                                                          sm, DestPath, DestFileExtension);
         end
-        else CompareFiles(NoSourceFileExtention, NoDestFileExtention, Silent,
-                          sm, DestPath, DestFileExtention);
+        else CompareFiles(NoSourceFileExtension, NoDestFileExtension, Silent,
+                          sm, DestPath, DestFileExtension);
       end;
     finally
       Free;

+ 2 - 1
tests/utils/avx/avxtestgenerator.pp

@@ -42,7 +42,7 @@ begin
         writeln('make avx assembler-testfiles');
         writeln('');
         writeln('-h  help');
-        writeln('-f  [fpc,nasm] outputformat');
+        writeln('-f  [fpc,nasm,fasm] outputformat');
         writeln('-p  [x8664] codegenerator for x86_64 platform');
         writeln('-o  destination path');
         writeln('');
@@ -51,6 +51,7 @@ begin
       begin
         case OutputFormat of
           'f': MakeTestFiles(tfFPC, x64, Path);
+          'F': MakeTestFiles(tfFasm, x64, Path);
           'n': MakeTestFiles(tfNasm, x64, Path);
         end;
       end;

+ 25 - 25
tests/utils/avx/cmpoptions.pas

@@ -11,12 +11,12 @@ type
   TOptions = class(TObject)
   private
     FHelp: boolean;
-    FNoDestFileExtention: boolean;
-    FNoSourceFileExtention: boolean;
+    FNoDestFileExtension: boolean;
+    FNoSourceFileExtension: boolean;
     FSilent: boolean;
-    FSourceFileExtention: String;
+    FSourceFileExtension: String;
     FSourceMask: String;
-    FDestFileExtention: String;
+    FDestFileExtension: String;
     FDestPath: String;
   public
     constructor Create;
@@ -25,12 +25,12 @@ type
 
     property Help                 : boolean read FHelp write FHelp;
     property SourceMask           : String read FSourceMask write FSourceMask;
-    property SourceFileExtention  : String read FSourceFileExtention write FSourceFileExtention;
-    property NoSourceFileExtention: boolean read FNoSourceFileExtention;
+    property SourceFileExtension  : String read FSourceFileExtension write FSourceFileExtension;
+    property NoSourceFileExtension: boolean read FNoSourceFileExtension;
 
     property DestPath             : String read FDestPath write FDestPath;
-    property DestFileExtention    : String read FDestFileExtention write FDestFileExtention;
-    property NoDestFileExtention  : boolean read FNoDestFileExtention;
+    property DestFileExtension    : String read FDestFileExtension write FDestFileExtension;
+    property NoDestFileExtension  : boolean read FNoDestFileExtension;
     property Silent               : boolean read FSilent;
   end;
 
@@ -44,8 +44,8 @@ constructor TOptions.Create;
 begin
   FHelp                     := false;
   FSourceMask               := '';
-  FNoSourceFileExtention    := false;
-  FDestFileExtention        := '';
+  FNoSourceFileExtension    := false;
+  FDestFileExtension        := '';
   FDestPath                 := '';
   FSilent                   := false;
 end;
@@ -61,12 +61,12 @@ begin
    else FHelp := false;
 
   FSourceMask            := IncludeTrailingBackslash(GetCurrentDir) + '*.*';
-  FSourceFileExtention   := '';
-  FNoSourceFileExtention := false;
+  FSourceFileExtension   := '';
+  FNoSourceFileExtension := false;
 
   FDestPath              := IncludeTrailingBackslash(GetCurrentDir);
-  FDestFileExtention     := '';
-  FNoDestFileExtention   := false;
+  FDestFileExtension     := '';
+  FNoDestFileExtension   := false;
 
   FSilent := false;
 
@@ -89,8 +89,8 @@ begin
                 if ExtractFileName(FSourceMask) = '' then FSourceMask := FSourceMask + '*';
               end;
          'n': begin
-                FSourceFileExtention   := sValue;
-                FNoSourceFileExtention := FSourceFileExtention = '';
+                FSourceFileExtension   := sValue;
+                FNoSourceFileExtension := FSourceFileExtension = '';
               end;
          'd': begin
                 FDestPath := sValue;
@@ -99,8 +99,8 @@ begin
                  else FDestPath := ExpandFileName(FDestPath);
               end;
          'e': begin
-                FDestFileExtention := sValue;
-                FNoDestFileExtention := FDestFileExtention = '';
+                FDestFileExtension := sValue;
+                FNoDestFileExtension := FDestFileExtension = '';
               end;
          's': FSilent := true;
          else begin
@@ -111,17 +111,17 @@ begin
     end
     else IsInvalidParam := true;
 
-    if (FNoSourceFileExtention = false) and
-       (FSourceFileExtention = '') then
+    if (FNoSourceFileExtension = false) and
+       (FSourceFileExtension = '') then
     begin
-      FSourceFileExtention := ExtractFileExt(FSourceMask);
+      FSourceFileExtension := ExtractFileExt(FSourceMask);
     end
     else if (ExtractFileExt(FSourceMask) <> '') and
-            (FSourceFileExtention <> '') and
-            (ExtractFileExt(FSourceMask) <> FSourceFileExtention) then
+            (FSourceFileExtension <> '') and
+            (ExtractFileExt(FSourceMask) <> FSourceFileExtension) then
     begin
-      writeln(format('parameter conflict: different sourcefile extention "%s" and "%s"',
-                     [ExtractFileExt(FSourceMask), FSourceFileExtention]));
+      writeln(format('parameter conflict: different sourcefile extension "%s" and "%s"',
+                     [ExtractFileExt(FSourceMask), FSourceFileExtension]));
       FHelp := true;
     end;
 

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

@@ -83,6 +83,7 @@ begin
          'h': FHelp := true;
          'f': if sValue = 'fpc' then FOutputFormat := 'f'
                else if sValue = 'nasm' then FOutputFormat := 'n'
+               else if sValue = 'fasm' then FOutputFormat := 'F'
                else IsInvalidParam := true;
          'p': if sValue = 'x8664' then
               begin

+ 38 - 4
tests/utils/avx/readme.txt

@@ -2,17 +2,52 @@ create testfiles in shell (linux):
 
 for i in `ls /tmp/avx/*.pp`; do /home/torsten/fpc/avx/ppcx64 -Fu/home/torsten/fpc/avx/rtl/units/x86_64-linux/ "$i"; done;
 
+On windows, complete testing would look like:
+
+i386:
+mkdir tmp
+fpc avxtestgenerator
+fpc avxtestfilecmp
+avxtestgenerator -ffpc -otmp
+cd tmp
+for %%p in (*.pp) do call fpc %%p -v0
+cd ..
+avxtestgenerator -fnasm -otmp
+cd tmp
+for %%a in (*.asm) do nasm -fwin32 %%a
+cd ..
+avxtestfilecmp -mtmp\*.obj -dtmp -eexe -s
+
+x86_64:
+fpc avxtestgenerator
+fpc avxtestfilecmp
+avxtestgenerator -px8664 -ffpc -otmp
+cd tmp
+for %%p in (*.pp) do call fpc -Px86_64 %%p -v0
+cd ..
+avxtestgenerator -px8664 -fnasm -otmp
+cd tmp
+for %%a in (*.asm) do nasm -fwin64 %%a
+cd ..
+avxtestfilecmp -mtmp\*.obj -dtmp -eexe -s
+
+****************************************************************************************************
+Note:
+While avxtestgenerator supports FASM output, testing with FASM does not work because
+FASM assembles slightly different from FPC, e.g. it swaps base and index register
+in references if this is benefical (e.g. [rbp+rax] => [rax+rbp] saves one byte).
+****************************************************************************************************
 
 compare binary-files:
 
 any instructions can have a different binary-streams
 
 e.g.
-     VMOVAPD XMM0, XMM1: 
+     VMOVAPD XMM0, XMM1:
 
      possible binary-codes:
      VMOVAPD xmm1, xmm2/m128     [VEX.128.66.0F.28 /r]
-     VMOVAPD xmm2/m128, xmm1     [VEX.128.66.0F.29 /r]	
+     VMOVAPD xmm2/m128, xmm1     [VEX.128.66.0F.29 /r]
 
 
      VMOVSD XMM1, XMM2, XMM3
@@ -21,10 +56,9 @@ e.g.
      VMOVSD xmm1, xmm2, xmm3     [VEX.NDS.LIG.F2.0F.WIG.10 /r] operand encoding: RVM
      VMOVSD xmm1, xmm2, xmm3     [VEX.NDS.LIG.F2.0F.WIG.11 /r] operand encoding: MVR
 
-
 currently (AVX I):
 
-VMOVAPD 
+VMOVAPD
 VMOVAPS
 VMOVDQA
 VMOVDQU