aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2002-03-19 14:16:10 -0800
committerRichard Henderson <rth@gcc.gnu.org>2002-03-19 14:16:10 -0800
commitebf0e888b125a10798d1a8c972305d8413f27a76 (patch)
tree60891dbaa035d55020b4cc4240f516e7f27619b8 /gcc/config
parentc6ef94c533d7a3fb81af6d84c4303f55cb707e49 (diff)
downloadgcc-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.c7
-rw-r--r--gcc/config/ia64/ia64.h8
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