Pārlūkot izejas kodu

preparing for bugfix 35700 and cleanup

git-svn-id: branches/tg74/avx512merge@42834 -
tg74 6 gadi atpakaļ
vecāks
revīzija
6a9e48c904
1 mainītis faili ar 37 papildinājumiem un 25 dzēšanām
  1. 37 25
      compiler/x86/aasmcpu.pas

+ 37 - 25
compiler/x86/aasmcpu.pas

@@ -353,9 +353,9 @@ interface
         Ch : set of TInsChange;
       end;
 
-      TMemRefSizeInfo = (msiUnkown, msiUnsupported, msiNoSize,
-                         msiMultiple, msiMultiple8, msiMultiple16, msiMultiple32,
-                         msiMultiple64, msiMultiple128, msiMultiple256, msiMultiple512,
+      TMemRefSizeInfo = (msiUnknown, msiUnsupported, msiNoSize, msiNoMemRef,
+                         msiMultiple, msiMultipleMinSize8, msiMultipleMinSize16, msiMultipleMinSize32,
+                         msiMultipleMinSize64, msiMultipleMinSize128, msiMultipleminSize256, msiMultipleMinSize512,
                          msiMemRegSize, msiMemRegx16y32, msiMemRegx16y32z64, msiMemRegx32y64, msiMemRegx32y64z128, msiMemRegx64y128, msiMemRegx64y128z256,
                          msiMemRegx64y256, msiMemRegx64y256z512,
                          msiMem8, msiMem16, msiMem32, msiBMem32, msiMem64, msiBMem64, msiMem128, msiMem256, msiMem512,
@@ -367,7 +367,7 @@ interface
       TMemRefSizeInfoBCSTType = (btUnknown, bt1to2, bt1to4, bt1to8, bt1to16);
 
       TEVEXTupleState = (etsUnknown, etsIsTuple, etsNotTuple);
-      TConstSizeInfo  = (csiUnkown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
+      TConstSizeInfo  = (csiUnknown, csiMultiple, csiNoSize, csiMem8, csiMem16, csiMem32, csiMem64);
 
       TInsTabMemRefSizeInfoRec = record
         MemRefSize               : TMemRefSizeInfo;
@@ -381,10 +381,10 @@ interface
 
 
     const
-      MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultiple8,
-                                                 msiMultiple16, msiMultiple32,
-                                                 msiMultiple64, msiMultiple128,
-                                                 msiMultiple256, msiMultiple512,
+      MemRefMultiples: set of TMemRefSizeInfo = [msiMultiple, msiMultipleMinSize8,
+                                                 msiMultipleMinSize16, msiMultipleMinSize32,
+                                                 msiMultipleMinSize64, msiMultipleMinSize128,
+                                                 msiMultipleMinSize256, msiMultipleMinSize512,
                                                  msiVMemMultiple];
 
       MemRefSizeInfoVMems: Set of TMemRefSizeInfo = [msiXMem32, msiXMem64, msiYMem32, msiYMem64,
@@ -413,6 +413,7 @@ interface
         IF_SB,                  { unsized operands can't be non-byte  }
         IF_SW,                  { unsized operands can't be non-word  }
         IF_SD,                  { unsized operands can't be nondword  }
+        IF_SQ,                  { unsized operands can't be nonqword  }
 
         { unsized argument spec }
         { please keep these in order and in sync with IF_ARMASK }
@@ -1620,7 +1621,7 @@ implementation
                   // special handling (opsize can different from const-size)
                   // (e.g. "pextrw  reg/m16, xmmreg, imm8" =>> opsize (16 bit), const-size (8 bit)
                   if (InsTabMemRefSizeInfoCache^[opcode].ExistsSSEAVX) and
-                     (not(InsTabMemRefSizeInfoCache^[opcode].ConstSize in [csiMultiple, csiUnkown])) then
+                     (not(InsTabMemRefSizeInfoCache^[opcode].ConstSize in [csiMultiple, csiUnknown])) then
                   begin
                     case InsTabMemRefSizeInfoCache^[opcode].ConstSize of
                       csiNoSize: ot := ot and OT_NON_SIZE or OT_IMMEDIATE;
@@ -4893,6 +4894,7 @@ implementation
       RegBCSTXMMSizeMask: int64;
       RegBCSTYMMSizeMask: int64;
       RegBCSTZMMSizeMask: int64;
+      ExistsMemRef      : boolean;
 
       bitcount: integer;
 
@@ -4923,10 +4925,10 @@ implementation
 
         if i >= 0 then
         begin
-          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize           := msiUnkown;
+          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize           := msiUnknown;
           InsTabMemRefSizeInfoCache^[AsmOp].MemRefSizeBCST       := msbUnknown;
           InsTabMemRefSizeInfoCache^[AsmOp].BCSTXMMMultiplicator := 0;
-          InsTabMemRefSizeInfoCache^[AsmOp].ConstSize            := csiUnkown;
+          InsTabMemRefSizeInfoCache^[AsmOp].ConstSize            := csiUnknown;
           InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX         := false;
           InsTabMemRefSizeInfoCache^[AsmOp].BCSTTypes            := [];
 
@@ -4945,10 +4947,11 @@ implementation
           RegBCSTXMMSizeMask := 0;
           RegBCSTYMMSizeMask := 0;
           RegBCSTZMMSizeMask := 0;
+          ExistsMemRef       := false;
 
           while (insentry^.opcode=AsmOp) do
           begin
-            MRefInfo         := msiUnkown;
+            MRefInfo         := msiUnknown;
 
             actRegSize       := 0;
             actRegCount      := 0;
@@ -5049,7 +5052,7 @@ implementation
                 else SConstInfo := csiMultiple;
               end;
 
-              if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnkown then
+              if InsTabMemRefSizeInfoCache^[AsmOp].ConstSize = csiUnknown then
               begin
                 InsTabMemRefSizeInfoCache^[AsmOp].ConstSize := SConstInfo;
               end
@@ -5108,7 +5111,7 @@ implementation
                   end;
 
 
-                  if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnkown then
+                  if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
                   begin
                     InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
                   end
@@ -5129,10 +5132,12 @@ implementation
               begin
                 if (actMemCount=2) and ((AsmOp=A_MOVS) or (AsmOp=A_CMPS)) then actMemCount:=1;
 
+                ExistsMemRef := ExistsMemRef or (actMemCount > 0);
+
                 case actMemCount of
                   0: ; // nothing todo
                   1: begin
-                       MRefInfo := msiUnkown;
+                       MRefInfo := msiUnknown;
                        case actRegMemTypes and (OT_MMXRM or OT_XMMRM or OT_YMMRM or OT_ZMMRM or OT_REG_EXTRA_MASK) of
                          OT_MMXRM: actMemSize := actMemSize or OT_BITS64;
                          OT_XMMRM: actMemSize := actMemSize or OT_BITS128;
@@ -5164,7 +5169,7 @@ implementation
                            end;
                        end;
 
-                       if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnkown then
+                       if InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown then
                          begin
                            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := MRefInfo;
                          end
@@ -5177,13 +5182,13 @@ implementation
                            begin
                              with InsTabMemRefSizeInfoCache^[AsmOp] do
                              begin
-                               if ((MemRefSize = msiMem8)        OR (MRefInfo = msiMem8))   then MemRefSize := msiMultiple8
-                               else if ((MemRefSize = msiMem16)  OR (MRefInfo = msiMem16))  then MemRefSize := msiMultiple16
-                               else if ((MemRefSize = msiMem32)  OR (MRefInfo = msiMem32))  then MemRefSize := msiMultiple32
-                               else if ((MemRefSize = msiMem64)  OR (MRefInfo = msiMem64))  then MemRefSize := msiMultiple64
-                               else if ((MemRefSize = msiMem128) OR (MRefInfo = msiMem128)) then MemRefSize := msiMultiple128
-                               else if ((MemRefSize = msiMem256) OR (MRefInfo = msiMem256)) then MemRefSize := msiMultiple256
-                               else if ((MemRefSize = msiMem512) OR (MRefInfo = msiMem512)) then MemRefSize := msiMultiple512
+                               if ((MemRefSize in [msiMem8, msiMULTIPLEMinSize8]) OR (MRefInfo = msiMem8))   then MemRefSize := msiMultipleMinSize8
+                               else if ((MemRefSize in [ msiMem16,  msiMULTIPLEMinSize16])  OR (MRefInfo =  msiMem16)) then MemRefSize := msiMultipleMinSize16
+                               else if ((MemRefSize in [ msiMem32,  msiMULTIPLEMinSize32])  OR (MRefInfo =  msiMem32)) then MemRefSize := msiMultipleMinSize32
+                               else if ((MemRefSize in [ msiMem64,  msiMULTIPLEMinSize64])  OR (MRefInfo =  msiMem64)) then MemRefSize := msiMultipleMinSize64
+                               else if ((MemRefSize in [msiMem128, msiMULTIPLEMinSize128])  OR (MRefInfo = msiMem128)) then MemRefSize := msiMultipleMinSize128
+                               else if ((MemRefSize in [msiMem256, msiMULTIPLEMinSize256])  OR (MRefInfo = msiMem256)) then MemRefSize := msiMultipleMinSize256
+                               else if ((MemRefSize in [msiMem512, msiMULTIPLEMinSize512])  OR (MRefInfo = msiMem512)) then MemRefSize := msiMultipleMinSize512
                                else MemRefSize := msiMultiple;
                              end;
                            end;
@@ -5394,6 +5399,12 @@ implementation
               InternalError(777205);
             end;
 
+          end
+          else if (InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) and
+                  (InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize = msiUnknown) and
+                  (not(ExistsMemRef)) then
+          begin
+            InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize := msiNoMemRef;
           end;
         end;
       end;
@@ -5405,8 +5416,8 @@ implementation
         // only supported intructiones with SSE- or AVX-operands
         if not(InsTabMemRefSizeInfoCache^[AsmOp].ExistsSSEAVX) then
         begin
-          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize  := msiUnkown;
-          InsTabMemRefSizeInfoCache^[AsmOp].ConstSize   := csiUnkown;
+          InsTabMemRefSizeInfoCache^[AsmOp].MemRefSize  := msiUnknown;
+          InsTabMemRefSizeInfoCache^[AsmOp].ConstSize   := csiUnknown;
         end;
       end;
     end;
@@ -5419,6 +5430,7 @@ implementation
 
         if not assigned(InsTabMemRefSizeInfoCache) then
           BuildInsTabMemRefSizeInfoCache;
+
       end;