mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 17:59:45 +02:00
* funnel all the wasm local var allocation, done by the register allocator, through the temp generator
git-svn-id: branches/wasm@47786 -
This commit is contained in:
parent
a38c3c682d
commit
ae60449699
@ -99,7 +99,7 @@ unit tgobj;
|
||||
procedure gethltempmanaged(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference); virtual;
|
||||
procedure gettemp(list: TAsmList; size: asizeint; alignment: shortint; temptype: ttemptype; out ref : treference);
|
||||
procedure gettempmanaged(list: TAsmList; def:tdef;temptype:ttemptype;out ref : treference);
|
||||
procedure ungettemp(list: TAsmList; const ref : treference);
|
||||
procedure ungettemp(list: TAsmList; const ref : treference); virtual;
|
||||
|
||||
function sizeoftemp(list: TAsmList; const ref: treference): asizeint;
|
||||
function changetemptype(list: TAsmList; const ref:treference;temptype:ttemptype):boolean;
|
||||
|
@ -30,7 +30,7 @@ unit rgcpu;
|
||||
aasmbase,aasmcpu,aasmtai,aasmdata,
|
||||
cgbase,cgutils, procinfo,
|
||||
cpubase,
|
||||
rgobj, tgcpu;
|
||||
rgobj;
|
||||
|
||||
type
|
||||
tspilltemps = array[tregistertype] of ^Tspill_temp_list;
|
||||
@ -53,7 +53,8 @@ implementation
|
||||
verbose,cutils,
|
||||
globtype,globals,
|
||||
cgobj,
|
||||
tgobj;
|
||||
tgobj,
|
||||
symtype,symdef;
|
||||
|
||||
{ trgcpu }
|
||||
|
||||
@ -320,36 +321,6 @@ implementation
|
||||
until not removedsomething;
|
||||
end;
|
||||
|
||||
function registertobastype(const reg: TRegister): TWasmBasicType;
|
||||
begin
|
||||
case getregtype(reg) of
|
||||
R_INTREGISTER:
|
||||
case getsubreg(reg) of
|
||||
R_SUBD:
|
||||
registertobastype:=wbt_i32;
|
||||
R_SUBQ:
|
||||
registertobastype:=wbt_i64;
|
||||
else
|
||||
internalerror(2020120801);
|
||||
end;
|
||||
|
||||
R_ADDRESSREGISTER:
|
||||
registertobastype:=wbt_i32;
|
||||
|
||||
R_FPUREGISTER:
|
||||
case getsubreg(reg) of
|
||||
R_SUBFS:
|
||||
registertobastype:=wbt_f32;
|
||||
R_SUBFD:
|
||||
registertobastype:=wbt_f64;
|
||||
else
|
||||
internalerror(2020120802);
|
||||
end;
|
||||
else
|
||||
internalerror(2010122912);
|
||||
end;
|
||||
end;
|
||||
|
||||
class procedure trgcpu.do_all_register_allocation(list: TAsmList; headertai: tai);
|
||||
var
|
||||
spill_temps : tspilltemps;
|
||||
@ -363,12 +334,12 @@ implementation
|
||||
lastins : TLinkedListItem;
|
||||
//locavail : array[TWasmBasicType] of tlocalalloc; // used or not
|
||||
|
||||
wbt : TWasmBasicType;
|
||||
ra : tai_regalloc;
|
||||
idx : integer;
|
||||
fidx : integer;
|
||||
pidx : integer;
|
||||
t: treftemppos;
|
||||
def: tdef;
|
||||
|
||||
begin
|
||||
{ Since there are no actual registers, we simply spill everything. We
|
||||
@ -401,25 +372,39 @@ implementation
|
||||
ait_regalloc:
|
||||
begin
|
||||
ra := tai_regalloc(p);
|
||||
wbt := registertobastype(ra.reg);
|
||||
case getregtype(ra.reg) of
|
||||
R_INTREGISTER:
|
||||
case getsubreg(ra.reg) of
|
||||
R_SUBD:
|
||||
size:=4;
|
||||
begin
|
||||
size:=4;
|
||||
def:=s32inttype;
|
||||
end;
|
||||
R_SUBQ:
|
||||
size:=8;
|
||||
begin
|
||||
size:=8;
|
||||
def:=s64inttype;
|
||||
end;
|
||||
else
|
||||
internalerror(2020120803);
|
||||
end;
|
||||
R_ADDRESSREGISTER:
|
||||
size:=4;
|
||||
begin
|
||||
size:=4;
|
||||
def:=voidpointertype;
|
||||
end;
|
||||
R_FPUREGISTER:
|
||||
case getsubreg(ra.reg) of
|
||||
R_SUBFS:
|
||||
size:=4;
|
||||
begin
|
||||
size:=4;
|
||||
def:=s32floattype;
|
||||
end;
|
||||
R_SUBFD:
|
||||
size:=8;
|
||||
begin
|
||||
size:=8;
|
||||
def:=s64floattype;
|
||||
end;
|
||||
else
|
||||
internalerror(2020120804);
|
||||
end;
|
||||
@ -428,36 +413,12 @@ implementation
|
||||
end;
|
||||
case ra.ratype of
|
||||
ra_alloc :
|
||||
begin
|
||||
ttgwasm(tg).allocLocalVarToRef(wbt, spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)]);
|
||||
{
|
||||
tg.gettemp(templist,
|
||||
size,1,
|
||||
tt_regallocator,spill_temps[getregtype(reg)]^[getsupreg(reg)]);
|
||||
|
||||
}
|
||||
(*wasmloc.
|
||||
pidx := fidx;
|
||||
idx := wasmloc.alloc(wbt);
|
||||
if idx<0 then
|
||||
internalerror(201909173); // ran out of local variables! ... must be dynamic
|
||||
|
||||
//spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)].temppos := idx;
|
||||
//spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)].isfloat := true;
|
||||
//tg.gettemp(templist,
|
||||
//size,1,
|
||||
//tt_regallocator,spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)]);
|
||||
t.val:=idx;
|
||||
reference_reset_base(spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)],current_procinfo.framepointer,idx,t,size,[]);
|
||||
wasm
|
||||
|
||||
if fidx<>pidx then // new local variable allocated
|
||||
templist.Concat( tai_local.create(wbt));*)
|
||||
end;
|
||||
tg.gethltemp(templist,def,
|
||||
size,
|
||||
tt_regallocator,spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)]);
|
||||
ra_dealloc :
|
||||
begin
|
||||
ttgwasm(tg).deallocLocalVar(wbt, spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)].offset);
|
||||
//tg.ungettemp(templist,spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)]);
|
||||
tg.ungettemp(templist,spill_temps[getregtype(ra.reg)]^[getsupreg(ra.reg)]);
|
||||
{ don't invalidate the temp reference, may still be used one instruction
|
||||
later }
|
||||
end;
|
||||
|
@ -58,6 +58,7 @@ unit tgcpu;
|
||||
destructor Destroy; override;
|
||||
function alloc(bt: TWasmBasicType): integer;
|
||||
procedure dealloc(bt: TWasmBasicType; index: integer);
|
||||
procedure dealloc(index: integer);
|
||||
end;
|
||||
|
||||
{ ttgwasm }
|
||||
@ -77,6 +78,7 @@ unit tgcpu;
|
||||
procedure getlocal(list: TAsmList; size: asizeint; alignment: shortint; def: tdef; var ref: treference); override;
|
||||
procedure gethltemp(list: TAsmList; def: tdef; forcesize: asizeint; temptype: ttemptype; out ref: treference); override;
|
||||
procedure gethltempmanaged(list: TAsmList; def: tdef; temptype: ttemptype; out ref: treference); override;
|
||||
procedure ungettemp(list: TAsmList; const ref : treference); override;
|
||||
|
||||
procedure allocLocalVarToRef(wbt: TWasmBasicType; out ref: treference);
|
||||
procedure deallocLocalVar(wbt: TWasmBasicType; idx: integer);
|
||||
@ -382,6 +384,14 @@ unit tgcpu;
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure ttgwasm.ungettemp(list: TAsmList; const ref: treference);
|
||||
begin
|
||||
if ref.base=NR_LOCAL_STACK_POINTER_REG then
|
||||
localvars.dealloc(ref.offset)
|
||||
else
|
||||
inherited;
|
||||
end;
|
||||
|
||||
procedure ttgwasm.allocLocalVarToRef(wbt: TWasmBasicType; out ref: treference);
|
||||
var
|
||||
idx : integer;
|
||||
@ -441,6 +451,13 @@ unit tgcpu;
|
||||
if Assigned(lc) then lc.inuse := false;
|
||||
end;
|
||||
|
||||
procedure TWasmLocalVars.dealloc(index: integer);
|
||||
var
|
||||
bt: TWasmBasicType;
|
||||
begin
|
||||
for bt in TWasmBasicType do
|
||||
dealloc(bt,index);
|
||||
end;
|
||||
|
||||
|
||||
initialization
|
||||
|
Loading…
Reference in New Issue
Block a user