浏览代码

* funnel all the wasm local var allocation, done by the register allocator, through the temp generator

git-svn-id: branches/wasm@47786 -
nickysn 4 年之前
父节点
当前提交
ae60449699
共有 3 个文件被更改,包括 46 次插入68 次删除
  1. 1 1
      compiler/tgobj.pas
  2. 28 67
      compiler/wasm32/rgcpu.pas
  3. 17 0
      compiler/wasm32/tgcpu.pas

+ 1 - 1
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;

+ 28 - 67
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;

+ 17 - 0
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