Browse Source

* Removed usage of edi in a lot of places when new register allocator used
+ Added newra versions of g_concatcopy and secondadd_float

daniel 22 năm trước cách đây
mục cha
commit
7677b18770
3 tập tin đã thay đổi với 144 bổ sung4 xóa
  1. 21 1
      compiler/i386/n386add.pas
  2. 13 1
      compiler/i386/n386set.pas
  3. 110 2
      compiler/x86/cgx86.pas

+ 21 - 1
compiler/i386/n386add.pas

@@ -229,9 +229,13 @@ interface
             begin
               if extra_not then
                 emit_reg(A_NOT,opsize,left.location.register);
+            {$ifdef newra}
+              r:=rg.getregisterint(exprasmlist,OS_INT);
+            {$else}
               r.enum:=R_INTREGISTER;
               r.number:=NR_EDI;
               rg.getexplicitregisterint(exprasmlist,NR_EDI);
+            {$endif}
               cg.a_load_loc_reg(exprasmlist,right.location,r);
               emit_reg_reg(op,opsize,left.location.register,r);
               emit_reg_reg(A_MOV,opsize,r,left.location.register);
@@ -275,9 +279,13 @@ interface
                  begin
                    if extra_not then
                      begin
+                     {$ifdef newra}
+                        r:=rg.getregisterint(exprasmlist,OS_INT);
+                     {$else}
                         rg.getexplicitregisterint(exprasmlist,NR_EDI);
                         r.enum:=R_INTREGISTER;
                         r.number:=NR_EDI;
+                     {$endif}
                         cg.a_load_loc_reg(exprasmlist,right.location,r);
                         emit_reg(A_NOT,S_L,r);
                         emit_reg_reg(A_AND,S_L,r,left.location.register);
@@ -680,6 +688,9 @@ interface
         { on comparison load flags }
         if cmpop then
          begin
+         {$ifdef newra}
+           r:=rg.getexplicitregisterint(exprasmlist,NR_AX);
+         {$else}
            if not(RS_EAX in rg.unusedregsint) then
              begin
                rg.getexplicitregisterint(exprasmlist,NR_EDI);
@@ -691,8 +702,12 @@ interface
              end;
            r.enum:=R_INTREGISTER;
            r.number:=NR_AX;
+         {$endif}
            emit_reg(A_FNSTSW,S_NO,r);
            emit_none(A_SAHF,S_NO);
+         {$ifdef newra}
+           rg.ungetregisterint(exprasmlist,r);
+         {$else}
            if not(RS_EAX in rg.unusedregsint) then
              begin
                r.enum:=R_INTREGISTER;
@@ -702,6 +717,7 @@ interface
                emit_reg_reg(A_MOV,S_L,r2,r);
                rg.ungetregisterint(exprasmlist,r2);
              end;
+         {$endif}
            if nf_swaped in flags then
             begin
               case nodetype of
@@ -1653,7 +1669,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.63  2003-04-22 23:50:23  peter
+  Revision 1.64  2003-04-23 09:51:16  daniel
+    * Removed usage of edi in a lot of places when new register allocator used
+    + Added newra versions of g_concatcopy and secondadd_float
+
+  Revision 1.63  2003/04/22 23:50:23  peter
     * firstpass uses expectloc
     * checks if there are differences between the expectloc and
       location.loc from secondpass in EXTDEBUG

+ 13 - 1
compiler/i386/n386set.pas

@@ -247,7 +247,11 @@ implementation
             else
              begin
                { load the value in a register }
+             {$ifdef newra}
+               pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
+             {$else}
                pleftreg := rg.getexplicitregisterint(exprasmlist,NR_EDI);
+             {$endif}
                opsize := S_L;
                emit_ref_reg(A_MOVZX,S_BL,left.location.reference,pleftreg);
              end;
@@ -527,7 +531,11 @@ implementation
                       pleftreg.number:=(left.location.register.number and not $ff) or R_SUBWHOLE;
                     end
                   else
+                  {$ifdef newra}
+                    pleftreg:=rg.getregisterint(exprasmlist,OS_INT);
+                  {$else}
                     pleftreg:=rg.getexplicitregisterint(exprasmlist,NR_EDI);
+                  {$endif}
                   cg.a_load_loc_reg(exprasmlist,left.location,pleftreg);
                   location_freetemp(exprasmlist,left.location);
                   location_release(exprasmlist,left.location);
