mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-01 18:39:25 +02:00
* when a i8086 reference uses only one register, choose it from the set [BX,BP,SI,DI] as it can be treated either as a base or an index, depending on what's convenient
git-svn-id: trunk@25183 -
This commit is contained in:
parent
5b6e50c9da
commit
42e82c9de3
@ -87,21 +87,44 @@ implementation
|
||||
if taicpu(p).oper[i]^.typ=top_ref then
|
||||
begin
|
||||
href:=taicpu(p).oper[i]^.ref^;
|
||||
if (href.base<>NR_NO) and (getsupreg(href.base)>=first_int_imreg) then
|
||||
{ in case there's exactly one register used, we can treat it
|
||||
as either base or index and choose it from the larger set
|
||||
of registers [BX, BP, SI, DI] }
|
||||
if (href.base<>NR_NO) xor (href.index<>NR_NO) then
|
||||
begin
|
||||
add_edge(getsupreg(href.base),RS_AX);
|
||||
add_edge(getsupreg(href.base),RS_CX);
|
||||
add_edge(getsupreg(href.base),RS_DX);
|
||||
add_edge(getsupreg(href.base),RS_SI);
|
||||
add_edge(getsupreg(href.base),RS_DI);
|
||||
end;
|
||||
if (href.index<>NR_NO) and (getsupreg(href.index)>=first_int_imreg) then
|
||||
if (href.base<>NR_NO) and (getsupreg(href.base)>=first_int_imreg) then
|
||||
begin
|
||||
add_edge(getsupreg(href.base),RS_AX);
|
||||
add_edge(getsupreg(href.base),RS_CX);
|
||||
add_edge(getsupreg(href.base),RS_DX);
|
||||
end;
|
||||
if (href.index<>NR_NO) and (getsupreg(href.index)>=first_int_imreg) then
|
||||
begin
|
||||
add_edge(getsupreg(href.index),RS_AX);
|
||||
add_edge(getsupreg(href.index),RS_CX);
|
||||
add_edge(getsupreg(href.index),RS_DX);
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
add_edge(getsupreg(href.index),RS_AX);
|
||||
add_edge(getsupreg(href.index),RS_BX);
|
||||
add_edge(getsupreg(href.index),RS_CX);
|
||||
add_edge(getsupreg(href.index),RS_DX);
|
||||
add_edge(getsupreg(href.index),RS_BP);
|
||||
{ base is chosen from the set [BX, BP] }
|
||||
if (href.base<>NR_NO) and (getsupreg(href.base)>=first_int_imreg) then
|
||||
begin
|
||||
add_edge(getsupreg(href.base),RS_AX);
|
||||
add_edge(getsupreg(href.base),RS_CX);
|
||||
add_edge(getsupreg(href.base),RS_DX);
|
||||
add_edge(getsupreg(href.base),RS_SI);
|
||||
add_edge(getsupreg(href.base),RS_DI);
|
||||
end;
|
||||
{ index is chosen from the set [SI, DI] }
|
||||
if (href.index<>NR_NO) and (getsupreg(href.index)>=first_int_imreg) then
|
||||
begin
|
||||
add_edge(getsupreg(href.index),RS_AX);
|
||||
add_edge(getsupreg(href.index),RS_BX);
|
||||
add_edge(getsupreg(href.index),RS_CX);
|
||||
add_edge(getsupreg(href.index),RS_DX);
|
||||
add_edge(getsupreg(href.index),RS_BP);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user