Browse Source

* x86: Don't save/restore integer registers that are volatile per calling convention of current procedure. It implies that nothing will be saved for procedures with OLDFPCCALL, FAR16 and PASCAL and calling conventions. OLDFPCCALL restores behavior that was in effect before r25224.

git-svn-id: trunk@32542 -
sergei 9 năm trước cách đây
mục cha
commit
1b965e6766
2 tập tin đã thay đổi với 10 bổ sung4 xóa
  1. 6 2
      compiler/x86/cgx86.pas
  2. 4 2
      compiler/x86_64/cgcpu.pas

+ 6 - 2
compiler/x86/cgx86.pas

@@ -2847,10 +2847,12 @@ unit cgx86;
       procedure push_regs;
         var
           r: longint;
+          usedregs: tcpuregisterset;
         begin
           regsize:=0;
+          usedregs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(current_procinfo.procdef.proccalloption);
           for r := low(saved_standard_registers) to high(saved_standard_registers) do
-            if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+            if saved_standard_registers[r] in usedregs then
               begin
                 inc(regsize,sizeof(aint));
                 list.concat(Taicpu.Op_reg(A_PUSH,tcgsize2opsize[OS_ADDR],newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE)));
@@ -3106,10 +3108,12 @@ unit cgx86;
         r: longint;
         hreg: tregister;
         href: treference;
+        usedregs: tcpuregisterset;
       begin
         href:=current_procinfo.save_regs_ref;
+        usedregs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(current_procinfo.procdef.proccalloption);
         for r:=high(saved_standard_registers) downto low(saved_standard_registers) do
-          if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+          if saved_standard_registers[r] in usedregs then
             begin
               hreg:=newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE);
               { Allocate register so the optimizer does not remove the load }

+ 4 - 2
compiler/x86_64/cgcpu.pas

@@ -189,9 +189,11 @@ unit cgcpu;
       procedure push_regs;
         var
           r: longint;
+          usedregs: tcpuregisterset;
         begin
+          usedregs:=rg[R_INTREGISTER].used_in_proc-paramanager.get_volatile_registers_int(current_procinfo.procdef.proccalloption);
           for r := low(saved_standard_registers) to high(saved_standard_registers) do
-            if saved_standard_registers[r] in rg[R_INTREGISTER].used_in_proc then
+            if saved_standard_registers[r] in usedregs then
               begin
                 inc(stackmisalignment,sizeof(pint));
                 push_one_reg(newreg(R_INTREGISTER,saved_standard_registers[r],R_SUBWHOLE));
@@ -263,7 +265,7 @@ unit cgcpu;
               begin
                 if target_info.stackalign>sizeof(pint) then
                   localsize := align(localsize+stackmisalignment,target_info.stackalign)-stackmisalignment;
-                cg.g_stackpointer_alloc(list,localsize);
+                g_stackpointer_alloc(list,localsize);
                 if current_procinfo.framepointer=NR_STACK_POINTER_REG then
                   current_asmdata.asmcfi.cfa_def_cfa_offset(list,localsize+sizeof(pint));
                 current_procinfo.final_localsize:=localsize;