mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 10:59:41 +01:00 
			
		
		
		
	+ internal round/trunc support for ppc970 using fctid/fctidz
* a_fctw_ -> a_fctiw_ git-svn-id: trunk@10367 -
This commit is contained in:
		
							parent
							
								
									1cdf575657
								
							
						
					
					
						commit
						417b5dcfda
					
				@ -58,8 +58,10 @@ const
 | 
				
			|||||||
    a_none, a_none, a_none, a_none, a_none, a_none, a_divw, a_divw_, a_divwo, a_divwo_,
 | 
					    a_none, a_none, a_none, a_none, a_none, a_none, a_divw, a_divw_, a_divwo, a_divwo_,
 | 
				
			||||||
    a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_none, a_none, a_none, a_eqv,
 | 
					    a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_none, a_none, a_none, a_eqv,
 | 
				
			||||||
    a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
					    a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
				
			||||||
    a_fadd_, a_fadds, a_fadds_, a_none, a_none, a_none, a_none, a_none,
 | 
					    a_fadd_, a_fadds, a_fadds_, a_none, a_none,
 | 
				
			||||||
    a_none, a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
					    a_fctid, a_fctid_, a_fctidz, a_fctidz_,
 | 
				
			||||||
 | 
					    a_fctiw, a_fctiw_, a_fctiwz, a_fctiwz_,
 | 
				
			||||||
 | 
					    a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
				
			||||||
    a_fmadds_, a_none, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
					    a_fmadds_, a_none, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
				
			||||||
    a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
					    a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
				
			||||||
    a_fnmadd_, a_fnmadds, a_fnmadds_, a_fnmsub, a_fnmsub_, a_fnmsubs,
 | 
					    a_fnmadd_, a_fnmadds, a_fnmadds_, a_fnmsub, a_fnmsub_, a_fnmsubs,
 | 
				
			||||||
@ -418,6 +420,7 @@ const
 | 
				
			|||||||
      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
      a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
      a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
 | 
					      a_none, a_none, a_none, a_none,
 | 
				
			||||||
      a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
					      a_none, a_none, a_none, a_none, a_none, a_none, a_none, a_none,
 | 
				
			||||||
 | 
				
			|||||||
@ -49,8 +49,9 @@ uses
 | 
				
			|||||||
        a_dcbf, a_dcbi, a_dcbst, a_dcbt, a_dcbtst, a_dcbz, a_divw, a_divw_, a_divwo, a_divwo_,
 | 
					        a_dcbf, a_dcbi, a_dcbst, a_dcbt, a_dcbtst, a_dcbz, a_divw, a_divw_, a_divwo, a_divwo_,
 | 
				
			||||||
        a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_eciwx, a_ecowx, a_eieio, a_eqv,
 | 
					        a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_eciwx, a_ecowx, a_eieio, a_eqv,
 | 
				
			||||||
        a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
					        a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
				
			||||||
        a_fadd_, a_fadds, a_fadds_, a_fcmpo, a_fcmpu, a_fctiw, a_fctw_, a_fctwz,
 | 
					        a_fadd_, a_fadds, a_fadds_, a_fcmpo, a_fcmpu, a_fctid, a_fctid_,
 | 
				
			||||||
        a_fctwz_, a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
					        a_fctidz, a_fctidz_, a_fctiw, a_fctiw_, a_fctiwz, a_fctiwz_,
 | 
				
			||||||
 | 
					        a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
				
			||||||
        a_fmadds_, a_fmr, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
					        a_fmadds_, a_fmr, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
				
			||||||
        a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
					        a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
				
			||||||
        a_fnmadd_, a_fnmadds, a_fnmadds_, a_fnmsub, a_fnmsub_, a_fnmsubs,
 | 
					        a_fnmadd_, a_fnmadds, a_fnmadds_, a_fnmsub, a_fnmsub_, a_fnmsubs,
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,8 @@ interface
 | 
				
			|||||||
        'dcbf','dcbi','dcbst','dcbt','dcbtst','dcbz','divw','divw.','divwo','divwo.',
 | 
					        'dcbf','dcbi','dcbst','dcbt','dcbtst','dcbz','divw','divw.','divwo','divwo.',
 | 
				
			||||||
        'divwu','divwu.','divwuo','divwuo.','eciwx','ecowx','eieio','eqv',
 | 
					        'divwu','divwu.','divwuo','divwuo.','eciwx','ecowx','eieio','eqv',
 | 
				
			||||||
        'eqv.','extsb','extsb.','extsh','extsh.','fabs','fabs.','fadd',
 | 
					        'eqv.','extsb','extsb.','extsh','extsh.','fabs','fabs.','fadd',
 | 
				
			||||||
        'fadd.','fadds','fadds.','fcmpo','fcmpu','fctiw','fctiw.','fctiwz',
 | 
					        'fadd.','fadds','fadds.','fcmpo','fcmpu','fctid','fctid.','fctidz',
 | 
				
			||||||
 | 
					        'fctidz.','fctiw','fctiw.','fctiwz',
 | 
				
			||||||
        'fctiwz.','fdiv','fdiv.','fdivs','fdivs.','fmadd','fmadd.','fmadds',
 | 
					        'fctiwz.','fdiv','fdiv.','fdivs','fdivs.','fmadd','fmadd.','fmadds',
 | 
				
			||||||
        'fmadds.','fmr','fmsub','fmsub.','fmsubs','fmsubs.','fmul','fmul.',
 | 
					        'fmadds.','fmr','fmsub','fmsub.','fmsubs','fmsubs.','fmul','fmul.',
 | 
				
			||||||
        'fmuls','fmuls.','fnabs','fnabs.','fneg','fneg.','fnmadd',
 | 
					        'fmuls','fmuls.','fnabs','fnabs.','fneg','fneg.','fnmadd',
 | 
				
			||||||
 | 
				
			|||||||
