* refactored tx86intreader.AddReferences to use a pair of case statements,

depending on the combination of operand types; this is done, so that adding
  OPR_LOCAL with OPR_REFERENCE operands can be supported later.

git-svn-id: trunk@38443 -
This commit is contained in:
nickysn 2018-03-07 16:43:39 +00:00
parent 0f6a88b0c7
commit d3cb61b651

View File

@ -828,31 +828,43 @@ Unit Rax86int;
end; end;
begin begin
if (dest.opr.typ<>OPR_REFERENCE) or (src.opr.typ<>OPR_REFERENCE) then case dest.opr.typ of
internalerror(2018022601); OPR_REFERENCE:
AddRegister(src.opr.ref.base,1); begin
AddRegister(src.opr.ref.index,src.opr.ref.scalefactor); case src.opr.typ of
if src.opr.ref.segment<>NR_NO then OPR_REFERENCE:
SetSegmentOverride(dest,src.opr.ref.segment); begin
Inc(dest.opr.ref.offset,src.opr.ref.offset); AddRegister(src.opr.ref.base,1);
Inc(dest.opr.constoffset,src.opr.constoffset); AddRegister(src.opr.ref.index,src.opr.ref.scalefactor);
dest.haslabelref:=dest.haslabelref or src.haslabelref; if src.opr.ref.segment<>NR_NO then
dest.hasproc:=dest.hasproc or src.hasproc; SetSegmentOverride(dest,src.opr.ref.segment);
dest.hasvar:=dest.hasvar or src.hasvar; Inc(dest.opr.ref.offset,src.opr.ref.offset);
if assigned(src.opr.ref.symbol) then Inc(dest.opr.constoffset,src.opr.constoffset);
begin dest.haslabelref:=dest.haslabelref or src.haslabelref;
if assigned(dest.opr.ref.symbol) then dest.hasproc:=dest.hasproc or src.hasproc;
Message(asmr_e_cant_have_multiple_relocatable_symbols); dest.hasvar:=dest.hasvar or src.hasvar;
dest.opr.ref.symbol:=src.opr.ref.symbol; if assigned(src.opr.ref.symbol) then
end; begin
if assigned(src.opr.ref.relsymbol) then if assigned(dest.opr.ref.symbol) then
begin Message(asmr_e_cant_have_multiple_relocatable_symbols);
if assigned(dest.opr.ref.relsymbol) then dest.opr.ref.symbol:=src.opr.ref.symbol;
Message(asmr_e_cant_have_multiple_relocatable_symbols); end;
dest.opr.ref.relsymbol:=src.opr.ref.relsymbol; if assigned(src.opr.ref.relsymbol) then
end; begin
if dest.opr.ref.refaddr=addr_no then if assigned(dest.opr.ref.relsymbol) then
dest.opr.ref.refaddr:=src.opr.ref.refaddr; Message(asmr_e_cant_have_multiple_relocatable_symbols);
dest.opr.ref.relsymbol:=src.opr.ref.relsymbol;
end;
if dest.opr.ref.refaddr=addr_no then
dest.opr.ref.refaddr:=src.opr.ref.refaddr;
end;
else
internalerror(2018030701);
end;
end;
else
internalerror(2018030702);
end;
end; end;