diff options
author | Paul Brook <paul@codesourcery.com> | 2005-12-29 15:23:34 +0000 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2005-12-29 15:23:34 +0000 |
commit | 854465ffc385e64e5696a2cd3cb0f2b81c209137 (patch) | |
tree | 821d774f875af382949be1cdcc84a054d2db0e4e | |
parent | ba76582cf3681866e033df6bfb5bb55e3578aa87 (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.csl | 6 | ||||
-rw-r--r-- | gcc/config/m68k/m68k.c | 15 | ||||
-rw-r--r-- | gcc/config/m68k/m68k.h | 6 |
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. */ |