Quellcode durchsuchen

* count address regs separate

peter vor 22 Jahren
Ursprung
Commit
e21dab9739
3 geänderte Dateien mit 47 neuen und 29 gelöschten Zeilen
  1. 12 9
      compiler/i386/cpubase.pas
  2. 24 18
      compiler/i386/rgcpu.pas
  3. 11 2
      compiler/rgobj.pas

+ 12 - 9
compiler/i386/cpubase.pas

@@ -513,13 +513,13 @@ uses
       { c_countusableregsxxx = amount of registers in the usableregsxxx set    }
 
       maxintregs = 4;
-      intregs = [R_EAX..R_BL];
+      intregs = [R_EAX..R_BL]-[R_ESI,R_SI];
 {$ifdef newra}
       usableregsint = [first_imreg..last_imreg];
 {$else}
-      usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX,RS_ESI];
+      usableregsint = [RS_EAX,RS_EBX,RS_ECX,RS_EDX];
 {$endif}
-      c_countusableregsint = 5;
+      c_countusableregsint = 4;
 
       maxfpuregs = 8;
       fpuregs = [R_ST0..R_ST7];
@@ -530,14 +530,14 @@ uses
       usableregsmm = [R_MM0..R_MM7];
       c_countusableregsmm  = 8;
 
-      maxaddrregs = 0;
-      addrregs    = [];
-      usableregsaddr = [];
-      c_countusableregsaddr = 0;
+      maxaddrregs = 1;
+      addrregs    = [R_ESI];
+      usableregsaddr = [RS_ESI];
+      c_countusableregsaddr = 1;
 
 
       firstsaveintreg = RS_EAX;
-      lastsaveintreg  = RS_ESI;
+      lastsaveintreg  = RS_EDX;
       firstsavefpureg = R_NO;
       lastsavefpureg  = R_NO;
       firstsavemmreg  = R_MM0;
@@ -814,7 +814,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.45  2003-03-28 19:16:57  peter
+  Revision 1.46  2003-04-21 19:16:50  peter
+    * count address regs separate
+
+  Revision 1.45  2003/03/28 19:16:57  peter
     * generic constructor working for i386
     * remove fixed self register
     * esi added as address register for i386

+ 24 - 18
compiler/i386/rgcpu.pas

@@ -240,30 +240,33 @@ unit rgcpu;
 
     function trgcpu.getaddressregister(list:Taasmoutput):Tregister;
     begin
-      if countunusedregsint=0 then
-        internalerror(10);
-      result.enum:=R_INTREGISTER;
+      if countunusedregsaddr>0 then
+       begin
+         result.enum:=R_INTREGISTER;
 {$ifdef TEMPREGDEBUG}
-      if curptree^.usableregsint-countunusedregsint>curptree^.registers32 then
-        internalerror(10);
+         if curptree^.usableregsaddr-countunusedregsaddr>curptree^.registers32 then
+           internalerror(10);
 {$endif TEMPREGDEBUG}
 {$ifdef EXTTEMPREGDEBUG}
-      if curptree^.usableregs-countunusedregistersint>curptree^^.reallyusedregs then
-        curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersint;
+         if curptree^.usableregs-countunusedregistersaddr>curptree^^.reallyusedregs then
+           curptree^.reallyusedregs:=curptree^^.usableregs-countunusedregistersaddr;
 {$endif EXTTEMPREGDEBUG}
-      if RS_ESI in unusedregsint then
-        begin
-          dec(countunusedregsint);
-          exclude(unusedregsint,RS_ESI);
-          include(usedintinproc,RS_ESI);
-          result.number:=NR_ESI;
+         if RS_ESI in unusedregsaddr then
+           begin
+             dec(countunusedregsaddr);
+             exclude(unusedregsaddr,RS_ESI);
+             include(usedaddrinproc,RS_ESI);
+             result.number:=NR_ESI;
 {$ifdef TEMPREGDEBUG}
-          reg_user[R_ESI]:=curptree^;
+             reg_user[R_ESI]:=curptree^;
 {$endif TEMPREGDEBUG}
-          exprasmlist.concat(tai_regalloc.alloc(result));
-        end
+             exprasmlist.concat(tai_regalloc.alloc(result));
+           end
+         else
+           internalerror(10);
+       end
       else
-        result:=getregisterint(list,OS_ADDR);
+       result:=getregisterint(list,OS_ADDR);
     end;
 
 
@@ -559,7 +562,10 @@ end.
 
 {
   $Log$
-  Revision 1.17  2003-03-28 19:16:57  peter
+  Revision 1.18  2003-04-21 19:16:50  peter
+    * count address regs separate
+
+  Revision 1.17  2003/03/28 19:16:57  peter
     * generic constructor working for i386
     * remove fixed self register
     * esi added as address register for i386

+ 11 - 2
compiler/rgobj.pas

@@ -131,14 +131,17 @@ unit rgobj;
           { allocated                                                    }
           lastintreg:Tsuperregister;
           unusedregsint,usableregsint:Tsupregset;
+          unusedregsaddr,usableregsaddr:Tsupregset;
           unusedregsfpu,usableregsfpu : tregisterset;
           unusedregsmm,usableregsmm : tregisterset;
           { these counters contain the number of elements in the }
           { unusedregsxxx/usableregsxxx sets                     }
           countunusedregsint,
+          countunusedregsaddr,
           countunusedregsfpu,
           countunusedregsmm : byte;
           countusableregsint,
+          countusableregsaddr,
           countusableregsfpu,
           countusableregsmm : byte;
 
@@ -147,7 +150,10 @@ unit rgobj;
           }
           usedbyproc,
           usedinproc : tregisterset;
-          usedintbyproc,usedintinproc:Tsupregset;
+          usedintbyproc,
+          usedaddrbyproc,
+          usedintinproc,
+          usedaddrinproc:Tsupregset;
 
           reg_pushes : regvar_longintarray;
           reg_pushes_int : regvarint_longintarray;
@@ -1397,7 +1403,10 @@ end.
 
 {
   $Log$
-  Revision 1.34  2003-04-17 16:48:21  daniel
+  Revision 1.35  2003-04-21 19:16:49  peter
+    * count address regs separate
+
+  Revision 1.34  2003/04/17 16:48:21  daniel
     * Added some code to keep track of move instructions in register
       allocator