aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2005-12-29 15:23:34 +0000
committerPaul Brook <paul@codesourcery.com>2005-12-29 15:23:34 +0000
commit854465ffc385e64e5696a2cd3cb0f2b81c209137 (patch)
tree821d774f875af382949be1cdcc84a054d2db0e4e
parentba76582cf3681866e033df6bfb5bb55e3578aa87 (diff)
2005-12-29 Paul Brook <paul@codesourcery.com>
* config/m68k/m68k.h (RETURN_ADDR_RTX): Define. * config/m68k/m68k.c (m68k_initial_elimination_offset): Remove FIXME. Include offset due to FIRST_PARM_OFFSET. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/csl/coldfire-4_1@109148 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--ChangeLog.csl6
-rw-r--r--gcc/config/m68k/m68k.c15
-rw-r--r--gcc/config/m68k/m68k.h6
3 files changed, 20 insertions, 7 deletions
diff --git a/ChangeLog.csl b/ChangeLog.csl
index f94c71348e2..e847629678c 100644
--- a/ChangeLog.csl
+++ b/ChangeLog.csl
@@ -1,5 +1,11 @@
2005-12-29 Paul Brook <paul@codesourcery.com>
+ * config/m68k/m68k.h (RETURN_ADDR_RTX): Define.
+ * config/m68k/m68k.c (m68k_initial_elimination_offset): Remove FIXME.
+ Include offset due to FIRST_PARM_OFFSET.
+
+2005-12-29 Paul Brook <paul@codesourcery.com>
+
* config/m68k/lb1sf68.asm (__cmpdf2): Fix typo in immediate mask.
Create wrapper and rename body...
(__cmpdf2_internal): ... to this. Return correct value for unordered
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 9691e016042..3cddd584dcc 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -434,20 +434,21 @@ m68k_compute_frame_layout (void)
HOST_WIDE_INT
m68k_initial_elimination_offset (int from, int to)
{
- /* FIXME: The correct offset to compute here would appear to be
- (frame_pointer_needed ? -UNITS_PER_WORD * 2 : -UNITS_PER_WORD);
- but for some obscure reason, this must be 0 to get correct code. */
+ int argptr_offset;
+ /* The arg pointer points 8 bytes before the start of the arguments,
+ as defined by FIRST_PARM_OFFSET. This makes it coincident with the
+ frame pointer in most frames. */
+ argptr_offset = frame_pointer_needed ? 0 : UNITS_PER_WORD;
if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
- return 0;
+ return argptr_offset;
m68k_compute_frame_layout ();
gcc_assert (to == STACK_POINTER_REGNUM);
switch (from)
{
- case ARG_POINTER_REGNUM:
- return current_frame.offset + current_frame.size
- + (frame_pointer_needed ? -UNITS_PER_WORD * 2 : -UNITS_PER_WORD);
+ case ARG_POINTER_REGNUM:
+ return current_frame.offset + current_frame.size - argptr_offset;
case FRAME_POINTER_REGNUM:
return current_frame.offset + current_frame.size;
default:
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 5320749b464..7c01b6826fa 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -896,6 +896,12 @@ do { if (cc_prev_status.flags & CC_IN_68881) \
#define INCOMING_RETURN_ADDR_RTX \
gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM))
+/* After the prologue, RA is at 4(AP) in the current frame. */
+#define RETURN_ADDR_RTX(COUNT, FRAME) \
+ ((COUNT) == 0 \
+ ? gen_rtx_MEM (Pmode, plus_constant (arg_pointer_rtx, UNITS_PER_WORD)) \
+ : gen_rtx_MEM (Pmode, plus_constant (FRAME, UNITS_PER_WORD)))
+
/* We must not use the DBX register numbers for the DWARF 2 CFA column
numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER.
Instead use the identity mapping. */