From 1b965e6766c148946c3b43a5d0ee1ef65b6aa8de Mon Sep 17 00:00:00 2001 From: sergei Date: Fri, 27 Nov 2015 05:48:49 +0000 Subject: [PATCH] * 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 - --- compiler/x86/cgx86.pas | 8 ++++++-- compiler/x86_64/cgcpu.pas | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/compiler/x86/cgx86.pas b/compiler/x86/cgx86.pas index a1a1915052..29b23f5414 100644 --- a/compiler/x86/cgx86.pas +++ b/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 } diff --git a/compiler/x86_64/cgcpu.pas b/compiler/x86_64/cgcpu.pas index 8435440540..e4d4676ff7 100644 --- a/compiler/x86_64/cgcpu.pas +++ b/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;