* 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:
nickysn 2020-12-16 13:26:27 +00:00
parent a38c3c682d
commit ae60449699
3 changed files with 46 additions and 68 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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