瀏覽代碼

* remove duplicate temp allocation for register saving
* cleanup register saving code by using a procinfo flag if registers
were saved on the stack

git-svn-id: trunk@9293 -

peter 17 年之前
父節點
當前提交
f704ee2d70
共有 2 個文件被更改,包括 8 次插入11 次删除
  1. 5 10
      compiler/cgobj.pas
  2. 3 1
      compiler/globtype.pas

+ 5 - 10
compiler/cgobj.pas

@@ -3618,14 +3618,13 @@ implementation
                 inc(size,tcgsize2size[OS_VECTOR]);
                 inc(size,tcgsize2size[OS_VECTOR]);
           end;
           end;
 
 
-        tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
-
         if size>0 then
         if size>0 then
           begin
           begin
             tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
             tg.GetTemp(list,size,tt_noreuse,current_procinfo.save_regs_ref);
+            include(current_procinfo.flags,pi_has_saved_regs);
+
             { Copy registers to temp }
             { Copy registers to temp }
             href:=current_procinfo.save_regs_ref;
             href:=current_procinfo.save_regs_ref;
-
             for r:=low(saved_standard_registers) to high(saved_standard_registers) do
             for r:=low(saved_standard_registers) to high(saved_standard_registers) do
               begin
               begin
                 if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
                 if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
@@ -3660,10 +3659,10 @@ implementation
         href     : treference;
         href     : treference;
         r        : integer;
         r        : integer;
         hreg     : tregister;
         hreg     : tregister;
-        freetemp : boolean;
       begin
       begin
+        if not(pi_has_saved_regs in current_procinfo.flags) then
+          exit;
         { Copy registers from temp }
         { Copy registers from temp }
-        freetemp:=false;
         href:=current_procinfo.save_regs_ref;
         href:=current_procinfo.save_regs_ref;
         for r:=low(saved_standard_registers) to high(saved_standard_registers) do
         for r:=low(saved_standard_registers) to high(saved_standard_registers) do
           if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
           if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
@@ -3673,7 +3672,6 @@ implementation
               a_reg_alloc(list,hreg);
               a_reg_alloc(list,hreg);
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
               a_load_ref_reg(list,OS_ADDR,OS_ADDR,href,hreg);
               inc(href.offset,sizeof(aint));
               inc(href.offset,sizeof(aint));
-              freetemp:=true;
             end;
             end;
 
 
         if uses_registers(R_MMREGISTER) then
         if uses_registers(R_MMREGISTER) then
@@ -3690,13 +3688,10 @@ implementation
                     a_reg_alloc(list,hreg);
                     a_reg_alloc(list,hreg);
                     a_loadmm_ref_reg(list,OS_VECTOR,OS_VECTOR,href,hreg,nil);
                     a_loadmm_ref_reg(list,OS_VECTOR,OS_VECTOR,href,hreg,nil);
                     inc(href.offset,tcgsize2size[OS_VECTOR]);
                     inc(href.offset,tcgsize2size[OS_VECTOR]);
-                    freetemp:=true;
                   end;
                   end;
               end;
               end;
           end;
           end;
-
-        if freetemp then
-          tg.UnGetTemp(list,current_procinfo.save_regs_ref);
+        tg.UnGetTemp(list,current_procinfo.save_regs_ref);
       end;
       end;
 
 
 
 

+ 3 - 1
compiler/globtype.pas

@@ -334,7 +334,9 @@ interface
          { calls itself recursive }
          { calls itself recursive }
          pi_is_recursive,
          pi_is_recursive,
          { stack frame optimization not possible (only on x86 probably) }
          { stack frame optimization not possible (only on x86 probably) }
-         pi_needs_stackframe
+         pi_needs_stackframe,
+         { set if the procedure has at least one register saved on the stack }
+         pi_has_saved_regs
        );
        );
        tprocinfoflags=set of tprocinfoflag;
        tprocinfoflags=set of tprocinfoflag;