* count address regs separate

This commit is contained in:
peter 2003-04-21 19:16:49 +00:00
parent 7e9e15cce8
commit e21dab9739
3 changed files with 47 additions and 29 deletions

View File

@ -513,13 +513,13 @@ uses
{ c_countusableregsxxx = amount of registers in the usableregsxxx set }
maxintregs = 4;
intregs = [R_EAX..R_BL];
intregs = [R_EAX..R_BL]-[R_ESI,R_SI];
{$ifdef newra}
usableregsint = [first_imreg..last_imreg];
{$else}
usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI];
usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX];
{$endif}
c_countusableregsint = 5;
c_countusableregsint = 4;
maxfpuregs = 8;
fpuregs = [R_ST0..R_ST7];
@ -530,14 +530,14 @@ uses
usableregsmm = [R_MM0..R_MM7];
c_countusableregsmm = 8;
maxaddrregs = 0;
addrregs = [];
usableregsaddr = [];
c_countusableregsaddr = 0;
maxaddrregs = 1;
addrregs = [R_ESI];
usableregsaddr = [RS_ESI];
c_countusableregsaddr = 1;
firstsaveintreg = RS_EAX;
lastsaveintreg = RS_ESI;
lastsaveintreg = RS_EDX;
firstsavefpureg = R_NO;
lastsavefpureg = R_NO;
firstsavemmreg = R_MM0;
@ -814,7 +814,10 @@ implementation
end.
{
$Log$
Revision 1.45 2003-03-28 19:16:57 peter
Revision 1.46 2003-04-21 19:16:50 peter
* count address regs separate
Revision 1.45 2003/03/28 19:16:57 peter
* generic constructor working for i386
* remove fixed self register
* esi added as address register for i386

View File

@ -240,30 +240,33 @@ unit rgcpu;
function trgcpu.getaddressregister(list:Taasmoutput):Tregister;
begin
if countunusedregsint=0 then
internalerror(10);
result.enum:=R_INTREGISTER;
if countunusedregsaddr>0 then
begin
result.enum:=R_INTREGISTER;
{$ifdef TEMPREGDEBUG}
if curptree^.usableregsint-countunusedregsint>curptree^.registers32 then
internalerror(10);
if curptree^.usableregsaddr-countunusedregsaddr>curptree^.registers32 then
internalerror(10);
{$endif TEMPREGDEBUG}
{$ifdef EXTTEMPREGDEBUG}
if curptree^.usableregs-countunusedregistersint>curptree^^.reallyusedregs then
curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersint;
if curptree^.usableregs-countunusedregistersaddr>curptree^^.reallyusedregs then
curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersaddr;
{$endif EXTTEMPREGDEBUG}
if RS_ESI in unusedregsint then
begin
dec(countunusedregsint);
exclude(unusedregsint,RS_ESI);
include(usedintinproc,RS_ESI);
result.number:=NR_ESI;
if RS_ESI in unusedregsaddr then
begin
dec(countunusedregsaddr);
exclude(unusedregsaddr,RS_ESI);
include(usedaddrinproc,RS_ESI);
result.number:=NR_ESI;
{$ifdef TEMPREGDEBUG}
reg_user[R_ESI]:=curptree^;
reg_user[R_ESI]:=curptree^;
{$endif TEMPREGDEBUG}
exprasmlist.concat(tai_regalloc.alloc(result));
end
exprasmlist.concat(tai_regalloc.alloc(result));
end
else
internalerror(10);
end
else
result:=getregisterint(list,OS_ADDR);
result:=getregisterint(list,OS_ADDR);
end;
@ -559,7 +562,10 @@ end.
{
$Log$
Revision 1.17 2003-03-28 19:16:57 peter
Revision 1.18 2003-04-21 19:16:50 peter
* count address regs separate
Revision 1.17 2003/03/28 19:16:57 peter
* generic constructor working for i386
* remove fixed self register
* esi added as address register for i386

View File

@ -131,14 +131,17 @@ unit rgobj;
{ allocated }
lastintreg:Tsuperregister;
unusedregsint,usableregsint:Tsupregset;
unusedregsaddr,usableregsaddr:Tsupregset;
unusedregsfpu,usableregsfpu : tregisterset;
unusedregsmm,usableregsmm : tregisterset;
{ these counters contain the number of elements in the }
{ unusedregsxxx/usableregsxxx sets }
countunusedregsint,
countunusedregsaddr,
countunusedregsfpu,
countunusedregsmm : byte;
countusableregsint,
countusableregsaddr,
countusableregsfpu,
countusableregsmm : byte;
@ -147,7 +150,10 @@ unit rgobj;
}
usedbyproc,
usedinproc : tregisterset;
usedintbyproc,usedintinproc:Tsupregset;
usedintbyproc,
usedaddrbyproc,
usedintinproc,
usedaddrinproc:Tsupregset;
reg_pushes : regvar_longintarray;
reg_pushes_int : regvarint_longintarray;
@ -1397,7 +1403,10 @@ end.
{
$Log$
Revision 1.34 2003-04-17 16:48:21 daniel
Revision 1.35 2003-04-21 19:16:49 peter
* count address regs separate
Revision 1.34 2003/04/17 16:48:21 daniel
* Added some code to keep track of move instructions in register
allocator