Browse Source

* Ignore FPU/MM registers in tcg.(de)allocallcpuregisters if they are not used in current procedure. This is consistent with logic of tcgcallnode and removes a lot of useless xmm regallocs on win64.

git-svn-id: trunk@21036 -
sergei 13 years ago
parent
commit
5f93d9992a
1 changed files with 8 additions and 4 deletions
  1. 8 4
      compiler/cgobj.pas

+ 8 - 4
compiler/cgobj.pas

@@ -762,9 +762,11 @@ implementation
       begin
       begin
         alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         alloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 {$if not(defined(i386)) and not(defined(avr))}
 {$if not(defined(i386)) and not(defined(avr))}
-        alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        if uses_registers(R_FPUREGISTER) then
+          alloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
 {$ifdef cpumm}
 {$ifdef cpumm}
-        alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
+        if uses_registers(R_MMREGISTER) then
+          alloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
 {$endif cpumm}
 {$endif cpumm}
 {$endif not(defined(i386)) and not(defined(avr))}
 {$endif not(defined(i386)) and not(defined(avr))}
       end;
       end;
@@ -783,9 +785,11 @@ implementation
       begin
       begin
         dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
         dealloccpuregisters(list,R_INTREGISTER,paramanager.get_volatile_registers_int(pocall_default));
 {$if not(defined(i386)) and not(defined(avr))}
 {$if not(defined(i386)) and not(defined(avr))}
-        dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
+        if uses_registers(R_FPUREGISTER) then
+          dealloccpuregisters(list,R_FPUREGISTER,paramanager.get_volatile_registers_fpu(pocall_default));
 {$ifdef cpumm}
 {$ifdef cpumm}
-        dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
+        if uses_registers(R_MMREGISTER) then
+          dealloccpuregisters(list,R_MMREGISTER,paramanager.get_volatile_registers_mm(pocall_default));
 {$endif cpumm}
 {$endif cpumm}
 {$endif not(defined(i386)) and not(defined(avr))}
 {$endif not(defined(i386)) and not(defined(avr))}
       end;
       end;