Selaa lähdekoodia

* merged new changes to avx2 branch (AVX2 vectory-memory support) by Torsten Grundke

git-svn-id: trunk@28527 -
florian 11 vuotta sitten
vanhempi
commit
8635894de4
3 muutettua tiedostoa jossa 259 lisäystä ja 14 poistoa
  1. 39 12
      compiler/x86/aasmcpu.pas
  2. 190 2
      tests/utils/avx/asmtestgenerator.pas
  3. 30 0
      tests/utils/avx/avxopcodes.pas

+ 39 - 12
compiler/x86/aasmcpu.pas

@@ -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;

+ 190 - 2
tests/utils/avx/asmtestgenerator.pas

@@ -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

+ 30 - 0
tests/utils/avx/avxopcodes.pas

@@ -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;