* 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:
Jonas Maebe 2003-12-29 14:17:50 +00:00
parent 2d05b23107
commit 92f038ebec
2 changed files with 115 additions and 38 deletions
compiler/powerpc

View File

@ -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)

View File

@ -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)