mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 16:39:24 +01:00 
			
		
		
		
	+ support for fpu temp parameters
+ saving/restoring of fpu register before/after a procedure call
This commit is contained in:
		
							parent
							
								
									c1279ba62b
								
							
						
					
					
						commit
						0cac29ec76
					
				@ -103,10 +103,8 @@ implementation
 | 
				
			|||||||
      begin
 | 
					      begin
 | 
				
			||||||
         { Allocate (temporary) paralocation }
 | 
					         { Allocate (temporary) paralocation }
 | 
				
			||||||
         tempparaloc:=paraitem.paraloc[callerside];
 | 
					         tempparaloc:=paraitem.paraloc[callerside];
 | 
				
			||||||
         if tempparaloc.loc=LOC_REGISTER then
 | 
					         if (tempparaloc.loc in [LOC_REGISTER,LOC_FPUREGISTER,LOC_MMREGISTER]) then
 | 
				
			||||||
           paramanager.alloctempregs(exprasmlist,tempparaloc)
 | 
					           paramanager.alloctempregs(exprasmlist,tempparaloc)
 | 
				
			||||||
         else
 | 
					 | 
				
			||||||
           paramanager.allocparaloc(exprasmlist,tempparaloc);
 | 
					 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -480,7 +478,8 @@ implementation
 | 
				
			|||||||
                  location.register:=NR_FPU_RESULT_REG;
 | 
					                  location.register:=NR_FPU_RESULT_REG;
 | 
				
			||||||
{$ifdef x86}
 | 
					{$ifdef x86}
 | 
				
			||||||
                tcgx86(cg).inc_fpu_stack;
 | 
					                tcgx86(cg).inc_fpu_stack;
 | 
				
			||||||
{$else x86}
 | 
					{$else x86} 
 | 
				
			||||||
 | 
					                cg.ungetregister(exprasmlist,location.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;
 | 
				
			||||||
@ -605,31 +604,52 @@ implementation
 | 
				
			|||||||
           ppn:=tcgcallparanode(left);
 | 
					           ppn:=tcgcallparanode(left);
 | 
				
			||||||
           while assigned(ppn) do
 | 
					           while assigned(ppn) do
 | 
				
			||||||
             begin
 | 
					             begin
 | 
				
			||||||
               if ppn.tempparaloc.loc=LOC_REGISTER then
 | 
					               case ppn.tempparaloc.loc of
 | 
				
			||||||
                 begin
 | 
					                 LOC_REGISTER:
 | 
				
			||||||
                   paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
					                   begin
 | 
				
			||||||
                   paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
					                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
				
			||||||
 | 
					                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
				
			||||||
{$ifdef sparc}
 | 
					{$ifdef sparc}
 | 
				
			||||||
                   case ppn.tempparaloc.size of
 | 
					                     case ppn.tempparaloc.size of
 | 
				
			||||||
                     OS_F32 :
 | 
					                       OS_F32 :
 | 
				
			||||||
                       ppn.tempparaloc.size:=OS_32;
 | 
					                         ppn.tempparaloc.size:=OS_32;
 | 
				
			||||||
                     OS_F64 :
 | 
					                       OS_F64 :
 | 
				
			||||||
                       ppn.tempparaloc.size:=OS_64;
 | 
					                         ppn.tempparaloc.size:=OS_64;
 | 
				
			||||||
                   end;
 | 
					                     end;
 | 
				
			||||||
{$endif sparc}
 | 
					{$endif sparc}
 | 
				
			||||||
{$ifndef cpu64bit}
 | 
					{$ifndef cpu64bit}
 | 
				
			||||||
                   if ppn.tempparaloc.size in [OS_64,OS_S64] then
 | 
					                     if ppn.tempparaloc.size in [OS_64,OS_S64] then
 | 
				
			||||||
                     begin
 | 
					                       begin
 | 
				
			||||||
                       cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
 | 
					                         cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerlow,
 | 
				
			||||||
                          ppn.paraitem.paraloc[callerside].registerlow);
 | 
					                            ppn.paraitem.paraloc[callerside].registerlow);
 | 
				
			||||||
                       cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
 | 
					                         cg.a_load_reg_reg(exprasmlist,OS_32,OS_32,ppn.tempparaloc.registerhigh,
 | 
				
			||||||
                          ppn.paraitem.paraloc[callerside].registerhigh);
 | 
					                            ppn.paraitem.paraloc[callerside].registerhigh);
 | 
				
			||||||
                     end
 | 
					                       end
 | 
				
			||||||
                   else
 | 
					                     else
 | 
				
			||||||
{$endif cpu64bit}
 | 
					{$endif cpu64bit}
 | 
				
			||||||
                     cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
 | 
					                       cg.a_load_reg_reg(exprasmlist,ppn.tempparaloc.size,ppn.tempparaloc.size,
 | 
				
			||||||
                         ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
 | 
					                           ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
 | 
				
			||||||
                 end;
 | 
					                   end;
 | 
				
			||||||
 | 
					                 LOC_FPUREGISTER:
 | 
				
			||||||
 | 
					                   begin
 | 
				
			||||||
 | 
					                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
				
			||||||
 | 
					                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
				
			||||||
 | 
					                     cg.a_loadfpu_reg_reg(exprasmlist,ppn.tempparaloc.size,
 | 
				
			||||||
 | 
					                       ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register);
 | 
				
			||||||
 | 
					                   end;
 | 
				
			||||||
 | 
					                 LOC_MMREGISTER:
 | 
				
			||||||
 | 
					                   begin
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
				
			||||||
 | 
					                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
				
			||||||
 | 
					                     paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
				
			||||||
 | 
					                     paramanager.allocparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
				
			||||||
 | 
					                     cg.a_loadmm_reg_reg(exprasmlist,ppn.tempparaloc.size,
 | 
				
			||||||
 | 
					                       ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register, shuffle???);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					                     internalerror(2003102910);
 | 
				
			||||||
 | 
					                   end;
 | 
				
			||||||
 | 
					               end;
 | 
				
			||||||
               ppn:=tcgcallparanode(ppn.right);
 | 
					               ppn:=tcgcallparanode(ppn.right);
 | 
				
			||||||
             end;
 | 
					             end;
 | 
				
			||||||
         end;
 | 
					         end;
 | 
				
			||||||
@ -642,8 +662,6 @@ implementation
 | 
				
			|||||||
           ppn:=tcgcallparanode(left);
 | 
					           ppn:=tcgcallparanode(left);
 | 
				
			||||||
           while assigned(ppn) do
 | 
					           while assigned(ppn) do
 | 
				
			||||||
             begin
 | 
					             begin
 | 
				
			||||||
               if ppn.tempparaloc.loc=LOC_REGISTER then
 | 
					 | 
				
			||||||
                 paramanager.freeparaloc(exprasmlist,ppn.tempparaloc);
 | 
					 | 
				
			||||||
               paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
					               paramanager.freeparaloc(exprasmlist,ppn.paraitem.paraloc[callerside]);
 | 
				
			||||||
               ppn:=tcgcallparanode(ppn.right);
 | 
					               ppn:=tcgcallparanode(ppn.right);
 | 
				
			||||||
             end;
 | 
					             end;
 | 
				
			||||||
@ -699,6 +717,14 @@ implementation
 | 
				
			|||||||
{$endif cpu64bit}
 | 
					{$endif cpu64bit}
 | 
				
			||||||
                   include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register));
 | 
					                   include(regs_to_alloc,getsupreg(procdefinition.funcret_paraloc[callerside].register));
 | 
				
			||||||
                end;
 | 
					                end;
 | 
				
			||||||
 | 
					              LOC_FPUREGISTER,LOC_CFPUREGISTER:
 | 
				
			||||||
 | 
					                begin
 | 
				
			||||||
 | 
					                  include(regs_to_push_fpu,procdefinition.funcret_paraloc[callerside].register);
 | 
				
			||||||
 | 
					                end;
 | 
				
			||||||
 | 
					              LOC_MMREGISTER,LOC_CMMREGISTER:
 | 
				
			||||||
 | 
					                begin
 | 
				
			||||||
 | 
					                  internalerror(2003102911);
 | 
				
			||||||
 | 
					                end;
 | 
				
			||||||
            end;
 | 
					            end;
 | 
				
			||||||
          end;
 | 
					          end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -770,6 +796,7 @@ implementation
 | 
				
			|||||||
                   cg.ungetregister(exprasmlist,pvreg);
 | 
					                   cg.ungetregister(exprasmlist,pvreg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                   cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
					                   cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
				
			||||||
 | 
					                   cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
 | 
				
			||||||
                   cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
					                   cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                   { call method }
 | 
					                   { call method }
 | 
				
			||||||
@ -786,6 +813,7 @@ implementation
 | 
				
			|||||||
                  freeparas;
 | 
					                  freeparas;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
					                  cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
				
			||||||
 | 
					                  cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
 | 
				
			||||||
                  cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
					                  cg.allocexplicitregisters(exprasmlist,R_SSEREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                  { Calling interrupt from the same code requires some
 | 
					                  { Calling interrupt from the same code requires some
 | 
				
			||||||
@ -821,6 +849,7 @@ implementation
 | 
				
			|||||||
              cg.ungetregister(exprasmlist,pvreg);
 | 
					              cg.ungetregister(exprasmlist,pvreg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
					              cg.allocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_alloc);
 | 
				
			||||||
 | 
					              cg.allocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
 | 
				
			||||||
              cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
					              cg.allocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              { Calling interrupt from the same code requires some
 | 
					              { Calling interrupt from the same code requires some
 | 
				
			||||||
@ -871,9 +900,14 @@ implementation
 | 
				
			|||||||
{$endif cpu64bit}
 | 
					{$endif cpu64bit}
 | 
				
			||||||
                     exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register));
 | 
					                     exclude(regs_to_free,getsupreg(procdefinition.funcret_paraloc[callerside].register));
 | 
				
			||||||
                 end;
 | 
					                 end;
 | 
				
			||||||
 | 
					               LOC_FPUREGISTER,LOC_CFPUREGISTER:
 | 
				
			||||||
 | 
					                 begin
 | 
				
			||||||
 | 
					                   exclude(regs_to_push_fpu,getsupreg(procdefinition.funcret_paraloc[callerside].register));
 | 
				
			||||||
 | 
					                 end;
 | 
				
			||||||
             end;
 | 
					             end;
 | 
				
			||||||
           end;
 | 
					           end;
 | 
				
			||||||
         cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
					         cg.deallocexplicitregisters(exprasmlist,R_MMREGISTER,paramanager.get_volatile_registers_mm(procdefinition.proccalloption));
 | 
				
			||||||
 | 
					         cg.deallocexplicitregisters(exprasmlist,R_FPUREGISTER,regs_to_push_fpu);
 | 
				
			||||||
         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_free);
 | 
					         cg.deallocexplicitregisters(exprasmlist,R_INTREGISTER,regs_to_free);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         { handle function results }
 | 
					         { handle function results }
 | 
				
			||||||
@ -1120,7 +1154,11 @@ begin
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.133  2003-10-20 19:28:17  peter
 | 
					  Revision 1.134  2003-10-29 21:24:14  jonas
 | 
				
			||||||
 | 
					    + support for fpu temp parameters
 | 
				
			||||||
 | 
					    + saving/restoring of fpu register before/after a procedure call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.133  2003/10/20 19:28:17  peter
 | 
				
			||||||
    * fixed inlining float parameters for i386
 | 
					    * fixed inlining float parameters for i386
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.132  2003/10/17 14:38:32  peter
 | 
					  Revision 1.132  2003/10/17 14:38:32  peter
 | 
				
			||||||
 | 
				
			|||||||
@ -377,17 +377,30 @@ implementation
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
 | 
					    procedure tparamanager.alloctempregs(list: taasmoutput;var locpara:tparalocation);
 | 
				
			||||||
      begin
 | 
					      begin
 | 
				
			||||||
        if locpara.loc<>LOC_REGISTER then
 | 
					        case locpara.loc of
 | 
				
			||||||
          internalerror(200308123);
 | 
					          LOC_REGISTER:
 | 
				
			||||||
 | 
					            begin
 | 
				
			||||||
{$ifndef cpu64bit}
 | 
					{$ifndef cpu64bit}
 | 
				
			||||||
        if locpara.size in [OS_64,OS_S64] then
 | 
					              if locpara.size in [OS_64,OS_S64] then
 | 
				
			||||||
          begin
 | 
					                begin
 | 
				
			||||||
            locpara.registerlow:=cg.getintregister(list,OS_32);
 | 
					                  locpara.registerlow:=cg.getintregister(list,OS_32);
 | 
				
			||||||
            locpara.registerhigh:=cg.getintregister(list,OS_32);
 | 
					                  locpara.registerhigh:=cg.getintregister(list,OS_32);
 | 
				
			||||||
          end
 | 
					                end
 | 
				
			||||||
        else
 | 
					              else
 | 
				
			||||||
{$endif cpu64bit}
 | 
					{$endif cpu64bit}
 | 
				
			||||||
          locpara.register:=cg.getintregister(list,locpara.size);
 | 
					                locpara.register:=cg.getintregister(list,locpara.size);
 | 
				
			||||||
 | 
					            end;
 | 
				
			||||||
 | 
					          LOC_FPUREGISTER:
 | 
				
			||||||
 | 
					            begin
 | 
				
			||||||
 | 
					              locpara.register:=cg.getfpuregister(list,locpara.size);
 | 
				
			||||||
 | 
					            end;
 | 
				
			||||||
 | 
					          LOC_MMREGISTER:
 | 
				
			||||||
 | 
					            begin
 | 
				
			||||||
 | 
					              locpara.register:=cg.getfpuregister(list,locpara.size);
 | 
				
			||||||
 | 
					            end;
 | 
				
			||||||
 | 
					          else
 | 
				
			||||||
 | 
					            internalerror(200308123);
 | 
				
			||||||
 | 
					        end;
 | 
				
			||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -437,7 +450,11 @@ end.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   $Log$
 | 
					   $Log$
 | 
				
			||||||
   Revision 1.64  2003-10-17 14:38:32  peter
 | 
					   Revision 1.65  2003-10-29 21:24:14  jonas
 | 
				
			||||||
 | 
					     + support for fpu temp parameters
 | 
				
			||||||
 | 
					     + saving/restoring of fpu register before/after a procedure call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Revision 1.64  2003/10/17 14:38:32  peter
 | 
				
			||||||
     * 64k registers supported
 | 
					     * 64k registers supported
 | 
				
			||||||
     * fixed some memory leaks
 | 
					     * fixed some memory leaks
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -254,6 +254,7 @@ unit cgx86;
 | 
				
			|||||||
            rgint.allocexplicitregisters(list,r);
 | 
					            rgint.allocexplicitregisters(list,r);
 | 
				
			||||||
          R_SSEREGISTER :
 | 
					          R_SSEREGISTER :
 | 
				
			||||||
            rgmm.allocexplicitregisters(list,r);
 | 
					            rgmm.allocexplicitregisters(list,r);
 | 
				
			||||||
 | 
					          R_FPUREGISTER :
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            internalerror(200310092);
 | 
					            internalerror(200310092);
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
@ -267,6 +268,7 @@ unit cgx86;
 | 
				
			|||||||
            rgint.deallocexplicitregisters(list,r);
 | 
					            rgint.deallocexplicitregisters(list,r);
 | 
				
			||||||
          R_SSEREGISTER :
 | 
					          R_SSEREGISTER :
 | 
				
			||||||
            rgmm.deallocexplicitregisters(list,r);
 | 
					            rgmm.deallocexplicitregisters(list,r);
 | 
				
			||||||
 | 
					          R_FPUREGISTER :
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            internalerror(200310093);
 | 
					            internalerror(200310093);
 | 
				
			||||||
        end;
 | 
					        end;
 | 
				
			||||||
@ -1733,7 +1735,11 @@ unit cgx86;
 | 
				
			|||||||
end.
 | 
					end.
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  $Log$
 | 
					  $Log$
 | 
				
			||||||
  Revision 1.83  2003-10-20 19:30:08  peter
 | 
					  Revision 1.84  2003-10-29 21:24:14  jonas
 | 
				
			||||||
 | 
					    + support for fpu temp parameters
 | 
				
			||||||
 | 
					    + saving/restoring of fpu register before/after a procedure call
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Revision 1.83  2003/10/20 19:30:08  peter
 | 
				
			||||||
    * remove memdebug code for rg
 | 
					    * remove memdebug code for rg
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Revision 1.82  2003/10/18 15:41:26  peter
 | 
					  Revision 1.82  2003/10/18 15:41:26  peter
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user