Selaa lähdekoodia

+ ansistring operator +
+ $h and string[n] for n>255 added
* small problem with TP fixed

florian 27 vuotta sitten
vanhempi
commit
d666ac848e
4 muutettua tiedostoa jossa 96 lisäystä ja 28 poistoa
  1. 53 6
      compiler/cg386add.pas
  2. 12 7
      compiler/cg386cal.pas
  3. 8 14
      compiler/pdecl.pas
  4. 23 1
      compiler/tgeni386.pas

+ 53 - 6
compiler/cg386add.pas

@@ -116,6 +116,8 @@ implementation
         href       : treference;
         href       : treference;
         pushed,
         pushed,
         cmpop      : boolean;
         cmpop      : boolean;
+        savedunused : tregisterset;
+
       begin
       begin
         { string operations are not commutative }
         { string operations are not commutative }
         if p^.swaped then
         if p^.swaped then
@@ -126,10 +128,50 @@ implementation
                 case p^.treetype of
                 case p^.treetype of
                    addn:
                    addn:
                      begin
                      begin
-                        { we do not need destination anymore }
-                        del_reference(p^.left^.location.reference);
-                        del_reference(p^.right^.location.reference);
-                        { concatansistring(p); }
+                        cmpop:=false;
+                        secondpass(p^.left);
+                        pushed:=maybe_push(p^.right^.registers32,p);
+                        secondpass(p^.right);
+                        if pushed then restore(p);
+                        { release used registers }
+                        case p^.right^.location.loc of
+                          LOC_REFERENCE,LOC_MEM:
+                            del_reference(p^.right^.location.reference);
+                          LOC_REGISTER,LOC_CREGISTER:
+                            ungetregister32(p^.right^.location.register);
+                        end;
+                        case p^.left^.location.loc of
+                          LOC_REFERENCE,LOC_MEM:
+                            del_reference(p^.left^.location.reference);
+                          LOC_REGISTER,LOC_CREGISTER:
+                            ungetregister32(p^.left^.location.register);
+                        end;
+                        { that's not nice, but how can we avoid, }
+
+                        savedunused:=unused;
+                        { push the still used registers }
+                        pushusedregisters(pushedregs,$ff);
+                        { push data }
+                        case p^.right^.location.loc of
+                          LOC_REFERENCE,LOC_MEM:
+                            emit_push_mem(p^.right^.location.reference);
+                          LOC_REGISTER,LOC_CREGISTER:
+                            exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.right^.location.register)));
+                        end;
+                        case p^.left^.location.loc of
+                          LOC_REFERENCE,LOC_MEM:
+                            emit_push_mem(p^.left^.location.reference);
+                          LOC_REGISTER,LOC_CREGISTER:
+                            exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,p^.left^.location.register)));
+                        end;
+                        emitcall('FPC_ANSICAT',true);
+                        unused:=savedunused;
+                        p^.location.register:=getexplicitregister32(R_EAX);
+                        emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register);
+                        popusedregisters(pushedregs);
+                        maybe_loadesi;
+                        ungetiftemp(p^.left^.location.reference);
+                        ungetiftemp(p^.right^.location.reference);
                      end;
                      end;
                    ltn,lten,gtn,gten,
                    ltn,lten,gtn,gten,
                    equaln,unequaln:
                    equaln,unequaln:
@@ -302,7 +344,7 @@ implementation
                 end;
                 end;
              end;
              end;
           end;
           end;
-        SetResultLocation(cmpop,true,p);
+          SetResultLocation(cmpop,true,p);
       end;
       end;
 
 
 
 
@@ -1324,7 +1366,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.19  1998-10-20 15:09:21  florian
+  Revision 1.20  1998-10-21 08:39:56  florian
+    + ansistring operator +
+    + $h and string[n] for n>255 added
+    * small problem with TP fixed
+
+  Revision 1.19  1998/10/20 15:09:21  florian
     + binary operators for ansi strings
     + binary operators for ansi strings
 
 
   Revision 1.18  1998/10/20 08:06:38  pierre
   Revision 1.18  1998/10/20 08:06:38  pierre

