working on internal assembler-reader x86 opsize local var

git-svn-id: branches/tg74/avx512-0037785@47663 -
This commit is contained in:
tg74 2020-12-02 09:19:41 +00:00
parent 84bf87b20d
commit 06b229e1c3

View File

@ -1451,12 +1451,13 @@ procedure Tx86Instruction.SetInstructionOpsize;
if bBroadcastMemRef then if bBroadcastMemRef then
begin begin
case MemRefSizeBCST of //case MemRefSizeBCST of
msbBCST32: opsize := S_L; // msbBCST32: opsize := S_L;
msbBCST64: opsize := S_Q; // msbBCST64: opsize := S_Q;
else opsize := S_NO; // else opsize := S_NO;
end; //end;
opsize := S_NO;
result := true; result := true;
end end
else else
@ -1476,7 +1477,8 @@ procedure Tx86Instruction.SetInstructionOpsize;
opsize:=tx86operand(operands[1]).opsize; opsize:=tx86operand(operands[1]).opsize;
result := true; result := true;
end; end;
3: begin 3,4:
begin
if (tx86operand(operands[1]).opr.typ <> OPR_CONSTANT) then if (tx86operand(operands[1]).opr.typ <> OPR_CONSTANT) then
opsize:=tx86operand(operands[1]).opsize opsize:=tx86operand(operands[1]).opsize
else opsize:=tx86operand(operands[2]).opsize; else opsize:=tx86operand(operands[2]).opsize;
@ -1489,9 +1491,9 @@ procedure Tx86Instruction.SetInstructionOpsize;
//bExistMemRef:=false; //bExistMemRef:=false;
for i := 1 to ops do for i := 1 to ops do
if tx86operand(operands[1]).opr.typ in [OPR_REFERENCE,OPR_LOCAL] then if tx86operand(operands[i]).opr.typ in [OPR_REFERENCE,OPR_LOCAL] then
begin begin
opsize := tx86operand(operands[1]).opsize; opsize := tx86operand(operands[i]).opsize;
result := true; result := true;
break; break;
end; end;
@ -1606,8 +1608,8 @@ begin
end; end;
//end; //end;
end; end;
4 : 4 : if not CheckSSEAVX then
opsize:=tx86operand(operands[ops]).opsize; opsize:=tx86operand(operands[ops]).opsize;
end; end;
end; end;
@ -1973,6 +1975,25 @@ begin
localscale,localgetoffset,localforceref); localscale,localgetoffset,localforceref);
ai.oper[i-1]^.localoper^.localsegment:=localsegment; ai.oper[i-1]^.localoper^.localsegment:=localsegment;
// check for embedded broadcast
if MemRefInfo(opcode).ExistsSSEAVX then
begin
asize := 0;
if ((operands[i] as tx86operand).vopext <> 0) and
(MemRefInfo(opcode).MemRefSizeBCST in [msbBCST32,msbBCST64]) then
begin
case operands[i].size of
OS_32,OS_M32: asize:=OT_BITS32;
OS_64,OS_M64: asize:=OT_BITS64;
else;
end;
end;
if asize<>0 then
ai.oper[i-1]^.ot:=(ai.oper[i-1]^.ot and not OT_SIZE_MASK) or asize;
end;
// if MemRefInfo(opcode).ExistsSSEAVX then // if MemRefInfo(opcode).ExistsSSEAVX then
// begin // begin
// asize := 0; // asize := 0;