mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 06:59:33 +01:00 
			
		
		
		
	* handling of float parameters passed in mm registers fixed
This commit is contained in:
		
							parent
							
								
									90830261ed
								
							
						
					
					
						commit
						e7399ee666
					
				@ -1138,12 +1138,22 @@ implementation
 | 
			
		||||
 | 
			
		||||
    procedure tcg.a_paramfpu_ref(list : taasmoutput;size : tcgsize;const ref : treference;const locpara : tparalocation);
 | 
			
		||||
      var
 | 
			
		||||
         hr : tregister;
 | 
			
		||||
         href : treference;
 | 
			
		||||
      begin
 | 
			
		||||
         hr:=getfpuregister(list,size);
 | 
			
		||||
         a_loadfpu_ref_reg(list,size,ref,hr);
 | 
			
		||||
         a_paramfpu_reg(list,size,hr,locpara);
 | 
			
		||||
         ungetregister(list,hr);
 | 
			
		||||
        case locpara.loc of
 | 
			
		||||
          LOC_FPUREGISTER,LOC_CFPUREGISTER:
 | 
			
		||||
            a_loadfpu_ref_reg(list,size,ref,locpara.register);
 | 
			
		||||
          LOC_REFERENCE,LOC_CREFERENCE:
 | 
			
		||||
            begin
 | 
			
		||||
              reference_reset(href);
 | 
			
		||||
              href.base:=locpara.reference.index;
 | 
			
		||||
              href.offset:=locpara.reference.offset;
 | 
			
		||||
              { concatcopy should choose the best way to copy the data }
 | 
			
		||||
              g_concatcopy(list,ref,href,tcgsize2size[size],false,false);
 | 
			
		||||
            end
 | 
			
		||||
          else
 | 
			
		||||
            internalerror(200402201);
 | 
			
		||||
        end;
 | 
			
		||||
      end;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2143,7 +2153,10 @@ finalization
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.157  2004-02-12 15:54:03  peter
 | 
			
		||||
  Revision 1.158  2004-02-20 22:16:34  florian
 | 
			
		||||
    * handling of float parameters passed in mm registers fixed
 | 
			
		||||
 | 
			
		||||
  Revision 1.157  2004/02/12 15:54:03  peter
 | 
			
		||||
    * make extcycle is working again
 | 
			
		||||
 | 
			
		||||
  Revision 1.156  2004/02/08 18:08:59  jonas
 | 
			
		||||
 | 
			
		||||
@ -147,7 +147,7 @@ implementation
 | 
			
		||||
        if left.resulttype.def.deftype=floatdef then
 | 
			
		||||
         begin
 | 
			
		||||
           location_release(exprasmlist,left.location);
 | 
			
		||||
{$ifdef x86}
 | 
			
		||||
{$ifdef i386}
 | 
			
		||||
           if tempparaloc.loc<>LOC_REFERENCE then
 | 
			
		||||
             internalerror(200309291);
 | 
			
		||||
           case left.location.loc of
 | 
			
		||||
@ -216,14 +216,28 @@ implementation
 | 
			
		||||
             else
 | 
			
		||||
               internalerror(200204243);
 | 
			
		||||
           end;
 | 
			
		||||
{$else x86}
 | 
			
		||||
{$else i386}
 | 
			
		||||
           case left.location.loc of
 | 
			
		||||
             LOC_MMREGISTER,
 | 
			
		||||
             LOC_CMMREGISTER:
 | 
			
		||||
               cg.a_parammm_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc,mms_movescalar);
 | 
			
		||||
             LOC_FPUREGISTER,
 | 
			
		||||
             LOC_CFPUREGISTER:
 | 
			
		||||
               cg.a_paramfpu_reg(exprasmlist,def_cgsize(left.resulttype.def),left.location.register,tempparaloc);
 | 
			
		||||
             LOC_REFERENCE,
 | 
			
		||||
             LOC_CREFERENCE :
 | 
			
		||||
               cg.a_paramfpu_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc);
 | 
			
		||||
             LOC_CREFERENCE:
 | 
			
		||||
               case tempparaloc.loc of
 | 
			
		||||
                 LOC_MMREGISTER,
 | 
			
		||||
                 LOC_CMMREGISTER:
 | 
			
		||||
                   cg.a_parammm_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc,mms_movescalar);
 | 
			
		||||
                 LOC_REFERENCE,
 | 
			
		||||
                 LOC_CREFERENCE,
 | 
			
		||||
                 LOC_FPUREGISTER,
 | 
			
		||||
                 LOC_CFPUREGISTER:
 | 
			
		||||
                   cg.a_paramfpu_ref(exprasmlist,def_cgsize(left.resulttype.def),left.location.reference,tempparaloc);
 | 
			
		||||
                 else
 | 
			
		||||
                   internalerror(200204243);
 | 
			
		||||
               end;
 | 
			
		||||
             else
 | 
			
		||||
               internalerror(200204243);
 | 
			
		||||
           end;
 | 
			
		||||
@ -238,7 +252,7 @@ implementation
 | 
			
		||||
                  aktcallnode.procdefinition.proccalloption) then
 | 
			
		||||
            begin
 | 
			
		||||
              location_release(exprasmlist,left.location);
 | 
			
		||||
{$ifdef x86}
 | 
			
		||||
{$ifdef i386}
 | 
			
		||||
              if tempparaloc.loc<>LOC_REFERENCE then
 | 
			
		||||
                internalerror(200309292);
 | 
			
		||||
              if not (left.location.loc in [LOC_REFERENCE,LOC_CREFERENCE]) then
 | 
			
		||||
@ -254,9 +268,9 @@ implementation
 | 
			
		||||
              else
 | 
			
		||||
                reference_reset_base(href,tempparaloc.reference.index,tempparaloc.reference.offset);
 | 
			
		||||
              cg.g_concatcopy(exprasmlist,left.location.reference,href,size,false,false);
 | 
			
		||||
{$else x86}
 | 
			
		||||
{$else i386}
 | 
			
		||||
              cg.a_param_copy_ref(exprasmlist,left.resulttype.def.size,left.location.reference,tempparaloc);
 | 
			
		||||
{$endif x86}
 | 
			
		||||
{$endif i386}
 | 
			
		||||
            end
 | 
			
		||||
           else
 | 
			
		||||
            begin
 | 
			
		||||
@ -665,15 +679,10 @@ implementation
 | 
			
		||||
                       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);
 | 
			
		||||
                           ppn.tempparaloc.size,ppn.tempparaloc.register,ppn.paraitem.paraloc[callerside].register,mms_movescalar);
 | 
			
		||||
                       end;
 | 
			
		||||
                     LOC_REFERENCE:
 | 
			
		||||
                       begin
 | 
			
		||||
@ -1210,7 +1219,10 @@ begin
 | 
			
		||||
end.
 | 
			
		||||
{
 | 
			
		||||
  $Log$
 | 
			
		||||
  Revision 1.155  2004-02-20 21:55:59  peter
 | 
			
		||||
  Revision 1.156  2004-02-20 22:16:35  florian
 | 
			
		||||
    * handling of float parameters passed in mm registers fixed
 | 
			
		||||
 | 
			
		||||
  Revision 1.155  2004/02/20 21:55:59  peter
 | 
			
		||||
    * procvar cleanup
 | 
			
		||||
 | 
			
		||||
  Revision 1.154  2004/02/11 19:59:06  peter
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user