diff options
author | Richard Henderson <rth@redhat.com> | 2002-03-19 14:16:10 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-03-19 14:16:10 -0800 |
commit | ebf0e888b125a10798d1a8c972305d8413f27a76 (patch) | |
tree | 60891dbaa035d55020b4cc4240f516e7f27619b8 /gcc/config | |
parent | c6ef94c533d7a3fb81af6d84c4303f55cb707e49 (diff) | |
download | gcc-ebf0e888b125a10798d1a8c972305d8413f27a76.zip gcc-ebf0e888b125a10798d1a8c972305d8413f27a76.tar.gz gcc-ebf0e888b125a10798d1a8c972305d8413f27a76.tar.bz2 |
ia64.c: Revert 2002-03-01 patch.
* config/ia64/ia64.c: Revert 2002-03-01 patch.
* config/ia64/ia64.h (INIT_EXPANDERS): New.
From-SVN: r51048
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/ia64/ia64.c | 7 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.h | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index d42a01f..a9ea756 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -1671,9 +1671,10 @@ ia64_initial_elimination_offset (from, to) /* Arguments start above the 16 byte save area, unless stdarg in which case we store through the 16 byte save area. */ if (to == HARD_FRAME_POINTER_REGNUM) - offset = 16; + offset = 16 - current_function_pretend_args_size; else if (to == STACK_POINTER_REGNUM) - offset = current_frame_info.total_size + 16; + offset = (current_frame_info.total_size + + 16 - current_function_pretend_args_size); else abort (); break; @@ -3226,7 +3227,7 @@ ia64_va_start (stdarg_p, valist, nextarg) else ofs = (arg_words >= MAX_ARGUMENT_SLOTS ? -UNITS_PER_WORD : 0); - nextarg = plus_constant (nextarg, ofs - current_function_pretend_args_size); + nextarg = plus_constant (nextarg, ofs); std_expand_builtin_va_start (1, valist, nextarg); } diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index b8f2449..c0d81ec 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1145,6 +1145,14 @@ enum reg_class in it. */ #define ARG_POINTER_REGNUM R_GR(0) +/* Due to the way varargs and argument spilling happens, the argument + pointer is not 16-byte aligned like the stack pointer. */ +#define INIT_EXPANDERS \ + do { \ + if (cfun && cfun->emit->regno_pointer_align) \ + REGNO_POINTER_ALIGN (ARG_POINTER_REGNUM) = 64; \ + } while (0) + /* The register number for the return address register. For IA-64, this is not actually a pointer as the name suggests, but that's a name that gen_rtx_REG already takes care to keep unique. We modify |