Browse Source

* fixed funcretloc for sparc

peter 20 years ago
parent
commit
a29eab36c7
3 changed files with 17 additions and 7 deletions
  1. 6 4
      compiler/ncgcal.pas
  2. 6 2
      compiler/ncgutil.pas
  3. 5 1
      compiler/sparc/cpupara.pas

+ 6 - 4
compiler/ncgcal.pas

@@ -493,7 +493,6 @@ implementation
         retloc    : tlocation;
         retloc    : tlocation;
         hregister : tregister;
         hregister : tregister;
         tempnode  : tnode;
         tempnode  : tnode;
-        resultparaloc : pcgparalocation;
       begin
       begin
         cgsize:=procdefinition.funcretloc[callerside].size;
         cgsize:=procdefinition.funcretloc[callerside].size;
 
 
@@ -557,8 +556,8 @@ implementation
 {$ifdef x86}
 {$ifdef x86}
                        tcgx86(cg).inc_fpu_stack;
                        tcgx86(cg).inc_fpu_stack;
 {$else x86}
 {$else x86}
-                       if getsupreg(resultparaloc^.register)<first_fpu_imreg then
-                         cg.ungetcpuregister(exprasmlist,resultparaloc^.register);
+                       if getsupreg(procdefinition.funcretloc[callerside].register)<first_fpu_imreg then
+                         cg.ungetcpuregister(exprasmlist,procdefinition.funcretloc[callerside].register);
                        hregister:=cg.getfpuregister(exprasmlist,location.size);
                        hregister:=cg.getfpuregister(exprasmlist,location.size);
                        cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
                        cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
                        location.register:=hregister;
                        location.register:=hregister;
@@ -1248,7 +1247,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.187  2004-11-21 17:54:59  peter
+  Revision 1.188  2004-11-21 18:13:31  peter
+    * fixed funcretloc for sparc
+
+  Revision 1.187  2004/11/21 17:54:59  peter
     * ttempcreatenode.create_reg merged into .create with parameter
     * ttempcreatenode.create_reg merged into .create with parameter
       whether a register is allowed
       whether a register is allowed
     * funcret_paraloc renamed to funcretloc
     * funcret_paraloc renamed to funcretloc

+ 6 - 2
compiler/ncgutil.pas

@@ -1769,7 +1769,8 @@ implementation
         cg.g_proc_exit(list,parasize,(po_nostackframe in current_procinfo.procdef.procoptions));
         cg.g_proc_exit(list,parasize,(po_nostackframe in current_procinfo.procdef.procoptions));
 
 
         { release return registers, needed for optimizer }
         { release return registers, needed for optimizer }
-        location_free(list,current_procinfo.procdef.funcretloc[calleeside]);
+        if not is_void(current_procinfo.procdef.rettype.def) then
+          location_free(list,current_procinfo.procdef.funcretloc[calleeside]);
 
 
         { end of frame marker for call frame info }
         { end of frame marker for call frame info }
         dwarfcfi.end_frame(list);
         dwarfcfi.end_frame(list);
@@ -2259,7 +2260,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.244  2004-11-21 17:54:59  peter
+  Revision 1.245  2004-11-21 18:13:31  peter
+    * fixed funcretloc for sparc
+
+  Revision 1.244  2004/11/21 17:54:59  peter
     * ttempcreatenode.create_reg merged into .create with parameter
     * ttempcreatenode.create_reg merged into .create with parameter
       whether a register is allowed
       whether a register is allowed
     * funcret_paraloc renamed to funcretloc
     * funcret_paraloc renamed to funcretloc

+ 5 - 1
compiler/sparc/cpupara.pas

@@ -176,6 +176,7 @@ implementation
 {$ifndef cpu64bit}
 {$ifndef cpu64bit}
             if retcgsize in [OS_64,OS_S64] then
             if retcgsize in [OS_64,OS_S64] then
              begin
              begin
+               p.funcretloc[side].loc:=LOC_REGISTER;
                { high }
                { high }
                if (side=callerside)  or (p.proccalloption=pocall_inline)then
                if (side=callerside)  or (p.proccalloption=pocall_inline)then
                  p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
                  p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
@@ -316,7 +317,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.49  2004-11-21 17:54:59  peter
+  Revision 1.50  2004-11-21 18:13:31  peter
+    * fixed funcretloc for sparc
+
+  Revision 1.49  2004/11/21 17:54:59  peter
     * ttempcreatenode.create_reg merged into .create with parameter
     * ttempcreatenode.create_reg merged into .create with parameter
       whether a register is allowed
       whether a register is allowed
     * funcret_paraloc renamed to funcretloc
     * funcret_paraloc renamed to funcretloc