Browse Source

* don't explicitly us NR_F0 in concatcopy but ask a register from
the register allocator (since NR_F0 can also be used by the ra)

git-svn-id: trunk@2855 -

Jonas Maebe 19 years ago
parent
commit
4ed39b0c16
1 changed files with 12 additions and 14 deletions
  1. 12 14
      compiler/powerpc/cgcpu.pas

+ 12 - 14
compiler/powerpc/cgcpu.pas

@@ -1740,6 +1740,7 @@ const
         lab: tasmlabel;
         lab: tasmlabel;
         count, count2: aint;
         count, count2: aint;
         size: tcgsize;
         size: tcgsize;
+        copyreg: tregister;
 
 
       begin
       begin
 {$ifdef extdebug}
 {$ifdef extdebug}
@@ -1761,10 +1762,9 @@ const
               end
               end
             else
             else
               begin
               begin
-                a_reg_alloc(list,NR_F0);
-                a_loadfpu_ref_reg(list,OS_F64,source,NR_F0);
-                a_loadfpu_reg_ref(list,OS_F64,NR_F0,dest);
-                a_reg_dealloc(list,NR_F0);
+                copyreg := getfpuregister(list,OS_F64);
+                a_loadfpu_ref_reg(list,OS_F64,source,copyreg);
+                a_loadfpu_reg_ref(list,OS_F64,copyreg,dest);
               end;
               end;
             exit;
             exit;
           end;
           end;
@@ -1814,16 +1814,15 @@ const
             list.concat(taicpu.op_reg_reg_const(A_SUBI,dst.base,dst.base,8));
             list.concat(taicpu.op_reg_reg_const(A_SUBI,dst.base,dst.base,8));
             countreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             countreg := rg[R_INTREGISTER].getregister(list,R_SUBWHOLE);
             a_load_const_reg(list,OS_32,count,countreg);
             a_load_const_reg(list,OS_32,count,countreg);
-            { explicitely allocate R_0 since it can be used safely here }
-            { (for holding date that's being copied)                    }
-            a_reg_alloc(list,NR_F0);
+            copyreg := getfpuregister(list,OS_F64);
+            a_reg_sync(list,copyreg);
             objectlibrary.getjumplabel(lab);
             objectlibrary.getjumplabel(lab);
             a_label(list, lab);
             a_label(list, lab);
             list.concat(taicpu.op_reg_reg_const(A_SUBIC_,countreg,countreg,1));
             list.concat(taicpu.op_reg_reg_const(A_SUBIC_,countreg,countreg,1));
-            list.concat(taicpu.op_reg_ref(A_LFDU,NR_F0,src));
-            list.concat(taicpu.op_reg_ref(A_STFDU,NR_F0,dst));
+            list.concat(taicpu.op_reg_ref(A_LFDU,copyreg,src));
+            list.concat(taicpu.op_reg_ref(A_STFDU,copyreg,dst));
             a_jmp(list,A_BC,C_NE,0,lab);
             a_jmp(list,A_BC,C_NE,0,lab);
-            a_reg_dealloc(list,NR_F0);
+            a_reg_sync(list,copyreg);
             len := len mod 8;
             len := len mod 8;
           end;
           end;
 
 
@@ -1831,15 +1830,14 @@ const
         if count > 0 then
         if count > 0 then
           { unrolled loop }
           { unrolled loop }
           begin
           begin
-            a_reg_alloc(list,NR_F0);
+            copyreg := getfpuregister(list,OS_F64);
             for count2 := 1 to count do
             for count2 := 1 to count do
               begin
               begin
-                a_loadfpu_ref_reg(list,OS_F64,src,NR_F0);
-                a_loadfpu_reg_ref(list,OS_F64,NR_F0,dst);
+                a_loadfpu_ref_reg(list,OS_F64,src,copyreg);
+                a_loadfpu_reg_ref(list,OS_F64,copyreg,dst);
                 inc(src.offset,8);
                 inc(src.offset,8);
                 inc(dst.offset,8);
                 inc(dst.offset,8);
               end;
               end;
-            a_reg_dealloc(list,NR_F0);
             len := len mod 8;
             len := len mod 8;
           end;
           end;