Bladeren bron

* 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 jaren geleden
bovenliggende
commit
a6d430204c
1 gewijzigde bestanden met toevoegingen van 44 en 3 verwijderingen
  1. 44 3
      compiler/regvars.pas

+ 44 - 3
compiler/regvars.pas

@@ -52,8 +52,9 @@ implementation
     uses
       globtype,systems,comphook,
       cutils,cclasses,verbose,globals,
+      psub,
       symconst,symbase,symtype,symdef,paramgr,defutil,
-      cgbase,cgobj,rgcpu;
+      cpuinfo,cgbase,cgobj,rgcpu;
 
 
     procedure searchregvars(p : tnamedindexitem;arg:pointer);
@@ -140,6 +141,9 @@ implementation
     procedure assign_regvars(p: tnode);
           { register variables }
     var
+{$ifndef i386}
+      hp: tparaitem;
+{$endif i386}
       regvarinfo: pregvarinfo;
       i: longint;
       parasym : boolean;
@@ -150,6 +154,10 @@ implementation
       { only if no asm is used }
       { and no try statement   }
       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_exceptions in current_procinfo.flags) then
         begin
@@ -162,7 +170,33 @@ implementation
               symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
               { copy parameter into a register ? }
               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 }
               for i:=maxvarregs downto maxvarregs-p.registers32+1 do
                 begin
@@ -572,7 +606,14 @@ end.
 
 {
   $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
       works for ppc