diff options
author | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2004-01-26 17:43:46 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@gcc.gnu.org> | 2004-01-26 17:43:46 +0000 |
commit | 6e290f11559f1bebdb91b7ff556ef160ee241d1e (patch) | |
tree | 0b1f4889297dff7a3acfcce24f16988159d49a62 | |
parent | c353b8e3fbee8bb8f72a2e9d45b935fb1bb5554f (diff) | |
download | gcc-6e290f11559f1bebdb91b7ff556ef160ee241d1e.zip gcc-6e290f11559f1bebdb91b7ff556ef160ee241d1e.tar.gz gcc-6e290f11559f1bebdb91b7ff556ef160ee241d1e.tar.bz2 |
Do not assign long long argument to memory in prologue if loaded in register.
OKed by Richard Henderson.
From-SVN: r76648
-rw-r--r-- | gcc/function.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/gcc/function.c b/gcc/function.c index f4c90b5..5af0a90 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4374,6 +4374,7 @@ assign_parms (tree fndecl) int in_regs; int partial = 0; int pretend_bytes = 0; + int loaded_in_reg = 0; /* Set LAST_NAMED if this is last named arg before last anonymous args. */ @@ -4745,6 +4746,7 @@ assign_parms (tree fndecl) emit_group_store (parmreg, entry_parm, TREE_TYPE (parm), int_size_in_bytes (TREE_TYPE (parm))); SET_DECL_RTL (parm, parmreg); + loaded_in_reg = 1; if (regno >= max_parm_reg) { @@ -4776,7 +4778,8 @@ assign_parms (tree fndecl) Handle calls that pass values in multiple non-contiguous locations. The Irix 6 ABI has examples of this. */ if (GET_CODE (entry_parm) == REG - || GET_CODE (entry_parm) == PARALLEL) + || (GET_CODE (entry_parm) == PARALLEL + && (!loaded_in_reg || !optimize))) { int size = int_size_in_bytes (TREE_TYPE (parm)); int size_stored = CEIL_ROUND (size, UNITS_PER_WORD); |