Selaa lähdekoodia

* correct bugs for ts010026 and ts010029 in win32 mode
in copyvaluparas
+ use SHL instead of IMUL if constant is a power of 2 in copyvalueparas

pierre 25 vuotta sitten
vanhempi
commit
477eacdff2
1 muutettua tiedostoa jossa 38 lisäystä ja 11 poistoa
  1. 38 11
      compiler/cgai386.pas

+ 38 - 11
compiler/cgai386.pas

@@ -2865,7 +2865,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
     var
       href1,href2 : treference;
       r    : preference;
-      len  : longint;
+      power,len  : longint;
       opsize : topsize;
       again,ok : pasmlabel;
     begin
@@ -2890,9 +2890,17 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               exprasmlist^.concat(new(paicpu,
                 op_reg(A_INC,S_L,R_EDI)));
 
-              exprasmlist^.concat(new(paicpu,
-                op_const_reg(A_IMUL,S_L,
-                parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
+              if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
+               begin
+                 if ispowerof2(parraydef(pvarsym(p)^.vartype.def)^.elesize, power) then
+                   exprasmlist^.concat(new(paicpu,
+                     op_const_reg(A_SHL,S_L,
+                       power,R_EDI)))
+                 else
+                   exprasmlist^.concat(new(paicpu,
+                     op_const_reg(A_IMUL,S_L,
+                     parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
+               end;
 {$ifndef NOTARGETWIN32}
               { windows guards only a few pages for stack growing, }
               { so we have to access every page first              }
@@ -2932,13 +2940,22 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                    exprasmlist^.concat(new(paicpu,
                      op_reg(A_INC,S_L,R_EDI)));
 
-                   exprasmlist^.concat(new(paicpu,
-                     op_const_reg(A_IMUL,S_L,
-                     parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
+                   if (parraydef(pvarsym(p)^.vartype.def)^.elesize<>1) then
+                    begin
+                      if ispowerof2(parraydef(pvarsym(p)^.vartype.def)^.elesize, power) then
+                        exprasmlist^.concat(new(paicpu,
+                          op_const_reg(A_SHL,S_L,
+                            power,R_EDI)))
+                      else
+                        exprasmlist^.concat(new(paicpu,
+                          op_const_reg(A_IMUL,S_L,
+                          parraydef(pvarsym(p)^.vartype.def)^.elesize,R_EDI)));
+                    end;
                 end;
-{$endif NOTARGETWIN32}
+{$else not NOTARGETWIN32}
               exprasmlist^.concat(new(paicpu,
                 op_reg_reg(A_SUB,S_L,R_EDI,R_ESP)));
+{$endif NOTARGETWIN32}
               { load destination }
               exprasmlist^.concat(new(paicpu,
                 op_reg_reg(A_MOV,S_L,R_ESP,R_EDI)));
@@ -2984,7 +3001,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                   len:=len shr 1;
                 end;
 
-              exprasmlist^.concat(new(paicpu,
+              if ispowerof2(len, power) then
+                exprasmlist^.concat(new(paicpu,
+                  op_const_reg(A_SHL,S_L,
+                    power,R_ECX)))
+              else
+                exprasmlist^.concat(new(paicpu,
                 op_const_reg(A_IMUL,S_L,len,R_ECX)));
               exprasmlist^.concat(new(paicpu,
                 op_none(A_REP,S_NO)));
@@ -3897,7 +3919,12 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
 end.
 {
   $Log$
-  Revision 1.97  2000-04-24 12:48:37  peter
+  Revision 1.98  2000-04-26 10:03:45  pierre
+    * correct bugs for ts010026 and ts010029 in win32 mode
+      in copyvaluparas
+    + use SHL instead of IMUL if constant is a power of 2 in copyvalueparas
+
+  Revision 1.97  2000/04/24 12:48:37  peter
     * removed unused vars
 
   Revision 1.96  2000/04/10 12:23:18  jonas
@@ -4048,4 +4075,4 @@ end.
 
   Revision 1.59  1999/11/15 14:04:00  pierre
    * self pointer stabs for local function was wrong
-}
+}