浏览代码

* temp fix/hack for nested procedures (disable regvars in all procedures
that have nested procedures)
* leave register parameters in their own register (instead of storing
them to memory or assigning them to another register) if the current
procedure doesn't call any other procedures

Jonas Maebe 22 年之前
父节点
当前提交
a6d430204c
共有 1 个文件被更改,包括 44 次插入3 次删除
  1. 44 3
      compiler/regvars.pas

+ 44 - 3
compiler/regvars.pas

@@ -52,8 +52,9 @@ implementation
     uses
     uses
       globtype,systems,comphook,
       globtype,systems,comphook,
       cutils,cclasses,verbose,globals,
       cutils,cclasses,verbose,globals,
+      psub,
       symconst,symbase,symtype,symdef,paramgr,defutil,
       symconst,symbase,symtype,symdef,paramgr,defutil,
-      cgbase,cgobj,rgcpu;
+      cpuinfo,cgbase,cgobj,rgcpu;
 
 
 
 
     procedure searchregvars(p : tnamedindexitem;arg:pointer);
     procedure searchregvars(p : tnamedindexitem;arg:pointer);
@@ -140,6 +141,9 @@ implementation
     procedure assign_regvars(p: tnode);
     procedure assign_regvars(p: tnode);
           { register variables }
           { register variables }
     var
     var
+{$ifndef i386}
+      hp: tparaitem;
+{$endif i386}
       regvarinfo: pregvarinfo;
       regvarinfo: pregvarinfo;
       i: longint;
       i: longint;
       parasym : boolean;
       parasym : boolean;
@@ -150,6 +154,10 @@ implementation
       { only if no asm is used }
       { only if no asm is used }
       { and no try statement   }
       { and no try statement   }
       if (cs_regalloc in aktglobalswitches) and
       if (cs_regalloc in aktglobalswitches) and
+{$ifndef i386}
+         { we have to store regvars back to memory in this case! }
+         (tcgprocinfo(current_procinfo).nestedprocs.count = 0) and
+{$endif i386}
          not(pi_uses_asm in current_procinfo.flags) and
          not(pi_uses_asm in current_procinfo.flags) and
          not(pi_uses_exceptions in current_procinfo.flags) then
          not(pi_uses_exceptions in current_procinfo.flags) then
         begin
         begin
@@ -162,7 +170,33 @@ implementation
               symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
               symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
               { copy parameter into a register ? }
               { copy parameter into a register ? }
               parasym:=true;
               parasym:=true;
-              symtablestack.next.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
+{$ifndef i386}
+              if (pi_do_call in current_procinfo.flags) then
+{$endif i386}
+                begin
+                  symtablestack.next.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
+                end
+{$ifndef i386}
+              else
+                begin
+                  hp:=tparaitem(current_procdef.para.first);
+                  while assigned(hp) do
+                    begin
+                      if (hp.paraloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,
+                            LOC_MMREGISTER,LOC_CREGISTER,LOC_CFPUREGISTER,
+                            LOC_CMMREGISTER]) and
+                         (TCGSize2Size[hp.paraloc.size] <= sizeof(aword)) then
+                        tvarsym(hp.parasym).reg := hp.paraloc.register
+                      else
+                        begin
+                          searchregvars(hp.parasym,@parasym);
+                          searchfpuregvars(hp.parasym,@parasym);
+                        end;
+                    hp := tparaitem(hp.next);
+                  end;
+                end
+{$endif not i386}
+              ;
               { hold needed registers free }
               { hold needed registers free }
               for i:=maxvarregs downto maxvarregs-p.registers32+1 do
               for i:=maxvarregs downto maxvarregs-p.registers32+1 do
                 begin
                 begin
@@ -572,7 +606,14 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.52  2003-05-30 18:55:21  jonas
+  Revision 1.53  2003-05-31 20:33:57  jonas
+    * temp fix/hack for nested procedures (disable regvars in all procedures
+      that have nested procedures)
+    * leave register parameters in their own register (instead of storing
+      them to memory or assigning them to another register) if the current
+      procedure doesn't call any other procedures
+
+  Revision 1.52  2003/05/30 18:55:21  jonas
     * fixed several regvar related bugs for non-i386. make cycle with -Or now
     * fixed several regvar related bugs for non-i386. make cycle with -Or now
       works for ppc
       works for ppc