|
@@ -62,6 +62,8 @@ unit rgcpu;
|
|
procinfo;
|
|
procinfo;
|
|
|
|
|
|
procedure trgintcputhumb2.add_cpu_interferences(p: tai);
|
|
procedure trgintcputhumb2.add_cpu_interferences(p: tai);
|
|
|
|
+ var
|
|
|
|
+ r : tregister;
|
|
begin
|
|
begin
|
|
if p.typ=ait_instruction then
|
|
if p.typ=ait_instruction then
|
|
begin
|
|
begin
|
|
@@ -95,6 +97,27 @@ unit rgcpu;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
+ A_LDRB,
|
|
|
|
+ A_STRB,
|
|
|
|
+ A_STR,
|
|
|
|
+ A_LDR,
|
|
|
|
+ A_LDRH,
|
|
|
|
+ A_STRH,
|
|
|
|
+ A_LDRSB,
|
|
|
|
+ A_LDRSH,
|
|
|
|
+ A_LDRD,
|
|
|
|
+ A_STRD:
|
|
|
|
+ { don't mix up the framepointer and stackpointer with pre/post indexed operations }
|
|
|
|
+ if (taicpu(p).oper[1]^.typ=top_ref) and
|
|
|
|
+ (taicpu(p).oper[1]^.ref^.addressmode in [AM_PREINDEXED,AM_POSTINDEXED]) then
|
|
|
|
+ begin
|
|
|
|
+ add_edge(getsupreg(taicpu(p).oper[1]^.ref^.base),getsupreg(current_procinfo.framepointer));
|
|
|
|
+ { FIXME: temp variable r is needed here to avoid Internal error 20060521 }
|
|
|
|
+ { while compiling the compiler. }
|
|
|
|
+ r:=NR_STACK_POINTER_REG;
|
|
|
|
+ if current_procinfo.framepointer<>r then
|
|
|
|
+ add_edge(getsupreg(taicpu(p).oper[1]^.ref^.base),getsupreg(r));
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|