Browse Source

* small regvar for para fixes
* function tvarsym.is_regvar added
* tvarsym.getvaluesize removed, use getsize instead

peter 21 years ago
parent
commit
66df745917
6 changed files with 88 additions and 60 deletions
  1. 8 3
      compiler/m68k/cgcpu.pas
  2. 17 26
      compiler/ncgutil.pas
  3. 18 8
      compiler/ncnv.pas
  4. 18 6
      compiler/nld.pas
  5. 19 14
      compiler/symsym.pas
  6. 8 3
      compiler/symtable.pas

+ 8 - 3
compiler/m68k/cgcpu.pas

@@ -63,7 +63,7 @@ unit cgcpu;
           procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword;delsource,loadref : boolean);override;
           { generates overflow checking code for a node }
           procedure g_overflowcheck(list: taasmoutput; const l:tlocation; def:tdef); override;
-          procedure g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:aword); override;
+          procedure g_copyvaluepara_openarray(list : taasmoutput;const ref:treference;const lenloc:tlocation;elesize:aword); override;
           procedure g_stackframe_entry(list : taasmoutput;localsize : longint);override;
           procedure g_restore_frame_pointer(list : taasmoutput);override;
           procedure g_return_from_proc(list : taasmoutput;parasize : aword);override;
@@ -998,7 +998,7 @@ unit cgcpu;
       begin
       end;
 
-    procedure tcg68k.g_copyvaluepara_openarray(list : taasmoutput;const ref, lenref:treference;elesize:aword);
+    procedure tcg68k.g_copyvaluepara_openarray(list : taasmoutput;const ref:treference;const lenloc:tlocation;elesize:aword);
       begin
       end;
 
