* 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 } { c_countusableregsxxx = amount of registers in the usableregsxxx set }
maxintregs = 4; maxintregs = 4;
intregs = [R_EAX..R_BL]; intregs = [R_EAX..R_BL]-[R_ESI,R_SI];
{$ifdef newra} {$ifdef newra}
usableregsint = [first_imreg..last_imreg]; usableregsint = [first_imreg..last_imreg];
{$else} {$else}
usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI]; usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX];
{$endif} {$endif}
c_countusableregsint = 5; c_countusableregsint = 4;
maxfpuregs = 8; maxfpuregs = 8;
fpuregs = [R_ST0..R_ST7]; fpuregs = [R_ST0..R_ST7];
@ -530,14 +530,14 @@ uses
usableregsmm = [R_MM0..R_MM7]; usableregsmm = [R_MM0..R_MM7];
c_countusableregsmm = 8; c_countusableregsmm = 8;
maxaddrregs = 0; maxaddrregs = 1;
addrregs = []; addrregs = [R_ESI];
usableregsaddr = []; usableregsaddr = [RS_ESI];
c_countusableregsaddr = 0; c_countusableregsaddr = 1;
firstsaveintreg = RS_EAX; firstsaveintreg = RS_EAX;
lastsaveintreg = RS_ESI; lastsaveintreg = RS_EDX;
firstsavefpureg = R_NO; firstsavefpureg = R_NO;
lastsavefpureg = R_NO; lastsavefpureg = R_NO;
firstsavemmreg = R_MM0; firstsavemmreg = R_MM0;
@ -814,7 +814,10 @@ implementation
end. end.
{ {
$Log$ $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 * generic constructor working for i386
* remove fixed self register * remove fixed self register
* esi added as address register for i386 * esi added as address register for i386

View File

@ -240,28 +240,31 @@ unit rgcpu;
function trgcpu.getaddressregister(list:Taasmoutput):Tregister; function trgcpu.getaddressregister(list:Taasmoutput):Tregister;
begin begin
if countunusedregsint=0 then if countunusedregsaddr>0 then
internalerror(10); begin
result.enum:=R_INTREGISTER; result.enum:=R_INTREGISTER;
{$ifdef TEMPREGDEBUG} {$ifdef TEMPREGDEBUG}
if curptree^.usableregsint-countunusedregsint>curptree^.registers32 then if curptree^.usableregsaddr-countunusedregsaddr>curptree^.registers32 then
internalerror(10); internalerror(10);
{$endif TEMPREGDEBUG} {$endif TEMPREGDEBUG}
{$ifdef EXTTEMPREGDEBUG} {$ifdef EXTTEMPREGDEBUG}
if curptree^.usableregs-countunusedregistersint>curptree^^.reallyusedregs then if curptree^.usableregs-countunusedregistersaddr>curptree^^.reallyusedregs then
curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersint; curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersaddr;
{$endif EXTTEMPREGDEBUG} {$endif EXTTEMPREGDEBUG}
if RS_ESI in unusedregsint then if RS_ESI in unusedregsaddr then
begin begin
dec(countunusedregsint); dec(countunusedregsaddr);
exclude(unusedregsint,RS_ESI); exclude(unusedregsaddr,RS_ESI);
include(usedintinproc,RS_ESI); include(usedaddrinproc,RS_ESI);
result.number:=NR_ESI; result.number:=NR_ESI;
{$ifdef TEMPREGDEBUG} {$ifdef TEMPREGDEBUG}
reg_user[R_ESI]:=curptree^; reg_user[R_ESI]:=curptree^;
{$endif TEMPREGDEBUG} {$endif TEMPREGDEBUG}
exprasmlist.concat(tai_regalloc.alloc(result)); exprasmlist.concat(tai_regalloc.alloc(result));
end end
else
internalerror(10);
end
else else
result:=getregisterint(list,OS_ADDR); result:=getregisterint(list,OS_ADDR);
end; end;
@ -559,7 +562,10 @@ end.
{ {
$Log$ $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 * generic constructor working for i386
* remove fixed self register * remove fixed self register
* esi added as address register for i386 * esi added as address register for i386

View File

@ -131,14 +131,17 @@ unit rgobj;
{ allocated } { allocated }
lastintreg:Tsuperregister; lastintreg:Tsuperregister;
unusedregsint,usableregsint:Tsupregset; unusedregsint,usableregsint:Tsupregset;
unusedregsaddr,usableregsaddr:Tsupregset;
unusedregsfpu,usableregsfpu : tregisterset; unusedregsfpu,usableregsfpu : tregisterset;
unusedregsmm,usableregsmm : tregisterset; unusedregsmm,usableregsmm : tregisterset;
{ these counters contain the number of elements in the } { these counters contain the number of elements in the }
{ unusedregsxxx/usableregsxxx sets } { unusedregsxxx/usableregsxxx sets }
countunusedregsint, countunusedregsint,
countunusedregsaddr,
countunusedregsfpu, countunusedregsfpu,
countunusedregsmm : byte; countunusedregsmm : byte;
countusableregsint, countusableregsint,
countusableregsaddr,
countusableregsfpu, countusableregsfpu,
countusableregsmm : byte; countusableregsmm : byte;
@ -147,7 +150,10 @@ unit rgobj;
} }
usedbyproc, usedbyproc,
usedinproc : tregisterset; usedinproc : tregisterset;
usedintbyproc,usedintinproc:Tsupregset; usedintbyproc,
usedaddrbyproc,
usedintinproc,
usedaddrinproc:Tsupregset;
reg_pushes : regvar_longintarray; reg_pushes : regvar_longintarray;
reg_pushes_int : regvarint_longintarray; reg_pushes_int : regvarint_longintarray;
@ -1397,7 +1403,10 @@ end.
{ {
$Log$ $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 * Added some code to keep track of move instructions in register
allocator allocator