From ae604496992183eafb52f44738f51dcd1ab90ee6 Mon Sep 17 00:00:00 2001 From: nickysn Date: Wed, 16 Dec 2020 13:26:27 +0000 Subject: [PATCH] * funnel all the wasm local var allocation, done by the register allocator, through the temp generator git-svn-id: branches/wasm@47786 - --- compiler/tgobj.pas | 2 +- compiler/wasm32/rgcpu.pas | 95 ++++++++++++--------------------------- compiler/wasm32/tgcpu.pas | 17 +++++++ 3 files changed, 46 insertions(+), 68 deletions(-) diff --git a/compiler/tgobj.pas b/compiler/tgobj.pas index 46f4fdccf8..05bb6b47ed 100644 --- a/compiler/tgobj.pas +++ b/compiler/tgobj.pas @@ -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; diff --git a/compiler/wasm32/rgcpu.pas b/compiler/wasm32/rgcpu.pas index 66a0e7d234..c36b56fccc 100644 --- a/compiler/wasm32/rgcpu.pas +++ b/compiler/wasm32/rgcpu.pas @@ -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; diff --git a/compiler/wasm32/tgcpu.pas b/compiler/wasm32/tgcpu.pas index df04f762ff..22fee664db 100644 --- a/compiler/wasm32/tgcpu.pas +++ b/compiler/wasm32/tgcpu.pas @@ -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