@@ -1313,7 +1313,12 @@ end.
 
 {
   $Log$
-  Revision 1.29  2004-09-25 14:23:54  peter
+  Revision 1.30  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  Revision 1.29  2004/09/25 14:23:54  peter
     * ungetregister is now only used for cpuregisters, renamed to
       ungetcpuregister
     * renamed (get|unget)explicitregister(s) to ..cpuregister

+ 17 - 26
compiler/ncgutil.pas

@@ -704,7 +704,7 @@ implementation
          begin
            loadref:=true;
            case tvarsym(p).localloc.loc of
-             LOC_REGISTER :
+             LOC_CREGISTER :
                begin
                  reference_reset_base(href1,tvarsym(p).localloc.register,0);
                  loadref:=false;
@@ -724,26 +724,13 @@ implementation
                   hsym:=tvarsym(tsym(p).owner.search('high'+p.name));
                   if not assigned(hsym) then
                     internalerror(200306061);
-                  case hsym.localloc.loc of
-                    LOC_REFERENCE :
-                      begin
-                        { this code is only executed before the code for the body and the entry/exit code is generated
-                          so we're allowed to include pi_do_call here; after pass1 is run, this isn't allowed anymore
-                        }
-                        include(current_procinfo.flags,pi_do_call);
-                        cg.g_copyvaluepara_openarray(list,href1,hsym.localloc.reference,tarraydef(tvarsym(p).vartype.def).elesize)
-                      end
-                    else
-                      internalerror(200309182);
-                  end;
+                  cg.g_copyvaluepara_openarray(list,href1,hsym.localloc,tarraydef(tvarsym(p).vartype.def).elesize);
                 end;
             end
            else
             begin
-              if tvarsym(p).localloc.loc<>LOC_REFERENCE then
-                internalerror(200309183);
               { Allocate space for the local copy }
-              l:=tvarsym(p).getvaluesize;
+              l:=tvarsym(p).getsize;
               localcopyloc.loc:=LOC_REFERENCE;
               localcopyloc.size:=int_cgsize(l);
               tg.GetLocal(list,l,tvarsym(p).vartype.def,localcopyloc.reference);
@@ -895,7 +882,7 @@ implementation
       begin
         list:=taasmoutput(arg);
         if (tsym(p).typ=varsym) and
-           not is_class(tvarsym(p).vartype.def) and
+           not is_class_or_interface(tvarsym(p).vartype.def) and
            tvarsym(p).vartype.def.needs_inittable then
          begin
            case tvarsym(p).varspez of
@@ -930,7 +917,7 @@ implementation
       begin
         list:=taasmoutput(arg);
         if (tsym(p).typ=varsym) and
-           not is_class(tvarsym(p).vartype.def) and
+           not is_class_or_interface(tvarsym(p).vartype.def) and
            tvarsym(p).vartype.def.needs_inittable then
          begin
            if (tvarsym(p).varspez=vs_value) then
@@ -1258,7 +1245,9 @@ implementation
       var
         hp      : tparaitem;
         paraloc : pcgparalocation;
+{$ifdef sparc}
         tempref,
+{$endif sparc}
         href    : treference;
       begin
         if (po_assembler in current_procinfo.procdef.procoptions) then
@@ -1827,7 +1816,7 @@ implementation
       begin
         storefilepos:=aktfilepos;
         aktfilepos:=sym.fileinfo;
-        l:=sym.getvaluesize;
+        l:=sym.getsize;
         if (vo_is_thread_var in sym.varoptions) then
           inc(l,sizeof(aint));
         varalign:=var_align(l);
@@ -1877,10 +1866,7 @@ implementation
                           cgsize:=def_cgsize(vartype.def);
 {$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
-                           not(pi_uses_exceptions in current_procinfo.flags) and
-                           (varregable<>vr_none) then
+                        if is_regvar then
                           begin
                             localloc.size:=cgsize;
                             case varregable of
@@ -1930,13 +1916,13 @@ implementation
                                       if isaddr then
                                         tg.GetLocal(list,sizeof(aint),voidpointertype.def,localloc.reference)
                                       else
-                                        tg.GetLocal(list,getvaluesize,vartype.def,localloc.reference);
+                                        tg.GetLocal(list,getsize,vartype.def,localloc.reference);
                                     end;
                                 end;
                               localsymtable,
                               stt_exceptsymtable :
                                 begin
-                                  tg.GetLocal(list,getvaluesize,vartype.def,localloc.reference);
+                                  tg.GetLocal(list,getsize,vartype.def,localloc.reference);
                                 end;
                               staticsymtable :
                                 begin
@@ -2216,7 +2202,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.225  2004-10-10 21:08:55  peter
+  Revision 1.226  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  Revision 1.225  2004/10/10 21:08:55  peter
     * parameter regvar fixes
 
   Revision 1.224  2004/10/10 20:51:46  peter

+ 18 - 8
compiler/ncnv.pas

@@ -1461,7 +1461,7 @@ implementation
               { which needs extra code to do the code page transistion             }
               { constant ordinal to pointer }
               if (resulttype.def.deftype=pointerdef) and
-	         (convtype<>tc_cchar_2_pchar) then
+                 (convtype<>tc_cchar_2_pchar) then
                 begin
                    hp:=cpointerconstnode.create(TConstPtrUInt(tordconstnode(left).value),resulttype);
                    result:=hp;
@@ -1531,12 +1531,17 @@ implementation
 
       begin
         first_int_to_int:=nil;
-        if (left.expectloc<>LOC_REGISTER) and
-           not is_void(left.resulttype.def) and
-           (resulttype.def.size>left.resulttype.def.size) then
-           expectloc:=LOC_REGISTER
-        else
-           expectloc:=left.expectloc;
+        expectloc:=left.expectloc;
+        if not is_void(left.resulttype.def) then
+          begin
+            if (left.expectloc<>LOC_REGISTER) and
+               (resulttype.def.size>left.resulttype.def.size) then
+              expectloc:=LOC_REGISTER
+            else
+              if (left.expectloc=LOC_CREGISTER) and
+                 (resulttype.def.size<left.resulttype.def.size) then
+                expectloc:=LOC_REGISTER;
+          end;
 {$ifndef cpu64bit}
         if is_64bit(resulttype.def) then
           registersint:=max(registersint,2)
@@ -2450,7 +2455,12 @@ begin
 end.
 {
   $Log$
-  Revision 1.153  2004-09-26 17:45:30  peter
+  Revision 1.154  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  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

+ 18 - 6
compiler/nld.pas

@@ -357,11 +357,18 @@ implementation
               begin
                 if assigned(left) then
                   firstpass(left);
-                if (cs_regvars in aktglobalswitches) and
-                   (symtable.symtabletype in [localsymtable]) and
-                   not(pi_has_assembler_block in current_procinfo.flags) and
-                   (tvarsym(symtableentry).varregable<>vr_none) then
-                  expectloc:=LOC_CREGISTER
+                if not is_addr_param_load and
+                   tvarsym(symtableentry).is_regvar then
+                  begin
+                    case tvarsym(symtableentry).varregable of
+                      vr_intreg :
+                        expectloc:=LOC_CREGISTER;
+                      vr_fpureg :
+                        expectloc:=LOC_CFPUREGISTER;
+                      vr_mmreg :
+                        expectloc:=LOC_CMMREGISTER;
+                    end
+                  end
                 else
                   if (tvarsym(symtableentry).varspez=vs_const) then
                     expectloc:=LOC_CREFERENCE;
@@ -1156,7 +1163,12 @@ begin
 end.
 {
   $Log$
-  Revision 1.132  2004-10-10 20:22:53  peter
+  Revision 1.133  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  Revision 1.132  2004/10/10 20:22:53  peter
     * symtable allocation rewritten
     * loading of parameters to local temps/regs cleanup
     * regvar support for parameters

+ 19 - 14
compiler/symsym.pas

@@ -166,7 +166,7 @@ interface
           procedure generate_mangledname;override;
           procedure set_mangledname(const s:string);
           function  getsize : longint;
-          function  getvaluesize : longint;
+          function  is_regvar:boolean;
           procedure trigger_notifications(what:Tnotification_flag);
           function register_notification(flags:Tnotification_flags;
                                          callback:Tnotification_callback):cardinal;
@@ -1420,24 +1420,24 @@ implementation
 
 
     function tvarsym.getsize : longint;
-      begin
-        if assigned(vartype.def) then
-          getsize:=vartype.def.size
-        else
-          getsize:=0;
-      end;
-
-
-    function tvarsym.getvaluesize : longint;
       begin
         if assigned(vartype.def) and
-           (varspez=vs_value) and
            ((vartype.def.deftype<>arraydef) or
             tarraydef(vartype.def).isDynamicArray or
             (tarraydef(vartype.def).highrange>=tarraydef(vartype.def).lowrange)) then
-          getvaluesize:=vartype.def.size
+          result:=vartype.def.size
         else
-          getvaluesize:=0;
+          result:=0;
+      end;
+
+
+    function tvarsym.is_regvar:boolean;
+      begin
+        result:=(cs_regvars in aktglobalswitches) and
+                not(pi_has_assembler_block in current_procinfo.flags) and
+                not(pi_uses_exceptions in current_procinfo.flags) and
+                not(vo_has_local_copy in varoptions) and
+                (varregable<>vr_none);
       end;
 
 
@@ -2223,7 +2223,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.183  2004-10-10 21:08:55  peter
+  Revision 1.184  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  Revision 1.183  2004/10/10 21:08:55  peter
     * parameter regvar fixes
 
   Revision 1.182  2004/10/10 20:22:53  peter

+ 8 - 3
compiler/symtable.pas

@@ -988,7 +988,7 @@ implementation
         { this symbol can't be loaded to a register }
         tvarsym(sym).varregable:=vr_none;
         { Calculate field offset }
-        l:=tvarsym(sym).getvaluesize;
+        l:=tvarsym(sym).getsize;
         vardef:=tvarsym(sym).vartype.def;
         varalign:=vardef.alignment;
         { Calc the alignment size for C style records }
@@ -1104,7 +1104,7 @@ implementation
             { update alignment of this record }
             varalign:=ps.vartype.def.alignment;
             if varalign=0 then
-              varalign:=size_2_align(ps.getvaluesize);
+              varalign:=size_2_align(ps.getsize);
             varalignrecord:=used_align(varalign,aktalignment.recordalignmin,fieldalignment);
             recordalignment:=max(recordalignment,varalignrecord);
 
@@ -2314,7 +2314,12 @@ implementation
 end.
 {
   $Log$
-  Revision 1.156  2004-10-08 17:09:43  peter
+  Revision 1.157  2004-10-11 15:48:15  peter
+    * small regvar for para fixes
+    * function tvarsym.is_regvar added
+    * tvarsym.getvaluesize removed, use getsize instead
+
+  Revision 1.156  2004/10/08 17:09:43  peter
     * tvarsym.varregable added, split vo_regable from varoptions
 
   Revision 1.155  2004/08/17 16:29:21  jonas