mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 14:39:36 +01:00 
			
		
		
		
	* don't reuse mm registers used by child nodes
git-svn-id: trunk@24897 -
This commit is contained in:
		
							parent
							
								
									e81d2d1f3b
								
							
						
					
					
						commit
						d8ff85846f
					
				@ -769,7 +769,8 @@ unit nx86add;
 | 
			
		||||
        { we can use only right as left operand if the operation is commutative }
 | 
			
		||||
        else if (right.location.loc=LOC_MMREGISTER) and (op in [OP_ADD,OP_MUL]) then
 | 
			
		||||
          begin
 | 
			
		||||
            location.register:=right.location.register;
 | 
			
		||||
            location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
 | 
			
		||||
            cg.a_loadmm_reg_reg(current_asmdata.CurrAsmList,right.location.size,location.size,right.location.register,location.register,mms_movescalar);
 | 
			
		||||
            { force floating point reg. location to be written to memory,
 | 
			
		||||
              we don't force it to mm register because writing to memory
 | 
			
		||||
              allows probably shorter code because there is no direct fpu->mm register
 | 
			
		||||
@ -781,11 +782,20 @@ unit nx86add;
 | 
			
		||||
          end
 | 
			
		||||
        else
 | 
			
		||||
          begin
 | 
			
		||||
            if (nf_swapped in flags) then
 | 
			
		||||
            if nf_swapped in flags then
 | 
			
		||||
              swapleftright;
 | 
			
		||||
 | 
			
		||||
            hlcg.location_force_mmregscalar(current_asmdata.CurrAsmList,left.location,left.resultdef,false);
 | 
			
		||||
            location.register:=left.location.register;
 | 
			
		||||
            { force floating point reg. location to be written to memory,
 | 
			
		||||
              we don't force it to mm register because writing to memory
 | 
			
		||||
              allows probably shorter code because there is no direct fpu->mm register
 | 
			
		||||
              copy instruction
 | 
			
		||||
            }
 | 
			
		||||
            if left.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
 | 
			
		||||
              hlcg.location_force_mem(current_asmdata.CurrAsmList,left.location,left.resultdef);
 | 
			
		||||
 | 
			
		||||
            location.register:=cg.getmmregister(current_asmdata.CurrAsmList,location.size);
 | 
			
		||||
            cg.a_loadmm_loc_reg(current_asmdata.CurrAsmList,location.size,left.location,location.register,mms_movescalar);
 | 
			
		||||
 | 
			
		||||
            { force floating point reg. location to be written to memory,
 | 
			
		||||
              we don't force it to mm register because writing to memory
 | 
			
		||||
              allows probably shorter code because there is no direct fpu->mm register
 | 
			
		||||
@ -793,6 +803,7 @@ unit nx86add;
 | 
			
		||||
            }
 | 
			
		||||
            if right.location.loc in [LOC_FPUREGISTER,LOC_CFPUREGISTER] then
 | 
			
		||||
              hlcg.location_force_mem(current_asmdata.CurrAsmList,right.location,right.resultdef);
 | 
			
		||||
 | 
			
		||||
            cg.a_opmm_loc_reg(current_asmdata.CurrAsmList,op,location.size,right.location,location.register,mms_movescalar);
 | 
			
		||||
          end;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user