mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 14:59:32 +02:00
tai_regalloc.allocation changed to ratype to notify rgobj of register size changes
This commit is contained in:
parent
fac96dd2ed
commit
5358278ca1
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user