@@ -718,7 +726,11 @@ begin
 end.
 {
   $Log$
-  Revision 1.54  2003-04-22 23:50:23  peter
+  Revision 1.55  2003-04-23 09:51:16  daniel
+    * Removed usage of edi in a lot of places when new register allocator used
+    + Added newra versions of g_concatcopy and secondadd_float
+
+  Revision 1.54  2003/04/22 23:50:23  peter
     * firstpass uses expectloc
     * checks if there are differences between the expectloc and
       location.loc from secondpass in EXTDEBUG

+ 110 - 2
compiler/x86/cgx86.pas

@@ -1158,6 +1158,110 @@ unit cgx86;
 
 { ************* concatcopy ************ }
 
+{$ifdef newra}
+
+    procedure Tcgx86.g_concatcopy(list:Taasmoutput;const source,dest:Treference;
+                                  len:aword;delsource,loadref:boolean);
+    var srcref,dstref:Treference;
+        srcreg,destreg,countreg,r:Tregister;
+        helpsize:aword;
+        copysize:byte;
+        cgsize:Tcgsize;
+
+    begin
+      helpsize:=12;
+      if cs_littlesize in aktglobalswitches then
+        helpsize:=8;
+      if not loadref and (len<=helpsize) then
+        begin
+          dstref:=dest;
+          srcref:=source;
+          copysize:=4;
+          cgsize:=OS_32;
+          while len<>0 do
+            begin
+              dec(len,copysize);
+              r:=rg.getregisterint(list,cgsize);
+              a_load_ref_reg(list,cgsize,srcref,r);
+              if (len=0) and delsource then
+                reference_release(list,source);
+              a_load_reg_ref(list,cgsize,r,dstref);
+              inc(srcref.offset,copysize);
+              inc(dstref.offset,copysize);
+              rg.ungetregisterint(list,r);
+              if copysize<2 then
+                begin
+                  copysize:=1;
+                  cgsize:=OS_8;
+                end
+              else if copysize<4 then
+                begin
+                  copysize:=2;
+                  cgsize:=OS_16;
+                end;
+            end;
+        end
+      else
+        begin
+          destreg:=rg.getexplicitregisterint(list,NR_EDI);
+          a_loadaddr_ref_reg(list,dest,destreg);
+          srcreg:=rg.getexplicitregisterint(list,NR_ESI);
+          if loadref then
+            a_load_ref_reg(list,OS_ADDR,source,srcreg)
+          else
+            begin
+              a_loadaddr_ref_reg(list,source,srcreg);
+              if delsource then
+                begin
+                  srcref:=source;
+                  { Don't release ESI register yet, it's needed
+                    by the movsl }
+                  if (srcref.base.number=NR_ESI) then
+                    srcref.base.number:=NR_NO
+                  else if (srcref.index.number=NR_ESI) then
+                    srcref.index.number:=NR_NO;
+                  reference_release(list,srcref);
+                end;
+            end;
+
+          countreg:=rg.getexplicitregisterint(list,NR_ECX);
+
+          list.concat(Taicpu.op_none(A_CLD,S_NO));
+          if cs_littlesize in aktglobalswitches  then
+            begin
+              a_load_const_reg(list,OS_INT,len,countreg);
+              list.concat(Taicpu.op_none(A_REP,S_NO));
+              list.concat(Taicpu.op_none(A_MOVSB,S_NO));
+            end
+          else
+            begin
+              helpsize:=len shr 2;
+              len:=len and 3;
+              if helpsize>1 then
+                begin
+                  a_load_const_reg(list,OS_INT,helpsize,countreg);
+                  list.concat(Taicpu.op_none(A_REP,S_NO));
+                end;
+              if helpsize>0 then
+                list.concat(Taicpu.op_none(A_MOVSD,S_NO));
+              if len>1 then
+                begin
+                  dec(len,2);
+                  list.concat(Taicpu.op_none(A_MOVSW,S_NO));
+                end;
+              if len=1 then
+                list.concat(Taicpu.op_none(A_MOVSB,S_NO));
+              end;
+          rg.ungetregisterint(list,countreg);
+          rg.ungetregisterint(list,srcreg);
+          rg.ungetregisterint(list,destreg);
+        end;
+      if delsource then
+        tg.ungetiftemp(list,source);
+    end;
+
+{$else newra}
+
     procedure tcgx86.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
       var
          ecxpushed,esipushed : boolean;
@@ -1360,7 +1464,7 @@ unit cgx86;
           tg.ungetiftemp(list,source);
       end;
 
-
+{$endif newra}
 
     procedure tcgx86.g_exception_reason_save(list : taasmoutput; const href : treference);
 
@@ -1834,7 +1938,11 @@ unit cgx86;
 end.
 {
   $Log$
-  Revision 1.40  2003-04-22 13:47:08  peter
+  Revision 1.41  2003-04-23 09:51:16  daniel
+    * Removed usage of edi in a lot of places when new register allocator used
+    + Added newra versions of g_concatcopy and secondadd_float
+
+  Revision 1.40  2003/04/22 13:47:08  peter
     * fixed C style array of const
     * fixed C array passing
     * fixed left to right with high parameters