From 3f05d88d5bda06b40280710089bd3ede3a8fdaa0 Mon Sep 17 00:00:00 2001 From: Pursuer <1596067968@qq.com> Date: Fri, 11 Jan 2019 01:44:23 +0800 Subject: [PATCH] optimize the generated code when save_reg is required (2) In gfunc_call, regisger will be saved before gcall_or_jmp. The register stored the function will be saved too, though in some generator the SValue of this function will be immediately poped after gcall_or_jmp, and no need to be saved. So I modify some generator to avoid save redundant SValue before gcall_or_jmp. --- arm-gen.c | 2 +- arm64-gen.c | 2 +- i386-gen.c | 2 +- x86_64-gen.c | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/arm-gen.c b/arm-gen.c index e766ce43..afbc23b6 100644 --- a/arm-gen.c +++ b/arm-gen.c @@ -1187,7 +1187,7 @@ again: /* Manually free remaining registers since next parameters are loaded * manually, without the help of gv(int). */ - save_regs(nb_args); + save_regs(nb_args+1); if(todo) { o(0xE8BD0000|todo); /* pop {todo} */ diff --git a/arm64-gen.c b/arm64-gen.c index efe42461..3d333155 100644 --- a/arm64-gen.c +++ b/arm64-gen.c @@ -948,7 +948,7 @@ ST_FUNC void gfunc_call(int nb_args) vswap(); } - save_regs(0); + save_regs(1); arm64_gen_bl_or_b(0); --vtop; if (stack) diff --git a/i386-gen.c b/i386-gen.c index b6629d40..646f261e 100644 --- a/i386-gen.c +++ b/i386-gen.c @@ -475,7 +475,7 @@ ST_FUNC void gfunc_call(int nb_args) } vtop--; } - save_regs(0); /* save used temporary registers */ + save_regs(1); /* save used temporary registers */ func_sym = vtop->type.ref; func_call = func_sym->f.func_call; /* fast call case */ diff --git a/x86_64-gen.c b/x86_64-gen.c index 045dd2c5..50252d35 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -903,7 +903,6 @@ void gfunc_call(int nb_args) vtop--; } save_regs(0); - /* Copy R10 and R11 into RCX and RDX, respectively */ if (nb_args > 0) { o(0xd1894c); /* mov %r10, %rcx */