+ 12 - 7
compiler/cg386cal.pas

@@ -1257,7 +1257,7 @@ implementation
                         else
                         else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                           begin
                           begin
-                             hregister:=getregister32;
+                             hregister:=getexplicitregister32(R_EAX);
                              emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                              emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                              p^.location.register:=hregister;
                              p^.location.register:=hregister;
                           end;
                           end;
@@ -1285,7 +1285,7 @@ implementation
                                else
                                else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                                  begin
                                  begin
-                                    hregister:=getregister32;
+                                    hregister:=getexplicitregister32(R_EAX);
                                     emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                     emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                     p^.location.register:=hregister;
                                     p^.location.register:=hregister;
                                  end;
                                  end;
@@ -1298,7 +1298,7 @@ implementation
                                      else
                                      else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                                        begin
                                        begin
-                                          hregister:=getregister32;
+                                          hregister:=getexplicitregister32(R_EAX);
                                           emit_reg_reg(A_MOV,S_B,R_AL,reg32toreg8(hregister));
                                           emit_reg_reg(A_MOV,S_B,R_AL,reg32toreg8(hregister));
                                           p^.location.register:=reg32toreg8(hregister);
                                           p^.location.register:=reg32toreg8(hregister);
                                        end;
                                        end;
@@ -1311,7 +1311,7 @@ implementation
                                      else
                                      else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                                        begin
                                        begin
-                                          hregister:=getregister32;
+                                          hregister:=getexplicitregister32(R_EAX);
                                           emit_reg_reg(A_MOV,S_W,R_AX,reg32toreg16(hregister));
                                           emit_reg_reg(A_MOV,S_W,R_AX,reg32toreg16(hregister));
                                           p^.location.register:=reg32toreg16(hregister);
                                           p^.location.register:=reg32toreg16(hregister);
                                        end;
                                        end;
@@ -1330,7 +1330,7 @@ implementation
                                              else
                                              else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                                                begin
                                                begin
-                                                  hregister:=getregister32;
+                                                  hregister:=getexplicitregister32(R_EAX);
                                                   emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                                   emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                                   p^.location.register:=hregister;
                                                   p^.location.register:=hregister;
                                                end;
                                                end;
@@ -1347,7 +1347,7 @@ implementation
                               else
                               else
 {$endif test_dest_loc}
 {$endif test_dest_loc}
                                 begin
                                 begin
-                                    hregister:=getregister32;
+                                    hregister:=getexplicitregister32(R_EAX);
                                     emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                     emit_reg_reg(A_MOV,S_L,R_EAX,hregister);
                                     p^.location.register:=hregister;
                                     p^.location.register:=hregister;
                                 end;
                                 end;
@@ -1514,7 +1514,12 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.36  1998-10-20 08:06:39  pierre
+  Revision 1.37  1998-10-21 08:39:57  florian
+    + ansistring operator +
+    + $h and string[n] for n>255 added
+    * small problem with TP fixed
+
+  Revision 1.36  1998/10/20 08:06:39  pierre
     * several memory corruptions due to double freemem solved
     * several memory corruptions due to double freemem solved
       => never use p^.loc.location:=p^.left^.loc.location;
       => never use p^.loc.location:=p^.left^.loc.location;
     + finally I added now by default
     + finally I added now by default

+ 8 - 14
compiler/pdecl.pas

@@ -549,23 +549,14 @@ unit pdecl;
               do_firstpass(p);
               do_firstpass(p);
               if not is_constintnode(p) then
               if not is_constintnode(p) then
                 Message(cg_e_illegal_expression);
                 Message(cg_e_illegal_expression);
