From 6a9e48c904da9c47e7e5e2d96ccf9e7a6c005b77 Mon Sep 17 00:00:00 2001 From: tg74 Date: Mon, 26 Aug 2019 19:25:13 +0000 Subject: [PATCH] preparing for bugfix 35700 and cleanup git-svn-id: branches/tg74/avx512merge@42834 - --- compiler/x86/aasmcpu.pas | 62 ++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 25 deletions(-) diff --git a/compiler/x86/aasmcpu.pas b/compiler/x86/aasmcpu.pas index 422ba3f1c8..d6f4baec88 100644 --- a/compiler/x86/aasmcpu.pas +++ b/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;