* x86_64: Don't waste time initializing/finalizing saved_standard_registers and saved_mm_registers arrays on every procedure. Initialize once, reinitialize if target system happens to change, and let finalization happen implicitly on shutdown.

git-svn-id: trunk@19672 -
This commit is contained in:
sergei 2011-11-23 20:06:38 +00:00
parent 4f8bc2aaf4
commit fffa4a35a0

View File

@ -35,7 +35,6 @@ unit cgcpu;
type type
tcgx86_64 = class(tcgx86) tcgx86_64 = class(tcgx86)
procedure init_register_allocators;override; procedure init_register_allocators;override;
procedure done_register_allocators;override;
procedure g_proc_entry(list : TAsmList; parasize:longint; nostackframe:boolean);override; procedure g_proc_entry(list : TAsmList; parasize:longint; nostackframe:boolean);override;
procedure g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);override; procedure g_proc_exit(list : TAsmList;parasize:longint;nostackframe:boolean);override;
@ -59,6 +58,7 @@ unit cgcpu;
const const
win64_saved_std_regs : array[0..6] of tsuperregister = (RS_RBX,RS_RDI,RS_RSI,RS_R12,RS_R13,RS_R14,RS_R15); win64_saved_std_regs : array[0..6] of tsuperregister = (RS_RBX,RS_RDI,RS_RSI,RS_R12,RS_R13,RS_R14,RS_R15);
others_saved_std_regs : array[0..4] of tsuperregister = (RS_RBX,RS_R12,RS_R13,RS_R14,RS_R15); others_saved_std_regs : array[0..4] of tsuperregister = (RS_RBX,RS_R12,RS_R13,RS_R14,RS_R15);
saved_regs_length : array[boolean] of longint = (5,7);
win64_saved_xmm_regs : array[0..9] of tsuperregister = (RS_XMM6,RS_XMM7, win64_saved_xmm_regs : array[0..9] of tsuperregister = (RS_XMM6,RS_XMM7,
RS_XMM8,RS_XMM9,RS_XMM10,RS_XMM11,RS_XMM12,RS_XMM13,RS_XMM14,RS_XMM15); RS_XMM8,RS_XMM9,RS_XMM10,RS_XMM11,RS_XMM12,RS_XMM13,RS_XMM14,RS_XMM15);
@ -67,24 +67,28 @@ unit cgcpu;
framepointer : tsuperregister; framepointer : tsuperregister;
begin begin
inherited init_register_allocators; inherited init_register_allocators;
if target_info.system=system_x86_64_win64 then
if (length(saved_standard_registers)<>saved_regs_length[target_info.system=system_x86_64_win64]) then
begin begin
SetLength(saved_standard_registers,Length(win64_saved_std_regs)); if target_info.system=system_x86_64_win64 then
SetLength(saved_mm_registers,Length(win64_saved_xmm_regs)); begin
SetLength(saved_standard_registers,Length(win64_saved_std_regs));
SetLength(saved_mm_registers,Length(win64_saved_xmm_regs));
for i:=low(win64_saved_std_regs) to high(win64_saved_std_regs) do for i:=low(win64_saved_std_regs) to high(win64_saved_std_regs) do
saved_standard_registers[i]:=win64_saved_std_regs[i]; saved_standard_registers[i]:=win64_saved_std_regs[i];
for i:=low(win64_saved_xmm_regs) to high(win64_saved_xmm_regs) do for i:=low(win64_saved_xmm_regs) to high(win64_saved_xmm_regs) do
saved_mm_registers[i]:=win64_saved_xmm_regs[i]; saved_mm_registers[i]:=win64_saved_xmm_regs[i];
end end
else else
begin begin
SetLength(saved_standard_registers,Length(others_saved_std_regs)); SetLength(saved_standard_registers,Length(others_saved_std_regs));
SetLength(saved_mm_registers,0); SetLength(saved_mm_registers,0);
for i:=low(others_saved_std_regs) to high(others_saved_std_regs) do for i:=low(others_saved_std_regs) to high(others_saved_std_regs) do
saved_standard_registers[i]:=others_saved_std_regs[i]; saved_standard_registers[i]:=others_saved_std_regs[i];
end;
end; end;
if assigned(current_procinfo) then if assigned(current_procinfo) then
framepointer:=getsupreg(current_procinfo.framepointer) framepointer:=getsupreg(current_procinfo.framepointer)
@ -104,13 +108,6 @@ unit cgcpu;
end; end;
procedure Tcgx86_64.done_register_allocators;
begin
inherited done_register_allocators;
setlength(saved_standard_registers,0);
setlength(saved_mm_registers,0);
end;
procedure tcgx86_64.g_proc_entry(list : TAsmList;parasize:longint;nostackframe:boolean); procedure tcgx86_64.g_proc_entry(list : TAsmList;parasize:longint;nostackframe:boolean);
var var
hitem: tlinkedlistitem; hitem: tlinkedlistitem;