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