tai_regalloc.allocation changed to ratype to notify rgobj of register size changes

This commit is contained in:
peter 2004-05-22 23:34:27 +00:00
parent fac96dd2ed
commit 5358278ca1
17 changed files with 215 additions and 124 deletions

View File

@ -220,6 +220,8 @@ interface
{ cut type, required for alphanumeric ordering of the assembler filenames }
TCutPlace=(cut_normal,cut_begin,cut_end);
TRegAllocType = (ra_alloc,ra_dealloc,ra_resize);
TMarker = (NoPropInfoStart,NoPropInfoEnd,
AsmBlockStart,AsmBlockEnd,
InlineStart,InlineEnd,marker_blockstart,
@ -466,10 +468,11 @@ interface
end;
tai_regalloc = class(tai)
allocation : boolean;
reg : tregister;
reg : tregister;
ratype : TRegAllocType;
constructor alloc(r : tregister);
constructor dealloc(r : tregister);
constructor resize(r : tregister);
constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
procedure ppuwrite(ppufile:tcompilerppufile);override;
end;
@ -1567,7 +1570,7 @@ implementation
begin
inherited create;
typ:=ait_regalloc;
allocation:=true;
ratype:=ra_alloc;
reg:=r;
end;
@ -1576,7 +1579,16 @@ implementation
begin
inherited create;
typ:=ait_regalloc;
allocation:=false;
ratype:=ra_dealloc;
reg:=r;
end;
constructor tai_regalloc.resize(r : tregister);
begin
inherited create;
typ:=ait_regalloc;
ratype:=ra_resize;
reg:=r;
end;
@ -1585,7 +1597,7 @@ implementation
begin
inherited ppuload(t,ppufile);
ppufile.getdata(reg,sizeof(Tregister));
allocation:=boolean(ppufile.getbyte);
ratype:=tregalloctype(ppufile.getbyte);
end;
@ -1593,7 +1605,7 @@ implementation
begin
inherited ppuwrite(ppufile);
ppufile.putdata(reg,sizeof(Tregister));
ppufile.putbyte(byte(allocation));
ppufile.putbyte(byte(ratype));
end;
@ -2009,7 +2021,10 @@ implementation
end.
{
$Log$
Revision 1.82 2004-04-12 18:59:32 florian
Revision 1.83 2004-05-22 23:34:27 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.82 2004/04/12 18:59:32 florian
* small x86_64 fixes
Revision 1.81 2004/03/16 22:12:10 florian

View File

@ -31,7 +31,7 @@ interface
uses
dos,
cclasses,
globals,
globals,
aasmbase,aasmtai,aasmcpu,
assemble;
@ -287,7 +287,8 @@ var
procedure TGNUAssembler.WriteTree(p:TAAsmoutput);
const
allocstr : array[boolean] of string[10]=(' released',' allocated');
regallocstr : array[tregalloctype] of string[10]=(' released',' allocated','resized');
tempallocstr : array[boolean] of string[10]=(' released',' allocated');
var
ch : char;
hp : tai;
@ -386,7 +387,7 @@ var
begin
if (cs_asm_regalloc in aktglobalswitches) then
AsmWriteLn(#9+target_asm.comment+'Register '+gas_regname(Tai_regalloc(hp).reg)+
allocstr[tai_regalloc(hp).allocation]);
regallocstr[tai_regalloc(hp).ratype]);
end;
ait_tempalloc :
@ -400,7 +401,7 @@ var
else
{$endif EXTDEBUG}
AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
tostr(tai_tempalloc(hp).tempsize)+allocstr[tai_tempalloc(hp).allocation]);
tostr(tai_tempalloc(hp).tempsize)+tempallocstr[tai_tempalloc(hp).allocation]);
end;
end;
@ -878,7 +879,10 @@ var
end.
{
$Log$
Revision 1.51 2004-04-27 13:38:24 florian
Revision 1.52 2004-05-22 23:34:27 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.51 2004/04/27 13:38:24 florian
* fixed wrong commit from yesterday
Revision 1.50 2004/04/25 21:26:16 florian

View File

@ -104,7 +104,7 @@ unit cgobj;
procedure do_register_allocation(list:Taasmoutput;headertai:tai);virtual;
function makeregsize(reg:Tregister;size:Tcgsize):Tregister;
function makeregsize(list:Taasmoutput;reg:Tregister;size:Tcgsize):Tregister;
{# Returns the tcgsize corresponding with the size of reg.}
class function reg_cgsize(const reg: tregister) : tcgsize; virtual;
@ -547,16 +547,6 @@ implementation
end;
function Tcg.makeregsize(reg:Tregister;size:Tcgsize):Tregister;
var
subreg:Tsubregister;
begin
subreg:=cgsize2subreg(size);
result:=reg;
setsubreg(result,subreg);
end;
{*****************************************************************************
register allocation
******************************************************************************}
@ -626,6 +616,19 @@ implementation
end;
function Tcg.makeregsize(list:Taasmoutput;reg:Tregister;size:Tcgsize):Tregister;
var
subreg:Tsubregister;
begin
subreg:=cgsize2subreg(size);
result:=reg;
setsubreg(result,subreg);
{ notify RA }
if result<>reg then
list.concat(tai_regalloc.resize(result));
end;
procedure tcg.getexplicitregister(list:Taasmoutput;r:Tregister);
begin
if not assigned(rg[getregtype(r)]) then
@ -2137,7 +2140,10 @@ finalization
end.
{
$Log$
Revision 1.163 2004-04-29 19:56:36 daniel
Revision 1.164 2004-05-22 23:34:27 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.163 2004/04/29 19:56:36 daniel
* Prepare compiler infrastructure for multiple ansistring types
Revision 1.162 2004/04/18 07:52:43 florian

View File

@ -335,7 +335,8 @@ implementation
procedure T386IntelAssembler.WriteTree(p:TAAsmoutput);
const
allocstr : array[boolean] of string[10]=(' released',' allocated');
regallocstr : array[tregalloctype] of string[10]=(' released',' allocated','resized');
tempallocstr : array[boolean] of string[10]=(' released',' allocated');
var
s,
prefix,
@ -419,7 +420,7 @@ implementation
begin
if (cs_asm_regalloc in aktglobalswitches) then
AsmWriteLn(target_asm.comment+'Register '+masm_regname(tai_regalloc(hp).reg)+
allocstr[tai_regalloc(hp).allocation]);
regallocstr[tai_regalloc(hp).ratype]);
end;
ait_tempalloc :
@ -433,7 +434,7 @@ implementation
else
{$endif EXTDEBUG}
AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
tostr(tai_tempalloc(hp).tempsize)+allocstr[tai_tempalloc(hp).allocation]);
tostr(tai_tempalloc(hp).tempsize)+tempallocstr[tai_tempalloc(hp).allocation]);
end;
end;
@ -883,7 +884,10 @@ initialization
end.
{
$Log$
Revision 1.47 2004-03-17 12:03:00 olle
Revision 1.48 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.47 2004/03/17 12:03:00 olle
* bugfix for multiline string constants
Revision 1.46 2004/02/27 10:21:05 florian

View File

@ -354,7 +354,8 @@ interface
procedure T386NasmAssembler.WriteTree(p:taasmoutput);
const
allocstr : array[boolean] of string[10]=(' released',' allocated');
regallocstr : array[tregalloctype] of string[10]=(' released',' allocated','resized');
tempallocstr : array[boolean] of string[10]=(' released',' allocated');
var
s : string;
hp : tai;
@ -439,7 +440,7 @@ interface
begin
if (cs_asm_regalloc in aktglobalswitches) then
AsmWriteLn(#9#9+target_asm.comment+'Register '+nasm_regname(tai_regalloc(hp).reg)+
allocstr[tai_regalloc(hp).allocation]);
regallocstr[tai_regalloc(hp).ratype]);
end;
ait_tempalloc :
@ -453,7 +454,7 @@ interface
else
{$endif EXTDEBUG}
AsmWriteLn(target_asm.comment+'Temp '+tostr(tai_tempalloc(hp).temppos)+','+
tostr(tai_tempalloc(hp).tempsize)+allocstr[tai_tempalloc(hp).allocation]);
tostr(tai_tempalloc(hp).tempsize)+tempallocstr[tai_tempalloc(hp).allocation]);
end;
end;
@ -924,7 +925,10 @@ initialization
end.
{
$Log$
Revision 1.44 2004-02-27 10:21:05 florian
Revision 1.45 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.44 2004/02/27 10:21:05 florian
* top_symbol killed
+ refaddr to treference added
+ refsymbol to treference added

View File

@ -322,10 +322,12 @@ begin
while assigned(p) and
(p.typ=ait_RegAlloc) Do
begin
if tai_regalloc(p).allocation then
UsedRegs := UsedRegs + [tai_regalloc(p).reg]
else
UsedRegs := UsedRegs - [tai_regalloc(p).reg];
case tai_regalloc(p).ratype of
ra_alloc :
UsedRegs := UsedRegs + [tai_regalloc(p).reg];
ra_dealloc :
UsedRegs := UsedRegs - [tai_regalloc(p).reg];
end;
p := tai(p.next);
end;
until not(assigned(p)) or
@ -338,7 +340,7 @@ end;
{************************ Create the Label table ************************}
function findregalloc(reg: tregister; starttai: tai; alloc: boolean): boolean;
function findregalloc(reg: tregister; starttai: tai; ratyp: tregalloctype): boolean;
{ Returns true if a ait_alloc object for reg is found in the block of tai's }
{ starting with Starttai and ending with the next "real" instruction }
var
@ -355,7 +357,7 @@ begin
if assigned(starttai) and
(starttai.typ = ait_regalloc) then
begin
if (tai_regalloc(Starttai).allocation = alloc) and
if (tai_regalloc(Starttai).ratype = ratyp) and
(getsupreg(tai_regalloc(Starttai).reg) = supreg) then
begin
findregalloc:=true;
@ -379,7 +381,7 @@ procedure RemoveLastDeallocForFuncRes(asml: taasmoutput; p: tai);
hp2 := tai(hp2.previous);
if assigned(hp2) and
(hp2.typ = ait_regalloc) and
not(tai_regalloc(hp2).allocation) and
(tai_regalloc(hp2).ratype=ra_dealloc) and
(getregtype(tai_regalloc(hp2).reg) = R_INTREGISTER) and
(getsupreg(tai_regalloc(hp2).reg) = supreg) then
begin
@ -1087,10 +1089,14 @@ begin
(p.typ=ait_RegAlloc) Do
begin
if (getregtype(tai_regalloc(p).reg) = R_INTREGISTER) then
if tai_regalloc(p).allocation then
UsedRegs := UsedRegs + [getsupreg(tai_regalloc(p).reg)]
else
UsedRegs := UsedRegs - [getsupreg(tai_regalloc(p).reg)];
begin
case tai_regalloc(p).ratype of
ra_alloc :
UsedRegs := UsedRegs + [getsupreg(tai_regalloc(p).reg)];
ra_dealloc :
UsedRegs := UsedRegs - [getsupreg(tai_regalloc(p).reg)];
end;
end;
p := tai(p.next);
end;
until not(assigned(p)) or
@ -1146,10 +1152,10 @@ begin
begin
if first then
begin
firstRemovedWasAlloc := tai_regalloc(p1).allocation;
firstRemovedWasAlloc := (tai_regalloc(p1).ratype=ra_alloc);
first := false;
end;
lastRemovedWasDealloc := not tai_regalloc(p1).allocation;
lastRemovedWasDealloc := (tai_regalloc(p1).ratype=ra_dealloc);
hp := tai(p1.Next);
asml.Remove(p1);
p1.free;
@ -1193,7 +1199,7 @@ begin
p := tai(p.previous);
if (p.typ = ait_regalloc) and
(getsupreg(tai_regalloc(p).reg) = supreg) then
if not(tai_regalloc(p).allocation) then
if (tai_regalloc(p).ratype=ra_dealloc) then
if first then
begin
findregdealloc := true;
@ -2010,30 +2016,32 @@ begin
ait_regalloc:
begin
supreg:=getsupreg(tai_regalloc(p).reg);
if tai_regalloc(p).allocation then
begin
if not(supreg in usedregs) then
include(usedregs, supreg)
else
addregdeallocfor(list, tai_regalloc(p).reg, p);
end
else
begin
exclude(usedregs, supreg);
hp1 := p;
hp2 := nil;
while not(findregalloc(tai_regalloc(p).reg, tai(hp1.next),true)) and
getnextinstruction(hp1, hp1) and
regininstruction(getsupreg(tai_regalloc(p).reg), hp1) Do
hp2 := hp1;
if hp2 <> nil then
begin
hp1 := tai(p.previous);
list.remove(p);
insertllitem(list, hp2, tai(hp2.next), p);
p := hp1;
end;
end;
case tai_regalloc(p).ratype of
ra_alloc :
begin
if not(supreg in usedregs) then
include(usedregs, supreg)
else
addregdeallocfor(list, tai_regalloc(p).reg, p);
end;
ra_dealloc :
begin
exclude(usedregs, supreg);
hp1 := p;
hp2 := nil;
while not(findregalloc(tai_regalloc(p).reg, tai(hp1.next),ra_alloc)) and
getnextinstruction(hp1, hp1) and
regininstruction(getsupreg(tai_regalloc(p).reg), hp1) Do
hp2 := hp1;
if hp2 <> nil then
begin
hp1 := tai(p.previous);
list.remove(p);
insertllitem(list, hp2, tai(hp2.next), p);
p := hp1;
end;
end;
end;
end;
{$endif i386}
end;
@ -2711,7 +2719,10 @@ end.
{
$Log$
Revision 1.66 2004-02-27 19:55:23 jonas
Revision 1.67 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.66 2004/02/27 19:55:23 jonas
* fixed optimizer for new treference fields
Revision 1.65 2004/02/27 10:21:05 florian

View File

@ -114,7 +114,7 @@ implementation
end;
objectlibrary.getlabel(table);
{ make it a 32bit register }
indexreg:=cg.makeregsize(hregister,OS_INT);
indexreg:=cg.makeregsize(exprasmlist,hregister,OS_INT);
cg.a_load_reg_reg(exprasmlist,opsize,OS_INT,hregister,indexreg);
{ create reference }
reference_reset_symbol(href,table,0);
@ -224,7 +224,10 @@ begin
end.
{
$Log$
Revision 1.73 2004-02-27 10:21:05 florian
Revision 1.74 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.73 2004/02/27 10:21:05 florian
* top_symbol killed
+ refaddr to treference added
+ refsymbol to treference added

View File

@ -594,7 +594,7 @@ implementation
{ change register size after the unget because the
getregister was done for the full register }
location.register:=cg.getintregister(exprasmlist,cgsize);
cg.a_load_reg_reg(exprasmlist,cgsize,cgsize,cg.makeregsize(NR_FUNCTION_RESULT_REG,cgsize),location.register);
cg.a_load_reg_reg(exprasmlist,cgsize,cgsize,cg.makeregsize(exprasmlist,NR_FUNCTION_RESULT_REG,cgsize),location.register);
end;
end
else
@ -1272,7 +1272,10 @@ begin
end.
{
$Log$
Revision 1.165 2004-04-28 15:19:03 florian
Revision 1.166 2004-05-22 23:34:27 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.165 2004/04/28 15:19:03 florian
+ syscall directive support for MorphOS added
Revision 1.164 2004/03/14 20:10:56 peter

View File

@ -332,7 +332,7 @@ implementation
objectlibrary.getlabel(lengthlab);
cg.a_cmp_const_reg_label(exprasmlist,OS_ADDR,OC_EQ,0,left.location.register,lengthlab);
reference_reset_base(href,left.location.register,-8);
hregister:=cg.makeregsize(left.location.register,OS_32);
hregister:=cg.makeregsize(exprasmlist,left.location.register,OS_32);
cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,href,hregister);
cg.a_label(exprasmlist,lengthlab);
location_reset(location,LOC_REGISTER,OS_32);
@ -678,7 +678,10 @@ end.
{
$Log$
Revision 1.56 2004-03-02 00:36:33 olle
Revision 1.57 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.56 2004/03/02 00:36:33 olle
* big transformation of Tai_[const_]Symbol.Create[data]name*
Revision 1.55 2004/02/27 10:21:05 florian

View File

@ -533,7 +533,7 @@ implementation
LOC_REGISTER,
LOC_CREGISTER :
begin
r:=cg.makeregsize(right.location.register,OS_8);
r:=cg.makeregsize(exprasmlist,right.location.register,OS_8);
cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,r,href);
end;
LOC_REFERENCE,
@ -942,7 +942,10 @@ begin
end.
{
$Log$
Revision 1.115 2004-04-29 19:56:37 daniel
Revision 1.116 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.115 2004/04/29 19:56:37 daniel
* Prepare compiler infrastructure for multiple ansistring types
Revision 1.114 2004/03/02 17:32:12 florian

View File

@ -185,7 +185,7 @@ begin
end
else
cg.a_load_const_ref(exprasmlist,OS_8,tordconstnode(right).value,href2);
lengthreg:=cg.makeregsize(lengthreg,OS_8);
lengthreg:=cg.makeregsize(exprasmlist,lengthreg,OS_8);
{ increase the string length }
cg.a_op_const_reg(exprasmlist,OP_ADD,OS_8,1,lengthreg);
cg.a_load_reg_ref(exprasmlist,OS_8,OS_8,lengthreg,left.location.reference);
@ -201,7 +201,10 @@ end.
{
$Log$
Revision 1.12 2004-01-31 17:45:17 peter
Revision 1.13 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.12 2004/01/31 17:45:17 peter
* Change several $ifdef i386 to x86
* Change several OS_32 to OS_INT/OS_ADDR

View File

@ -324,7 +324,7 @@ implementation
cg.deallocexplicitregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
cg.g_exception_reason_save(list, t.reasonbuf);
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
cg.a_cmp_const_reg_label(list,OS_S32,OC_NE,0,cg.makeregsize(list,NR_FUNCTION_RESULT_REG,OS_S32),exceptlabel);
end;
@ -367,7 +367,7 @@ implementation
{ load a smaller size to OS_64 }
if l.loc=LOC_REGISTER then
begin
hregister:=cg.makeregsize(l.registerlow,OS_32);
hregister:=cg.makeregsize(list,l.registerlow,OS_32);
cg.a_load_reg_reg(list,l.size,OS_32,l.registerlow,hregister);
end
else
@ -470,7 +470,7 @@ implementation
if (TCGSize2Size[dst_size]<TCGSize2Size[l.size]) then
begin
if (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
l.register:=cg.makeregsize(l.register,dst_size);
l.register:=cg.makeregsize(list,l.register,dst_size);
{ for big endian systems, the reference's offset must }
{ be increased in this case, since they have the }
{ MSB first in memory and e.g. byte(word_var) should }
@ -538,7 +538,7 @@ implementation
if (TCGSize2Size[dst_size]<TCGSize2Size[l.size]) then
begin
if (l.loc in [LOC_REGISTER,LOC_CREGISTER]) then
l.register:=cg.makeregsize(l.register,dst_size);
l.register:=cg.makeregsize(list,l.register,dst_size);
{ for big endian systems, the reference's offset must }
{ be increased in this case, since they have the }
{ MSB first in memory and e.g. byte(word_var) should }
@ -1053,7 +1053,7 @@ implementation
{$endif cpu64bit}
begin
cg.getexplicitregister(list,NR_FUNCTION_RETURN_REG);
hreg:=cg.makeregsize(NR_FUNCTION_RETURN_REG,resloc.size);
hreg:=cg.makeregsize(list,NR_FUNCTION_RETURN_REG,resloc.size);
cg.ungetregister(list,hreg);
// for the optimizer
cg.a_reg_alloc(list,NR_FUNCTION_RETURN_REG);
@ -1094,7 +1094,7 @@ implementation
{$endif cpu64bit}
begin
cg.getexplicitregister(list,NR_FUNCTION_RETURN_REG);
hreg:=cg.makeregsize(NR_FUNCTION_RETURN_REG,resloc.size);
hreg:=cg.makeregsize(list,NR_FUNCTION_RETURN_REG,resloc.size);
cg.ungetregister(list,hreg);
// for the optimizer
cg.a_reg_alloc(list,NR_FUNCTION_RETURN_REG);
@ -2139,7 +2139,10 @@ implementation
end.
{
$Log$
Revision 1.199 2004-05-19 21:16:12 peter
Revision 1.200 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.199 2004/05/19 21:16:12 peter
* add DEBUGINFO symbol to reference the .o file that includes the
stabs info for types and global/static variables
* debuginfo flag added to ppu to indicate whether debuginfo is

View File

@ -1504,7 +1504,7 @@ implementation
while assigned(p) and
assigned(p.previous) and
(tai(p.previous).typ=ait_regalloc) and
tai_regalloc(p.previous).allocation and
(tai_regalloc(p.previous).ratype=ra_alloc) and
(tai_regalloc(p.previous).reg<>r) do
p:=tai(p.previous);
list.insertbefore(Tai_regalloc.dealloc(r),p);
@ -1542,11 +1542,19 @@ implementation
if (getregtype(reg)=regtype) then
begin
supreg:=getsupreg(reg);
if allocation then
live_registers.add(supreg)
else
live_registers.delete(supreg);
add_edges_used(supreg);
case ratype of
ra_alloc :
begin
live_registers.add(supreg);
add_edges_used(supreg);
end;
ra_dealloc :
begin
live_registers.delete(supreg);
add_edges_used(supreg);
end;
end;
{ constraints needs always to be updated }
add_constraints(reg);
end;
end;
@ -1604,7 +1612,7 @@ implementation
{ deallocation,allocation }
{ note: do not remove allocation,deallocation, those }
{ do have a real meaning }
(not(Tai_regalloc(previous).allocation) and allocation) then
(not(Tai_regalloc(previous).ratype=ra_alloc) and (ratype=ra_alloc)) then
begin
q:=Tai(next);
hp:=tai(previous);
@ -1674,7 +1682,7 @@ implementation
begin
supreg:=getsupreg(Tai_regalloc(p).reg);
{Rewind the register allocation.}
if Tai_regalloc(p).allocation then
if (Tai_regalloc(p).ratype=ra_alloc) then
live_registers.delete(supreg)
else
begin
@ -1715,10 +1723,12 @@ implementation
begin
if p.typ<>ait_regalloc then
internalerror(200305311);
if Tai_regalloc(p).allocation then
live_registers.add(getsupreg(Tai_regalloc(p).reg))
else
live_registers.delete(getsupreg(Tai_regalloc(p).reg));
case Tai_regalloc(p).ratype of
ra_alloc :
live_registers.add(getsupreg(Tai_regalloc(p).reg));
ra_dealloc :
live_registers.delete(getsupreg(Tai_regalloc(p).reg));
end;
p:=Tai(p.next);
end;
end;
@ -1779,10 +1789,14 @@ implementation
continue;
end
else
if allocation then
live_registers.add(supreg)
else
live_registers.delete(supreg);
begin
case ratype of
ra_alloc :
live_registers.add(supreg);
ra_dealloc :
live_registers.delete(supreg);
end;
end;
end;
end;
ait_instruction:
@ -2023,7 +2037,10 @@ implementation
end.
{
$Log$
Revision 1.125 2004-04-26 19:57:50 jonas
Revision 1.126 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.125 2004/04/26 19:57:50 jonas
* do not remove "allocation,deallocation" pairs, as those are important
for the optimizer

View File

@ -1030,7 +1030,7 @@ implementation
else
begin
{ packrecords is set explicit, ignore recordalignmax limit }
varalignrecord:=used_align(varalign,aktalignment.recordalignmin,varalign);
varalignrecord:=used_align(varalign,aktalignment.recordalignmin,usefieldalignment);
end;
recordalignment:=max(recordalignment,varalignrecord);
end;
@ -2308,7 +2308,10 @@ implementation
end.
{
$Log$
Revision 1.145 2004-04-29 19:56:37 daniel
Revision 1.146 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.145 2004/04/29 19:56:37 daniel
* Prepare compiler infrastructure for multiple ansistring types
Revision 1.144 2004/03/14 20:08:37 peter

View File

@ -451,7 +451,7 @@ unit cgx86;
(reference.index=NR_STACK_POINTER_REG) then
begin
pushsize:=int_cgsize(alignment);
list.concat(taicpu.op_reg(A_PUSH,tcgsize2opsize[pushsize],makeregsize(r,pushsize)));
list.concat(taicpu.op_reg(A_PUSH,tcgsize2opsize[pushsize],makeregsize(list,r,pushsize)));
end
else
inherited a_param_reg(list,size,r,locpara);
@ -591,7 +591,7 @@ unit cgx86;
which clears the upper 64 bit too, so it could be that s is S_L while the reg is
64 bit (FK) }
if s in [S_BL,S_WL,S_L] then
tmpreg:=makeregsize(tmpreg,OS_32);
tmpreg:=makeregsize(list,tmpreg,OS_32);
{$endif x86_64}
list.concat(taicpu.op_reg_reg(op,s,reg,tmpreg));
a_load_reg_ref(list,tosize,tosize,tmpreg,ref);
@ -615,7 +615,7 @@ unit cgx86;
which clears the upper 64 bit too, so it could be that s is S_L while the reg is
64 bit (FK) }
if s in [S_BL,S_WL,S_L] then
reg:=makeregsize(reg,OS_32);
reg:=makeregsize(list,reg,OS_32);
{$endif x86_64}
list.concat(taicpu.op_ref_reg(op,s,ref,reg));
end;
@ -631,7 +631,7 @@ unit cgx86;
check_register_size(tosize,reg2);
if tcgsize2size[fromsize]>tcgsize2size[tosize] then
begin
reg1:=makeregsize(reg1,tosize);
reg1:=makeregsize(list,reg1,tosize);
s:=tcgsize2opsize[tosize];
op:=A_MOV;
end
@ -642,7 +642,7 @@ unit cgx86;
which clears the upper 64 bit too, so it could be that s is S_L while the reg is
64 bit (FK) }
if s in [S_BL,S_WL,S_L] then
reg2:=makeregsize(reg2,OS_32);
reg2:=makeregsize(list,reg2,OS_32);
{$endif x86_64}
instr:=taicpu.op_reg_reg(op,s,reg1,reg2);
{ Notify the register allocator that we have written a move instruction so
@ -1053,7 +1053,7 @@ unit cgx86;
OP_SHR,OP_SHL,OP_SAR:
begin
getexplicitregister(list,NR_CL);
a_load_reg_reg(list,OS_8,OS_8,makeregsize(src,OS_8),NR_CL);
a_load_reg_reg(list,OS_8,OS_8,makeregsize(list,src,OS_8),NR_CL);
list.concat(taicpu.op_reg_reg(Topcg2asmop[op],tcgsize2opsize[size],NR_CL,src));
ungetregister(list,NR_CL);
end;
@ -1082,7 +1082,7 @@ unit cgx86;
internalerror(200109239);
else
begin
reg := makeregsize(reg,size);
reg := makeregsize(list,reg,size);
list.concat(taicpu.op_ref_reg(TOpCG2AsmOp[op],tcgsize2opsize[size],ref,reg));
end;
end;
@ -1268,7 +1268,7 @@ unit cgx86;
ai : taicpu;
hreg : tregister;
begin
hreg:=makeregsize(reg,OS_8);
hreg:=makeregsize(list,reg,OS_8);
ai:=Taicpu.op_reg(A_SETcc,S_B,hreg);
ai.setcondition(flags_to_cond(f));
list.concat(ai);
@ -1790,7 +1790,10 @@ unit cgx86;
end.
{
$Log$
Revision 1.121 2004-04-28 15:19:03 florian
Revision 1.122 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.121 2004/04/28 15:19:03 florian
+ syscall directive support for MorphOS added
Revision 1.120 2004/04/09 14:36:05 peter

View File

@ -332,7 +332,7 @@ implementation
{ need a cmp and jmp, but this should be done by the }
{ type cast code which does range checking if necessary (FK) }
begin
hregister:=cg.makeregsize(Tcallparanode(Tcallparanode(left).right).left.location.register,OS_INT);
hregister:=cg.makeregsize(exprasmlist,Tcallparanode(Tcallparanode(left).right).left.location.register,OS_INT);
end
else
begin
@ -353,7 +353,10 @@ implementation
end.
{
$Log$
Revision 1.2 2004-02-27 10:21:06 florian
Revision 1.3 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.2 2004/02/27 10:21:06 florian
* top_symbol killed
+ refaddr to treference added
+ refsymbol to treference added

View File

@ -206,7 +206,7 @@ implementation
{ use the register as base in a reference (JM) }
if ranges then
begin
pleftreg:=cg.makeregsize(left.location.register,OS_ADDR);
pleftreg:=cg.makeregsize(exprasmlist,left.location.register,OS_ADDR);
cg.a_load_reg_reg(exprasmlist,left.location.size,OS_ADDR,left.location.register,pleftreg);
if opsize<>OS_ADDR then
cg.a_op_const_reg(exprasmlist,OP_AND,OS_ADDR,255,pleftreg);
@ -216,7 +216,7 @@ implementation
{ otherwise simply use the lower 8 bits (no "and" }
{ necessary this way) (JM) }
begin
pleftreg:=cg.makeregsize(left.location.register,OS_8);
pleftreg:=cg.makeregsize(exprasmlist,left.location.register,OS_8);
opsize := OS_8;
end;
end
@ -353,7 +353,7 @@ implementation
LOC_REGISTER,
LOC_CREGISTER:
begin
hr:=cg.makeregsize(left.location.register,OS_32);
hr:=cg.makeregsize(exprasmlist,left.location.register,OS_32);
cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hr);
end;
else
@ -414,7 +414,7 @@ implementation
LOC_REGISTER,
LOC_CREGISTER:
begin
hr:=cg.makeregsize(left.location.register,OS_32);
hr:=cg.makeregsize(exprasmlist,left.location.register,OS_32);
cg.a_load_reg_reg(exprasmlist,left.location.size,OS_32,left.location.register,hr);
cg.a_cmp_const_reg_label(exprasmlist,OS_32,OC_BE,31,hr,l);
{ reset carry flag }
@ -472,7 +472,7 @@ implementation
else
begin
if (left.location.loc in [LOC_REGISTER,LOC_CREGISTER]) then
pleftreg:=cg.makeregsize(left.location.register,OS_32)
pleftreg:=cg.makeregsize(exprasmlist,left.location.register,OS_32)
else
pleftreg:=cg.getintregister(exprasmlist,OS_32);
cg.a_load_loc_reg(exprasmlist,OS_32,left.location,pleftreg);
@ -495,7 +495,10 @@ begin
end.
{
$Log$
Revision 1.2 2004-02-27 10:21:06 florian
Revision 1.3 2004-05-22 23:34:28 peter
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
Revision 1.2 2004/02/27 10:21:06 florian
* top_symbol killed
+ refaddr to treference added
+ refsymbol to treference added