* perform double->single-conversion-before-storing workaround for

fpu bug on some ppc's depending on the selected target cpu type
    rather than depending on whether we're compiling for 64 bit

git-svn-id: trunk@9685 -
This commit is contained in:
Jonas Maebe 2008-01-08 22:00:37 +00:00
parent 831a76905d
commit 6e9b3bf345

View File

@ -532,9 +532,7 @@ unit cgppc;
var var
op: tasmop; op: tasmop;
ref2: treference; ref2: treference;
{$ifndef cpu64bit}
reg2: tregister; reg2: tregister;
{$endif cpu64bit}
begin begin
if not(fromsize in [OS_F32,OS_F64]) or if not(fromsize in [OS_F32,OS_F64]) or
@ -543,17 +541,17 @@ unit cgppc;
ref2 := ref; ref2 := ref;
fixref(list,ref2); fixref(list,ref2);
op := fpustoreinstr[tosize,ref2.index <> NR_NO,false]; op := fpustoreinstr[tosize,ref2.index <> NR_NO,false];
{$ifndef cpu64bit}
{ some ppc's have a bug whereby storing a double to memory } { some PPCs have a bug whereby storing a double to memory }
{ as single corrupts the value -> convert double to single } { as single corrupts the value -> convert double to single }
{ first } { first (bug confirmed on some G4s, but not on G5s) }
if (tosize < fromsize) then if (tosize < fromsize) and
(current_settings.cputype < cpu_PPC970) then
begin begin
reg2:=getfpuregister(list,tosize); reg2:=getfpuregister(list,tosize);
a_loadfpu_reg_reg(list,fromsize,tosize,reg,reg2); a_loadfpu_reg_reg(list,fromsize,tosize,reg,reg2);
reg:=reg2; reg:=reg2;
end; end;
{$endif not cpu64bit}
a_load_store(list,op,reg,ref2); a_load_store(list,op,reg,ref2);
end; end;