mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-23 22:49:35 +02: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,22 +1195,33 @@ 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
|
||||
if regcounter in rg[R_FPUREGISTER].used_in_proc then
|
||||
begin
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
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
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
usesgpr:=false;
|
||||
if not (po_assembler in current_procinfo.procdef.procoptions) then
|
||||
@ -1307,19 +1340,30 @@ 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
|
||||
if regcounter in rg[R_FPUREGISTER].used_in_proc then
|
||||
begin
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
break;
|
||||
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;
|
||||
end;
|
||||
for regcounter:=firstfpureg to RS_F31 do
|
||||
begin
|
||||
if regcounter in rg[R_FPUREGISTER].used_in_proc then
|
||||
begin
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
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,20 +1419,31 @@ 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
|
||||
if regcounter in rg[R_FPUREGISTER].used_in_proc then
|
||||
begin
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
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
|
||||
usesfpr:=true;
|
||||
firstregfpu:=regcounter;
|
||||
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