Przeglądaj źródła

bugfix internal assembler-reader x86 opsize local va

git-svn-id: branches/tg74/avx512-0037785@47681 -
tg74 4 lat temu
rodzic
commit
d8d472cf68

+ 8 - 8
compiler/i386/i386tab.inc

@@ -10542,6 +10542,13 @@
     code    : #220#232#233#234#248#1#230#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
+  (
+    opcode  : A_VCVTPD2DQ;
+    ops     : 2;
+    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    code    : #220#232#233#234#248#1#230#72;
+    flags   : [if_avx512,if_tfv]
+  ),
   (
     opcode  : A_VCVTPD2PS;
     ops     : 2;
@@ -21283,7 +21290,7 @@
   (
     opcode  : A_VCVTPD2UDQ;
     ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    optypes : (ot_ymmreg_mz,ot_zmmrm_er,ot_none,ot_none);
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_tfv]
   ),
@@ -21294,13 +21301,6 @@
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
-  (
-    opcode  : A_VCVTPD2UDQ;
-    ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmreg_er,ot_none,ot_none);
-    code    : #232#233#234#248#1#121#72;
-    flags   : [if_avx512]
-  ),
   (
     opcode  : A_VCVTPD2UQQ;
     ops     : 2;

+ 8 - 8
compiler/i8086/i8086tab.inc

@@ -10570,6 +10570,13 @@
     code    : #220#232#233#234#248#1#230#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
+  (
+    opcode  : A_VCVTPD2DQ;
+    ops     : 2;
+    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    code    : #220#232#233#234#248#1#230#72;
+    flags   : [if_avx512,if_tfv]
+  ),
   (
     opcode  : A_VCVTPD2PS;
     ops     : 2;
@@ -21507,7 +21514,7 @@
   (
     opcode  : A_VCVTPD2UDQ;
     ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    optypes : (ot_ymmreg_mz,ot_zmmrm_er,ot_none,ot_none);
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_tfv]
   ),
@@ -21518,13 +21525,6 @@
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
-  (
-    opcode  : A_VCVTPD2UDQ;
-    ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmreg_er,ot_none,ot_none);
-    code    : #232#233#234#248#1#121#72;
-    flags   : [if_avx512]
-  ),
   (
     opcode  : A_VCVTPD2UQQ;
     ops     : 2;

+ 10 - 2
compiler/ppcx64.lpi

@@ -22,10 +22,18 @@
     </PublishOptions>
     <RunParams>
       <local>
-        <FormatVersion Value="1"/>
-        <CommandLineParams Value="-O- \home\torsten\tmp\test.pp -Fu\home\torsten\avx512\rtl\units\x86_64-linux"/>
+        <CommandLineParams Value="-O- \home\torsten\tmp\vpinsrb.pp -Fu\home\torsten\avx512\rtl\units\x86_64-linux"/>
         <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
       </local>
+      <FormatVersion Value="2"/>
+      <Modes Count="1">
+        <Mode0 Name="default">
+          <local>
+            <CommandLineParams Value="-O- \home\torsten\tmp\vpinsrb.pp -Fu\home\torsten\avx512\rtl\units\x86_64-linux"/>
+            <LaunchingApplication PathPlusParams="\usr\X11R6\bin\xterm -T 'Lazarus Run Output' -e $(LazarusDir)\tools\runwait.sh $(TargetCmdLine)"/>
+          </local>
+        </Mode0>
+      </Modes>
     </RunParams>
     <Units Count="2">
       <Unit0>

+ 9 - 0
compiler/x86/aasmcpu.pas

@@ -376,6 +376,9 @@ interface
         ExistsSSEAVX             : boolean;
         ConstSize                : TConstSizeInfo;
         BCSTTypes                : Set of TMemRefSizeInfoBCSTType;
+        RegXMMSizeMask           : int64;
+        RegYMMSizeMask           : int64;
+        RegZMMSizeMask           : int64;
       end;
 
 
@@ -5342,6 +5345,7 @@ implementation
 
             inc(insentry);
           end;
+
           if InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX then
           begin
             case RegBCSTSizeMask of
@@ -5493,6 +5497,11 @@ implementation
           begin
             InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
           end;
+
+          InsTabMemRefSizeInfoCache^[AsmOp].RegXMMSizeMask:=RegXMMSizeMask;
+          InsTabMemRefSizeInfoCache^[AsmOp].RegYMMSizeMask:=RegYMMSizeMask;
+          InsTabMemRefSizeInfoCache^[AsmOp].RegZMMSizeMask:=RegZMMSizeMask;
+
         end;
       end;
 

+ 66 - 7
compiler/x86/rax86.pas

@@ -456,6 +456,21 @@ var
   mmregs: Set of TSubregister;
   multiplicator: integer;
   bcst1,bcst2: string;
+
+  function ScanLowestActiveBit(aValue: int64): int64;
+  var
+    i: integer;
+  begin
+    result := 0;
+
+    for i := 0 to 63 do
+     if aValue and (1 shl i) <> 0 then
+     begin
+       result := 1 shl i;
+       break;
+     end;
+  end;
+
 begin
   ExistsMemRefNoSize := false;
   ExistsMemRef       := false;
@@ -726,13 +741,57 @@ begin
             msiYMem64,
             msiZMem64: ; // ignore;  gather/scatter opcodes haven a fixed element-size, not a fixed memory-size
                          // the vector-register have indices with base of the memory-address in the memory-operand
-              msiMultipleMinSize8: memrefsize := 8;
-             msiMultipleMinSize16: memrefsize := 16;
-             msiMultipleMinSize32: memrefsize := 32;
-             msiMultipleMinSize64: memrefsize := 64;
-            msiMultipleMinSize128: memrefsize := 128;
-            msiMultipleMinSize256: memrefsize := 256;
-            msiMultipleMinSize512: memrefsize := 512;
+            //  msiMultipleMinSize8: memrefsize := 8;
+            // msiMultipleMinSize16: memrefsize := 16;
+            // msiMultipleMinSize32: memrefsize := 32;
+            // msiMultipleMinSize64: memrefsize := 64;
+            //msiMultipleMinSize128: memrefsize := 128;
+            //msiMultipleMinSize256: memrefsize := 256;
+            //msiMultipleMinSize512: memrefsize := 512;
+            msiMultipleMinSize8,
+           msiMultipleMinSize16,
+           msiMultipleMinSize32,
+           msiMultipleMinSize64,
+          msiMultipleMinSize128,
+          msiMultipleMinSize256,
+          msiMultipleMinSize512:
+              begin
+                for j := 1 to ops do
+                begin
+                  if operands[j].Opr.Typ = OPR_REGISTER then
+                  begin
+                    case getsubreg(operands[j].opr.reg) of
+                      R_SUBMMX: begin
+                                  memrefsize := ScanLowestActiveBit(MemRefInfo(opcode).RegXMMSizeMask);
+                                  break;
+                                end;
+                      R_SUBMMY: begin
+                                  memrefsize := ScanLowestActiveBit(MemRefInfo(opcode).RegYMMSizeMask);
+                                  break;
+                                end;
+                      R_SUBMMZ: begin
+                                  memrefsize := ScanLowestActiveBit(MemRefInfo(opcode).RegZMMSizeMask);
+                                  break;
+                                end;
+                           else;
+                    end;
+                  end;
+                end;
+
+                if memrefsize = -1 then
+                begin
+                  case MemRefInfo(opcode).MemRefSize of
+                      msiMultipleMinSize8: memrefsize := 8;
+                     msiMultipleMinSize16: memrefsize := 16;
+                     msiMultipleMinSize32: memrefsize := 32;
+                     msiMultipleMinSize64: memrefsize := 64;
+                    msiMultipleMinSize128: memrefsize := 128;
+                    msiMultipleMinSize256: memrefsize := 256;
+                    msiMultipleMinSize512: memrefsize := 512;
+                                     else;
+                  end;
+                end;
+              end;
             msiNoSize,
             msiNoMemRef,
             msiUnknown,

+ 1 - 0
compiler/x86/x86ins.dat

@@ -4188,6 +4188,7 @@ xmmreg_mz,bmem64                          \334\350\352\364\370\1\xE6\110
 ymmreg_mz,zmmrm_er                        \334\350\351\352\370\1\xE6\110            AVX512,TFV
 ymmreg_mz,bmem64                          \334\350\351\352\370\1\xE6\110            AVX512,BCST8,TFV
 ;ymmreg_mz,zmmreg_er                       \334\350\351\352\370\1\xE6\110            AVX512
+ymmreg_mz,zmmrm                           \334\350\351\352\370\1\xE6\110            AVX512,TFV
 
 
 ; VCVTPD2PS xmmreg_mz,mem256 must come first - map MemRefSize 256bits correct

+ 8 - 8
compiler/x86_64/x8664tab.inc

@@ -10843,6 +10843,13 @@
     code    : #220#232#233#234#248#1#230#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
+  (
+    opcode  : A_VCVTPD2DQ;
+    ops     : 2;
+    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    code    : #220#232#233#234#248#1#230#72;
+    flags   : [if_avx512,if_tfv]
+  ),
   (
     opcode  : A_VCVTPD2PS;
     ops     : 2;
@@ -21717,7 +21724,7 @@
   (
     opcode  : A_VCVTPD2UDQ;
     ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmrm,ot_none,ot_none);
+    optypes : (ot_ymmreg_mz,ot_zmmrm_er,ot_none,ot_none);
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_tfv]
   ),
@@ -21728,13 +21735,6 @@
     code    : #232#233#234#248#1#121#72;
     flags   : [if_avx512,if_bcst8,if_tfv]
   ),
-  (
-    opcode  : A_VCVTPD2UDQ;
-    ops     : 2;
-    optypes : (ot_ymmreg_mz,ot_zmmreg_er,ot_none,ot_none);
-    code    : #232#233#234#248#1#121#72;
-    flags   : [if_avx512]
-  ),
   (
     opcode  : A_VCVTPD2UQQ;
     ops     : 2;