Browse Source

* use FPC_SHPRTSTR_CONCAT_LEN for -dnewoptimizations (temp)
* more precise reg deallocation when calling the above)

Jonas Maebe 25 years ago
parent
commit
43e023d0af
1 changed files with 33 additions and 16 deletions
  1. 33 16
      compiler/cg386add.pas

+ 33 - 16
compiler/cg386add.pas

@@ -1,4 +1,4 @@
-{
+ {
     $Id$
     Copyright (c) 1998-2000 by Florian Klaempfl
 
@@ -150,6 +150,7 @@ implementation
         href       : treference;
         pushed,
         cmpop      : boolean;
+        regstopush : byte;
       begin
         { string operations are not commutative }
         if p^.swaped then
@@ -296,7 +297,7 @@ implementation
                              clear_location(p^.left^.location);
                              p^.left^.location.loc:=LOC_MEM;
                              p^.left^.location.reference:=href;
-                             
+
                              { length of temp string = 255 (JM) }
                              pstringdef(p^.left^.resulttype)^.len := 255;
                           end;
@@ -324,7 +325,7 @@ implementation
                               { no, make sure it is in a register }
                               if p^.right^.location.loc in [LOC_REFERENCE,LOC_MEM] then
                                 begin
-                                  { free the registers of p^.right } 
+                                  { free the registers of p^.right }
                                   del_reference(p^.right^.location.reference);
                                   { get register for the char }
                                   hreg := reg32toreg8(getregister32);
@@ -378,24 +379,36 @@ implementation
                         else
                           begin
 {$endif  newoptimizations}
-{$IfNDef regallocfix}
                         { on the right we do not need the register anymore too }
-                            del_reference(p^.right^.location.reference);
-                            pushusedregisters(pushedregs,$ff);
-{$Else regallocfix}
-                            pushusedregisters(pushedregs,$ff
-                              xor ($80 shr byte(p^.right^.location.reference.base))
-                              xor ($80 shr byte(p^.right^.location.reference.index)));
-{$EndIf regallocfix}
+                        { Instead of releasing them already, simply do not }
+                        { push them (so the release is in the right place, }
+                        { because emitpushreferenceaddr doesn't need extra }
+                        { registers) (JM)                                  }
+                            regstopush := $ff;
+                            remove_non_regvars_from_loc(p^.right^.location,
+                              regstopush);
+                           pushusedregisters(pushedregs,regstopush);
+                           { push the maximum possible length of the result }
+{$ifdef newoptimizations}
+                           { string (could be < 255 chars now) (JM)         }
+                            emit_const(A_PUSH,S_L,
+                              pstringdef(p^.left^.resulttype)^.len);
+{$endif newoptimizations}
                             emitpushreferenceaddr(p^.left^.location.reference);
-                            emitpushreferenceaddr(p^.right^.location.reference);
-{$IfDef regallocfix}
+                           { the optimizer can more easily put the          }
+                           { deallocations in the right place if it happens }
+                           { too early than when it happens too late (if    }
+                           { the pushref needs a "lea (..),edi; push edi")  }
                             del_reference(p^.right^.location.reference);
-{$EndIf regallocfix}
+                            emitpushreferenceaddr(p^.right^.location.reference);
+{$ifdef newoptimizations}
+                            emitcall('FPC_SHORTSTR_CONCAT_LEN');
+{$else newoptimizations}
                             emitcall('FPC_SHORTSTR_CONCAT');
+{$endif newoptimizations}
+                            ungetiftemp(p^.right^.location.reference);
                             maybe_loadesi;
                             popusedregisters(pushedregs);
-                            ungetiftemp(p^.right^.location.reference);
 {$ifdef newoptimizations}
                         end;
 {$endif newoptimizations}
@@ -2356,7 +2369,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.99  2000-04-21 12:35:05  jonas
+  Revision 1.100  2000-04-23 09:28:19  jonas
+    * use FPC_SHPRTSTR_CONCAT_LEN for -dnewoptimizations (temp)
+    * more precise reg deallocation when calling the above)
+
+  Revision 1.99  2000/04/21 12:35:05  jonas
     + special code for string + char, between -dnewoptimizations
 
   Revision 1.98  2000/04/10 12:23:19  jonas