Browse Source

* 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 -

Jonas Maebe 17 years ago
parent
commit
6e9b3bf345
1 changed files with 5 additions and 7 deletions
  1. 5 7
      compiler/ppcgen/cgppc.pas

+ 5 - 7
compiler/ppcgen/cgppc.pas

@@ -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                                                    }
-         if (tosize < fromsize) then
+         { first (bug confirmed on some G4s, but not on G5s)        }
+         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;