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 */