| Index: gcc/gcc/config/crx/crx.c
|
| diff --git a/gcc/gcc/config/crx/crx.c b/gcc/gcc/config/crx/crx.c
|
| index 6f10afd2e5f27f0d127bf2e9f46d59f25bfa5a28..a0b43a4aa18cda2b90e41f6ed1633acde8eded20 100644
|
| --- a/gcc/gcc/config/crx/crx.c
|
| +++ b/gcc/gcc/config/crx/crx.c
|
| @@ -1,6 +1,7 @@
|
| /* Output routines for GCC for CRX.
|
| Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
| - 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
| + 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
| + Free Software Foundation, Inc.
|
|
|
| This file is part of GCC.
|
|
|
| @@ -45,6 +46,7 @@
|
| #include "optabs.h"
|
| #include "toplev.h"
|
| #include "basic-block.h"
|
| +#include "df.h"
|
| #include "target.h"
|
| #include "target-def.h"
|
|
|
| @@ -118,17 +120,6 @@ static int size_for_adjusting_sp;
|
| static enum machine_mode output_memory_reference_mode;
|
|
|
| /*****************************************************************************/
|
| -/* GLOBAL VARIABLES */
|
| -/*****************************************************************************/
|
| -
|
| -/* Table of machine attributes. */
|
| -const struct attribute_spec crx_attribute_table[];
|
| -
|
| -/* Test and compare insns use these globals to generate branch insns. */
|
| -rtx crx_compare_op0 = NULL_RTX;
|
| -rtx crx_compare_op1 = NULL_RTX;
|
| -
|
| -/*****************************************************************************/
|
| /* TARGETM FUNCTION PROTOTYPES */
|
| /*****************************************************************************/
|
|
|
| @@ -137,6 +128,18 @@ static rtx crx_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
|
| int incoming ATTRIBUTE_UNUSED);
|
| static bool crx_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED);
|
| static int crx_address_cost (rtx, bool);
|
| +static bool crx_legitimate_address_p (enum machine_mode, rtx, bool);
|
| +static bool crx_can_eliminate (const int, const int);
|
| +
|
| +/*****************************************************************************/
|
| +/* RTL VALIDITY */
|
| +/*****************************************************************************/
|
| +
|
| +#undef TARGET_LEGITIMATE_ADDRESS_P
|
| +#define TARGET_LEGITIMATE_ADDRESS_P crx_legitimate_address_p
|
| +
|
| +#undef TARGET_CAN_ELIMINATE
|
| +#define TARGET_CAN_ELIMINATE crx_can_eliminate
|
|
|
| /*****************************************************************************/
|
| /* STACK LAYOUT AND CALLING CONVENTIONS */
|
| @@ -165,7 +168,7 @@ static int crx_address_cost (rtx, bool);
|
| #undef TARGET_ATTRIBUTE_TABLE
|
| #define TARGET_ATTRIBUTE_TABLE crx_attribute_table
|
|
|
| -const struct attribute_spec crx_attribute_table[] = {
|
| +static const struct attribute_spec crx_attribute_table[] = {
|
| /* ISRs have special prologue and epilogue requirements. */
|
| {"interrupt", 0, 0, false, true, true, NULL},
|
| {NULL, 0, 0, false, false, false, NULL}
|
| @@ -321,6 +324,14 @@ crx_compute_frame (void)
|
| crtl->outgoing_args_size : 0);
|
| }
|
|
|
| +/* Worker function for TARGET_CAN_ELIMINATE. */
|
| +
|
| +bool
|
| +crx_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
|
| +{
|
| + return (to == STACK_POINTER_REGNUM ? ! frame_pointer_needed : true);
|
| +}
|
| +
|
| /* Implements the macro INITIAL_ELIMINATION_OFFSET, return the OFFSET. */
|
|
|
| int
|
| @@ -541,7 +552,7 @@ crx_function_arg_regno_p (int n)
|
| /* ADDRESSING MODES */
|
| /* ---------------- */
|
|
|
| -/* Implements the macro GO_IF_LEGITIMATE_ADDRESS defined in crx.h.
|
| +/* Implements the hook for TARGET_LEGITIMATE_ADDRESS_P defined in crx.h.
|
| * The following addressing modes are supported on CRX:
|
| *
|
| * Relocations --> const | symbol_ref | label_ref
|
| @@ -726,9 +737,9 @@ crx_decompose_address (rtx addr, struct crx_address *out)
|
| return retval;
|
| }
|
|
|
| -int
|
| +bool
|
| crx_legitimate_address_p (enum machine_mode mode ATTRIBUTE_UNUSED,
|
| - rtx addr, int strict)
|
| + rtx addr, bool strict)
|
| {
|
| enum crx_addrtype addrtype;
|
| struct crx_address address;
|
| @@ -1217,43 +1228,6 @@ crx_expand_movmem (rtx dstbase, rtx srcbase, rtx count_exp, rtx align_exp)
|
| return 1;
|
| }
|
|
|
| -rtx
|
| -crx_expand_compare (enum rtx_code code, enum machine_mode mode)
|
| -{
|
| - rtx op0, op1, cc_reg, ret;
|
| -
|
| - op0 = crx_compare_op0;
|
| - op1 = crx_compare_op1;
|
| -
|
| - /* Emit the compare that writes into CC_REGNUM) */
|
| - cc_reg = gen_rtx_REG (CCmode, CC_REGNUM);
|
| - ret = gen_rtx_COMPARE (CCmode, op0, op1);
|
| - emit_insn (gen_rtx_SET (VOIDmode, cc_reg, ret));
|
| - /* debug_rtx (get_last_insn ()); */
|
| -
|
| - /* Return the rtx for using the result in CC_REGNUM */
|
| - return gen_rtx_fmt_ee (code, mode, cc_reg, const0_rtx);
|
| -}
|
| -
|
| -void
|
| -crx_expand_branch (enum rtx_code code, rtx label)
|
| -{
|
| - rtx tmp = crx_expand_compare (code, VOIDmode);
|
| - tmp = gen_rtx_IF_THEN_ELSE (VOIDmode, tmp,
|
| - gen_rtx_LABEL_REF (VOIDmode, label),
|
| - pc_rtx);
|
| - emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, tmp));
|
| - /* debug_rtx (get_last_insn ()); */
|
| -}
|
| -
|
| -void
|
| -crx_expand_scond (enum rtx_code code, rtx dest)
|
| -{
|
| - rtx tmp = crx_expand_compare (code, GET_MODE (dest));
|
| - emit_move_insn (dest, tmp);
|
| - /* debug_rtx (get_last_insn ()); */
|
| -}
|
| -
|
| static void
|
| mpushpop_str (char *stringbuffer, const char *mnemonic, char *mask)
|
| {
|
| @@ -1468,4 +1442,3 @@ crx_expand_epilogue (void)
|
| else
|
| emit_jump_insn (gen_pop_and_popret_return (GEN_INT (sum_regs)));
|
| }
|
| -
|
|
|