@ -49,7 +49,7 @@ type
 | 
				
			|||||||
      a_divwo_,
 | 
					      a_divwo_,
 | 
				
			||||||
    a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_eciwx, a_ecowx, a_eieio, a_eqv,
 | 
					    a_divwu, a_divwu_, a_divwuo, a_divwuo_, a_eciwx, a_ecowx, a_eieio, a_eqv,
 | 
				
			||||||
    a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
					    a_eqv_, a_extsb, a_extsb_, a_extsh, a_extsh_, a_fabs, a_fabs_, a_fadd,
 | 
				
			||||||
    a_fadd_, a_fadds, a_fadds_, a_fcmpo, a_fcmpu, a_fctiw, a_fctw_, a_fctwz,
 | 
					    a_fadd_, a_fadds, a_fadds_, a_fcmpo, a_fcmpu, a_fctiw, a_fctiw_, a_fctiwz,
 | 
				
			||||||
    a_fctwz_, a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
					    a_fctwz_, a_fdiv, a_fdiv_, a_fdivs, a_fdivs_, a_fmadd, a_fmadd_, a_fmadds,
 | 
				
			||||||
    a_fmadds_, a_fmr, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
					    a_fmadds_, a_fmr, a_fmsub, a_fmsub_, a_fmsubs, a_fmsubs_, a_fmul, a_fmul_,
 | 
				
			||||||
    a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
					    a_fmuls, a_fmuls_, a_fnabs, a_fnabs_, a_fneg, a_fneg_, a_fnmadd,
 | 
				
			||||||
 | 
				
			|||||||
@ -26,6 +26,7 @@ unit ngppcinl;
 | 
				
			|||||||
interface
 | 
					interface
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uses
 | 
					    uses
 | 
				
			||||||
 | 
					       cpubase,
 | 
				
			||||||
       node,ninl,ncginl;
 | 
					       node,ninl,ncginl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    type
 | 
					    type
 | 
				
			||||||
