Sfoglia il codice sorgente

* fixed several regvar related bugs for non-i386. make cycle with -Or now
works for ppc

Jonas Maebe 22 anni fa
parent
commit
0357f71e14
3 ha cambiato i file con 64 aggiunte e 10 eliminazioni
  1. 25 3
      compiler/ncgflw.pas
  2. 19 4
      compiler/regvars.pas
  3. 20 3
      compiler/rgobj.pas

+ 25 - 3
compiler/ncgflw.pas

@@ -180,6 +180,7 @@ implementation
 
       var
          hl,otlabel,oflabel : tasmlabel;
+{$ifdef i386}
          org_regvar_loaded_other,
          then_regvar_loaded_other,
          else_regvar_loaded_other : regvarother_booleanarray;
@@ -189,6 +190,7 @@ implementation
          org_list,
          then_list,
          else_list : taasmoutput;
+{$endif i386}
 
       begin
          location_reset(location,LOC_VOID,OS_NO);
@@ -202,7 +204,7 @@ implementation
       {$endif}
          secondpass(left);
 
-
+{$ifdef i386}
          { save regvars loaded in the beginning so that we can restore them }
          { when processing the else-block                                   }
          if cs_regalloc in aktglobalswitches then
@@ -210,13 +212,16 @@ implementation
              org_list := exprasmlist;
              exprasmlist := taasmoutput.create;
            end;
+{$endif i386}
          maketojumpbool(exprasmlist,left,lr_dont_load_regvars);
 
+{$ifdef i386}
          if cs_regalloc in aktglobalswitches then
            begin
              org_regvar_loaded_int := rg.regvar_loaded_int;
              org_regvar_loaded_other := rg.regvar_loaded_other;
            end;
+{$endif i386}
 
          if assigned(right) then
            begin
@@ -227,6 +232,7 @@ implementation
               secondpass(right);
            end;
 
+{$ifdef i386}
          { save current asmlist (previous instructions + then-block) and }
          { loaded regvar state and create new clean ones                 }
          if cs_regalloc in aktglobalswitches then
@@ -238,6 +244,7 @@ implementation
              then_list := exprasmlist;
              exprasmlist := taasmoutput.create;
            end;
+{$endif i386}
 
          if assigned(t1) then
            begin
@@ -245,10 +252,15 @@ implementation
                 begin
                    objectlibrary.getlabel(hl);
                    { do go back to if line !! }
+{$ifdef i386}
                    if not(cs_regalloc in aktglobalswitches) then
+{$endif i386}
                      aktfilepos:=exprasmList.getlasttaifilepos^
+{$ifdef i386}
                    else
-                     aktfilepos:=then_list.getlasttaifilepos^;
+                     aktfilepos:=then_list.getlasttaifilepos^
+{$endif i386}
+                   ;
                    cg.a_jmp_always(exprasmlist,hl);
                 end;
               cg.a_label(exprasmlist,falselabel);
@@ -256,6 +268,7 @@ implementation
               rg.cleartempgen;
             {$endif}
               secondpass(t1);
+{$ifdef i386}
               { save current asmlist (previous instructions + else-block) }
               { and loaded regvar state and create a new clean list       }
               if cs_regalloc in aktglobalswitches then
@@ -265,11 +278,13 @@ implementation
                   else_list := exprasmlist;
                   exprasmlist := taasmoutput.create;
                 end;
+{$endif i386}
               if assigned(right) then
                 cg.a_label(exprasmlist,hl);
            end
          else
            begin
+{$ifdef i386}
               if cs_regalloc in aktglobalswitches then
                 begin
                   else_regvar_loaded_int := rg.regvar_loaded_int;
@@ -277,6 +292,7 @@ implementation
                   else_list := exprasmlist;
                   exprasmlist := taasmoutput.create;
                 end;
+{$endif i386}
               cg.a_label(exprasmlist,falselabel);
            end;
          if not(assigned(right)) then
@@ -284,6 +300,7 @@ implementation
               cg.a_label(exprasmlist,truelabel);
            end;
 
+{$ifdef i386}
          if cs_regalloc in aktglobalswitches then
            begin
              { add loads of regvars at the end of the then- and else-blocks  }
@@ -316,6 +333,7 @@ implementation
              exprasmlist.free;
              exprasmlist := org_list;
            end;
+{$endif i386}
          truelabel:=otlabel;
          falselabel:=oflabel;
       end;
@@ -1403,7 +1421,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.64  2003-05-26 21:17:17  peter
+  Revision 1.65  2003-05-30 18:55:21  jonas
+    * fixed several regvar related bugs for non-i386. make cycle with -Or now
+      works for ppc
+
+  Revision 1.64  2003/05/26 21:17:17  peter
     * procinlinenode removed
     * aktexit2label removed, fast exit removed
     + tcallnode.inlined_pass_2 added

+ 19 - 4
compiler/regvars.pas

@@ -40,10 +40,12 @@ interface
     procedure load_regvar_reg(asml: TAAsmoutput; reg: tregister);
     procedure load_all_regvars(asml: TAAsmoutput);
 
+{$ifdef i386}
     procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
       regvarsloaded2: regvarother_booleanarray);
     procedure sync_regvars_int(list1, list2: taasmoutput; const regvarsloaded1,
       regvarsloaded2: Tsupregset);
+{$endif i386}
 
 implementation
 
@@ -154,7 +156,7 @@ implementation
           new(regvarinfo);
           fillchar(regvarinfo^,sizeof(regvarinfo^),0);
           current_procdef.regvarinfo := regvarinfo;
