Pārlūkot izejas kodu

* simple regvar support, not yet finished

peter 21 gadi atpakaļ
vecāks
revīzija
8fb3536f6e

+ 15 - 2
compiler/aasmtai.pas

@@ -231,7 +231,7 @@ interface
        { cut type, required for alphanumeric ordering of the assembler filenames }
        TCutPlace=(cut_normal,cut_begin,cut_end);
 
-       TRegAllocType = (ra_alloc,ra_dealloc,ra_resize);
+       TRegAllocType = (ra_alloc,ra_dealloc,ra_sync,ra_resize);
 
        TMarker = (NoPropInfoStart,NoPropInfoEnd,
                   AsmBlockStart,AsmBlockEnd,
@@ -489,6 +489,7 @@ interface
           ratype  : TRegAllocType;
           constructor alloc(r : tregister);
           constructor dealloc(r : tregister);
+          constructor sync(r : tregister);
           constructor resize(r : tregister);
           constructor ppuload(t:taitype;ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
@@ -1734,6 +1735,15 @@ implementation
       end;
 
 
+    constructor tai_regalloc.sync(r : tregister);
+      begin
+        inherited create;
+        typ:=ait_regalloc;
+        ratype:=ra_sync;
+        reg:=r;
+      end;
+
+
     constructor tai_regalloc.resize(r : tregister);
       begin
         inherited create;
@@ -2214,7 +2224,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.88  2004-08-15 13:30:18  florian
+  Revision 1.89  2004-09-26 17:45:29  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.88  2004/08/15 13:30:18  florian
     * fixed alignment of variant records
     * more alignment problems fixed
 

+ 5 - 2
compiler/aggas.pas

@@ -342,7 +342,7 @@ var
 
     procedure TGNUAssembler.WriteTree(p:TAAsmoutput);
     const
-      regallocstr : array[tregalloctype] of string[10]=(' allocated',' released','resized');
+      regallocstr : array[tregalloctype] of string[10]=(' allocated',' released',' sync',' resized');
       tempallocstr : array[boolean] of string[10]=(' released',' allocated');
     var
       ch       : char;
@@ -969,7 +969,10 @@ var
 end.
 {
   $Log$
-  Revision 1.58  2004-08-27 20:53:52  peter
+  Revision 1.59  2004-09-26 17:45:29  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.58  2004/08/27 20:53:52  peter
   don't lowercase filenames in stabs
 
   Revision 1.57  2004/07/18 22:04:55  hajny

+ 16 - 1
compiler/cgobj.pas

@@ -111,6 +111,8 @@ unit cgobj;
           procedure a_reg_alloc(list : taasmoutput;r : tregister);
           {# Deallocates register r by inserting a pa_regdealloc record}
           procedure a_reg_dealloc(list : taasmoutput;r : tregister);
+          { Synchronize register, make sure it is still valid }
+          procedure a_reg_sync(list : taasmoutput;r : tregister);
 
           {# Pass a parameter, which is located in a register, to a routine.
 
@@ -713,6 +715,16 @@ implementation
       end;
 
 
+    procedure tcg.a_reg_sync(list : taasmoutput;r : tregister);
+      var
+        instr : tai;
+      begin
+        instr:=tai_regalloc.sync(r);
+        list.concat(instr);
+        add_reg_instruction(instr,r);
+      end;
+
+
     procedure tcg.a_label(list : taasmoutput;l : tasmlabel);
       begin
          list.concat(tai_label.create(l));
@@ -2192,7 +2204,10 @@ finalization
 end.
 {
   $Log$
-  Revision 1.170  2004-09-25 14:23:54  peter
+  Revision 1.171  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.170  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 6 - 3
compiler/globtype.pas

@@ -201,8 +201,8 @@ interface
        tproccalloptions = set of tproccalloption;
 
        tprocinfoflag=(
-         { procedure uses asm }
-         pi_uses_asm,
+         { procedure has at least one assembler block }
+         pi_has_assembler_block,
          { procedure does a call }
          pi_do_call,
          { procedure has a try statement = no register optimization }
@@ -295,7 +295,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.59  2004-07-14 23:19:22  olle
+  Revision 1.60  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.59  2004/07/14 23:19:22  olle
     + added external facilities for macpas
 
   Revision 1.58  2004/06/20 08:55:29  florian

+ 5 - 2
compiler/i386/ag386int.pas

@@ -344,7 +344,7 @@ implementation
 
     procedure T386IntelAssembler.WriteTree(p:TAAsmoutput);
     const
-      regallocstr : array[tregalloctype] of string[10]=(' released',' allocated','resized');
+      regallocstr : array[tregalloctype] of string[10]=(' released',' allocated',' sync',' resized');
       tempallocstr : array[boolean] of string[10]=(' released',' allocated');
     var
       s,
@@ -878,7 +878,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.50  2004-06-20 08:55:31  florian
+  Revision 1.51  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.50  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.49  2004/06/16 20:07:10  florian

+ 5 - 2
compiler/i386/ag386nsm.pas

@@ -382,7 +382,7 @@ interface
 
     procedure T386NasmAssembler.WriteTree(p:taasmoutput);
     const
-      regallocstr : array[tregalloctype] of string[10]=(' released',' allocated','resized');
+      regallocstr : array[tregalloctype] of string[10]=(' released',' allocated',' sync',' resized');
       tempallocstr : array[boolean] of string[10]=(' released',' allocated');
     var
       s : string;
@@ -909,7 +909,10 @@ initialization
 end.
 {
   $Log$
-  Revision 1.47  2004-06-20 08:55:31  florian
+  Revision 1.48  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.47  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.46  2004/06/16 20:07:10  florian

+ 5 - 2
compiler/i386/daopt386.pas

@@ -1513,7 +1513,7 @@ begin {checks whether two taicpu instructions are equal}
               RegInfo.RegsLoadedForRef := RegInfo.RegsLoadedForRef -
                                               [getsupreg(taicpu(p2).oper[1]^.reg)];
 {$ifdef csdebug}
-              Writeln(std_regname(getsupreg(taicpu(p2).oper[1]^.reg)), ' removed');
+              Writeln(std_regname(newreg(R_INTREGISTER,getsupreg(taicpu(p2).oper[1]^.reg),R_SUBWHOLE)), ' removed');
 {$endif csdebug}
             end;
           InstructionsEquivalent :=
@@ -2719,7 +2719,10 @@ end.
 
 {
   $Log$
-  Revision 1.68  2004-06-20 08:55:31  florian
+  Revision 1.69  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.68  2004/06/20 08:55:31  florian
     * logs truncated
 
   Revision 1.67  2004/05/22 23:34:28  peter

+ 5 - 2
compiler/nbas.pas

@@ -641,7 +641,7 @@ implementation
         result:=nil;
         resulttype:=voidtype;
         if not(nf_get_asm_position in flags) then
-          include(current_procinfo.flags,pi_uses_asm);
+          include(current_procinfo.flags,pi_has_assembler_block);
       end;
 
 
@@ -1018,7 +1018,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.86  2004-07-16 19:45:15  jonas
+  Revision 1.87  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.86  2004/07/16 19:45:15  jonas
     + temps can now also hold fpu values in registers (take care with use,
       bacause of the x86 fpu stack)
     * fpu parameters to node-inlined procedures can now also be put in

+ 5 - 3
compiler/ncgbas.pas

@@ -473,8 +473,7 @@ interface
             begin
               { make sure the register allocator doesn't reuse the }
               { register e.g. in the middle of a loop              }
-              cg.a_load_reg_reg(exprasmlist,OS_INT,OS_INT,tempinfo^.loc.reg,
-                tempinfo^.loc.reg);
+              cg.a_reg_sync(exprasmlist,tempinfo^.loc.reg);
               if release_to_normal then
                 tempinfo^.loc.loc := LOC_REGISTER;
             end;
@@ -493,7 +492,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.67  2004-09-25 14:23:54  peter
+  Revision 1.68  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.67  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 5 - 1
compiler/ncgflw.pas

@@ -1159,6 +1159,7 @@ implementation
          if assigned(exceptsymtable) then
            begin
              tvarsym(exceptsymtable.symindex.first).localloc.loc:=LOC_REFERENCE;
+             tvarsym(exceptsymtable.symindex.first).localloc.size:=OS_ADDR;
              tg.GetLocal(exprasmlist,sizeof(aint),voidpointertype.def,
                 tvarsym(exceptsymtable.symindex.first).localloc.reference);
              cg.a_load_reg_ref(exprasmlist,OS_ADDR,OS_ADDR,NR_FUNCTION_RESULT_REG,tvarsym(exceptsymtable.symindex.first).localloc.reference);
@@ -1442,7 +1443,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.99  2004-09-25 14:23:54  peter
+  Revision 1.100  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.99  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 22 - 22
compiler/ncgld.pas

@@ -117,8 +117,6 @@ implementation
               end;
             varsym :
                begin
-                  if (tvarsym(symtableentry).varspez=vs_const) then
-                    location_reset(location,LOC_CREFERENCE,newsize);
                   symtabletype:=symtable.symtabletype;
                   hregister:=NR_NO;
                   { C variable }
@@ -202,13 +200,15 @@ implementation
                       secondpass(left);
                       if left.location.loc<>LOC_REGISTER then
                         internalerror(200309286);
+                      if tvarsym(symtableentry).localloc.loc<>LOC_REFERENCE then
+                        internalerror(200409241);
                       hregister:=left.location.register;
-                      location.reference.base:=hregister;
-                      location.reference.offset:=tvarsym(symtableentry).localloc.reference.offset;
+                      reference_reset_base(location.reference,hregister,tvarsym(symtableentry).localloc.reference.offset);
                     end
                   { normal variable }
                   else
                     begin
+{$ifdef OLDREGVARS}
                        { in case it is a register variable: }
                        if tvarsym(symtableentry).localloc.loc in [LOC_REGISTER,LOC_FPUREGISTER] then
                          begin
@@ -229,15 +229,13 @@ implementation
                             end;
                          end
                        else
+{$endif OLDREGVARS}
                          begin
                            case symtabletype of
+                              stt_exceptsymtable,
                               localsymtable,
                               parasymtable :
-                                begin
-                                  if tvarsym(symtableentry).localloc.loc<>LOC_REFERENCE then
-                                    internalerror(2003091816);
-                                  location.reference:=tvarsym(symtableentry).localloc.reference;
-                                end;
+                                location:=tvarsym(symtableentry).localloc;
                               globalsymtable,
                               staticsymtable :
                                 begin
@@ -250,12 +248,6 @@ implementation
                                   else
                                     location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname,AB_EXTERNAL,AT_DATA);
                                 end;
-                              stt_exceptsymtable:
-                                begin
-                                  if tvarsym(symtableentry).localloc.loc<>LOC_REFERENCE then
-                                    internalerror(2003091817);
-                                  location.reference:=tvarsym(symtableentry).localloc.reference;
-                                end;
                               else
                                 internalerror(200305102);
                            end;
@@ -275,12 +267,14 @@ implementation
                       { we need to load only an address }
                       location.size:=OS_ADDR;
                       cg.a_load_loc_reg(exprasmlist,location.size,location,hregister);
-                      if tvarsym(symtableentry).varspez=vs_const then
-                       location_reset(location,LOC_CREFERENCE,newsize)
-                      else
-                       location_reset(location,LOC_REFERENCE,newsize);
+                      location_reset(location,LOC_REFERENCE,newsize);
                       location.reference.base:=hregister;
                     end;
+
+                  { make const a LOC_CREFERENCE }
+                  if (tvarsym(symtableentry).varspez=vs_const) and
+                     (location.loc=LOC_REFERENCE) then
+                    location.loc:=LOC_CREFERENCE;
                end;
             procsym:
                begin
@@ -559,6 +553,7 @@ implementation
               LOC_CREFERENCE :
                 begin
                   case left.location.loc of
+                    LOC_REGISTER,
                     LOC_CREGISTER :
                       begin
                         cgsize:=def_cgsize(left.resulttype.def);
@@ -569,6 +564,7 @@ implementation
 {$endif cpu64bit}
                           cg.a_load_ref_reg(exprasmlist,cgsize,cgsize,right.location.reference,left.location.register);
                       end;
+                    LOC_FPUREGISTER,
                     LOC_CFPUREGISTER :
                       begin
                         cg.a_loadfpu_ref_reg(exprasmlist,
@@ -631,7 +627,8 @@ implementation
 {$endif cpu64bit}
                     cg.a_load_reg_loc(exprasmlist,right.location.size,right.location.register,left.location);
                 end;
-              LOC_FPUREGISTER,LOC_CFPUREGISTER :
+              LOC_FPUREGISTER,
+              LOC_CFPUREGISTER :
                 begin
                   if (left.resulttype.def.deftype=floatdef) then
                    fputyp:=tfloatdef(left.resulttype.def).typ
@@ -675,7 +672,7 @@ implementation
               LOC_FLAGS :
                 begin
                   {This can be a wordbool or longbool too, no?}
-                  if left.location.loc=LOC_CREGISTER then
+                  if left.location.loc in [LOC_REGISTER,LOC_CREGISTER] then
                     cg.g_flags2reg(exprasmlist,def_cgsize(left.resulttype.def),right.location.resflags,left.location.register)
                   else
                     begin
@@ -930,7 +927,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.125  2004-09-25 14:23:54  peter
+  Revision 1.126  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.125  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 42 - 11
compiler/ncgutil.pas

@@ -1027,13 +1027,16 @@ implementation
           ressym:=tvarsym(current_procinfo.procdef.funcretsym);
         if (ressym.refs>0) then
           begin
+{$ifdef OLDREGVARS}
             case ressym.localloc.loc of
+              LOC_CFPUREGISTER:
               LOC_FPUREGISTER:
                 begin
                   location_reset(restmploc,LOC_CFPUREGISTER,funcretloc^.size);
                   restmploc.register:=ressym.localloc.register;
                 end;
 
+              LOC_CREGISTER:
               LOC_REGISTER:
                 begin
                   location_reset(restmploc,LOC_CREGISTER,funcretloc^.size);
@@ -1054,6 +1057,9 @@ implementation
               else
                 internalerror(200309184);
             end;
+{$else}
+            restmploc:=ressym.localloc;
+{$endif}
 
             { Here, we return the function result. In most architectures, the value is
               passed into the FUNCTION_RETURN_REG, but in a windowed architecure like sparc a
@@ -1155,7 +1161,6 @@ implementation
     procedure gen_load_para_value(list:TAAsmoutput);
       var
         hp : tparaitem;
-        gotregvarparas : boolean;
         hiparaloc,
         paraloc : pcgparalocation;
       begin
@@ -1167,7 +1172,6 @@ implementation
             { we do this before init_paras because that one calls routines which may overwrite these  }
             { registers and it also expects the values to be in memory                                }
             hp:=tparaitem(current_procinfo.procdef.para.first);
-            gotregvarparas := false;
             while assigned(hp) do
               begin
                 paraloc:=hp.paraloc[calleeside].location;
@@ -1179,7 +1183,6 @@ implementation
                   LOC_MMREGISTER,
                   LOC_FPUREGISTER:
                     begin
-                      gotregvarparas := true;
                       { cg.a_load_param_reg will first allocate and then deallocate paraloc }
                       { register (if the parameter resides in a register) and then allocate }
                       { the regvar (which is currently not allocated)                       }
@@ -1715,12 +1718,34 @@ implementation
               begin
                 with tvarsym(sym) do
                   begin
-{$warning TODO Add support for register variables}
-                    localloc.loc:=LOC_REFERENCE;
-                    tg.GetLocal(list,getvaluesize,vartype.def,localloc.reference);
-                    if cs_asm_source in aktglobalswitches then
-                      list.concat(Tai_comment.Create(strpnew('Local '+realname+' located at '+
-                          std_regname(localloc.reference.base)+tostr_with_plus(localloc.reference.offset))));
+{$ifndef OLDREGVARS}
+                    { When there is assembler code we can't use regvars }
+                    if (cs_regvars in aktglobalswitches) and
+                       not(pi_has_assembler_block in current_procinfo.flags) and
+                       (vo_regable in varoptions) then
+                      begin
+                        localloc.loc:=LOC_CREGISTER;
+                        localloc.size:=def_cgsize(vartype.def);
+                        localloc.register:=cg.getintregister(list,localloc.size);
+                        if cs_asm_source in aktglobalswitches then
+                          begin
+                            if (cs_no_regalloc in aktglobalswitches) then
+                              list.concat(Tai_comment.Create(strpnew('Local '+realname+' located in register '+
+                                 std_regname(localloc.register))))
+                            else
+                              list.concat(Tai_comment.Create(strpnew('Local '+realname+' located in register')));
+                          end;
+                      end
+                    else
+{$endif NOT OLDREGVARS}
+                      begin
+                        localloc.loc:=LOC_REFERENCE;
+                        localloc.size:=def_cgsize(vartype.def);
+                        tg.GetLocal(list,getvaluesize,vartype.def,localloc.reference);
+                        if cs_asm_source in aktglobalswitches then
+                          list.concat(Tai_comment.Create(strpnew('Local '+realname+' located at '+
+                             std_regname(localloc.reference.base)+tostr_with_plus(localloc.reference.offset))));
+                      end;
                   end;
               end;
             sym:=tsym(sym.indexnext);
@@ -1744,6 +1769,8 @@ implementation
                       for the sub procedures that can access local data
                       in the parent procedures }
                     case localloc.loc of
+                      LOC_CREGISTER :
+                        cg.a_reg_sync(list,localloc.register);
                       LOC_REFERENCE :
                         tg.Ungetlocal(list,localloc.reference);
                     end;
@@ -1906,7 +1933,6 @@ implementation
 
     procedure gen_alloc_inline_funcret(list:TAAsmoutput;pd:tprocdef);
       var
-        sym : tsym;
         calleeparaloc,
         callerparaloc : pcgparalocation;
       begin
@@ -1981,6 +2007,8 @@ implementation
                       for the sub procedures that can access local data
                       in the parent procedures }
                     case localloc.loc of
+                      LOC_REGISTER :
+                        cg.a_reg_sync(list,localloc.register);
                       LOC_REFERENCE :
                         tg.UngetLocal(list,localloc.reference);
                     end;
@@ -2065,7 +2093,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.217  2004-09-25 14:23:54  peter
+  Revision 1.218  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.217  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 13 - 10
compiler/ncnv.pas

@@ -1500,6 +1500,15 @@ implementation
             end;
         end;
 
+        if (nf_explicit in flags) or
+           (nf_absolute in flags) then
+         begin
+           { check if the result could be in a register }
+           if not(tstoreddef(resulttype.def).is_intregable) and
+              not(tstoreddef(resulttype.def).is_fpuregable) then
+            make_not_regable(left);
+         end;
+
         { now call the resulttype helper to do constant folding }
         result:=resulttype_call_helper(convtype);
       end;
@@ -1951,15 +1960,6 @@ implementation
 {$endif}
         expectloc:=left.expectloc;
 
-        if (nf_explicit in flags) or
-           (nf_absolute in flags) then
-         begin
-           { check if the result could be in a register }
-           if not(tstoreddef(resulttype.def).is_intregable) and
-              not(tstoreddef(resulttype.def).is_fpuregable) then
-            make_not_regable(left);
-         end;
-
         result:=first_call_helper(convtype);
       end;
 
@@ -2450,7 +2450,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.152  2004-08-08 16:00:56  florian
+  Revision 1.153  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.152  2004/08/08 16:00:56  florian
     * constant floating point assignments etc. are now overflow checked
       if Q+ or R+ is turned on
 

+ 16 - 9
compiler/nld.pas

@@ -138,11 +138,11 @@ implementation
 
     uses
       cutils,verbose,globtype,globals,systems,
-      symtable,symnot,
+      symnot,
       defutil,defcmp,
       htypechk,pass_1,procinfo,paramgr,
       ncon,ninl,ncnv,nmem,ncal,nutils,
-      cpubase,cgobj,cgbase
+      cgobj,cgbase
       ;
 
 {*****************************************************************************
@@ -264,6 +264,8 @@ implementation
                    if assigned(left) then
                      internalerror(200309289);
                    left:=cloadparentfpnode.create(tprocdef(symtable.defowner));
+                   { reference in nested procedures, variable needs to be in memory }
+                   make_not_regable(self);
                  end;
                { fix self type which is declared as voidpointer in the
                  definition }
@@ -340,8 +342,14 @@ implementation
               begin
                 if assigned(left) then
                   firstpass(left);
-                if (tvarsym(symtableentry).varspez=vs_const) then
-                  expectloc:=LOC_CREFERENCE;
+                if (cs_regvars in aktglobalswitches) and
+                   (symtable.symtabletype in [localsymtable]) and
+                   not(pi_has_assembler_block in current_procinfo.flags) and
+                   (vo_regable in tvarsym(symtableentry).varoptions) then
+                  expectloc:=LOC_CREGISTER
+                else
+                  if (tvarsym(symtableentry).varspez=vs_const) then
+                    expectloc:=LOC_CREFERENCE;
                 { we need a register for call by reference parameters }
                 if paramanager.push_addr_param(tvarsym(symtableentry).varspez,tvarsym(symtableentry).vartype.def,pocall_default) then
                   registersint:=1;
@@ -880,12 +888,8 @@ implementation
 
     procedure tarrayconstructornode.insert_typeconvs;
       var
-        thp,
-        chp,
         hp        : tarrayconstructornode;
         dovariant : boolean;
-        htype     : ttype;
-        orgflags  : tnodeflags;
       begin
         dovariant:=(nf_forcevaria in flags) or tarraydef(resulttype.def).isvariant;
         { only pass left tree, right tree contains next construct if any }
@@ -1137,7 +1141,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.128  2004-06-20 08:55:29  florian
+  Revision 1.129  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.128  2004/06/20 08:55:29  florian
     * logs truncated
 
   Revision 1.127  2004/06/16 20:07:08  florian

+ 6 - 2
compiler/nmem.pas

@@ -313,6 +313,8 @@ implementation
         if codegenerror then
          exit;
 
+        make_not_regable(left);
+
         { don't allow constants }
         if is_constnode(left) then
          begin
@@ -464,7 +466,6 @@ implementation
          if codegenerror then
           exit;
 
-         make_not_regable(left);
          if nf_procvarload in flags then
           begin
             registersint:=left.registersint;
@@ -981,7 +982,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.85  2004-06-20 08:55:29  florian
+  Revision 1.86  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.85  2004/06/20 08:55:29  florian
     * logs truncated
 
   Revision 1.84  2004/06/16 20:07:09  florian

+ 7 - 1
compiler/pstatmnt.pas

@@ -864,6 +864,9 @@ implementation
          else
            Message(parser_f_assembler_reader_not_supported);
 
+         { Mark procedure that it has assembler blocks }
+         include(current_procinfo.flags,pi_has_assembler_block);
+
          { Read first the _ASM statement }
          consume(_ASM);
 
@@ -1183,7 +1186,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.139  2004-09-21 17:25:12  peter
+  Revision 1.140  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.139  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.138  2004/09/21 16:00:50  peter

+ 5 - 2
compiler/psub.pas

@@ -1033,7 +1033,7 @@ implementation
              { remove cross unit overloads }
              tstoredsymtable(procdef.localst).unchain_overloaded;
              { check for unused symbols, but only if there is no asm block }
-             if not(pi_uses_asm in flags) then
+             if not(pi_has_assembler_block in flags) then
                begin
                  tstoredsymtable(procdef.localst).allsymbolsused;
                  tstoredsymtable(procdef.parast).allsymbolsused;
@@ -1393,7 +1393,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.206  2004-09-21 17:25:12  peter
+  Revision 1.207  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.206  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.205  2004/09/13 20:34:28  peter

+ 7 - 4
compiler/regvars.pas

@@ -151,7 +151,7 @@ implementation
         { we have to store regvars back to memory in this case (the nested }
         { procedures can access the variables of the parent)               }
         (tcgprocinfo(current_procinfo).nestedprocs.count = 0) and
-         not(pi_uses_asm in current_procinfo.flags) and
+         not(pi_has_assembler_block in current_procinfo.flags) and
          not(pi_uses_exceptions in current_procinfo.flags) then
         begin
           new(regvarinfo);
@@ -458,7 +458,7 @@ implementation
       regvarinfo: pregvarinfo;
     begin
       if (cs_regvars in aktglobalswitches) and
-         not(pi_uses_asm in current_procinfo.flags) and
+         not(pi_has_assembler_block in current_procinfo.flags) and
          not(pi_uses_exceptions in current_procinfo.flags) then
         begin
           regvarinfo := pregvarinfo(current_procinfo.procdef.regvarinfo);
@@ -557,7 +557,7 @@ implementation
       if not assigned(current_procinfo.procdef.regvarinfo) then
         exit;
       if (cs_regvars in aktglobalswitches) and
-         not(pi_uses_asm in current_procinfo.flags) and
+         not(pi_has_assembler_block in current_procinfo.flags) and
          not(pi_uses_exceptions in current_procinfo.flags) then
         with pregvarinfo(current_procinfo.procdef.regvarinfo)^ do
           begin
@@ -669,7 +669,10 @@ end.
 
 {
   $Log$
-  Revision 1.79  2004-09-25 14:23:54  peter
+  Revision 1.80  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.79  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 45 - 23
compiler/rgobj.pas

@@ -1447,7 +1447,7 @@ unit rgobj;
 {$endif EXTDEBUG}
                   list.insertbefore(Tai_regalloc.alloc(r),live_start);
                   { Insert live end deallocation before reg allocations
-                  to reduce conflicts }
+                    to reduce conflicts }
                   p:=live_end;
                   while assigned(p) and
                         assigned(p.previous) and
@@ -1455,7 +1455,15 @@ unit rgobj;
                         (tai_regalloc(p.previous).ratype=ra_alloc) and
                         (tai_regalloc(p.previous).reg<>r) do
                     p:=tai(p.previous);
-                  list.insertbefore(Tai_regalloc.dealloc(r),p);
+                  { , but add release after sync }
+                  if assigned(p) and
+                     (p.typ=ait_regalloc) and
+                     (tai_regalloc(p).ratype=ra_sync) then
+                    p:=tai(p.next);
+                  if assigned(p) then
+                    list.insertbefore(Tai_regalloc.dealloc(r),p)
+                  else
+                    list.concat(Tai_regalloc.dealloc(r));
                 end
 {$ifdef EXTDEBUG}
               else
@@ -1544,32 +1552,43 @@ unit rgobj;
               ait_regalloc:
                 with Tai_regalloc(p) do
                   begin
-                    if (getregtype(reg)=regtype) then
-                      setsupreg(reg,reginfo[getsupreg(reg)].colour);
-
-                    {
-                      Remove sequences of release and
-                      allocation of the same register like:
-
-                         # Register X released
-                         # Register X allocated
-                    }
-                    if assigned(previous) and
-                       (Tai(previous).typ=ait_regalloc) and
-                       (Tai_regalloc(previous).reg=reg) and
-                       { deallocation,allocation }
-                       { note: do not remove allocation,deallocation, those }
-                       {   do have a real meaning                           }
-                       (not(Tai_regalloc(previous).ratype=ra_alloc) and (ratype=ra_alloc)) then
+                    { Only alloc/dealloc is needed for the optimizer, remove
+                      other regalloc }
+                    if not(ratype in [ra_alloc,ra_dealloc]) then
                       begin
                         q:=Tai(next);
-                        hp:=tai(previous);
-                        list.remove(hp);
-                        hp.free;
                         list.remove(p);
                         p.free;
                         p:=q;
                         continue;
+                      end
+                    else
+                      begin
+                        if (getregtype(reg)=regtype) then
+                          setsupreg(reg,reginfo[getsupreg(reg)].colour);
+                        {
+                          Remove sequences of release and
+                          allocation of the same register like. Other combinations
+                          of release/allocate need to stay in the list.
+
+                             # Register X released
+                             # Register X allocated
+                        }
+                        if assigned(previous) and
+                           (ratype=ra_alloc) and
+                           (Tai(previous).typ=ait_regalloc) and
+                           (Tai_regalloc(previous).reg=reg) and
+                           (Tai_regalloc(previous).ratype=ra_dealloc) then
+                          begin
+                            q:=Tai(next);
+                            hp:=tai(previous);
+                            list.remove(hp);
+                            hp.free;
+                            list.remove(p);
+                            p.free;
+                            p:=q;
+                            continue;
+                          end;
                       end;
                   end;
               ait_instruction:
@@ -1996,7 +2015,10 @@ unit rgobj;
 end.
 {
   $Log$
-  Revision 1.136  2004-09-25 14:23:54  peter
+  Revision 1.137  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.136  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 10 - 7
compiler/symsym.pas

@@ -314,15 +314,10 @@ implementation
        systems,
        { symtable }
        defutil,symtable,
-{$ifdef GDB}
-       gdb,
-{$endif GDB}
        { tree }
        node,
        { aasm }
        aasmcpu,
-       { module }
-       fmodule,
        { codegen }
        paramgr,cresstr,
        procinfo
@@ -1593,7 +1588,12 @@ implementation
                       st := 'p'+st;
                   end;
                 case loc of
-                  LOC_REGISTER, LOC_FPUREGISTER :
+                  LOC_REGISTER,
+                  LOC_CREGISTER,
+                  LOC_MMREGISTER,
+                  LOC_CMMREGISTER,
+                  LOC_FPUREGISTER,
+                  LOC_CFPUREGISTER :
                     begin
                       regidx:=findreg_by_number(localloc.register);
                       { "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi", "eip", "ps", "cs", "ss", "ds", "es", "fs", "gs", }
@@ -2215,7 +2215,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.176  2004-09-21 17:25:12  peter
+  Revision 1.177  2004-09-26 17:45:30  peter
+    * simple regvar support, not yet finished
+
+  Revision 1.176  2004/09/21 17:25:12  peter
     * paraloc branch merged
 
   Revision 1.175.4.1  2004/08/31 20:43:06  peter