@ -37,24 +38,29 @@ interface
 | 
				
			|||||||
          function first_sqrt_real: tnode; override;
 | 
					          function first_sqrt_real: tnode; override;
 | 
				
			||||||
          function first_abs_real: tnode; override;
 | 
					          function first_abs_real: tnode; override;
 | 
				
			||||||
          function first_sqr_real: tnode; override;
 | 
					          function first_sqr_real: tnode; override;
 | 
				
			||||||
 | 
					          function first_trunc_real: tnode; override;
 | 
				
			||||||
 | 
					          function first_round_real: tnode; override;
 | 
				
			||||||
          procedure second_sqrt_real; override;
 | 
					          procedure second_sqrt_real; override;
 | 
				
			||||||
          procedure second_abs_real; override;
 | 
					          procedure second_abs_real; override;
 | 
				
			||||||
          procedure second_sqr_real; override;
 | 
					          procedure second_sqr_real; override;
 | 
				
			||||||
 | 
					          procedure second_trunc_real; override;
 | 
				
			||||||
 | 
					          procedure second_round_real; override;
 | 
				
			||||||
          procedure second_prefetch;override;
 | 
					          procedure second_prefetch;override;
 | 
				
			||||||
       protected
 | 
					       protected
 | 
				
			||||||
          procedure load_fpu_location;
 | 
					          procedure load_fpu_location;
 | 
				
			||||||
 | 
					          procedure second_trunc_round_real(op: tasmop);
 | 
				
			||||||
       end;
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
implementation
 | 
					implementation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    uses
 | 
					    uses
 | 
				
			||||||
      cutils,globals,verbose,
 | 
					      cutils,globals,verbose,globtype,
 | 
				
			||||||
      aasmtai,aasmdata,aasmcpu,
 | 
					      aasmtai,aasmdata,aasmcpu,
 | 
				
			||||||
      symconst,symdef,
 | 
					      symconst,symdef,
 | 
				
			||||||
      defutil,
 | 
					      defutil,
 | 
				
			||||||
      cgbase,pass_2,
 | 
					      cgbase,pass_2,
 | 
				
			||||||
      cpubase,cpuinfo,ncgutil,
 | 
					      cpuinfo,ncgutil,
 | 
				
			||||||
      cgutils,cgobj,rgobj;
 | 
					      cgutils,cgobj,rgobj,tgobj;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{*****************************************************************************
 | 
					{*****************************************************************************
 | 
				
			||||||
@ -87,6 +93,30 @@ implementation
 | 
				
			|||||||
      end;
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function tgppcinlinenode.first_trunc_real : tnode;
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					       if (current_settings.cputype >= cpu_PPC970) then
 | 
				
			||||||
 | 
					          begin
 | 
				
			||||||
 | 
					            expectloc:=LOC_REFERENCE;
 | 
				
			||||||
 | 
					            first_trunc_real := nil;
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          result:=inherited first_trunc_real;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     function tgppcinlinenode.first_round_real : tnode;
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					       if (current_settings.cputype >= cpu_PPC970) then
 | 
				
			||||||
 | 
					          begin
 | 
				
			||||||
 | 
					            expectloc:=LOC_REFERENCE;
 | 
				
			||||||
 | 
					            first_round_real := nil;
 | 
				
			||||||
 | 
					          end
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					          result:=inherited first_round_real;
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     { load the FPU into the an fpu register }
 | 
					     { load the FPU into the an fpu register }
 | 
				
			||||||
     procedure tgppcinlinenode.load_fpu_location;
 | 
					     procedure tgppcinlinenode.load_fpu_location;
 | 
				
			||||||
       begin
 | 
					       begin
 | 
				
			||||||
@ -141,6 +171,37 @@ implementation
 | 
				
			|||||||
       end;
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     procedure tgppcinlinenode.second_trunc_round_real(op: tasmop);
 | 
				
			||||||
 | 
					       var
 | 
				
			||||||
 | 
					         tmpreg: tregister;
 | 
				
			||||||
 | 
					       begin
 | 
				
			||||||
 | 
					         if (current_settings.cputype < cpu_PPC970) then
 | 
				
			||||||
 | 
					           internalerror(2007020910);
 | 
				
			||||||
 | 
					         secondpass(left);
 | 
				
			||||||
 | 
					         location_force_fpureg(current_asmdata.CurrAsmList,left.location,true);
 | 
				
			||||||
 | 
					         tmpreg:=cg.getfpuregister(current_asmdata.CurrAsmList,OS_F64);
 | 
				
			||||||
 | 
					         current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg(op,tmpreg,
 | 
				
			||||||
 | 
					           left.location.register));
 | 
				
			||||||
 | 
					         location_reset(location,LOC_REFERENCE,def_cgsize(resultdef));
 | 
				
			||||||
 | 
					         tg.gettemptyped(current_asmdata.CurrAsmList,resultdef,tt_normal,
 | 
				
			||||||
 | 
					           location.reference);
 | 
				
			||||||
 | 
					         cg.a_loadfpu_reg_ref(current_asmdata.CurrAsmList,OS_F64,OS_F64,tmpreg,
 | 
				
			||||||
 | 
					           location.reference);
 | 
				
			||||||
 | 
					       end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    procedure tgppcinlinenode.second_trunc_real;
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        second_trunc_round_real(A_FCTIDZ);
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    procedure tgppcinlinenode.second_round_real;
 | 
				
			||||||
 | 
					      begin
 | 
				
			||||||
 | 
					        second_trunc_round_real(A_FCTID);
 | 
				
			||||||
 | 
					      end;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     procedure tgppcinlinenode.second_prefetch;
 | 
					     procedure tgppcinlinenode.second_prefetch;
 | 
				
			||||||
       var
 | 
					       var
 | 
				
			||||||
         r: tregister;
 | 
					         r: tregister;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user