|
@@ -458,7 +458,7 @@ implementation
|
|
|
end;
|
|
|
|
|
|
var
|
|
|
- { the array ranges are oveestimated !!! }
|
|
|
+ { the array ranges are overestimated !!! }
|
|
|
{ max(maxvarregs,maxfpuvarregs) would be }
|
|
|
{ enough }
|
|
|
regvars : array[1..maxvarregs+maxfpuvarregs] of pvarsym;
|
|
@@ -467,40 +467,32 @@ implementation
|
|
|
parasym : boolean;
|
|
|
|
|
|
procedure searchregvars(p : pnamedindexobject);
|
|
|
+
|
|
|
var
|
|
|
i,j,k : longint;
|
|
|
+
|
|
|
begin
|
|
|
if (psym(p)^.typ=varsym) and (vo_regable in pvarsym(p)^.varoptions) then
|
|
|
begin
|
|
|
- { walk through all momentary register variables }
|
|
|
+ j:=pvarsym(p)^.refs;
|
|
|
+ { parameter get a less value }
|
|
|
+ if parasym then
|
|
|
+ begin
|
|
|
+ if cs_littlesize in aktglobalswitches then
|
|
|
+ dec(j,1)
|
|
|
+ else
|
|
|
+ dec(j,100);
|
|
|
+ end;
|
|
|
for i:=1 to maxvarregs do
|
|
|
begin
|
|
|
- { free register ? }
|
|
|
- if regvars[i]=nil then
|
|
|
- begin
|
|
|
- regvars[i]:=pvarsym(p);
|
|
|
- regvars_para[i]:=parasym;
|
|
|
- break;
|
|
|
- end;
|
|
|
- { else throw out a variable ? }
|
|
|
- j:=pvarsym(p)^.refs;
|
|
|
- { parameter get a less value }
|
|
|
- if parasym then
|
|
|
- begin
|
|
|
- if cs_littlesize in aktglobalswitches then
|
|
|
- dec(j,1)
|
|
|
- else
|
|
|
- dec(j,100);
|
|
|
- end;
|
|
|
- if (j>regvars_refs[i]) and (j>0) then
|
|
|
+ if (regvars[i]=nil) or ((j>regvars_refs[i]) and (j>0)) then
|
|
|
begin
|
|
|
for k:=maxvarregs-1 downto i do
|
|
|
begin
|
|
|
regvars[k+1]:=regvars[k];
|
|
|
regvars_para[k+1]:=regvars_para[k];
|
|
|
+ regvars_refs[k+1]:=regvars_refs[k];
|
|
|
end;
|
|
|
- { calc the new refs
|
|
|
- pvarsym(p)^.refs:=j; }
|
|
|
regvars[i]:=pvarsym(p);
|
|
|
regvars_para[i]:=parasym;
|
|
|
regvars_refs[i]:=j;
|
|
@@ -514,38 +506,30 @@ implementation
|
|
|
procedure searchfpuregvars(p : pnamedindexobject);
|
|
|
var
|
|
|
i,j,k : longint;
|
|
|
+
|
|
|
begin
|
|
|
if (psym(p)^.typ=varsym) and (vo_fpuregable in pvarsym(p)^.varoptions) then
|
|
|
begin
|
|
|
- { walk through all momentary register variables }
|
|
|
+ j:=pvarsym(p)^.refs;
|
|
|
+ { parameter get a less value }
|
|
|
+ if parasym then
|
|
|
+ begin
|
|
|
+ if cs_littlesize in aktglobalswitches then
|
|
|
+ dec(j,1)
|
|
|
+ else
|
|
|
+ dec(j,100);
|
|
|
+ end;
|
|
|
for i:=1 to maxfpuvarregs do
|
|
|
begin
|
|
|
- { free register ? }
|
|
|
- if regvars[i]=nil then
|
|
|
- begin
|
|
|
- regvars[i]:=pvarsym(p);
|
|
|
- regvars_para[i]:=parasym;
|
|
|
- break;
|
|
|
- end;
|
|
|
{ else throw out a variable ? }
|
|
|
- j:=pvarsym(p)^.refs;
|
|
|
- { parameter get a less value }
|
|
|
- if parasym then
|
|
|
- begin
|
|
|
- if cs_littlesize in aktglobalswitches then
|
|
|
- dec(j,1)
|
|
|
- else
|
|
|
- dec(j,100);
|
|
|
- end;
|
|
|
if (j>regvars_refs[i]) and (j>0) then
|
|
|
begin
|
|
|
for k:=maxfpuvarregs-1 downto i do
|
|
|
begin
|
|
|
regvars[k+1]:=regvars[k];
|
|
|
regvars_para[k+1]:=regvars_para[k];
|
|
|
+ regvars_refs[k+1]:=regvars_refs[k];
|
|
|
end;
|
|
|
- { calc the new refs
|
|
|
- pvarsym(p)^.refs:=j; }
|
|
|
regvars[i]:=pvarsym(p);
|
|
|
regvars_para[i]:=parasym;
|
|
|
regvars_refs[i]:=j;
|
|
@@ -623,7 +607,7 @@ implementation
|
|
|
end;
|
|
|
*)
|
|
|
{ $ifdef dummy}
|
|
|
- if (p^.registers32<4) then
|
|
|
+ if (p^.registers32<maxvarregs) then
|
|
|
begin
|
|
|
for i:=1 to maxvarregs do
|
|
|
regvars[i]:=nil;
|
|
@@ -643,12 +627,13 @@ implementation
|
|
|
{ it is nonsens, to copy the variable to }
|
|
|
{ a register because we need then much }
|
|
|
{ too pushes ? }
|
|
|
+ {
|
|
|
if reg_pushes[varregs[i]]>=regvars[i]^.refs then
|
|
|
begin
|
|
|
regvars[i]:=nil;
|
|
|
goto nextreg;
|
|
|
end;
|
|
|
-
|
|
|
+ }
|
|
|
{ register is no longer available for }
|
|
|
{ expressions }
|
|
|
{ search the register which is the most }
|
|
@@ -725,6 +710,9 @@ implementation
|
|
|
{ dummy }
|
|
|
regsize:=S_W;
|
|
|
end;
|
|
|
+ if cs_asm_source in aktglobalswitches then
|
|
|
+ procinfo^.aktentrycode^.insert(new(pai_asm_comment,init(strpnew(tostr(p^.registers32)+
|
|
|
+ ' registers necessary to evaluate expressions'))));
|
|
|
for i:=1 to maxvarregs do
|
|
|
begin
|
|
|
if assigned(regvars[i]) then
|
|
@@ -850,7 +838,10 @@ implementation
|
|
|
end.
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.52 2000-01-22 15:58:12 jonas
|
|
|
+ Revision 1.53 2000-02-04 08:47:10 florian
|
|
|
+ * better register variable allocation in -Or mode
|
|
|
+
|
|
|
+ Revision 1.52 2000/01/22 15:58:12 jonas
|
|
|
* forgot to commit a procedure for -dlogsecondpass the last time
|
|
|
|
|
|
Revision 1.51 2000/01/21 12:16:53 jonas
|
|
@@ -975,4 +966,4 @@ end.
|
|
|
Revision 1.21 1999/05/17 21:57:11 florian
|
|
|
* new temporary ansistring handling
|
|
|
|
|
|
-}
|
|
|
+}
|