aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386/i386.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r--gcc/config/i386/i386.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index f58d529604c..259f97b5a10 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -7975,8 +7975,14 @@ ix86_function_regparm (const_tree type, const_tree decl)
local_regparm = 2;
/* Save a register for the split stack. */
- if (local_regparm == 3 && flag_split_stack)
- local_regparm = 2;
+ if (flag_split_stack)
+ {
+ if (local_regparm == 3)
+ local_regparm = 2;
+ else if (local_regparm == 2
+ && DECL_STATIC_CHAIN (target->decl))
+ local_regparm = 1;
+ }
/* Each fixed register usage increases register pressure,
so less registers should be used for argument passing.