-          if (p.registers32<4) then
+          if (p.registers32<maxvarregs) then
             begin
               parasym:=false;
               symtablestack.foreach_static({$ifdef FPCPROCVAR}@{$endif}searchregvars,@parasym);
@@ -197,8 +199,10 @@ implementation
 
                       regvarinfo^.regvars[i].reg.enum:=R_INTREGISTER;
                       regvarinfo^.regvars[i].reg.number:=(varregs[i] shl 8) or cgsize2subreg(siz);
+{$ifdef i386}
                       { procedure uses this register }
                       include(rg.usedintinproc,varregs[i]);
+{$endif i386}
                     end
                   else
                     begin
@@ -253,6 +257,7 @@ implementation
                        r.enum:=R_ST0;
                        regvarinfo^.fpuregvars[i].reg:=trgcpu(rg).correct_fpuregister(r,i);
 {$else i386}
+                       regvarinfo^.fpuregvars[i].reg.enum:=fpuvarregs[i];
                        rg.makeregvarother(regvarinfo^.fpuregvars[i].reg);
 {$endif i386}
                      end;
@@ -271,6 +276,7 @@ implementation
       regvarinfo: pregvarinfo;
       vsym: tvarsym;
     begin
+{$ifdef i386}
       regvarinfo := pregvarinfo(current_procdef.regvarinfo);
       if not assigned(regvarinfo) then
         exit;
@@ -321,6 +327,7 @@ implementation
                   end;
               end;
         end;
+{$endif i386}
     end;
 
     procedure load_regvar(asml: TAAsmoutput; vsym: tvarsym);
@@ -330,6 +337,9 @@ implementation
       r,
       reg : tregister;
     begin
+{$ifndef i386}
+      exit;
+{$endif i386}
       reg:=vsym.reg;
       if reg.enum=R_INTREGISTER then
         begin
@@ -472,7 +482,7 @@ implementation
         end;
     end;
 
-
+{$ifdef i386}
     procedure sync_regvars_other(list1, list2: taasmoutput; const regvarsloaded1,
       regvarsloaded2: regvarother_booleanarray);
     var
@@ -510,6 +520,7 @@ implementation
               load_regvar_reg(list1,r);
         end;
     end;
+{$endif i386}
 
 
     procedure cleanup_regvars(asml: TAAsmoutput);
@@ -544,7 +555,7 @@ implementation
                     end
                   else
                     begin
-                      reg.number:=(r.number and not $ff) or cgsize2subreg(OS_INT);
+                      reg.number:=(reg.number and not $ff) or cgsize2subreg(OS_INT);
                       r:=reg;
                       convert_register_to_enum(r);
                       if r.enum>lastreg then
@@ -561,7 +572,11 @@ end.
 
 {
   $Log$
-  Revision 1.51  2003-05-23 14:27:35  peter
+  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
+
+  Revision 1.51  2003/05/23 14:27:35  peter
     * remove some unit dependencies
     * current_procinfo changes to store more info
 

+ 20 - 3
compiler/rgobj.pas

@@ -1109,11 +1109,13 @@ unit rgobj;
     var regi:Tsuperregister;
 
     begin
+{$ifdef i386}
       for regi:=firstsaveintreg to lastsaveintreg do
         begin
           if (regi in s) then
             inc(reg_pushes_int[regi],t_times*2);
         end;
+{$endif i386}
     end;
 
     procedure trgobj.incrementotherregisterpushed(const s:Tregisterset);
@@ -1122,6 +1124,7 @@ unit rgobj;
          regi : Toldregister;
 
       begin
+{$ifdef i386}
          if firstsavefpureg <> R_NO then
            for regi:=firstsavefpureg to lastsavefpureg do
              begin
@@ -1134,6 +1137,7 @@ unit rgobj;
                 if (regi in s) then
                   inc(reg_pushes_other[regi],t_times*2);
              end;
+{$endif i386}
       end;
 
 
@@ -1169,9 +1173,12 @@ unit rgobj;
     {$ifndef newra}
       dec(countunusedregsint);
     {$endif}
-      exclude(usableregsint,reg shl 8);
-      exclude(unusedregsint,reg shl 8);
+      exclude(usableregsint,reg);
+      exclude(unusedregsint,reg);
       include(is_reg_var_int,reg);
+{$ifndef i386}
+      include(usedintbyproc,reg);
+{$endif not i386}
     end;
 
     procedure trgobj.makeregvarother(reg: tregister);
@@ -1186,6 +1193,9 @@ unit rgobj;
              dec(countunusedregsfpu);
              exclude(usableregsfpu,reg.enum);
              exclude(unusedregsfpu,reg.enum);
+{$ifndef i386}
+             include(usedbyproc,reg.enum);
+{$endif not i386}
           end
         else if reg.enum in mmregs then
           begin
@@ -1193,6 +1203,9 @@ unit rgobj;
              dec(countunusedregsmm);
              exclude(usableregsmm,reg.enum);
              exclude(unusedregsmm,reg.enum);
+{$ifndef i386}
+             include(usedbyproc,reg.enum);
+{$endif not i386}
           end;
         is_reg_var_other[reg.enum]:=true;
       end;
@@ -2038,7 +2051,11 @@ end.
 
 {
   $Log$
-  Revision 1.45  2003-05-30 12:36:13  jonas
+  Revision 1.46  2003-05-30 18:55:21  jonas
+    * fixed several regvar related bugs for non-i386. make cycle with -Or now
+      works for ppc
+
+  Revision 1.45  2003/05/30 12:36:13  jonas
     * use as little different registers on the ppc until newra is released,
       since every used register must be saved