mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 20:29:23 +02:00
* 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:
parent
0f6a88b0c7
commit
d3cb61b651
@ -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;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user