mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 15:49:26 +02:00
* count address regs separate
This commit is contained in:
parent
7e9e15cce8
commit
e21dab9739
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user