mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-31 09:11:53 +01:00 
			
		
		
		
	* fixed saving/restoring of volatile fpu registers under sysv
+ better provisions for abi differences regarding fpu registers that have
    to be saved
			
			
This commit is contained in:
		
							parent
							
								
									2d05b23107
								
							
						
					
					
						commit
						92f038ebec
					
				| @ -173,6 +173,22 @@ const | ||||
|              RS_R28,RS_R27,RS_R26,RS_R25,RS_R24,RS_R23,RS_R22, | ||||
|              RS_R21,RS_R20,RS_R19,RS_R18,RS_R17,RS_R16,RS_R15, | ||||
|              RS_R14,RS_R13],first_int_imreg,[]); | ||||
|         case target_info.abi of | ||||
|           abi_powerpc_aix: | ||||
|             rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE, | ||||
|                 [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9, | ||||
|                  RS_F10,RS_F11,RS_F12,RS_F13,RS_F31,RS_F30,RS_F29,RS_F28,RS_F27, | ||||
|                  RS_F26,RS_F25,RS_F24,RS_F23,RS_F22,RS_F21,RS_F20,RS_F19,RS_F18, | ||||
|                  RS_F17,RS_F16,RS_F15,RS_F14],first_fpu_imreg,[]); | ||||
|           abi_powerpc_sysv: | ||||
|             rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE, | ||||
|                 [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9, | ||||
|                  RS_F31,RS_F30,RS_F29,RS_F28,RS_F27,RS_F26,RS_F25,RS_F24,RS_F23, | ||||
|                  RS_F22,RS_F21,RS_F20,RS_F19,RS_F18,RS_F17,RS_F16,RS_F15,RS_F14, | ||||
|                  RS_F13,RS_F12,RS_F11,RS_F10],first_fpu_imreg,[]); | ||||
|           else | ||||
|             internalerror(2003122903); | ||||
|         end; | ||||
|         rg[R_FPUREGISTER]:=trgcpu.create(R_FPUREGISTER,R_SUBNONE, | ||||
|             [RS_F0,RS_F1,RS_F2,RS_F3,RS_F4,RS_F5,RS_F6,RS_F7,RS_F8,RS_F9, | ||||
|              RS_F10,RS_F11,RS_F12,RS_F13,RS_F31,RS_F30,RS_F29,RS_F28,RS_F27, | ||||
| @ -942,9 +958,8 @@ const | ||||
|          href,href2 : treference; | ||||
|          usesfpr,usesgpr,gotgot : boolean; | ||||
|          parastart : aword; | ||||
|          offset : aword; | ||||
| //         r,r2,rsp:Tregister; | ||||
|          regcounter2: Tsuperregister; | ||||
|          regcounter2, firstfpureg: Tsuperregister; | ||||
|          hp: tparaitem; | ||||
| 
 | ||||
|       begin | ||||
| @ -960,9 +975,16 @@ const | ||||
| 
 | ||||
|         usesfpr:=false; | ||||
|         if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
| {$warning FIXME!!} | ||||
|           { FIXME: has to be R_F8 instad of R_F14 for SYSV abi } | ||||
|           for regcounter:=RS_F14 to RS_F31 do | ||||
|           { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit } | ||||
|           case target_info.abi of | ||||
|             abi_powerpc_aix: | ||||
|               firstfpureg := RS_F14; | ||||
|             abi_powerpc_sysv: | ||||
|               firstfpureg := RS_F9; | ||||
|             else | ||||
|               internalerror(2003122903); | ||||
|           end; | ||||
|           for regcounter:=firstfpureg to RS_F31 do | ||||
|            begin | ||||
|              if regcounter in rg[R_FPUREGISTER].used_in_proc then | ||||
|               begin | ||||
| @ -1173,14 +1195,24 @@ const | ||||
|          regcounter,firstregfpu,firstreggpr: TsuperRegister; | ||||
|          href : treference; | ||||
|          usesfpr,usesgpr,genret : boolean; | ||||
|          regcounter2:Tsuperregister; | ||||
|          regcounter2, firstfpureg:Tsuperregister; | ||||
|          localsize: aword; | ||||
|       begin | ||||
|         { AltiVec context restore, not yet implemented !!! } | ||||
| 
 | ||||
|         usesfpr:=false; | ||||
|         if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
|           for regcounter:=RS_F14 to RS_F31 do | ||||
|           begin | ||||
|             { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit } | ||||
|             case target_info.abi of | ||||
|               abi_powerpc_aix: | ||||
|                 firstfpureg := RS_F14; | ||||
|               abi_powerpc_sysv: | ||||
|                 firstfpureg := RS_F9; | ||||
|               else | ||||
|                 internalerror(2003122903); | ||||
|             end; | ||||
|             for regcounter:=firstfpureg to RS_F31 do | ||||
|              begin | ||||
|                if regcounter in rg[R_FPUREGISTER].used_in_proc then | ||||
|                 begin | ||||
| @ -1189,6 +1221,7 @@ const | ||||
|                    break; | ||||
|                 end; | ||||
|              end; | ||||
|           end; | ||||
| 
 | ||||
|         usesgpr:=false; | ||||
|         if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
| @ -1307,11 +1340,21 @@ const | ||||
|          usesfpr,usesgpr: boolean; | ||||
|          href : treference; | ||||
|          offset: integer; | ||||
|          regcounter2: Tsuperregister; | ||||
|          regcounter2, firstfpureg: Tsuperregister; | ||||
|     begin | ||||
|       usesfpr:=false; | ||||
|       if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
|         for regcounter:=RS_F14 to RS_F31 do | ||||
|         begin | ||||
|             { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit } | ||||
|             case target_info.abi of | ||||
|               abi_powerpc_aix: | ||||
|                 firstfpureg := RS_F14; | ||||
|               abi_powerpc_sysv: | ||||
|                 firstfpureg := RS_F9; | ||||
|               else | ||||
|                 internalerror(2003122903); | ||||
|             end; | ||||
|           for regcounter:=firstfpureg to RS_F31 do | ||||
|            begin | ||||
|              if regcounter in rg[R_FPUREGISTER].used_in_proc then | ||||
|               begin | ||||
| @ -1320,6 +1363,7 @@ const | ||||
|                  break; | ||||
|               end; | ||||
|            end; | ||||
|         end; | ||||
|       usesgpr:=false; | ||||
|       if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
|         for regcounter2:=RS_R13 to RS_R31 do | ||||
| @ -1375,12 +1419,22 @@ const | ||||
|          usesfpr,usesgpr: boolean; | ||||
|          href : treference; | ||||
|          offset: integer; | ||||
|          regcounter2: Tsuperregister; | ||||
|          regcounter2, firstfpureg: Tsuperregister; | ||||
| 
 | ||||
|     begin | ||||
|       usesfpr:=false; | ||||
|       if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
|         for regcounter:=RS_F14 to RS_F31 do | ||||
|         begin | ||||
|           { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit } | ||||
|           case target_info.abi of | ||||
|             abi_powerpc_aix: | ||||
|               firstfpureg := RS_F14; | ||||
|             abi_powerpc_sysv: | ||||
|               firstfpureg := RS_F9; | ||||
|             else | ||||
|               internalerror(2003122903); | ||||
|           end; | ||||
|           for regcounter:=firstfpureg to RS_F31 do | ||||
|            begin | ||||
|              if regcounter in rg[R_FPUREGISTER].used_in_proc then | ||||
|               begin | ||||
| @ -1389,6 +1443,7 @@ const | ||||
|                  break; | ||||
|               end; | ||||
|            end; | ||||
|         end; | ||||
| 
 | ||||
|       usesgpr:=false; | ||||
|       if not (po_assembler in current_procinfo.procdef.procoptions) then | ||||
| @ -2326,7 +2381,12 @@ begin | ||||
| end. | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.153  2003-12-29 11:13:53  jonas | ||||
|   Revision 1.154  2003-12-29 14:17:50  jonas | ||||
|     * fixed saving/restoring of volatile fpu registers under sysv | ||||
|     + better provisions for abi differences regarding fpu registers that have | ||||
|       to be saved | ||||
| 
 | ||||
|   Revision 1.153  2003/12/29 11:13:53  jonas | ||||
|     * fixed tb0350 (support loading address of reference containing the | ||||
|       address 0) | ||||
| 
 | ||||
|  | ||||
| @ -52,7 +52,8 @@ unit cpupi; | ||||
|        cpubase, | ||||
|        aasmtai, | ||||
|        tgobj, | ||||
|        symconst,symsym,paramgr,symutil; | ||||
|        symconst,symsym,paramgr,symutil, | ||||
|        verbose; | ||||
| 
 | ||||
|     constructor tppcprocinfo.create(aparent:tprocinfo); | ||||
| 
 | ||||
| @ -119,10 +120,21 @@ unit cpupi; | ||||
| 
 | ||||
| 
 | ||||
|     function tppcprocinfo.calc_stackframe_size:longint; | ||||
|       var | ||||
|         first_save_fpu_register: longint; | ||||
|       begin | ||||
|         { more or less copied from cgcpu.pas/g_stackframe_entry } | ||||
|         { FIXME: has to be R_F14 instad of R_F8 for SYSV-64bit } | ||||
|         case target_info.abi of | ||||
|           abi_powerpc_aix: | ||||
|             first_save_fpu_register := 14; | ||||
|           abi_powerpc_sysv: | ||||
|             first_save_fpu_register := 9; | ||||
|           else | ||||
|             internalerror(2003122903); | ||||
|         end; | ||||
|         if not (po_assembler in procdef.procoptions) then | ||||
|           result := align(align((31-13+1)*4+(31-14+1)*8,16)+tg.lasttemp,16) | ||||
|           result := align(align((31-13+1)*4+(31-first_save_fpu_register+1)*8,16)+tg.lasttemp,16) | ||||
|         else | ||||
|           result := align(tg.lasttemp,16); | ||||
|       end; | ||||
| @ -133,7 +145,12 @@ begin | ||||
| end. | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.32  2003-12-07 16:40:45  jonas | ||||
|   Revision 1.33  2003-12-29 14:17:50  jonas | ||||
|     * fixed saving/restoring of volatile fpu registers under sysv | ||||
|     + better provisions for abi differences regarding fpu registers that have | ||||
|       to be saved | ||||
| 
 | ||||
|   Revision 1.32  2003/12/07 16:40:45  jonas | ||||
|     * moved count_locals from pstatmnt to symutils | ||||
|     * use count_locals in powerpc/cpupi to check whether we should set the | ||||
|       first temp offset (and as such generate a stackframe) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Jonas Maebe
						Jonas Maebe