-{$ifndef UseAnsiString}
-              if (p^.value<1) or (p^.value>255) then
+              if (p^.value<0) then
                 begin
                 begin
                    Message(parser_e_string_too_long);
                    Message(parser_e_string_too_long);
                    p^.value:=255;
                    p^.value:=255;
                 end;
                 end;
               consume(RECKKLAMMER);
               consume(RECKKLAMMER);
-              if p^.value<>255 then
-                d:=new(pstringdef,init(p^.value))
-{$ifndef GDB}
-                 else d:=new(pstringdef,init(255));
-{$else GDB}
-                 else d:=globaldef('STRING');
-{$endif GDB}
-{$else UseAnsiString}
               if p^.value>255 then
               if p^.value>255 then
-                d:=new(pstringdef,ansiinit(p^.value))
+                d:=new(pstringdef,longinit(p^.value))
               else if p^.value<>255 then
               else if p^.value<>255 then
                 d:=new(pstringdef,init(p^.value))
                 d:=new(pstringdef,init(p^.value))
 {$ifndef GDB}
 {$ifndef GDB}
@@ -573,8 +564,6 @@ unit pdecl;
 {$else GDB}
 {$else GDB}
                  else d:=globaldef('STRING');
                  else d:=globaldef('STRING');
 {$endif GDB}
 {$endif GDB}
-              consume(RECKKLAMMER);
-{$endif UseAnsiString}
               disposetree(p);
               disposetree(p);
            end
            end
            { should string without suffix be an ansistring also
            { should string without suffix be an ansistring also
@@ -2081,7 +2070,12 @@ unit pdecl;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.74  1998-10-20 13:09:13  peter
+  Revision 1.75  1998-10-21 08:39:59  florian
+    + ansistring operator +
+    + $h and string[n] for n>255 added
+    * small problem with TP fixed
+
+  Revision 1.74  1998/10/20 13:09:13  peter
     * fixed object(unknown) crash
     * fixed object(unknown) crash
 
 
   Revision 1.73  1998/10/19 08:54:56  pierre
   Revision 1.73  1998/10/19 08:54:56  pierre

+ 23 - 1
compiler/tgeni386.pas

@@ -44,6 +44,8 @@ unit tgeni386;
 
 
     function getregister32 : tregister;
     function getregister32 : tregister;
     procedure ungetregister32(r : tregister);
     procedure ungetregister32(r : tregister);
+    { tries to allocate the passed register, if possible }
+    function getexplicitregister32(r : tregister) : tregister;
 {$ifdef SUPPORT_MMX}
 {$ifdef SUPPORT_MMX}
     function getregistermmx : tregister;
     function getregistermmx : tregister;
     procedure ungetregistermmx(r : tregister);
     procedure ungetregistermmx(r : tregister);
@@ -303,6 +305,21 @@ implementation
          else internalerror(10);
          else internalerror(10);
       end;
       end;
 
 
+    function getexplicitregister32(r : tregister) : tregister;
+
+      begin
+         if r in unused then
+           begin
+              unused:=unused-[r];
+              usedinproc:=usedinproc or ($80 shr byte(r));
+              getexplicitregister32:=R_ECX;
+              exprasmlist^.concat(new(pairegalloc,init(r)));
+              getexplicitregister32:=r;
+           end
+         else
+           getexplicitregister32:=getregister32;
+      end;
+
     procedure cleartempgen;
     procedure cleartempgen;
 
 
       begin
       begin
@@ -349,7 +366,12 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.12  1998-09-20 17:11:24  jonas
+  Revision 1.13  1998-10-21 08:40:03  florian
+    + ansistring operator +
+    + $h and string[n] for n>255 added
+    * small problem with TP fixed
+
+  Revision 1.12  1998/09/20 17:11:24  jonas
     * released REGALLOC
     * released REGALLOC
 
 
   Revision 1.11  1998/09/16 17:58:33  jonas
   Revision 1.11  1998/09/16 17:58:33  jonas